@okclaw-build/cli 1.0.0-beta.48 → 1.0.0-beta.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export declare function migrationCommand(args: string[]): Promise<void>;
@@ -0,0 +1,205 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync, } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ import { ARCHIVE_MANIFEST_NAME, buildCreateEncryptedArchiveCommand, buildDecryptArchiveCommand, buildTarCommand, buildTarCreateArgs, buildTarExtractArgs, buildTarExtractManifestArgs, buildTarListArgs, validateTarEntries, } from '../migration/archive.js';
6
+ import { buildMigrationManifest, existingManifestPaths, validateMigrationManifest, } from '../migration/manifest.js';
7
+ import { assertAgeIdentityContent, assertAgeRecipientContent, assertAuthenticatedEncryptionAvailable, } from '../migration/crypto.js';
8
+ import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
9
+ import { error, info, success } from '../utils/logger.js';
10
+ import { commandExists, shell, shellCapture } from '../utils/shell.js';
11
+ export async function migrationCommand(args) {
12
+ const emitter = new NdjsonEmitter('migration');
13
+ registerExitHandlers(emitter);
14
+ let parsed;
15
+ try {
16
+ parsed = parseMigrationArgs(args);
17
+ }
18
+ catch (e) {
19
+ const msg = e instanceof Error ? e.message : String(e);
20
+ error(msg);
21
+ emitter.end(false, 1, 'E_USAGE', { error: msg });
22
+ process.exit(1);
23
+ return;
24
+ }
25
+ emitter.start(`migration ${parsed.action}`, migrationFields('start', `migration ${parsed.action}`, {
26
+ taskId: parsed.taskId,
27
+ shrimpId: parsed.shrimpId,
28
+ sourceHostId: parsed.sourceHostId,
29
+ targetHostId: parsed.targetHostId,
30
+ }));
31
+ try {
32
+ switch (parsed.action) {
33
+ case 'export':
34
+ await exportRuntime(parsed, emitter);
35
+ break;
36
+ case 'restore':
37
+ await restoreRuntime(parsed, emitter);
38
+ break;
39
+ case 'verify':
40
+ verifyManifest(parsed, emitter);
41
+ break;
42
+ }
43
+ emitter.end(true, 0, undefined, { taskId: parsed.taskId, action: parsed.action });
44
+ }
45
+ catch (e) {
46
+ const msg = e instanceof Error ? e.message : String(e);
47
+ error(msg);
48
+ emitter.end(false, 1, 'E_MIGRATION_FAILED', { error: msg, taskId: parsed.taskId, action: parsed.action });
49
+ process.exit(1);
50
+ }
51
+ }
52
+ async function exportRuntime(args, emitter) {
53
+ if (!args.out || !args.keyFile)
54
+ throw new Error('export requires --out and --key-file');
55
+ await assertRequiredTools(['tar']);
56
+ await assertAuthenticatedEncryptionAvailable();
57
+ assertAgeRecipientContent(readFileSync(args.keyFile, 'utf8'), args.keyFile);
58
+ const workDir = mkdtempSync(join(tmpdir(), 'okclaw-migration-export-'));
59
+ const tarPath = join(workDir, 'runtime.tar');
60
+ const manifestPath = join(workDir, ARCHIVE_MANIFEST_NAME);
61
+ try {
62
+ emitter.stepStart('manifest', 'building migration manifest', migrationFields('manifest', 'building migration manifest'));
63
+ const manifest = buildMigrationManifest(identityFromArgs(args));
64
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
65
+ emitter.stepDone('manifest', 'migration manifest built', migrationFields('manifest', 'migration manifest built', {
66
+ missingPaths: manifest.missingPaths,
67
+ }));
68
+ emitter.stepStart('archive', 'creating runtime tar archive', migrationFields('archive', 'creating runtime tar archive'));
69
+ await shell(buildTarCommand(buildTarCreateArgs({
70
+ tarPath,
71
+ manifestPath,
72
+ existingIncludePaths: existingManifestPaths(manifest),
73
+ })));
74
+ emitter.stepDone('archive', 'runtime tar archive created', migrationFields('archive', 'runtime tar archive created'));
75
+ mkdirSync(dirname(args.out), { recursive: true });
76
+ emitter.stepStart('encrypt', 'encrypting runtime archive with age', migrationFields('encrypt', 'encrypting runtime archive'));
77
+ await shell(buildCreateEncryptedArchiveCommand(args.keyFile, tarPath, args.out));
78
+ emitter.stepDone('encrypt', 'encrypted runtime archive created', migrationFields('encrypt', 'encrypted runtime archive created', {
79
+ sha256: sha256File(args.out),
80
+ archive: args.out,
81
+ }));
82
+ success(`Migration archive exported: ${args.out}`);
83
+ }
84
+ finally {
85
+ rmSync(workDir, { recursive: true, force: true });
86
+ }
87
+ }
88
+ async function restoreRuntime(args, emitter) {
89
+ if (!args.archive || !args.keyFile)
90
+ throw new Error('restore requires --archive and --key-file');
91
+ await assertRequiredTools(['tar']);
92
+ await assertAuthenticatedEncryptionAvailable();
93
+ if (!existsSync(args.archive))
94
+ throw new Error(`Archive not found: ${args.archive}`);
95
+ assertAgeIdentityContent(readFileSync(args.keyFile, 'utf8'), args.keyFile);
96
+ const workDir = mkdtempSync(join(tmpdir(), 'okclaw-migration-restore-'));
97
+ const tarPath = join(workDir, 'runtime.tar');
98
+ try {
99
+ emitter.stepStart('decrypt', 'decrypting runtime archive with age', migrationFields('decrypt', 'decrypting runtime archive'));
100
+ await shell(buildDecryptArchiveCommand(args.keyFile, args.archive, tarPath));
101
+ emitter.stepDone('decrypt', 'runtime archive decrypted', migrationFields('decrypt', 'runtime archive decrypted'));
102
+ emitter.stepStart('manifest', 'validating migration manifest', migrationFields('manifest', 'validating migration manifest'));
103
+ await shell(buildTarCommand(buildTarExtractManifestArgs(tarPath, workDir)));
104
+ const manifest = validateMigrationManifest(JSON.parse(readFileSync(join(workDir, ARCHIVE_MANIFEST_NAME), 'utf8')), identityFromArgs(args));
105
+ emitter.stepDone('manifest', 'migration manifest validated', migrationFields('manifest', 'migration manifest validated'));
106
+ emitter.stepStart('archive-safety', 'validating archive entry paths', migrationFields('archive-safety', 'validating archive entry paths'));
107
+ const listing = await shellCapture(buildTarCommand(buildTarListArgs(tarPath)));
108
+ if (listing.code !== 0)
109
+ throw new Error(`Unable to list migration archive: ${listing.stderr}`);
110
+ validateTarEntries(listing.stdout.split(/\r?\n/), existingManifestPaths(manifest));
111
+ emitter.stepDone('archive-safety', 'archive entries validated', migrationFields('archive-safety', 'archive entries validated'));
112
+ emitter.stepStart('restore', 'restoring runtime files', migrationFields('restore', 'restoring runtime files'));
113
+ await shell(buildTarCommand(buildTarExtractArgs(tarPath)));
114
+ emitter.stepDone('restore', 'runtime files restored', migrationFields('restore', 'runtime files restored'));
115
+ success(`Migration archive restored: ${args.archive}`);
116
+ }
117
+ finally {
118
+ rmSync(workDir, { recursive: true, force: true });
119
+ }
120
+ }
121
+ function verifyManifest(args, emitter) {
122
+ if (!args.manifest)
123
+ throw new Error('verify requires --manifest');
124
+ emitter.stepStart('verify', 'validating migration manifest', migrationFields('verify', 'validating migration manifest'));
125
+ const manifest = validateMigrationManifest(JSON.parse(readFileSync(args.manifest, 'utf8')), identityFromArgs(args));
126
+ emitter.stepDone('verify', 'migration manifest valid', migrationFields('verify', 'migration manifest valid', {
127
+ missingPaths: manifest.missingPaths,
128
+ }));
129
+ info('Migration manifest is valid.');
130
+ }
131
+ function parseMigrationArgs(args) {
132
+ const action = args[0];
133
+ if (action !== 'export' && action !== 'restore' && action !== 'verify') {
134
+ throw new Error('Usage: okclaw migration <export|restore|verify> --task-id <id> --shrimp-id <id> --source-host-id <id> --target-host-id <id>');
135
+ }
136
+ const flags = parseFlags(args.slice(1));
137
+ const parsed = {
138
+ action,
139
+ taskId: requireFlag(flags, 'task-id'),
140
+ shrimpId: requireFlag(flags, 'shrimp-id'),
141
+ sourceHostId: requireFlag(flags, 'source-host-id'),
142
+ targetHostId: requireFlag(flags, 'target-host-id'),
143
+ out: flags.get('out'),
144
+ archive: flags.get('archive'),
145
+ keyFile: flags.get('key-file'),
146
+ manifest: flags.get('manifest'),
147
+ };
148
+ if (action === 'export' && (!parsed.out || !parsed.keyFile)) {
149
+ throw new Error('Usage: okclaw migration export --task-id <id> --shrimp-id <id> --source-host-id <id> --target-host-id <id> --out <archive> --key-file <key>');
150
+ }
151
+ if (action === 'restore' && (!parsed.archive || !parsed.keyFile)) {
152
+ throw new Error('Usage: okclaw migration restore --task-id <id> --shrimp-id <id> --source-host-id <id> --target-host-id <id> --archive <archive> --key-file <key>');
153
+ }
154
+ if (action === 'verify' && !parsed.manifest) {
155
+ throw new Error('Usage: okclaw migration verify --task-id <id> --shrimp-id <id> --source-host-id <id> --target-host-id <id> --manifest <manifest>');
156
+ }
157
+ return parsed;
158
+ }
159
+ function parseFlags(args) {
160
+ const flags = new Map();
161
+ for (let i = 0; i < args.length; i++) {
162
+ const arg = args[i];
163
+ if (!arg.startsWith('--'))
164
+ throw new Error(`Unexpected argument: ${arg}`);
165
+ const withoutPrefix = arg.slice(2);
166
+ const eq = withoutPrefix.indexOf('=');
167
+ if (eq >= 0) {
168
+ flags.set(withoutPrefix.slice(0, eq), withoutPrefix.slice(eq + 1));
169
+ continue;
170
+ }
171
+ const value = args[++i];
172
+ if (!value || value.startsWith('--'))
173
+ throw new Error(`Missing value for --${withoutPrefix}`);
174
+ flags.set(withoutPrefix, value);
175
+ }
176
+ return flags;
177
+ }
178
+ function requireFlag(flags, name) {
179
+ const value = flags.get(name);
180
+ if (!value)
181
+ throw new Error(`--${name} is required`);
182
+ return value;
183
+ }
184
+ function identityFromArgs(args) {
185
+ return {
186
+ taskId: args.taskId,
187
+ shrimpId: args.shrimpId,
188
+ sourceHostId: args.sourceHostId,
189
+ targetHostId: args.targetHostId,
190
+ };
191
+ }
192
+ async function assertRequiredTools(commands) {
193
+ for (const command of commands) {
194
+ if (!await commandExists(command)) {
195
+ throw new Error(`Missing required command: ${command}`);
196
+ }
197
+ }
198
+ }
199
+ function migrationFields(phase, message, data = {}) {
200
+ return { phase, message, data };
201
+ }
202
+ function sha256File(path) {
203
+ return createHash('sha256').update(readFileSync(path)).digest('hex');
204
+ }
205
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/commands/migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare const ARCHIVE_MANIFEST_NAME = "migration-manifest.json";
2
+ export interface TarCreateOptions {
3
+ tarPath: string;
4
+ manifestPath: string;
5
+ existingIncludePaths: string[];
6
+ }
7
+ export declare function buildTarCreateArgs(options: TarCreateOptions): string[];
8
+ export declare function buildTarExtractArgs(tarPath: string): string[];
9
+ export declare function buildTarListArgs(tarPath: string): string[];
10
+ export declare function validateTarEntries(entries: string[], allowedAbsoluteRoots: string[]): void;
11
+ export declare function buildTarExtractManifestArgs(tarPath: string, outDir: string): string[];
12
+ export declare function buildTarCommand(args: string[]): string;
13
+ export declare function buildCreateEncryptedArchiveCommand(keyFile: string, inputTarPath: string, outputArchivePath: string): string;
14
+ export declare function buildDecryptArchiveCommand(keyFile: string, inputArchivePath: string, outputTarPath: string): string;
@@ -0,0 +1,84 @@
1
+ import { basename, dirname } from 'node:path';
2
+ import { excludePatterns } from './manifest.js';
3
+ import { buildAgeCommand, buildAgeDecryptArgs, buildAgeEncryptArgs, quoteShellArg } from './crypto.js';
4
+ export const ARCHIVE_MANIFEST_NAME = 'migration-manifest.json';
5
+ export function buildTarCreateArgs(options) {
6
+ return [
7
+ '--create',
8
+ '--file',
9
+ options.tarPath,
10
+ '--xattrs',
11
+ '--acls',
12
+ '--numeric-owner',
13
+ ...excludePatterns.map((pattern) => `--exclude=${pattern}`),
14
+ '-C',
15
+ dirname(options.manifestPath),
16
+ basename(options.manifestPath),
17
+ '-C',
18
+ '/',
19
+ ...options.existingIncludePaths.map(toTarRelativePath),
20
+ ];
21
+ }
22
+ export function buildTarExtractArgs(tarPath) {
23
+ return [
24
+ '--extract',
25
+ '--file',
26
+ tarPath,
27
+ '--same-owner',
28
+ '--preserve-permissions',
29
+ '--numeric-owner',
30
+ '-C',
31
+ '/',
32
+ ];
33
+ }
34
+ export function buildTarListArgs(tarPath) {
35
+ return [
36
+ '--list',
37
+ '--file',
38
+ tarPath,
39
+ ];
40
+ }
41
+ export function validateTarEntries(entries, allowedAbsoluteRoots) {
42
+ const allowed = new Set([
43
+ ARCHIVE_MANIFEST_NAME,
44
+ ...allowedAbsoluteRoots.map(toTarRelativePath).map(stripTrailingSlash),
45
+ ]);
46
+ for (const raw of entries) {
47
+ const entry = stripTrailingSlash(raw.trim());
48
+ if (!entry)
49
+ continue;
50
+ if (entry.startsWith('/') || entry.split('/').includes('..')) {
51
+ throw new Error(`Unsafe archive entry: ${raw}`);
52
+ }
53
+ const ok = [...allowed].some((root) => entry === root || entry.startsWith(`${root}/`));
54
+ if (!ok) {
55
+ throw new Error(`Archive entry outside manifest paths: ${raw}`);
56
+ }
57
+ }
58
+ }
59
+ export function buildTarExtractManifestArgs(tarPath, outDir) {
60
+ return [
61
+ '--extract',
62
+ '--file',
63
+ tarPath,
64
+ '-C',
65
+ outDir,
66
+ ARCHIVE_MANIFEST_NAME,
67
+ ];
68
+ }
69
+ export function buildTarCommand(args) {
70
+ return ['tar', ...args.map(quoteShellArg)].join(' ');
71
+ }
72
+ export function buildCreateEncryptedArchiveCommand(keyFile, inputTarPath, outputArchivePath) {
73
+ return buildAgeCommand(buildAgeEncryptArgs(keyFile, inputTarPath, outputArchivePath));
74
+ }
75
+ export function buildDecryptArchiveCommand(keyFile, inputArchivePath, outputTarPath) {
76
+ return buildAgeCommand(buildAgeDecryptArgs(keyFile, inputArchivePath, outputTarPath));
77
+ }
78
+ function toTarRelativePath(path) {
79
+ return path.replace(/^\/+/, '');
80
+ }
81
+ function stripTrailingSlash(path) {
82
+ return path.replace(/\/+$/, '');
83
+ }
84
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/migration/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const AUTHENTICATED_ENCRYPTION_TOOL = "age";
2
+ export declare const AUTHENTICATED_ENCRYPTION_CONTRACT = "age-v1-X25519-ChaCha20Poly1305";
3
+ export declare function buildAgeEncryptArgs(keyFile: string, inputPath: string, outputPath: string): string[];
4
+ export declare function buildAgeDecryptArgs(keyFile: string, inputPath: string, outputPath: string): string[];
5
+ export declare function buildAgeCommand(args: string[]): string;
6
+ export declare function assertAuthenticatedEncryptionAvailable(): Promise<void>;
7
+ export declare function quoteShellArg(value: string): string;
8
+ /**
9
+ * export 用 `--recipient-file`,必须是 age 公钥;若误传私钥(identity),age 会在运行期才报错。
10
+ * 提前在 CLI 层显式校验,避免操作人把私钥当公钥用。
11
+ */
12
+ export declare function assertAgeRecipientContent(content: string, keyFile: string): void;
13
+ /**
14
+ * restore 用 `--identity`,必须是 age 私钥;若误传只含公钥的文件,提前报错而不是等 age 运行期失败。
15
+ */
16
+ export declare function assertAgeIdentityContent(content: string, keyFile: string): void;
@@ -0,0 +1,56 @@
1
+ import { commandExists } from '../utils/shell.js';
2
+ export const AUTHENTICATED_ENCRYPTION_TOOL = 'age';
3
+ export const AUTHENTICATED_ENCRYPTION_CONTRACT = 'age-v1-X25519-ChaCha20Poly1305';
4
+ export function buildAgeEncryptArgs(keyFile, inputPath, outputPath) {
5
+ return [
6
+ '--encrypt',
7
+ '--recipient-file',
8
+ keyFile,
9
+ '--output',
10
+ outputPath,
11
+ inputPath,
12
+ ];
13
+ }
14
+ export function buildAgeDecryptArgs(keyFile, inputPath, outputPath) {
15
+ return [
16
+ '--decrypt',
17
+ '--identity',
18
+ keyFile,
19
+ '--output',
20
+ outputPath,
21
+ inputPath,
22
+ ];
23
+ }
24
+ export function buildAgeCommand(args) {
25
+ return [AUTHENTICATED_ENCRYPTION_TOOL, ...args.map(quoteShellArg)].join(' ');
26
+ }
27
+ export async function assertAuthenticatedEncryptionAvailable() {
28
+ if (!await commandExists(AUTHENTICATED_ENCRYPTION_TOOL)) {
29
+ throw new Error('Missing authenticated encryption tool: age');
30
+ }
31
+ }
32
+ export function quoteShellArg(value) {
33
+ return `'${value.replace(/'/g, `'\\''`)}'`;
34
+ }
35
+ const AGE_SECRET_KEY_MARKER = /AGE-SECRET-KEY-/;
36
+ const OPENSSH_PRIVATE_KEY_MARKER = /BEGIN OPENSSH PRIVATE KEY/;
37
+ const AGE_RECIPIENT_MARKER = /(^|\n)\s*age1[0-9a-z]/;
38
+ /**
39
+ * export 用 `--recipient-file`,必须是 age 公钥;若误传私钥(identity),age 会在运行期才报错。
40
+ * 提前在 CLI 层显式校验,避免操作人把私钥当公钥用。
41
+ */
42
+ export function assertAgeRecipientContent(content, keyFile) {
43
+ if (AGE_SECRET_KEY_MARKER.test(content)) {
44
+ throw new Error(`--key-file 应为 age 公钥(recipient)文件,但 ${keyFile} 含 age 私钥;export 加密只需公钥`);
45
+ }
46
+ }
47
+ /**
48
+ * restore 用 `--identity`,必须是 age 私钥;若误传只含公钥的文件,提前报错而不是等 age 运行期失败。
49
+ */
50
+ export function assertAgeIdentityContent(content, keyFile) {
51
+ const hasIdentity = AGE_SECRET_KEY_MARKER.test(content) || OPENSSH_PRIVATE_KEY_MARKER.test(content);
52
+ if (!hasIdentity && AGE_RECIPIENT_MARKER.test(content)) {
53
+ throw new Error(`--key-file 应为 age 私钥(identity)文件,但 ${keyFile} 仅含 age 公钥;restore 解密需要私钥`);
54
+ }
55
+ }
56
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/migration/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,CAAC;AACnD,MAAM,CAAC,MAAM,iCAAiC,GAAG,gCAAgC,CAAC;AAElF,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,SAAiB,EAAE,UAAkB;IACxF,OAAO;QACL,WAAW;QACX,kBAAkB;QAClB,OAAO;QACP,UAAU;QACV,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,SAAiB,EAAE,UAAkB;IACxF,OAAO;QACL,WAAW;QACX,YAAY;QACZ,OAAO;QACP,UAAU;QACV,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,OAAO,CAAC,6BAA6B,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sCAAsC;IAC1D,IAAI,CAAC,MAAM,aAAa,CAAC,6BAA6B,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAChD,MAAM,0BAA0B,GAAG,2BAA2B,CAAC;AAC/D,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAErD;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAe,EAAE,OAAe;IACxE,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,yBAAyB,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,OAAe;IACvE,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpG,IAAI,CAAC,WAAW,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,2BAA2B,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ export declare const MIGRATION_MANIFEST_VERSION = "openclaw-runtime-v1";
2
+ export declare const LEGACY_OPENCLAW_WORKSPACE = "/root/openclaw/workspace";
3
+ export declare const includePaths: string[];
4
+ export declare const excludePatterns: string[];
5
+ export declare const requiredRuntimeFiles: string[];
6
+ export interface MigrationManifestPath {
7
+ path: string;
8
+ status: 'included' | 'missing';
9
+ type?: 'file' | 'directory' | 'symlink' | 'other';
10
+ mode?: number;
11
+ uid?: number;
12
+ gid?: number;
13
+ }
14
+ export interface MigrationManifest {
15
+ version: typeof MIGRATION_MANIFEST_VERSION;
16
+ createdAt: string;
17
+ taskId: string;
18
+ shrimpId: string;
19
+ sourceHostId: string;
20
+ targetHostId: string;
21
+ includePaths: string[];
22
+ excludePatterns: string[];
23
+ requiredRuntimeFiles: string[];
24
+ missingPaths: string[];
25
+ paths: MigrationManifestPath[];
26
+ }
27
+ export interface MigrationIdentity {
28
+ taskId: string;
29
+ shrimpId: string;
30
+ sourceHostId: string;
31
+ targetHostId: string;
32
+ }
33
+ export interface BuildManifestOptions extends MigrationIdentity {
34
+ rootDir?: string;
35
+ createdAt?: string;
36
+ }
37
+ export declare function buildMigrationManifest(options: BuildManifestOptions): MigrationManifest;
38
+ export declare function existingManifestPaths(manifest: MigrationManifest): string[];
39
+ export declare function validateMigrationManifest(value: unknown, expected: MigrationIdentity): MigrationManifest;
@@ -0,0 +1,140 @@
1
+ import { existsSync, lstatSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { OKCLAW_BACKUP_DIR, OKCLAW_CONFIG_DIR, OPENCLAW_HOME, OPENCLAW_WORKSPACE, OPENVIKING_HOME, } from '../utils/constants.js';
4
+ export const MIGRATION_MANIFEST_VERSION = 'openclaw-runtime-v1';
5
+ export const LEGACY_OPENCLAW_WORKSPACE = '/root/openclaw/workspace';
6
+ export const includePaths = [
7
+ OPENCLAW_HOME,
8
+ OPENCLAW_WORKSPACE,
9
+ LEGACY_OPENCLAW_WORKSPACE,
10
+ OKCLAW_CONFIG_DIR,
11
+ OKCLAW_BACKUP_DIR,
12
+ OPENVIKING_HOME,
13
+ ];
14
+ export const excludePatterns = [
15
+ '**/*.sock',
16
+ '**/*.pid',
17
+ '**/*.lock',
18
+ '**/tmp/**',
19
+ '**/.cache/**',
20
+ '**/node_modules/.cache/**',
21
+ ];
22
+ export const requiredRuntimeFiles = [
23
+ `${OPENCLAW_HOME}/openclaw.json`,
24
+ ];
25
+ export function buildMigrationManifest(options) {
26
+ const rootDir = options.rootDir ?? '/';
27
+ const missingCritical = requiredRuntimeFiles.filter((path) => !existsSync(toHostPath(rootDir, path)));
28
+ if (missingCritical.length > 0) {
29
+ throw new Error(`Missing critical runtime file: ${missingCritical.join(', ')}`);
30
+ }
31
+ const paths = includePaths.map((path) => {
32
+ const hostPath = toHostPath(rootDir, path);
33
+ if (!existsSync(hostPath)) {
34
+ return { path, status: 'missing' };
35
+ }
36
+ const stat = lstatSync(hostPath);
37
+ return {
38
+ path,
39
+ status: 'included',
40
+ type: stat.isDirectory() ? 'directory' : stat.isFile() ? 'file' : stat.isSymbolicLink() ? 'symlink' : 'other',
41
+ mode: stat.mode,
42
+ uid: stat.uid,
43
+ gid: stat.gid,
44
+ };
45
+ });
46
+ return {
47
+ version: MIGRATION_MANIFEST_VERSION,
48
+ createdAt: options.createdAt ?? new Date().toISOString(),
49
+ taskId: options.taskId,
50
+ shrimpId: options.shrimpId,
51
+ sourceHostId: options.sourceHostId,
52
+ targetHostId: options.targetHostId,
53
+ includePaths: [...includePaths],
54
+ excludePatterns: [...excludePatterns],
55
+ requiredRuntimeFiles: [...requiredRuntimeFiles],
56
+ missingPaths: paths.filter((item) => item.status === 'missing').map((item) => item.path),
57
+ paths,
58
+ };
59
+ }
60
+ export function existingManifestPaths(manifest) {
61
+ return manifest.paths.filter((item) => item.status === 'included').map((item) => item.path);
62
+ }
63
+ export function validateMigrationManifest(value, expected) {
64
+ if (!isManifest(value)) {
65
+ throw new Error('Invalid migration manifest');
66
+ }
67
+ if (value.version !== MIGRATION_MANIFEST_VERSION) {
68
+ throw new Error(`Unsupported manifest version: ${value.version}`);
69
+ }
70
+ assertEqual('taskId', value.taskId, expected.taskId);
71
+ assertEqual('shrimpId', value.shrimpId, expected.shrimpId);
72
+ assertEqual('sourceHostId', value.sourceHostId, expected.sourceHostId);
73
+ assertEqual('targetHostId', value.targetHostId, expected.targetHostId);
74
+ /*
75
+ * Restore cannot trust the archive's manifest to define its own allowed roots.
76
+ * The tar safety check extracts to /, so a malicious package that declares /etc
77
+ * as an included path would otherwise turn the manifest into an allow-list bypass.
78
+ * Keep the manifest useful for audit, but require every path list to match the
79
+ * hard-coded runtime contract compiled into this CLI version.
80
+ */
81
+ assertStringArrayEqual('includePaths', value.includePaths, includePaths);
82
+ assertStringArrayEqual('excludePatterns', value.excludePatterns, excludePatterns);
83
+ assertStringArrayEqual('requiredRuntimeFiles', value.requiredRuntimeFiles, requiredRuntimeFiles);
84
+ validateManifestPathSet(value);
85
+ return value;
86
+ }
87
+ function assertEqual(field, actual, expected) {
88
+ if (actual !== expected) {
89
+ throw new Error(`Manifest ${field} mismatch: expected ${expected}, got ${actual}`);
90
+ }
91
+ }
92
+ function isManifest(value) {
93
+ if (typeof value !== 'object' || value === null)
94
+ return false;
95
+ const candidate = value;
96
+ return typeof candidate.version === 'string'
97
+ && typeof candidate.taskId === 'string'
98
+ && typeof candidate.shrimpId === 'string'
99
+ && typeof candidate.sourceHostId === 'string'
100
+ && typeof candidate.targetHostId === 'string'
101
+ && Array.isArray(candidate.includePaths)
102
+ && Array.isArray(candidate.excludePatterns)
103
+ && Array.isArray(candidate.requiredRuntimeFiles)
104
+ && Array.isArray(candidate.missingPaths)
105
+ && Array.isArray(candidate.paths);
106
+ }
107
+ function assertStringArrayEqual(field, actual, expected) {
108
+ if (!Array.isArray(actual) || actual.length !== expected.length
109
+ || actual.some((item, index) => item !== expected[index])) {
110
+ throw new Error(`Manifest ${field} does not match CLI runtime contract`);
111
+ }
112
+ }
113
+ function validateManifestPathSet(manifest) {
114
+ const allowed = new Set(includePaths);
115
+ const seen = new Set();
116
+ const missing = new Set();
117
+ for (const item of manifest.paths) {
118
+ if (!item || typeof item.path !== 'string' || !allowed.has(item.path)) {
119
+ throw new Error(`Manifest path outside CLI runtime contract: ${item?.path ?? '<invalid>'}`);
120
+ }
121
+ if (seen.has(item.path)) {
122
+ throw new Error(`Manifest path duplicated: ${item.path}`);
123
+ }
124
+ seen.add(item.path);
125
+ if (item.status !== 'included' && item.status !== 'missing') {
126
+ throw new Error(`Manifest path has invalid status: ${item.path}`);
127
+ }
128
+ if (item.status === 'missing') {
129
+ missing.add(item.path);
130
+ }
131
+ }
132
+ if (manifest.missingPaths.length !== missing.size
133
+ || manifest.missingPaths.some((path) => !missing.has(path))) {
134
+ throw new Error('Manifest missingPaths does not match path statuses');
135
+ }
136
+ }
137
+ function toHostPath(rootDir, absolutePath) {
138
+ return join(rootDir, absolutePath.replace(/^\/+/, ''));
139
+ }
140
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/migration/manifest.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ export declare const NODE_MIN_MAJOR = 24;
13
13
  export declare const NODE_MIN_MINOR = 0;
14
14
  export declare const NODE_INSTALL_VERSION = "24";
15
15
  export declare const NPM_REGISTRY = "https://registry.npmmirror.com";
16
+ export declare const CLI_NPM_REGISTRY = "https://registry.npmjs.org";
17
+ export declare const CLI_PACKAGE = "@okclaw-build/cli";
16
18
  export declare const PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple";
17
19
  export declare const PIP_TRUSTED_HOST = "pypi.tuna.tsinghua.edu.cn";
18
20
  export declare const NODE_MIRROR = "https://npmmirror.com/mirrors/node";
@@ -25,6 +25,11 @@ export const NODE_MIN_MINOR = 0;
25
25
  export const NODE_INSTALL_VERSION = '24';
26
26
  // China mirrors
27
27
  export const NPM_REGISTRY = 'https://registry.npmmirror.com';
28
+ // The okclaw CLI itself is published on the public npm registry (not mirrored
29
+ // to npmmirror reliably), so self-relocation after a Node upgrade pulls it from
30
+ // npmjs.org — same registry os-api's preflight uses to install the CLI.
31
+ export const CLI_NPM_REGISTRY = 'https://registry.npmjs.org';
32
+ export const CLI_PACKAGE = '@okclaw-build/cli';
28
33
  export const PIP_INDEX_URL = 'https://pypi.tuna.tsinghua.edu.cn/simple';
29
34
  export const PIP_TRUSTED_HOST = 'pypi.tuna.tsinghua.edu.cn';
30
35
  export const NODE_MIRROR = 'https://npmmirror.com/mirrors/node';
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,WAAW,SAAS,CAAC;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,WAAW,SAAS,CAAC;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,WAAW,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,aAAa,YAAY,CAAC;AAC/D,0DAA0D;AAC1D,kEAAkE;AAClE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,eAAe,UAAU,CAAC;AAC5D,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,aAAa,iBAAiB,CAAC;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,uEAAuE;AACvE,0EAA0E;AAC1E,mEAAmE;AACnE,6EAA6E;AAC7E,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,4EAA4E;AAC5E,mEAAmE;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,0CAA0C,CAAC;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAC;AAEhE,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAEzD,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,iCAAiC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,GAAG,WAAW,eAAe,WAAW,SAAS;IACjD,qCAAqC,WAAW,SAAS;IACzD,gDAAgD,WAAW,SAAS;CACrE,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAEhE,gDAAgD;AAChD,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAC1F,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,mBAAmB,EAAE,WAAW,EAAE,oBAAoB;IACtD,mBAAmB,EAAE,eAAe,EAAE,iBAAiB;IACvD,8BAA8B,EAAE,sBAAsB;IACtD,eAAe;CAChB,CAAC;AAEF,8BAA8B;AAC9B,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,QAAQ,EAAE,iBAAiB;IAC3B,MAAM,EAAE,iCAAiC;IACzC,iDAAiD;IACjD,mEAAmE;CACpE,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,WAAW,SAAS,CAAC;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,WAAW,SAAS,CAAC;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,WAAW,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,aAAa,YAAY,CAAC;AAC/D,0DAA0D;AAC1D,kEAAkE;AAClE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,eAAe,UAAU,CAAC;AAC5D,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,aAAa,iBAAiB,CAAC;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,uEAAuE;AACvE,0EAA0E;AAC1E,mEAAmE;AACnE,6EAA6E;AAC7E,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,4EAA4E;AAC5E,mEAAmE;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAC7D,8EAA8E;AAC9E,gFAAgF;AAChF,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,0CAA0C,CAAC;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAC;AAEhE,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAEzD,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,iCAAiC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,GAAG,WAAW,eAAe,WAAW,SAAS;IACjD,qCAAqC,WAAW,SAAS;IACzD,gDAAgD,WAAW,SAAS;CACrE,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAEhE,gDAAgD;AAChD,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAC1F,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,mBAAmB,EAAE,WAAW,EAAE,oBAAoB;IACtD,mBAAmB,EAAE,eAAe,EAAE,iBAAiB;IACvD,8BAA8B,EAAE,sBAAsB;IACtD,eAAe;CAChB,CAAC;AAEF,8BAA8B;AAC9B,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,QAAQ,EAAE,iBAAiB;IAC3B,MAAM,EAAE,iCAAiC;IACzC,iDAAiD;IACjD,mEAAmE;CACpE,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC"}
@@ -3,6 +3,42 @@
3
3
  * Installs nvm first if not present, then installs Node.js through nvm.
4
4
  */
5
5
  export declare function ensureNodeVersion(): Promise<void>;
6
+ /**
7
+ * 升级 default node 后,把 okclaw CLI 也装到新 default 下。
8
+ *
9
+ * 为什么必须做:CLI 最初由 os-api preflight 装在升级前的旧 node(如 22.x)的全局
10
+ * 目录里;`nvm alias default 24` 之后,os-api 用新 shell(只 source nvm → auto-use
11
+ * default 24)再调 `okclaw stop/start/status` 时,新 default 下找不到 okclaw →
12
+ * "command not found",迁移会从 bootstrap 之后的步骤失败。把 CLI 重装到新 default
13
+ * 下,让 okclaw 和 openclaw 都落在 node 24,os-api 侧无需任何改动。
14
+ *
15
+ * 版本固定为当前正在运行的 CLI 自身版本:`@okclaw-build/cli` 的 latest dist-tag 并非
16
+ * 最新版,裸装会回退到旧版本,必须显式 pin。
17
+ *
18
+ * 失败必须抛、不能吞:relocation 是"升级完成"的一部分。若只 warn 放过,okclaw check
19
+ * 仍会成功返回,但 default node 下没有 okclaw —— openclaw 这次能在 24 跑起来,可
20
+ * 之后 os-api 用新 shell 调 okclaw 会以 "command not found" 在更晚、更难定位的步骤
21
+ * (迁移 target:stop 等)失败;且此时 node 已是 24,下一次 okclaw check 会直接
22
+ * early-return、永不重试 relocation,这个半坏状态自己解不开。所以用 shellRetry 吸收
23
+ * 瞬时抖动,重试仍失败就抛,让 okclaw check 在 bootstrap 早早干净失败(可重试),
24
+ * 而不是留下半坏主机。
25
+ *
26
+ * shell 副作用经 {@link RelocateCliDeps} 注入(沿用 openviking-purge 的 deps 约定),
27
+ * 让"失败必抛 + 重装后校验可解析"这条契约可单测。
28
+ */
29
+ export interface RelocateCliDeps {
30
+ /** 把指定 spec 装到当前 default node 全局(默认 shellRetry npm install)。 */
31
+ installGlobal: (spec: string) => Promise<void>;
32
+ /** 校验 okclaw 在当前 default node 下可解析(默认 commandExists)。 */
33
+ isResolvable: () => Promise<boolean>;
34
+ }
35
+ export declare function relocateCliToDefaultNode(deps?: Partial<RelocateCliDeps>): Promise<void>;
36
+ /**
37
+ * 把版本号格式化成 CLI 安装 spec。有版本则 pin 成 `@okclaw-build/cli@<version>`;
38
+ * 读不到版本(空/缺失)时回退到 `@beta` dist-tag —— 绝不用裸包名,因为
39
+ * `@okclaw-build/cli` 的 latest tag 指向的不是最新版,裸装会回退到旧版本。
40
+ */
41
+ export declare function formatCliSpec(version: string | null | undefined): string;
6
42
  /**
7
43
  * Ensure a command exists on PATH.
8
44
  */
@@ -1,6 +1,7 @@
1
- import { shell, shellCapture, commandExists } from './shell.js';
1
+ import { readFileSync } from 'node:fs';
2
+ import { shell, shellRetry, shellCapture, commandExists } from './shell.js';
2
3
  import { info, warn } from './logger.js';
3
- import { NODE_MIN_MAJOR, NODE_MIN_MINOR, NODE_INSTALL_VERSION, NODE_MIRROR, NVM_SH_SOURCES, } from './constants.js';
4
+ import { NODE_MIN_MAJOR, NODE_MIN_MINOR, NODE_INSTALL_VERSION, NODE_MIRROR, NVM_SH_SOURCES, CLI_NPM_REGISTRY, CLI_PACKAGE, } from './constants.js';
4
5
  /**
5
6
  * Ensure Node.js >= NODE_MIN_MAJOR.NODE_MIN_MINOR is installed via nvm.
6
7
  * Installs nvm first if not present, then installs Node.js through nvm.
@@ -21,6 +22,49 @@ export async function ensureNodeVersion() {
21
22
  }
22
23
  await ensureNvm();
23
24
  await installNodejs();
25
+ await relocateCliToDefaultNode();
26
+ }
27
+ function relocateCliDeps(deps = {}) {
28
+ return {
29
+ installGlobal: deps.installGlobal
30
+ ?? ((spec) => shellRetry(`npm install -g ${spec} --registry ${CLI_NPM_REGISTRY} --no-audit --no-fund`)),
31
+ isResolvable: deps.isResolvable ?? (() => commandExists('okclaw')),
32
+ };
33
+ }
34
+ export async function relocateCliToDefaultNode(deps = {}) {
35
+ const d = relocateCliDeps(deps);
36
+ const spec = cliPackageSpec();
37
+ info(`Relocating okclaw CLI (${spec}) onto the upgraded default Node...`);
38
+ await d.installGlobal(spec); // shellRetry 抖动重试;彻底失败直接抛(不 catch)
39
+ // 校验真的在升级后的 default node 下可解析(npm 偶发 exit 0 但 bin 没就位)。
40
+ if (!(await d.isResolvable())) {
41
+ throw new Error(`okclaw CLI not resolvable under the upgraded default Node after relocate (${spec})`);
42
+ }
43
+ info('okclaw CLI relocated onto default Node ✓');
44
+ }
45
+ /**
46
+ * 把版本号格式化成 CLI 安装 spec。有版本则 pin 成 `@okclaw-build/cli@<version>`;
47
+ * 读不到版本(空/缺失)时回退到 `@beta` dist-tag —— 绝不用裸包名,因为
48
+ * `@okclaw-build/cli` 的 latest tag 指向的不是最新版,裸装会回退到旧版本。
49
+ */
50
+ export function formatCliSpec(version) {
51
+ if (typeof version === 'string' && version.length > 0) {
52
+ return `${CLI_PACKAGE}@${version}`;
53
+ }
54
+ return `${CLI_PACKAGE}@beta`;
55
+ }
56
+ /** 当前正在运行的 CLI 自身的安装 spec。 */
57
+ function cliPackageSpec() {
58
+ let version = null;
59
+ try {
60
+ const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
61
+ if (typeof pkg.version === 'string')
62
+ version = pkg.version;
63
+ }
64
+ catch {
65
+ // ignore — formatCliSpec falls back to the @beta tag
66
+ }
67
+ return formatCliSpec(version);
24
68
  }
25
69
  const NVM_DIR = '/root/.nvm';
26
70
  async function ensureNvm() {
@@ -1 +1 @@
1
- {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"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"}
@@ -22,8 +22,20 @@ export function ensureRoot() {
22
22
  process.exit(code);
23
23
  }
24
24
  }
25
- // Prefix to source nvm before every shell command so node/npm are on PATH
26
- const NVM_INIT = 'export HOME=/root; export NVM_DIR=/root/.nvm; [ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"; ';
25
+ // Prefix to source nvm before every shell command so node/npm are on PATH.
26
+ //
27
+ // 关键:source nvm.sh 之后必须显式 `nvm use default`。nvm.sh 被 source 时的
28
+ // auto-use 只会激活"当前 PATH 上已有的那个 node"(nvm_ls_current 命中即
29
+ // `nvm use $NVM_CURRENT`),而不是 default。bootstrap 脚本只 source 一次 nvm、
30
+ // 把旧 node(如 22.16)钉进并 export 进 PATH,于是这里每个子进程继承到的都是
31
+ // 旧 node —— 即便 `okclaw check` 已经把 default 升到 24,`npm install openclaw`/
32
+ // `openclaw onboard`/`openclaw gateway` 仍跑在旧 node 上,触发 openclaw 的
33
+ // "Node.js vX is required" 而部署失败。强制 `nvm use default` 抵消这个行为,
34
+ // 让所有命令都跑在升级后的 default(24)。
35
+ // `command -v nvm` 守卫:全新主机只有 ensureNodeScript 写的极简 nvm.sh(无 nvm
36
+ // 函数,升级前),此时跳过 use default,不影响首个 node 的安装与版本判定。
37
+ const NVM_INIT = 'export HOME=/root; export NVM_DIR=/root/.nvm; '
38
+ + '[ -s "$NVM_DIR/nvm.sh" ] && { source "$NVM_DIR/nvm.sh"; command -v nvm >/dev/null 2>&1 && nvm use default --silent >/dev/null 2>&1; }; ';
27
39
  /**
28
40
  * Run a shell command and wait for exit.
29
41
  *
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okclaw-build/cli",
3
- "version": "1.0.0-beta.48",
3
+ "version": "1.0.0-beta.49",
4
4
  "description": "OKClaw deployment CLI - install and manage OpenClaw, OpenViking, and channel plugins",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",