@cleocode/core 2026.9.16 → 2026.9.18
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/changesets/parser.d.ts.map +1 -1
- package/dist/changesets/parser.js +67 -0
- package/dist/changesets/parser.js.map +1 -1
- package/dist/crypto/credentials.d.ts +128 -26
- package/dist/crypto/credentials.d.ts.map +1 -1
- package/dist/crypto/credentials.js +183 -142
- package/dist/crypto/credentials.js.map +1 -1
- package/dist/docs/export-document.js +14705 -12949
- package/dist/docs/export-document.js.map +3 -3
- package/dist/doctor/index.d.ts +1 -1
- package/dist/doctor/index.d.ts.map +1 -1
- package/dist/doctor/index.js +1 -1
- package/dist/doctor/index.js.map +1 -1
- package/dist/doctor/nexus-schema-residency.d.ts +1 -1
- package/dist/doctor/nexus-schema-residency.d.ts.map +1 -1
- package/dist/doctor/nexus-schema-residency.js +1 -0
- package/dist/doctor/nexus-schema-residency.js.map +1 -1
- package/dist/doctor/project-identity.d.ts +124 -0
- package/dist/doctor/project-identity.d.ts.map +1 -0
- package/dist/doctor/project-identity.js +307 -0
- package/dist/doctor/project-identity.js.map +1 -0
- package/dist/doctor/superseded-store.d.ts +8 -0
- package/dist/doctor/superseded-store.d.ts.map +1 -1
- package/dist/doctor/superseded-store.js +48 -3
- package/dist/doctor/superseded-store.js.map +1 -1
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +17 -2
- package/dist/init.js.map +1 -1
- package/dist/internal.d.ts +6 -3
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +4 -2
- package/dist/internal.js.map +1 -1
- package/dist/llm/credentials-store.d.ts +10 -0
- package/dist/llm/credentials-store.d.ts.map +1 -1
- package/dist/llm/credentials-store.js +7 -1
- package/dist/llm/credentials-store.js.map +1 -1
- package/dist/llm/plugin-facade.js +13368 -1550
- package/dist/llm/plugin-facade.js.map +3 -3
- package/dist/nexus/analyze-orchestrator.d.ts +20 -3
- package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
- package/dist/nexus/analyze-orchestrator.js +210 -16
- package/dist/nexus/analyze-orchestrator.js.map +1 -1
- package/dist/nexus/assessment-store.d.ts +86 -0
- package/dist/nexus/assessment-store.d.ts.map +1 -0
- package/dist/nexus/assessment-store.js +113 -0
- package/dist/nexus/assessment-store.js.map +1 -0
- package/dist/nexus/freshness.d.ts +131 -0
- package/dist/nexus/freshness.d.ts.map +1 -0
- package/dist/nexus/freshness.js +391 -0
- package/dist/nexus/freshness.js.map +1 -0
- package/dist/nexus/graph-manifest.d.ts +88 -0
- package/dist/nexus/graph-manifest.d.ts.map +1 -0
- package/dist/nexus/graph-manifest.js +114 -0
- package/dist/nexus/graph-manifest.js.map +1 -0
- package/dist/nexus/knowledge.d.ts +21 -1
- package/dist/nexus/knowledge.d.ts.map +1 -1
- package/dist/nexus/knowledge.js +74 -37
- package/dist/nexus/knowledge.js.map +1 -1
- package/dist/nexus/path-map.d.ts +55 -0
- package/dist/nexus/path-map.d.ts.map +1 -0
- package/dist/nexus/path-map.js +87 -0
- package/dist/nexus/path-map.js.map +1 -0
- package/dist/nexus/projects-clean.d.ts +21 -28
- package/dist/nexus/projects-clean.d.ts.map +1 -1
- package/dist/nexus/projects-clean.js +168 -85
- package/dist/nexus/projects-clean.js.map +1 -1
- package/dist/nexus/query.d.ts.map +1 -1
- package/dist/nexus/query.js +3 -2
- package/dist/nexus/query.js.map +1 -1
- package/dist/nexus/registry-hygiene.d.ts +70 -0
- package/dist/nexus/registry-hygiene.d.ts.map +1 -0
- package/dist/nexus/registry-hygiene.js +113 -0
- package/dist/nexus/registry-hygiene.js.map +1 -0
- package/dist/nexus/registry.d.ts +2 -2
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +48 -12
- package/dist/nexus/registry.js.map +1 -1
- package/dist/paths.d.ts +26 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +99 -6
- package/dist/paths.js.map +1 -1
- package/dist/release/index.d.ts +1 -1
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js.map +1 -1
- package/dist/release/plan.d.ts +84 -2
- package/dist/release/plan.d.ts.map +1 -1
- package/dist/release/plan.js +61 -14
- package/dist/release/plan.js.map +1 -1
- package/dist/release/pr-evidence.d.ts +81 -1
- package/dist/release/pr-evidence.d.ts.map +1 -1
- package/dist/release/pr-evidence.js +149 -9
- package/dist/release/pr-evidence.js.map +1 -1
- package/dist/render/nexus/graph/index.d.ts.map +1 -1
- package/dist/render/nexus/graph/index.js +8 -0
- package/dist/render/nexus/graph/index.js.map +1 -1
- package/dist/scaffold/ensure-config.d.ts +12 -3
- package/dist/scaffold/ensure-config.d.ts.map +1 -1
- package/dist/scaffold/ensure-config.js +61 -38
- package/dist/scaffold/ensure-config.js.map +1 -1
- package/dist/scaffold/project-identity.d.ts +136 -0
- package/dist/scaffold/project-identity.d.ts.map +1 -0
- package/dist/scaffold/project-identity.js +225 -0
- package/dist/scaffold/project-identity.js.map +1 -0
- package/dist/selfimprove/fix-gen.js +13319 -1556
- package/dist/selfimprove/fix-gen.js.map +3 -3
- package/dist/store/agent-api-key.d.ts +114 -0
- package/dist/store/agent-api-key.d.ts.map +1 -0
- package/dist/store/agent-api-key.js +136 -0
- package/dist/store/agent-api-key.js.map +1 -0
- package/dist/store/agent-registry-accessor.d.ts +4 -2
- package/dist/store/agent-registry-accessor.d.ts.map +1 -1
- package/dist/store/agent-registry-accessor.js +39 -89
- package/dist/store/agent-registry-accessor.js.map +1 -1
- package/dist/store/api-key-kdf.d.ts +7 -0
- package/dist/store/api-key-kdf.d.ts.map +1 -1
- package/dist/store/api-key-kdf.js +7 -0
- package/dist/store/api-key-kdf.js.map +1 -1
- package/dist/store/backup-crypto.d.ts +49 -0
- package/dist/store/backup-crypto.d.ts.map +1 -1
- package/dist/store/backup-crypto.js +154 -0
- package/dist/store/backup-crypto.js.map +1 -1
- package/dist/store/credential-transfer.d.ts +303 -0
- package/dist/store/credential-transfer.d.ts.map +1 -0
- package/dist/store/credential-transfer.js +774 -0
- package/dist/store/credential-transfer.js.map +1 -0
- package/dist/store/exodus/column-transforms.d.ts +79 -4
- package/dist/store/exodus/column-transforms.d.ts.map +1 -1
- package/dist/store/exodus/column-transforms.js +121 -4
- package/dist/store/exodus/column-transforms.js.map +1 -1
- package/dist/store/exodus/index.d.ts +1 -0
- package/dist/store/exodus/index.d.ts.map +1 -1
- package/dist/store/exodus/index.js +1 -0
- package/dist/store/exodus/index.js.map +1 -1
- package/dist/store/exodus/migrate.d.ts +17 -1
- package/dist/store/exodus/migrate.d.ts.map +1 -1
- package/dist/store/exodus/migrate.js +155 -33
- package/dist/store/exodus/migrate.js.map +1 -1
- package/dist/store/exodus/on-open.d.ts +14 -0
- package/dist/store/exodus/on-open.d.ts.map +1 -1
- package/dist/store/exodus/on-open.js +115 -6
- package/dist/store/exodus/on-open.js.map +1 -1
- package/dist/store/exodus/reconcile.d.ts +103 -0
- package/dist/store/exodus/reconcile.d.ts.map +1 -0
- package/dist/store/exodus/reconcile.js +728 -0
- package/dist/store/exodus/reconcile.js.map +1 -0
- package/dist/store/exodus/recovery.d.ts.map +1 -1
- package/dist/store/exodus/recovery.js +14 -2
- package/dist/store/exodus/recovery.js.map +1 -1
- package/dist/store/exodus/runtime-targets.d.ts +39 -0
- package/dist/store/exodus/runtime-targets.d.ts.map +1 -0
- package/dist/store/exodus/runtime-targets.js +63 -0
- package/dist/store/exodus/runtime-targets.js.map +1 -0
- package/dist/store/exodus/table-name-map.d.ts.map +1 -1
- package/dist/store/exodus/table-name-map.js +5 -0
- package/dist/store/exodus/table-name-map.js.map +1 -1
- package/dist/store/exodus/table-order.d.ts +35 -0
- package/dist/store/exodus/table-order.d.ts.map +1 -0
- package/dist/store/exodus/table-order.js +62 -0
- package/dist/store/exodus/table-order.js.map +1 -0
- package/dist/store/exodus/verify-migration.d.ts +4 -1
- package/dist/store/exodus/verify-migration.d.ts.map +1 -1
- package/dist/store/exodus/verify-migration.js +142 -10
- package/dist/store/exodus/verify-migration.js.map +1 -1
- package/dist/store/global-salt.d.ts +16 -0
- package/dist/store/global-salt.d.ts.map +1 -1
- package/dist/store/global-salt.js +22 -7
- package/dist/store/global-salt.js.map +1 -1
- package/dist/store/legacy-tasks-lineage.d.ts +86 -0
- package/dist/store/legacy-tasks-lineage.d.ts.map +1 -0
- package/dist/store/legacy-tasks-lineage.js +285 -0
- package/dist/store/legacy-tasks-lineage.js.map +1 -0
- package/dist/store/migration-manager.d.ts +27 -0
- package/dist/store/migration-manager.d.ts.map +1 -1
- package/dist/store/migration-manager.js +63 -0
- package/dist/store/migration-manager.js.map +1 -1
- package/dist/store/portable-bundle-import.d.ts +117 -0
- package/dist/store/portable-bundle-import.d.ts.map +1 -0
- package/dist/store/portable-bundle-import.js +589 -0
- package/dist/store/portable-bundle-import.js.map +1 -0
- package/dist/store/portable-bundle-relocate.d.ts +66 -0
- package/dist/store/portable-bundle-relocate.d.ts.map +1 -0
- package/dist/store/portable-bundle-relocate.js +304 -0
- package/dist/store/portable-bundle-relocate.js.map +1 -0
- package/dist/store/portable-bundle-scan.d.ts +167 -0
- package/dist/store/portable-bundle-scan.d.ts.map +1 -0
- package/dist/store/portable-bundle-scan.js +569 -0
- package/dist/store/portable-bundle-scan.js.map +1 -0
- package/dist/store/portable-bundle.d.ts +146 -0
- package/dist/store/portable-bundle.d.ts.map +1 -0
- package/dist/store/portable-bundle.js +674 -0
- package/dist/store/portable-bundle.js.map +1 -0
- package/dist/store/regenerators.d.ts +3 -1
- package/dist/store/regenerators.d.ts.map +1 -1
- package/dist/store/regenerators.js +6 -2
- package/dist/store/regenerators.js.map +1 -1
- package/dist/store/schema/cleo-global/nexus.d.ts +98 -0
- package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/nexus.js +19 -0
- package/dist/store/schema/cleo-global/nexus.js.map +1 -1
- package/dist/store/schema/nexus-schema.d.ts +102 -0
- package/dist/store/schema/nexus-schema.d.ts.map +1 -1
- package/dist/store/schema/nexus-schema.js +24 -0
- package/dist/store/schema/nexus-schema.js.map +1 -1
- package/dist/store/split-brain-import.d.ts +176 -0
- package/dist/store/split-brain-import.d.ts.map +1 -0
- package/dist/store/split-brain-import.js +680 -0
- package/dist/store/split-brain-import.js.map +1 -0
- package/dist/store/sqlite.d.ts +29 -0
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +57 -5
- package/dist/store/sqlite.js.map +1 -1
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +30 -5
- package/dist/system/health.js.map +1 -1
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +5 -27
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/evidence.js +1 -1
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/verification-policy.d.ts +55 -0
- package/dist/tasks/verification-policy.d.ts.map +1 -0
- package/dist/tasks/verification-policy.js +75 -0
- package/dist/tasks/verification-policy.js.map +1 -0
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +60 -0
- package/dist/upgrade.js.map +1 -1
- package/dist/validation/doctor/checks.d.ts +14 -0
- package/dist/validation/doctor/checks.d.ts.map +1 -1
- package/dist/validation/doctor/checks.js +33 -0
- package/dist/validation/doctor/checks.js.map +1 -1
- package/migrations/drizzle-cleo-global/20260924000000_t12354-project-paths/migration.sql +40 -0
- package/migrations/drizzle-nexus/20260924000000_t12315-nexus-parse-cache/migration.sql +21 -0
- package/package.json +13 -13
- package/templates/CLEO-INJECTION.md +3 -3
- package/templates/cleo-gitignore +7 -0
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* portable-bundle-import.ts — import side of the lossless machine-migration
|
|
3
|
+
* bundle (manifest v2).
|
|
4
|
+
*
|
|
5
|
+
* Order of operations (nothing is placed until everything is verified):
|
|
6
|
+
* 1. decrypt (streamed) and extract into a staging directory;
|
|
7
|
+
* 2. verify the manifest self-hash, every file's size + SHA-256, and
|
|
8
|
+
* `PRAGMA integrity_check` on every database;
|
|
9
|
+
* 3. resolve destinations (`--target` for a single project, `--map`
|
|
10
|
+
* prefix rewrites, else the original paths) and refuse to overwrite
|
|
11
|
+
* live data without `force`;
|
|
12
|
+
* 4. relocate the STAGED copies (paths, registry rows) when a project
|
|
13
|
+
* moves;
|
|
14
|
+
* 5. place files and databases (tmp + rename, stale WAL sidecars removed);
|
|
15
|
+
* 6. re-count every table of every placed database and compare with the
|
|
16
|
+
* manifest — any mismatch fails the import;
|
|
17
|
+
* 7. encrypted bundles: unseal the passphrase-sealed credentials and
|
|
18
|
+
* re-encrypt each under the TARGET home's machine-key (the bundle never
|
|
19
|
+
* carries the source machine-key), reporting any that must be re-entered.
|
|
20
|
+
*
|
|
21
|
+
* @task T12318
|
|
22
|
+
* @epic T12317
|
|
23
|
+
* @module store/portable-bundle-import
|
|
24
|
+
*/
|
|
25
|
+
import fs from 'node:fs';
|
|
26
|
+
import { createRequire } from 'node:module';
|
|
27
|
+
import path from 'node:path';
|
|
28
|
+
import { extract as tarExtract, list as tarList } from 'tar';
|
|
29
|
+
import { generateProjectHash } from '../nexus/hash.js';
|
|
30
|
+
import { getCleoConfigDir, getCleoHome } from '../paths.js';
|
|
31
|
+
import { decryptFileStream, encryptedBundleVersion, STREAM_FORMAT_VERSION, } from './backup-crypto.js';
|
|
32
|
+
import { reentryFor, unsealCredentials } from './credential-transfer.js';
|
|
33
|
+
import { allSections, computeManifestHash, PortableBundleError } from './portable-bundle.js';
|
|
34
|
+
import { isUnderRoot, relocateDatabase, relocatePath, relocateProjectFiles, } from './portable-bundle-relocate.js';
|
|
35
|
+
import { countRows, integrityCheck, KEY_COUNT_TABLES, sha256File } from './portable-bundle-scan.js';
|
|
36
|
+
const _require = createRequire(import.meta.url);
|
|
37
|
+
const { DatabaseSync } = _require('node:sqlite');
|
|
38
|
+
/**
|
|
39
|
+
* Parse `--map` values (`<old>=<new>`).
|
|
40
|
+
*
|
|
41
|
+
* @param values - Raw flag values.
|
|
42
|
+
* @returns Parsed mappings with resolved absolute prefixes.
|
|
43
|
+
* @throws {PortableBundleError} `E_BUNDLE_FORMAT` on a malformed value.
|
|
44
|
+
*/
|
|
45
|
+
export function parsePathMappings(values) {
|
|
46
|
+
return values.map((raw) => {
|
|
47
|
+
const eq = raw.indexOf('=');
|
|
48
|
+
if (eq <= 0 || eq === raw.length - 1) {
|
|
49
|
+
throw new PortableBundleError('E_TARGET_AMBIGUOUS', `--map expects <oldPrefix>=<newPrefix>, got "${raw}"`);
|
|
50
|
+
}
|
|
51
|
+
return { from: path.resolve(raw.slice(0, eq)), to: path.resolve(raw.slice(eq + 1)) };
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Apply the longest matching prefix mapping to a path.
|
|
56
|
+
*
|
|
57
|
+
* @param original - Original absolute path.
|
|
58
|
+
* @param maps - Mappings.
|
|
59
|
+
* @returns The mapped path (unchanged when nothing matches).
|
|
60
|
+
*/
|
|
61
|
+
export function applyPathMappings(original, maps) {
|
|
62
|
+
let best = null;
|
|
63
|
+
for (const m of maps) {
|
|
64
|
+
if (isUnderRoot(original, m.from) && (best === null || m.from.length > best.from.length)) {
|
|
65
|
+
best = m;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return best ? relocatePath(original, best.from, best.to) : original;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Peek at a bundle and report whether it is a portable (manifest v2) bundle.
|
|
72
|
+
*
|
|
73
|
+
* Encrypted bundles are identified by their format version byte; unencrypted
|
|
74
|
+
* ones by the `format` field of their first entry, `manifest.json`.
|
|
75
|
+
*
|
|
76
|
+
* @param bundlePath - Bundle file.
|
|
77
|
+
* @returns `v2`, `v1`, or `unknown`.
|
|
78
|
+
*/
|
|
79
|
+
export async function detectBundleFormat(bundlePath) {
|
|
80
|
+
const header = Buffer.alloc(9);
|
|
81
|
+
const fd = fs.openSync(bundlePath, 'r');
|
|
82
|
+
try {
|
|
83
|
+
fs.readSync(fd, header, 0, 9, 0);
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
fs.closeSync(fd);
|
|
87
|
+
}
|
|
88
|
+
const version = encryptedBundleVersion(header);
|
|
89
|
+
if (version !== null)
|
|
90
|
+
return version === STREAM_FORMAT_VERSION ? 'v2' : 'v1';
|
|
91
|
+
const found = { text: null };
|
|
92
|
+
try {
|
|
93
|
+
await tarList({
|
|
94
|
+
file: bundlePath,
|
|
95
|
+
filter: (p) => p === 'manifest.json',
|
|
96
|
+
onReadEntry: (entry) => {
|
|
97
|
+
const chunks = [];
|
|
98
|
+
entry.on('data', (c) => chunks.push(c));
|
|
99
|
+
entry.on('end', () => {
|
|
100
|
+
found.text = Buffer.concat(chunks).toString('utf-8');
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return 'unknown';
|
|
107
|
+
}
|
|
108
|
+
if (found.text === null)
|
|
109
|
+
return 'unknown';
|
|
110
|
+
try {
|
|
111
|
+
const parsed = JSON.parse(found.text);
|
|
112
|
+
if (parsed.format === 'cleo-portable-bundle')
|
|
113
|
+
return 'v2';
|
|
114
|
+
if (typeof parsed.manifestVersion === 'string' && parsed.manifestVersion.startsWith('1.')) {
|
|
115
|
+
return 'v1';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return 'unknown';
|
|
120
|
+
}
|
|
121
|
+
return 'unknown';
|
|
122
|
+
}
|
|
123
|
+
/** Verify the staged bundle; throws on any integrity failure. */
|
|
124
|
+
async function verifyStaged(stagingDir) {
|
|
125
|
+
const manifestPath = path.join(stagingDir, 'manifest.json');
|
|
126
|
+
if (!fs.existsSync(manifestPath)) {
|
|
127
|
+
throw new PortableBundleError('E_BUNDLE_FORMAT', 'manifest.json is missing from the bundle');
|
|
128
|
+
}
|
|
129
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
130
|
+
if (manifest.format !== 'cleo-portable-bundle' || !manifest.manifestVersion?.startsWith('2.')) {
|
|
131
|
+
throw new PortableBundleError('E_BUNDLE_FORMAT', 'Not a portable (manifest v2) bundle — use the legacy import path for v1 bundles');
|
|
132
|
+
}
|
|
133
|
+
if (computeManifestHash(manifest) !== manifest.integrity.manifestHash) {
|
|
134
|
+
throw new PortableBundleError('E_BUNDLE_INTEGRITY', 'Manifest self-hash mismatch — the manifest was modified after export');
|
|
135
|
+
}
|
|
136
|
+
for (const section of allSections(manifest)) {
|
|
137
|
+
for (const entry of [...section.databases, ...section.files]) {
|
|
138
|
+
const abs = path.join(stagingDir, entry.bundlePath);
|
|
139
|
+
if (!abs.startsWith(`${stagingDir}${path.sep}`) || !fs.existsSync(abs)) {
|
|
140
|
+
throw new PortableBundleError('E_BUNDLE_INTEGRITY', `Bundle entry missing or outside the archive root: ${entry.bundlePath}`);
|
|
141
|
+
}
|
|
142
|
+
if (fs.statSync(abs).size !== entry.size || (await sha256File(abs)) !== entry.sha256) {
|
|
143
|
+
throw new PortableBundleError('E_BUNDLE_INTEGRITY', `Size/SHA-256 mismatch: ${entry.bundlePath}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const sealed = section.sealedCredentials;
|
|
147
|
+
if (sealed) {
|
|
148
|
+
const abs = path.join(stagingDir, sealed.bundlePath);
|
|
149
|
+
if (!abs.startsWith(`${stagingDir}${path.sep}`) ||
|
|
150
|
+
!fs.existsSync(abs) ||
|
|
151
|
+
fs.statSync(abs).size !== sealed.size ||
|
|
152
|
+
(await sha256File(abs)) !== sealed.sha256) {
|
|
153
|
+
throw new PortableBundleError('E_BUNDLE_INTEGRITY', `Sealed credentials missing or modified: ${sealed.bundlePath}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
for (const db of section.databases) {
|
|
157
|
+
const result = integrityCheck(path.join(stagingDir, db.bundlePath));
|
|
158
|
+
if (result !== 'ok') {
|
|
159
|
+
throw new PortableBundleError('E_BUNDLE_INTEGRITY', `PRAGMA integrity_check failed for ${db.bundlePath}: ${result}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return manifest;
|
|
164
|
+
}
|
|
165
|
+
function planPlacements(manifest, input, cleoHome, configHome) {
|
|
166
|
+
const plans = [];
|
|
167
|
+
if (manifest.global) {
|
|
168
|
+
plans.push({ kind: 'global-home', section: manifest.global.home, destDir: cleoHome });
|
|
169
|
+
if (manifest.global.config) {
|
|
170
|
+
plans.push({ kind: 'global-config', section: manifest.global.config, destDir: configHome });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (input.target !== undefined && manifest.projects.length !== 1) {
|
|
174
|
+
throw new PortableBundleError('E_TARGET_AMBIGUOUS', `--target applies to a single-project bundle; this bundle holds ${manifest.projects.length} projects (use --map)`);
|
|
175
|
+
}
|
|
176
|
+
const maps = input.maps ?? [];
|
|
177
|
+
const seen = new Map();
|
|
178
|
+
for (const project of manifest.projects) {
|
|
179
|
+
const destRoot = input.target !== undefined
|
|
180
|
+
? path.resolve(input.target)
|
|
181
|
+
: applyPathMappings(project.originalPath, maps);
|
|
182
|
+
const prior = seen.get(destRoot);
|
|
183
|
+
if (prior !== undefined) {
|
|
184
|
+
throw new PortableBundleError('E_TARGET_AMBIGUOUS', `Two projects map to the same destination ${destRoot}: ${prior} and ${project.originalPath}`);
|
|
185
|
+
}
|
|
186
|
+
seen.set(destRoot, project.originalPath);
|
|
187
|
+
plans.push({
|
|
188
|
+
kind: 'project',
|
|
189
|
+
section: project,
|
|
190
|
+
destDir: path.join(destRoot, '.cleo'),
|
|
191
|
+
project,
|
|
192
|
+
destRoot,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return plans;
|
|
196
|
+
}
|
|
197
|
+
function assertNoLiveData(plans) {
|
|
198
|
+
const existing = [];
|
|
199
|
+
for (const plan of plans) {
|
|
200
|
+
for (const db of plan.section.databases) {
|
|
201
|
+
if (db.role !== 'primary')
|
|
202
|
+
continue;
|
|
203
|
+
const abs = path.join(plan.destDir, db.relPath);
|
|
204
|
+
if (fs.existsSync(abs))
|
|
205
|
+
existing.push(abs);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (existing.length > 0) {
|
|
209
|
+
throw new PortableBundleError('E_DATA_EXISTS', `Target already has live data: ${existing.join(', ')}. Re-run with --force to overwrite.`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** Rewrite registry rows in a STAGED global store for projects that moved. */
|
|
213
|
+
function relocateRegistryRows(stagedGlobalDb, moves) {
|
|
214
|
+
const outcomes = new Map();
|
|
215
|
+
const db = new DatabaseSync(stagedGlobalDb);
|
|
216
|
+
try {
|
|
217
|
+
for (const move of moves) {
|
|
218
|
+
if (move.from === move.to) {
|
|
219
|
+
outcomes.set(move.from, { status: 'unchanged', detail: 'project path unchanged' });
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
// Mirrors nexusMoveProject's column set; done on the staged file so the
|
|
223
|
+
// live registry is never half-updated.
|
|
224
|
+
let changes = 0;
|
|
225
|
+
try {
|
|
226
|
+
changes = Number(db
|
|
227
|
+
.prepare('UPDATE nexus_project_registry SET project_path = ?, project_hash = ?, brain_db_path = ?, tasks_db_path = ?, last_seen = ? WHERE project_path = ? OR (? IS NOT NULL AND project_id = ?)')
|
|
228
|
+
.run(move.to, generateProjectHash(move.to), path.join(move.to, '.cleo', 'brain.db'), path.join(move.to, '.cleo', 'tasks.db'), new Date().toISOString(), move.from, move.projectId, move.projectId).changes);
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
// e.g. another (stale) registry row already owns the new path.
|
|
232
|
+
outcomes.set(move.from, {
|
|
233
|
+
status: 'failed',
|
|
234
|
+
detail: `${err instanceof Error ? err.message : String(err)} — resolve with \`cleo nexus projects list\` then \`cleo nexus projects register ${move.to}\``,
|
|
235
|
+
});
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
outcomes.set(move.from, changes > 0
|
|
239
|
+
? { status: 'updated', detail: `registry row for ${move.from} -> ${move.to}` }
|
|
240
|
+
: {
|
|
241
|
+
status: 'not-in-registry',
|
|
242
|
+
detail: `neither ${move.from} nor projectId ${move.projectId ?? '(none)'} is in the bundled registry; run \`cleo nexus projects register ${move.to}\``,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
db.close();
|
|
248
|
+
}
|
|
249
|
+
return outcomes;
|
|
250
|
+
}
|
|
251
|
+
function placeSection(stagingDir, plan) {
|
|
252
|
+
fs.mkdirSync(plan.destDir, { recursive: true });
|
|
253
|
+
for (const f of plan.section.files) {
|
|
254
|
+
const src = path.join(stagingDir, f.bundlePath);
|
|
255
|
+
const dst = path.join(plan.destDir, f.relPath);
|
|
256
|
+
fs.mkdirSync(path.dirname(dst), { recursive: true });
|
|
257
|
+
fs.copyFileSync(src, dst);
|
|
258
|
+
fs.chmodSync(dst, fs.statSync(src).mode & 0o777);
|
|
259
|
+
}
|
|
260
|
+
for (const d of plan.section.databases) {
|
|
261
|
+
const src = path.join(stagingDir, d.bundlePath);
|
|
262
|
+
const dst = path.join(plan.destDir, d.relPath);
|
|
263
|
+
fs.mkdirSync(path.dirname(dst), { recursive: true });
|
|
264
|
+
const tmp = `${dst}.import-tmp-${process.pid}`;
|
|
265
|
+
fs.copyFileSync(src, tmp);
|
|
266
|
+
for (const sidecar of [`${dst}-wal`, `${dst}-shm`, `${dst}-journal`]) {
|
|
267
|
+
fs.rmSync(sidecar, { force: true });
|
|
268
|
+
}
|
|
269
|
+
fs.renameSync(tmp, dst);
|
|
270
|
+
}
|
|
271
|
+
for (const link of plan.section.symlinks ?? []) {
|
|
272
|
+
const dst = path.join(plan.destDir, link.relPath);
|
|
273
|
+
fs.mkdirSync(path.dirname(dst), { recursive: true });
|
|
274
|
+
fs.rmSync(dst, { force: true });
|
|
275
|
+
fs.symlinkSync(link.target, dst);
|
|
276
|
+
}
|
|
277
|
+
return { files: plan.section.files.length, dbs: plan.section.databases.length };
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Re-encrypt one section's sealed credentials under the TARGET home's keys.
|
|
281
|
+
* Runs after every section is placed, so the restored stores (and the
|
|
282
|
+
* bundled `global-salt`) are what the credentials are written into and keyed by.
|
|
283
|
+
* A failure is reported per credential, never thrown: the data is already
|
|
284
|
+
* placed, and a credential that cannot be restored is re-entered.
|
|
285
|
+
*/
|
|
286
|
+
async function restoreSealedCredentials(extractDir, plan, passphrase, cleoHome) {
|
|
287
|
+
const sealed = plan.section.sealedCredentials;
|
|
288
|
+
if (!sealed)
|
|
289
|
+
return { restored: [], reentry: [] };
|
|
290
|
+
const primary = plan.section.databases.find((d) => d.role === 'primary');
|
|
291
|
+
const primaryPath = primary ? path.join(plan.destDir, primary.relPath) : undefined;
|
|
292
|
+
const targets = plan.kind === 'project'
|
|
293
|
+
? {
|
|
294
|
+
...(primaryPath !== undefined ? { projectDbPath: primaryPath } : {}),
|
|
295
|
+
...(plan.project?.projectId ? { projectId: plan.project.projectId } : {}),
|
|
296
|
+
cleoHome,
|
|
297
|
+
}
|
|
298
|
+
: { ...(primaryPath !== undefined ? { globalDbPath: primaryPath } : {}), cleoHome };
|
|
299
|
+
try {
|
|
300
|
+
const result = await unsealCredentials(fs.readFileSync(path.join(extractDir, sealed.bundlePath)), passphrase ?? '', targets);
|
|
301
|
+
return { restored: [...result.restored], reentry: [...result.reentry] };
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
const reason = `sealed credentials could not be restored: ${err instanceof Error ? err.message : String(err)}`;
|
|
305
|
+
return {
|
|
306
|
+
restored: [],
|
|
307
|
+
reentry: [...sealed.reentry, ...sealed.credentials.map((c) => reentryFor(c, reason))],
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function compareCounts(plan) {
|
|
312
|
+
let tablesCompared = 0;
|
|
313
|
+
const mismatches = [];
|
|
314
|
+
const keyCounts = [];
|
|
315
|
+
for (const d of plan.section.databases) {
|
|
316
|
+
const placed = path.join(plan.destDir, d.relPath);
|
|
317
|
+
const actual = countRows(placed).rowCounts;
|
|
318
|
+
for (const [table, expected] of Object.entries(d.rowCounts)) {
|
|
319
|
+
tablesCompared += 1;
|
|
320
|
+
const got = actual[table] ?? null;
|
|
321
|
+
if (got !== expected)
|
|
322
|
+
mismatches.push({ database: d.relPath, table, expected, actual: got });
|
|
323
|
+
if (d.role === 'primary' && KEY_COUNT_TABLES.includes(table)) {
|
|
324
|
+
keyCounts.push({ table, expected, actual: got });
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return { tablesCompared, mismatches, keyCounts };
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Relative paths of a section that relocation rewrote on purpose, so their
|
|
332
|
+
* placed bytes legitimately differ from the manifest.
|
|
333
|
+
*/
|
|
334
|
+
function rewrittenEntries(plan, relocations, registryOutcomes) {
|
|
335
|
+
const out = new Set();
|
|
336
|
+
const report = relocations.get(plan);
|
|
337
|
+
for (const finding of report?.rewritten ?? []) {
|
|
338
|
+
const sep = finding.location.indexOf(':');
|
|
339
|
+
out.add(sep === -1 ? finding.location : finding.location.slice(0, sep));
|
|
340
|
+
}
|
|
341
|
+
if (plan.kind === 'global-home' &&
|
|
342
|
+
[...registryOutcomes.values()].some((o) => o.status === 'updated')) {
|
|
343
|
+
for (const d of plan.section.databases)
|
|
344
|
+
if (d.role === 'primary')
|
|
345
|
+
out.add(d.relPath);
|
|
346
|
+
}
|
|
347
|
+
return out;
|
|
348
|
+
}
|
|
349
|
+
/** Hash every placed file/database of a section against the manifest. */
|
|
350
|
+
async function compareHashes(plan, rewritten) {
|
|
351
|
+
let compared = 0;
|
|
352
|
+
const mismatches = [];
|
|
353
|
+
const skipped = [];
|
|
354
|
+
for (const entry of [...plan.section.databases, ...plan.section.files]) {
|
|
355
|
+
if (rewritten.has(entry.relPath)) {
|
|
356
|
+
skipped.push(entry.relPath);
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
compared += 1;
|
|
360
|
+
const placed = path.join(plan.destDir, entry.relPath);
|
|
361
|
+
if (!fs.existsSync(placed) || (await sha256File(placed)) !== entry.sha256) {
|
|
362
|
+
mismatches.push(entry.relPath);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return { compared, mismatches, skipped };
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Import a portable (manifest v2) bundle.
|
|
369
|
+
*
|
|
370
|
+
* @param input - Import options.
|
|
371
|
+
* @returns Per-section outcomes; `lossless` is true only when every table of
|
|
372
|
+
* every placed database re-counts to the manifest value.
|
|
373
|
+
* @throws {PortableBundleError} On decrypt/format/integrity failure, existing
|
|
374
|
+
* live data without `force`, or an ambiguous destination.
|
|
375
|
+
*
|
|
376
|
+
* @example
|
|
377
|
+
* ```ts
|
|
378
|
+
* const r = await importPortableBundle({ bundlePath: '/b/p.cleobundle.tar.gz', target: '/new/p' });
|
|
379
|
+
* if (!r.lossless) throw new Error('restore is not lossless');
|
|
380
|
+
* ```
|
|
381
|
+
*/
|
|
382
|
+
export async function importPortableBundle(input) {
|
|
383
|
+
const cleoHome = path.resolve(input.cleoHome ?? getCleoHome());
|
|
384
|
+
const configHome = path.resolve(input.configHome ?? getCleoConfigDir());
|
|
385
|
+
const stagingParent = path.resolve(input.stagingParent ?? path.dirname(cleoHome));
|
|
386
|
+
fs.mkdirSync(stagingParent, { recursive: true });
|
|
387
|
+
const stagingDir = fs.mkdtempSync(path.join(stagingParent, '.cleo-import-'));
|
|
388
|
+
const extractDir = path.join(stagingDir, 'bundle');
|
|
389
|
+
fs.mkdirSync(extractDir);
|
|
390
|
+
try {
|
|
391
|
+
// ----- 1. decrypt + extract ------------------------------------------
|
|
392
|
+
const format = await detectBundleFormat(input.bundlePath);
|
|
393
|
+
if (format !== 'v2') {
|
|
394
|
+
throw new PortableBundleError('E_BUNDLE_FORMAT', format === 'v1'
|
|
395
|
+
? 'This is a v1 .cleobundle; it is handled by the legacy import path'
|
|
396
|
+
: 'Unrecognised bundle format');
|
|
397
|
+
}
|
|
398
|
+
let tarPath = input.bundlePath;
|
|
399
|
+
const header = Buffer.alloc(9);
|
|
400
|
+
const fd = fs.openSync(input.bundlePath, 'r');
|
|
401
|
+
fs.readSync(fd, header, 0, 9, 0);
|
|
402
|
+
fs.closeSync(fd);
|
|
403
|
+
if (encryptedBundleVersion(header) !== null) {
|
|
404
|
+
if (!input.passphrase) {
|
|
405
|
+
throw new PortableBundleError('E_PASSPHRASE_REQUIRED', 'Bundle is encrypted; set CLEO_BACKUP_PASSPHRASE or run on a TTY');
|
|
406
|
+
}
|
|
407
|
+
tarPath = path.join(stagingDir, 'bundle.tar.gz');
|
|
408
|
+
try {
|
|
409
|
+
await decryptFileStream(input.bundlePath, tarPath, input.passphrase);
|
|
410
|
+
}
|
|
411
|
+
catch (err) {
|
|
412
|
+
throw new PortableBundleError('E_BUNDLE_DECRYPT', err instanceof Error ? err.message : String(err));
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
await tarExtract({ file: tarPath, cwd: extractDir });
|
|
416
|
+
if (tarPath !== input.bundlePath)
|
|
417
|
+
fs.rmSync(tarPath, { force: true });
|
|
418
|
+
// ----- 2. verify ------------------------------------------------------
|
|
419
|
+
const manifest = await verifyStaged(extractDir);
|
|
420
|
+
// ----- 3. plan + pre-check -------------------------------------------
|
|
421
|
+
const plans = planPlacements(manifest, input, cleoHome, configHome);
|
|
422
|
+
if (input.force !== true)
|
|
423
|
+
assertNoLiveData(plans);
|
|
424
|
+
// ----- 4. relocate staged copies -------------------------------------
|
|
425
|
+
const relocations = new Map();
|
|
426
|
+
for (const plan of plans) {
|
|
427
|
+
if (plan.kind !== 'project' || !plan.project || !plan.destRoot)
|
|
428
|
+
continue;
|
|
429
|
+
const from = plan.project.originalPath;
|
|
430
|
+
const to = plan.destRoot;
|
|
431
|
+
if (from === to)
|
|
432
|
+
continue;
|
|
433
|
+
const report = {
|
|
434
|
+
fromRoot: from,
|
|
435
|
+
toRoot: to,
|
|
436
|
+
rewritten: [],
|
|
437
|
+
leftUnderOldRoot: [],
|
|
438
|
+
leftOutsideRoot: [],
|
|
439
|
+
rewrittenTargetMissing: [],
|
|
440
|
+
};
|
|
441
|
+
// Only the live store is relocated. Legacy files, archives and `.bak`
|
|
442
|
+
// snapshots are historical copies and are restored byte-identical.
|
|
443
|
+
for (const d of plan.section.databases.filter((db) => db.role === 'primary')) {
|
|
444
|
+
relocateDatabase(path.join(extractDir, d.bundlePath), d.relPath, from, to, report);
|
|
445
|
+
}
|
|
446
|
+
relocateProjectFiles(path.join(extractDir, plan.section.bundlePrefix), plan.section.files.map((f) => f.relPath), from, to, report);
|
|
447
|
+
relocations.set(plan, report);
|
|
448
|
+
}
|
|
449
|
+
const globalPrimary = manifest.global?.home.databases.find((d) => d.role === 'primary');
|
|
450
|
+
const registryOutcomes = globalPrimary
|
|
451
|
+
? relocateRegistryRows(path.join(extractDir, globalPrimary.bundlePath), plans
|
|
452
|
+
.filter((p) => p.kind === 'project' && p.project && p.destRoot)
|
|
453
|
+
.map((p) => ({
|
|
454
|
+
projectId: p.project?.projectId ?? null,
|
|
455
|
+
from: p.project?.originalPath ?? '',
|
|
456
|
+
to: p.destRoot ?? '',
|
|
457
|
+
})))
|
|
458
|
+
: new Map();
|
|
459
|
+
// ----- 5. place + 6. verify counts ------------------------------------
|
|
460
|
+
const sections = [];
|
|
461
|
+
for (const plan of plans) {
|
|
462
|
+
const written = placeSection(extractDir, plan);
|
|
463
|
+
const counts = compareCounts(plan);
|
|
464
|
+
const hashes = await compareHashes(plan, rewrittenEntries(plan, relocations, registryOutcomes));
|
|
465
|
+
const result = {
|
|
466
|
+
kind: plan.kind,
|
|
467
|
+
originalRoot: plan.section.originalRoot,
|
|
468
|
+
destinationRoot: plan.destRoot ?? plan.destDir,
|
|
469
|
+
filesWritten: written.files,
|
|
470
|
+
databasesWritten: written.dbs,
|
|
471
|
+
hashesCompared: hashes.compared,
|
|
472
|
+
hashMismatches: hashes.mismatches,
|
|
473
|
+
hashSkipped: hashes.skipped,
|
|
474
|
+
tablesCompared: counts.tablesCompared,
|
|
475
|
+
mismatches: counts.mismatches,
|
|
476
|
+
keyCounts: counts.keyCounts,
|
|
477
|
+
};
|
|
478
|
+
if (plan.project && plan.destRoot) {
|
|
479
|
+
result.name = plan.project.name;
|
|
480
|
+
result.projectId = plan.project.projectId;
|
|
481
|
+
const relocation = relocations.get(plan);
|
|
482
|
+
if (relocation)
|
|
483
|
+
result.relocation = relocation;
|
|
484
|
+
if (plan.project.unmigratedLegacyData) {
|
|
485
|
+
result.unmigratedLegacyData = plan.project.unmigratedLegacyData;
|
|
486
|
+
}
|
|
487
|
+
const fromBundle = registryOutcomes.get(plan.project.originalPath);
|
|
488
|
+
if (fromBundle) {
|
|
489
|
+
result.registry = fromBundle;
|
|
490
|
+
}
|
|
491
|
+
else if (plan.project.unmigratedLegacyData?.detected) {
|
|
492
|
+
// Registering opens the project store, and opening can run the
|
|
493
|
+
// on-open legacy migration. Import only preserves; it never migrates.
|
|
494
|
+
result.registry = {
|
|
495
|
+
status: 'skipped',
|
|
496
|
+
detail: `legacy-only data present (see unmigratedLegacyData); registering opens the store and may migrate it. Run \`cleo nexus projects register ${plan.destRoot}\` when you intend that`,
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
else if (input.registerProject) {
|
|
500
|
+
try {
|
|
501
|
+
result.registry = await input.registerProject(plan.project.projectId, plan.destRoot);
|
|
502
|
+
}
|
|
503
|
+
catch (err) {
|
|
504
|
+
result.registry = {
|
|
505
|
+
status: 'failed',
|
|
506
|
+
detail: `${err instanceof Error ? err.message : String(err)} — run \`cleo nexus projects register ${plan.destRoot}\``,
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
result.registry = {
|
|
512
|
+
status: 'skipped',
|
|
513
|
+
detail: `no global store in this bundle; run \`cleo nexus projects register ${plan.destRoot}\``,
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
sections.push(result);
|
|
518
|
+
}
|
|
519
|
+
// ----- 7. re-encrypt sealed credentials under the TARGET machine-key ---
|
|
520
|
+
const credentials = {
|
|
521
|
+
restored: [],
|
|
522
|
+
reentry: [],
|
|
523
|
+
};
|
|
524
|
+
let anySealed = false;
|
|
525
|
+
for (const plan of plans) {
|
|
526
|
+
if (!plan.section.sealedCredentials)
|
|
527
|
+
continue;
|
|
528
|
+
anySealed = true;
|
|
529
|
+
const outcome = await restoreSealedCredentials(extractDir, plan, input.passphrase, cleoHome);
|
|
530
|
+
for (const c of outcome.restored)
|
|
531
|
+
credentials.restored.push({ ...c, section: plan.destDir });
|
|
532
|
+
for (const c of outcome.reentry)
|
|
533
|
+
credentials.reentry.push({ ...c, section: plan.destDir });
|
|
534
|
+
}
|
|
535
|
+
const requiresReentry = [];
|
|
536
|
+
for (const plan of plans) {
|
|
537
|
+
for (const item of plan.section.requiresReentry) {
|
|
538
|
+
requiresReentry.push({ ...item, section: plan.destDir });
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
const result = {
|
|
542
|
+
bundlePath: path.resolve(input.bundlePath),
|
|
543
|
+
scope: manifest.backup.scope,
|
|
544
|
+
sections,
|
|
545
|
+
lossless: sections.every((s) => s.mismatches.length === 0 && s.hashMismatches.length === 0),
|
|
546
|
+
secretsIncluded: manifest.backup.secretsIncluded,
|
|
547
|
+
requiresReentry,
|
|
548
|
+
...(anySealed ? { credentials } : {}),
|
|
549
|
+
};
|
|
550
|
+
if (input.requireLossless === true && !result.lossless) {
|
|
551
|
+
throw new PortableBundleError('E_RESTORE_MISMATCH', 'Restored row counts differ from the bundle manifest (see details.sections[].mismatches)', result);
|
|
552
|
+
}
|
|
553
|
+
return result;
|
|
554
|
+
}
|
|
555
|
+
finally {
|
|
556
|
+
fs.rmSync(stagingDir, { recursive: true, force: true });
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Point the ambient global registry at a relocated project: move the existing
|
|
561
|
+
* row (keyed by projectId) or register the project when it is absent.
|
|
562
|
+
*
|
|
563
|
+
* Uses the canonical nexus registry API against the CURRENT `getCleoHome()`,
|
|
564
|
+
* so callers must run it with the destination home active.
|
|
565
|
+
*
|
|
566
|
+
* @param projectId - Stable projectId from project-info.json (null when absent).
|
|
567
|
+
* @param newRoot - New project root.
|
|
568
|
+
* @returns Registry outcome.
|
|
569
|
+
*/
|
|
570
|
+
export async function registerRelocatedProject(projectId, newRoot) {
|
|
571
|
+
const registry = await import('../nexus/registry.js');
|
|
572
|
+
if (projectId) {
|
|
573
|
+
const rows = await registry.nexusList();
|
|
574
|
+
const existing = rows.find((r) => r.projectId === projectId);
|
|
575
|
+
if (existing) {
|
|
576
|
+
if (existing.path === newRoot) {
|
|
577
|
+
return { status: 'unchanged', detail: `already registered at ${newRoot}` };
|
|
578
|
+
}
|
|
579
|
+
await registry.nexusMoveProject(projectId, newRoot);
|
|
580
|
+
return {
|
|
581
|
+
status: 'updated',
|
|
582
|
+
detail: `registry row ${projectId}: ${existing.path} -> ${newRoot}`,
|
|
583
|
+
};
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
await registry.nexusRegister(newRoot, { path: newRoot });
|
|
587
|
+
return { status: 'registered', detail: `registered ${newRoot}` };
|
|
588
|
+
}
|
|
589
|
+
//# sourceMappingURL=portable-bundle-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-bundle-import.js","sourceRoot":"","sources":["../../src/store/portable-bundle-import.ts"],"names":[],"mappings":"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"}
|