From dece9e8b0786efef78aac743dd68565064970d70 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 16 Feb 2026 00:41:28 +0000 Subject: [PATCH] refactor(update): share package.json readers --- src/cli/update-cli/shared.ts | 22 ++-------------------- src/infra/package-json.ts | 23 +++++++++++++++++++++++ src/infra/update-runner.ts | 22 +--------------------- 3 files changed, 26 insertions(+), 41 deletions(-) create mode 100644 src/infra/package-json.ts diff --git a/src/cli/update-cli/shared.ts b/src/cli/update-cli/shared.ts index 507df6edc50..b137248f0b8 100644 --- a/src/cli/update-cli/shared.ts +++ b/src/cli/update-cli/shared.ts @@ -5,6 +5,7 @@ import path from "node:path"; import type { UpdateStepProgress, UpdateStepResult } from "../../infra/update-runner.js"; import { resolveStateDir } from "../../config/paths.js"; import { resolveOpenClawPackageRoot } from "../../infra/openclaw-root.js"; +import { readPackageName, readPackageVersion } from "../../infra/package-json.js"; import { trimLogTail } from "../../infra/restart-sentinel.js"; import { parseSemver } from "../../infra/runtime-guard.js"; import { fetchNpmTagVersion } from "../../infra/update-check.js"; @@ -68,15 +69,7 @@ export function normalizeVersionTag(tag: string): string | null { return parseSemver(cleaned) ? cleaned : null; } -export async function readPackageVersion(root: string): Promise { - try { - const raw = await fs.readFile(path.join(root, "package.json"), "utf-8"); - const parsed = JSON.parse(raw) as { version?: string }; - return typeof parsed.version === "string" ? parsed.version : null; - } catch { - return null; - } -} +export { readPackageName, readPackageVersion }; export async function resolveTargetVersion( tag: string, @@ -99,17 +92,6 @@ export async function isGitCheckout(root: string): Promise { } } -export async function readPackageName(root: string): Promise { - try { - const raw = await fs.readFile(path.join(root, "package.json"), "utf-8"); - const parsed = JSON.parse(raw) as { name?: string }; - const name = parsed?.name?.trim(); - return name ? name : null; - } catch { - return null; - } -} - export async function isCorePackage(root: string): Promise { const name = await readPackageName(root); return Boolean(name && CORE_PACKAGE_NAMES.has(name)); diff --git a/src/infra/package-json.ts b/src/infra/package-json.ts new file mode 100644 index 00000000000..f0007a3c04d --- /dev/null +++ b/src/infra/package-json.ts @@ -0,0 +1,23 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +export async function readPackageVersion(root: string): Promise { + try { + const raw = await fs.readFile(path.join(root, "package.json"), "utf-8"); + const parsed = JSON.parse(raw) as { version?: string }; + return typeof parsed?.version === "string" ? parsed.version : null; + } catch { + return null; + } +} + +export async function readPackageName(root: string): Promise { + try { + const raw = await fs.readFile(path.join(root, "package.json"), "utf-8"); + const parsed = JSON.parse(raw) as { name?: string }; + const name = parsed?.name?.trim(); + return name ? name : null; + } catch { + return null; + } +} diff --git a/src/infra/update-runner.ts b/src/infra/update-runner.ts index d0fbc43ce4c..4e84cea4073 100644 --- a/src/infra/update-runner.ts +++ b/src/infra/update-runner.ts @@ -7,6 +7,7 @@ import { resolveControlUiDistIndexPathForRoot, } from "./control-ui-assets.js"; import { detectPackageManager as detectPackageManagerImpl } from "./detect-package-manager.js"; +import { readPackageName, readPackageVersion } from "./package-json.js"; import { trimLogTail } from "./restart-sentinel.js"; import { channelToNpmTag, @@ -131,27 +132,6 @@ function buildStartDirs(opts: UpdateRunnerOptions): string[] { return Array.from(new Set(dirs)); } -async function readPackageVersion(root: string) { - try { - const raw = await fs.readFile(path.join(root, "package.json"), "utf-8"); - const parsed = JSON.parse(raw) as { version?: string }; - return typeof parsed?.version === "string" ? parsed.version : null; - } catch { - return null; - } -} - -async function readPackageName(root: string) { - try { - const raw = await fs.readFile(path.join(root, "package.json"), "utf-8"); - const parsed = JSON.parse(raw) as { name?: string }; - const name = parsed?.name?.trim(); - return name ? name : null; - } catch { - return null; - } -} - async function readBranchName( runCommand: CommandRunner, root: string,