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

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.
package/dist/index.js CHANGED
@@ -167,7 +167,7 @@ Notes:
167
167
  - All commands auto-elevate to root via sudo if needed
168
168
  - All paths are anchored to /root/ (forced HOME=/root)
169
169
  - npm uses npmmirror, pip uses tsinghua mirror (China acceleration)
170
- - Node.js >= 22.16 is auto-installed if missing
170
+ - Node.js >= 24 (LTS) is auto-installed/upgraded via nvm if missing or too old
171
171
  `);
172
172
  }
173
173
  main().catch((err) => {
@@ -9,14 +9,16 @@ export declare const OPENVIKING_HOME = "/root/.openviking";
9
9
  export declare const OPENVIKING_CONF = "/root/.openviking/ov.conf";
10
10
  export declare const OPENVIKING_ENV = "/root/.openclaw/openviking.env";
11
11
  export declare const OPENVIKING_PORT = 1933;
12
- export declare const NODE_MIN_MAJOR = 22;
13
- export declare const NODE_MIN_MINOR = 16;
14
- export declare const NODE_INSTALL_VERSION = "22.16.0";
12
+ export declare const NODE_MIN_MAJOR = 24;
13
+ export declare const NODE_MIN_MINOR = 0;
14
+ export declare const NODE_INSTALL_VERSION = "24";
15
15
  export declare const NPM_REGISTRY = "https://registry.npmmirror.com";
16
16
  export declare const PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple";
17
17
  export declare const PIP_TRUSTED_HOST = "pypi.tuna.tsinghua.edu.cn";
18
18
  export declare const NODE_MIRROR = "https://npmmirror.com/mirrors/node";
19
19
  export declare const JSDELIVR_GH = "https://cdn.jsdelivr.net/gh";
20
+ export declare const NVM_VERSION = "v0.40.3";
21
+ export declare const NVM_SH_SOURCES: string[];
20
22
  export declare const OPENVIKING_REPO = "volcengine/OpenViking";
21
23
  export declare const OPENVIKING_PLUGIN_DIR = "examples/openclaw-plugin";
22
24
  export declare const OPENVIKING_PLUGIN_REQUIRED_FILES: string[];
@@ -13,10 +13,16 @@ export const OPENVIKING_HOME = '/root/.openviking';
13
13
  export const OPENVIKING_CONF = `${OPENVIKING_HOME}/ov.conf`;
14
14
  export const OPENVIKING_ENV = `${OPENCLAW_HOME}/openviking.env`;
15
15
  export const OPENVIKING_PORT = 1933;
16
- // Version requirementsslightly above official minimum (Node >= 22.14)
17
- export const NODE_MIN_MAJOR = 22;
18
- export const NODE_MIN_MINOR = 16;
19
- export const NODE_INSTALL_VERSION = '22.16.0';
16
+ // Node baselinestandardize on the current LTS (Node 24, "Krypton").
17
+ // openclaw keeps raising its own minimum over time (e.g. >=22.19), so any
18
+ // host sitting on an older Node makes `openclaw onboard` fail with
19
+ // "Node.js vX is required". Keeping the CLI's floor well ahead means a stale
20
+ // host is auto-upgraded via nvm (see deps.ts) — never a hard error.
21
+ export const NODE_MIN_MAJOR = 24;
22
+ export const NODE_MIN_MINOR = 0;
23
+ // Major-only: nvm resolves the latest 24.x LTS patch at install time, so we
24
+ // pick up security releases without bumping a pinned version here.
25
+ export const NODE_INSTALL_VERSION = '24';
20
26
  // China mirrors
21
27
  export const NPM_REGISTRY = 'https://registry.npmmirror.com';
22
28
  export const PIP_INDEX_URL = 'https://pypi.tuna.tsinghua.edu.cn/simple';
@@ -24,6 +30,19 @@ export const PIP_TRUSTED_HOST = 'pypi.tuna.tsinghua.edu.cn';
24
30
  export const NODE_MIRROR = 'https://npmmirror.com/mirrors/node';
25
31
  // jsdelivr CDN for GitHub content (works in China, GitHub raw does not)
26
32
  export const JSDELIVR_GH = 'https://cdn.jsdelivr.net/gh';
33
+ // nvm install sources. The official install.sh clones/downloads from GitHub
34
+ // (raw.githubusercontent.com / github.com .git) which is unreliable in China,
35
+ // so instead we drop nvm.sh itself directly — a single self-contained file that
36
+ // is enough for `nvm install/use/alias`. jsdelivr serves any repo file and is
37
+ // reachable in China; gitee/github raw are fallbacks. Tried in order, each curl
38
+ // time-bounded, and validated by running `nvm --version` (rejects HTML/redirect
39
+ // bodies that still return 200).
40
+ export const NVM_VERSION = 'v0.40.3';
41
+ export const NVM_SH_SOURCES = [
42
+ `${JSDELIVR_GH}/nvm-sh/nvm@${NVM_VERSION}/nvm.sh`,
43
+ `https://gitee.com/mirrors/nvm/raw/${NVM_VERSION}/nvm.sh`,
44
+ `https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/nvm.sh`,
45
+ ];
27
46
  export const OPENVIKING_REPO = 'volcengine/OpenViking';
28
47
  export const OPENVIKING_PLUGIN_DIR = 'examples/openclaw-plugin';
29
48
  // Plugin files to download (same as ov-install)
@@ -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,yEAAyE;AACzE,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C,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;AACzD,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,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,6 +1,6 @@
1
1
  import { shell, shellCapture, commandExists } from './shell.js';
2
2
  import { info, warn } from './logger.js';
3
- import { NODE_MIN_MAJOR, NODE_MIN_MINOR, NODE_INSTALL_VERSION, NODE_MIRROR, } from './constants.js';
3
+ import { NODE_MIN_MAJOR, NODE_MIN_MINOR, NODE_INSTALL_VERSION, NODE_MIRROR, NVM_SH_SOURCES, } from './constants.js';
4
4
  /**
5
5
  * Ensure Node.js >= NODE_MIN_MAJOR.NODE_MIN_MINOR is installed via nvm.
6
6
  * Installs nvm first if not present, then installs Node.js through nvm.
@@ -31,17 +31,22 @@ async function ensureNvm() {
31
31
  return;
32
32
  }
33
33
  info('nvm not found, installing...');
34
- // Install nvm from gitee mirror (GitHub is unreliable in China)
35
- await shell(`curl -fsSL https://gitee.com/mirrors/nvm/raw/master/install.sh | PROFILE=/dev/null NVM_DIR=${NVM_DIR} bash`).catch(async () => {
36
- // Fallback: npmmirror hosted nvm install script
37
- info('Retrying nvm install from npmmirror...');
38
- await shell(`curl -fsSL https://npmmirror.com/mirrors/nvm/v0.40.3/install.sh | PROFILE=/dev/null NVM_DIR=${NVM_DIR} bash`);
39
- });
40
- // Verify
41
- const verify = await shellCapture('nvm --version');
42
- if (verify.code !== 0)
43
- throw new Error('nvm installation failed');
44
- info(`nvm ${verify.stdout.trim()} installed ✓`);
34
+ // 不跑官方 install.sh:它内部从 GitHub clone/下载,国内不可靠且无超时会卡住部署。
35
+ // 直接把 nvm.sh 本体落到 $NVM_DIR(单文件即可支撑 nvm install/use/alias)。
36
+ // 多源按序尝试,每个 curl --connect-timeout/--max-time 快速失败,并用
37
+ // `nvm --version` 校验真的拿到了可用 nvm(镜像偶发返回重定向/HTML 也是 200)。
38
+ for (const src of NVM_SH_SOURCES) {
39
+ const dl = await shellCapture(`mkdir -p ${NVM_DIR} && curl -fsSL --connect-timeout 10 --max-time 60 '${src}' -o ${NVM_DIR}/nvm.sh`);
40
+ if (dl.code === 0) {
41
+ const verify = await shellCapture('nvm --version');
42
+ if (verify.code === 0) {
43
+ info(`nvm ${verify.stdout.trim()} installed (source: ${src}) ✓`);
44
+ return;
45
+ }
46
+ }
47
+ warn(`nvm source unavailable, trying next: ${src}`);
48
+ }
49
+ throw new Error('nvm installation failed: all sources unreachable (jsdelivr/gitee/github)');
45
50
  }
46
51
  async function installNodejs() {
47
52
  info(`Installing Node.js ${NODE_INSTALL_VERSION} via nvm...`);
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okclaw-build/cli",
3
- "version": "1.0.0-beta.47",
3
+ "version": "1.0.0-beta.48",
4
4
  "description": "OKClaw deployment CLI - install and manage OpenClaw, OpenViking, and channel plugins",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1 +0,0 @@
1
- export declare function migrationCommand(args: string[]): Promise<void>;
@@ -1,205 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/commands/migration.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
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;
@@ -1,84 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/migration/archive.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
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;
@@ -1,56 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,39 +0,0 @@
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;
@@ -1,140 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/migration/manifest.ts"],"names":[],"mappings":"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"}