@cleocode/core 2026.4.11 → 2026.4.12
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/codebase-map/analyzers/architecture.d.ts.map +1 -1
- package/dist/codebase-map/analyzers/architecture.js +0 -1
- package/dist/codebase-map/analyzers/architecture.js.map +1 -1
- package/dist/conduit/local-transport.d.ts +18 -8
- package/dist/conduit/local-transport.d.ts.map +1 -1
- package/dist/conduit/local-transport.js +23 -13
- package/dist/conduit/local-transport.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -1
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +6 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.js +175 -68950
- package/dist/index.js.map +1 -7
- package/dist/init.d.ts +1 -2
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +1 -2
- package/dist/init.js.map +1 -1
- package/dist/internal.d.ts +8 -3
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +13 -6
- package/dist/internal.js.map +1 -1
- package/dist/memory/learnings.d.ts +2 -2
- package/dist/memory/patterns.d.ts +6 -6
- package/dist/output.d.ts +32 -11
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +67 -67
- package/dist/output.js.map +1 -1
- package/dist/paths.js +80 -14
- package/dist/paths.js.map +1 -1
- package/dist/skills/dynamic-skill-generator.d.ts +0 -2
- package/dist/skills/dynamic-skill-generator.d.ts.map +1 -1
- package/dist/skills/dynamic-skill-generator.js.map +1 -1
- package/dist/store/agent-registry-accessor.d.ts +203 -12
- package/dist/store/agent-registry-accessor.d.ts.map +1 -1
- package/dist/store/agent-registry-accessor.js +618 -100
- package/dist/store/agent-registry-accessor.js.map +1 -1
- package/dist/store/api-key-kdf.d.ts +73 -0
- package/dist/store/api-key-kdf.d.ts.map +1 -0
- package/dist/store/api-key-kdf.js +84 -0
- package/dist/store/api-key-kdf.js.map +1 -0
- package/dist/store/cleanup-legacy.js +171 -0
- package/dist/store/cleanup-legacy.js.map +1 -0
- package/dist/store/conduit-sqlite.d.ts +184 -0
- package/dist/store/conduit-sqlite.d.ts.map +1 -0
- package/dist/store/conduit-sqlite.js +570 -0
- package/dist/store/conduit-sqlite.js.map +1 -0
- package/dist/store/global-salt.d.ts +78 -0
- package/dist/store/global-salt.d.ts.map +1 -0
- package/dist/store/global-salt.js +147 -0
- package/dist/store/global-salt.js.map +1 -0
- package/dist/store/migrate-signaldock-to-conduit.d.ts +81 -0
- package/dist/store/migrate-signaldock-to-conduit.d.ts.map +1 -0
- package/dist/store/migrate-signaldock-to-conduit.js +555 -0
- package/dist/store/migrate-signaldock-to-conduit.js.map +1 -0
- package/dist/store/nexus-sqlite.js +28 -3
- package/dist/store/nexus-sqlite.js.map +1 -1
- package/dist/store/signaldock-sqlite.d.ts +122 -19
- package/dist/store/signaldock-sqlite.d.ts.map +1 -1
- package/dist/store/signaldock-sqlite.js +401 -251
- package/dist/store/signaldock-sqlite.js.map +1 -1
- package/dist/store/sqlite-backup.js +122 -4
- package/dist/store/sqlite-backup.js.map +1 -1
- package/dist/system/backup.d.ts +0 -26
- package/dist/system/backup.d.ts.map +1 -1
- package/dist/system/runtime.d.ts +0 -2
- package/dist/system/runtime.d.ts.map +1 -1
- package/dist/system/runtime.js +3 -3
- package/dist/system/runtime.js.map +1 -1
- package/dist/tasks/add.d.ts +1 -1
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/add.js +98 -23
- package/dist/tasks/add.js.map +1 -1
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +4 -1
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/find.d.ts.map +1 -1
- package/dist/tasks/find.js +4 -1
- package/dist/tasks/find.js.map +1 -1
- package/dist/tasks/labels.d.ts.map +1 -1
- package/dist/tasks/labels.js +4 -1
- package/dist/tasks/labels.js.map +1 -1
- package/dist/tasks/relates.d.ts.map +1 -1
- package/dist/tasks/relates.js +16 -4
- package/dist/tasks/relates.js.map +1 -1
- package/dist/tasks/show.d.ts.map +1 -1
- package/dist/tasks/show.js +4 -1
- package/dist/tasks/show.js.map +1 -1
- package/dist/tasks/update.d.ts.map +1 -1
- package/dist/tasks/update.js +32 -6
- package/dist/tasks/update.js.map +1 -1
- package/dist/validation/engine.d.ts.map +1 -1
- package/dist/validation/engine.js +16 -4
- package/dist/validation/engine.js.map +1 -1
- package/dist/validation/param-utils.d.ts +5 -3
- package/dist/validation/param-utils.d.ts.map +1 -1
- package/dist/validation/param-utils.js +8 -6
- package/dist/validation/param-utils.js.map +1 -1
- package/dist/validation/protocols/_shared.d.ts.map +1 -1
- package/dist/validation/protocols/_shared.js +13 -6
- package/dist/validation/protocols/_shared.js.map +1 -1
- package/package.json +7 -7
- package/src/adapters/__tests__/manager.test.ts +0 -1
- package/src/codebase-map/analyzers/architecture.ts +0 -1
- package/src/conduit/__tests__/local-credential-flow.test.ts +20 -18
- package/src/conduit/__tests__/local-transport.test.ts +14 -12
- package/src/conduit/local-transport.ts +23 -13
- package/src/config.ts +0 -1
- package/src/errors.ts +24 -0
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.ts +2 -5
- package/src/init.ts +1 -2
- package/src/internal.ts +49 -2
- package/src/lifecycle/cant/lifecycle-rcasd.cant +133 -0
- package/src/memory/__tests__/engine-compat.test.ts +2 -2
- package/src/memory/__tests__/pipeline-manifest-sqlite.test.ts +4 -4
- package/src/observability/__tests__/index.test.ts +4 -4
- package/src/observability/__tests__/log-filter.test.ts +4 -4
- package/src/output.ts +73 -75
- package/src/sessions/__tests__/session-grade.integration.test.ts +1 -1
- package/src/sessions/__tests__/session-grade.test.ts +2 -2
- package/src/skills/__tests__/dynamic-skill-generator.test.ts +0 -2
- package/src/skills/dynamic-skill-generator.ts +0 -2
- package/src/store/__tests__/agent-registry-accessor.test.ts +807 -0
- package/src/store/__tests__/api-key-kdf.test.ts +113 -0
- package/src/store/__tests__/conduit-sqlite.test.ts +413 -0
- package/src/store/__tests__/global-salt.test.ts +195 -0
- package/src/store/__tests__/migrate-signaldock-to-conduit.test.ts +715 -0
- package/src/store/__tests__/signaldock-sqlite.test.ts +652 -0
- package/src/store/__tests__/sqlite-backup-global.test.ts +307 -3
- package/src/store/__tests__/sqlite-backup.test.ts +5 -1
- package/src/store/__tests__/t310-integration.test.ts +1150 -0
- package/src/store/agent-registry-accessor.ts +847 -140
- package/src/store/api-key-kdf.ts +104 -0
- package/src/store/conduit-sqlite.ts +655 -0
- package/src/store/global-salt.ts +175 -0
- package/src/store/migrate-signaldock-to-conduit.ts +669 -0
- package/src/store/signaldock-sqlite.ts +431 -254
- package/src/store/sqlite-backup.ts +185 -10
- package/src/system/backup.ts +2 -62
- package/src/system/runtime.ts +4 -6
- package/src/tasks/__tests__/error-hints.test.ts +256 -0
- package/src/tasks/add.ts +99 -9
- package/src/tasks/complete.ts +4 -1
- package/src/tasks/find.ts +4 -1
- package/src/tasks/labels.ts +4 -1
- package/src/tasks/relates.ts +16 -4
- package/src/tasks/show.ts +4 -1
- package/src/tasks/update.ts +32 -3
- package/src/validation/__tests__/error-hints.test.ts +97 -0
- package/src/validation/engine.ts +16 -1
- package/src/validation/param-utils.ts +10 -7
- package/src/validation/protocols/_shared.ts +14 -6
- package/src/validation/protocols/cant/architecture-decision.cant +80 -0
- package/src/validation/protocols/cant/artifact-publish.cant +95 -0
- package/src/validation/protocols/cant/consensus.cant +74 -0
- package/src/validation/protocols/cant/contribution.cant +82 -0
- package/src/validation/protocols/cant/decomposition.cant +92 -0
- package/src/validation/protocols/cant/implementation.cant +67 -0
- package/src/validation/protocols/cant/provenance.cant +88 -0
- package/src/validation/protocols/cant/release.cant +96 -0
- package/src/validation/protocols/cant/research.cant +66 -0
- package/src/validation/protocols/cant/specification.cant +67 -0
- package/src/validation/protocols/cant/testing.cant +88 -0
- package/src/validation/protocols/cant/validation.cant +65 -0
- package/src/validation/protocols/protocols-markdown/decomposition.md +0 -4
- package/templates/config.template.json +0 -1
- package/templates/global-config.template.json +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signaldock-sqlite.js","sourceRoot":"","sources":["../../src/store/signaldock-sqlite.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"signaldock-sqlite.js","sourceRoot":"","sources":["../../src/store/signaldock-sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,18 +2,21 @@
|
|
|
2
2
|
* SQLite backup via VACUUM INTO with snapshot rotation.
|
|
3
3
|
*
|
|
4
4
|
* Produces self-contained, WAL-free copies of CLEO SQLite databases
|
|
5
|
-
* (tasks.db
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* (tasks.db, brain.db at project tier; nexus.db at global tier) into
|
|
6
|
+
* `.cleo/backups/sqlite/` (project) or `$XDG_DATA_HOME/cleo/backups/sqlite/`
|
|
7
|
+
* (global) with a configurable rotation limit. All errors are swallowed —
|
|
8
|
+
* backup failure must never interrupt normal operation.
|
|
8
9
|
*
|
|
9
10
|
* @task T4873
|
|
10
11
|
* @task T5158 — extended to cover brain.db
|
|
12
|
+
* @task T306 — extended to cover global-tier nexus.db (epic T299)
|
|
11
13
|
* @epic T4867
|
|
12
14
|
*/
|
|
13
15
|
import { existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from 'node:fs';
|
|
14
16
|
import { join } from 'node:path';
|
|
15
|
-
import { getCleoDir } from '../paths.js';
|
|
17
|
+
import { getCleoDir, getCleoHome } from '../paths.js';
|
|
16
18
|
import { getBrainNativeDb } from './brain-sqlite.js';
|
|
19
|
+
import { getNexusNativeDb } from './nexus-sqlite.js';
|
|
17
20
|
import { getNativeDb } from './sqlite.js';
|
|
18
21
|
/** Maximum number of snapshots retained per database (oldest rotated out). */
|
|
19
22
|
const MAX_SNAPSHOTS = 10;
|
|
@@ -238,4 +241,119 @@ export function listSqliteBackupsAll(cwd) {
|
|
|
238
241
|
}
|
|
239
242
|
return out;
|
|
240
243
|
}
|
|
244
|
+
/**
|
|
245
|
+
* Registered global-tier snapshot targets. `signaldock` is reserved for T310
|
|
246
|
+
* — only `nexus` is active in v2026.4.11.
|
|
247
|
+
*/
|
|
248
|
+
const GLOBAL_SNAPSHOT_TARGETS = [{ prefix: 'nexus', getDb: getNexusNativeDb }];
|
|
249
|
+
/**
|
|
250
|
+
* Resolve the global-tier backup directory, creating it on first use.
|
|
251
|
+
*
|
|
252
|
+
* Uses `cleoHomeOverride` when provided (test isolation) or falls back to
|
|
253
|
+
* `getCleoHome()` (XDG-compliant; never hardcodes `~/.cleo`).
|
|
254
|
+
*/
|
|
255
|
+
function resolveGlobalBackupDir(cleoHomeOverride) {
|
|
256
|
+
const base = cleoHomeOverride ?? getCleoHome();
|
|
257
|
+
return join(base, 'backups', 'sqlite');
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Snapshot a global-tier SQLite database via VACUUM INTO.
|
|
261
|
+
*
|
|
262
|
+
* Writes to `$XDG_DATA_HOME/cleo/backups/sqlite/<dbName>-YYYYMMDD-HHmmss.db`
|
|
263
|
+
* and enforces a per-prefix rotation window (default 10 snapshots).
|
|
264
|
+
*
|
|
265
|
+
* Non-fatal: errors from any individual step are surfaced via the return value
|
|
266
|
+
* but never thrown — a failed snapshot MUST NOT interrupt normal operation.
|
|
267
|
+
*
|
|
268
|
+
* @param dbName - Which global-tier DB to snapshot (`'nexus'`; `'signaldock'` reserved for T310)
|
|
269
|
+
* @param opts.rotation - Maximum retained snapshots per prefix (default 10)
|
|
270
|
+
* @param opts.cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
|
|
271
|
+
* @returns Object containing the new snapshot path and any rotated (deleted) file paths
|
|
272
|
+
*
|
|
273
|
+
* @task T306
|
|
274
|
+
* @epic T299
|
|
275
|
+
* @why ADR-036 §Backup Mechanism requires VACUUM INTO rotation at the global tier;
|
|
276
|
+
* nexus.db has zero backup coverage prior to v2026.4.11.
|
|
277
|
+
*/
|
|
278
|
+
export async function vacuumIntoGlobalBackup(dbName, opts) {
|
|
279
|
+
const maxSnaps = opts?.rotation ?? MAX_SNAPSHOTS;
|
|
280
|
+
const backupDir = resolveGlobalBackupDir(opts?.cleoHomeOverride);
|
|
281
|
+
mkdirSync(backupDir, { recursive: true });
|
|
282
|
+
const target = GLOBAL_SNAPSHOT_TARGETS.find((t) => t.prefix === dbName);
|
|
283
|
+
if (!target) {
|
|
284
|
+
return { snapshotPath: '', rotated: [] };
|
|
285
|
+
}
|
|
286
|
+
const db = target.getDb();
|
|
287
|
+
if (!db) {
|
|
288
|
+
return { snapshotPath: '', rotated: [] };
|
|
289
|
+
}
|
|
290
|
+
const now = new Date();
|
|
291
|
+
const snapshotName = `${dbName}-${formatTimestamp(now)}.db`;
|
|
292
|
+
const snapshotPath = join(backupDir, snapshotName);
|
|
293
|
+
// Collect files that will be rotated out before writing the new one.
|
|
294
|
+
const rotated = [];
|
|
295
|
+
try {
|
|
296
|
+
const pattern = snapshotPattern(dbName);
|
|
297
|
+
const existing = readdirSync(backupDir)
|
|
298
|
+
.filter((f) => pattern.test(f))
|
|
299
|
+
.map((f) => ({
|
|
300
|
+
name: f,
|
|
301
|
+
path: join(backupDir, f),
|
|
302
|
+
mtimeMs: statSync(join(backupDir, f)).mtimeMs,
|
|
303
|
+
}))
|
|
304
|
+
.sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first
|
|
305
|
+
// Remove oldest until we have room for the new snapshot.
|
|
306
|
+
while (existing.length >= maxSnaps) {
|
|
307
|
+
const oldest = existing.shift();
|
|
308
|
+
if (!oldest)
|
|
309
|
+
break;
|
|
310
|
+
try {
|
|
311
|
+
unlinkSync(oldest.path);
|
|
312
|
+
rotated.push(oldest.path);
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
// non-fatal rotation failure
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
// non-fatal — continue even if rotation enumeration fails
|
|
321
|
+
}
|
|
322
|
+
// Checkpoint then VACUUM INTO for a WAL-free, atomic snapshot.
|
|
323
|
+
db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
324
|
+
const safeDest = snapshotPath.replace(/'/g, "''");
|
|
325
|
+
db.exec(`VACUUM INTO '${safeDest}'`);
|
|
326
|
+
return { snapshotPath, rotated };
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* List global-tier SQLite backups from `$XDG_DATA_HOME/cleo/backups/sqlite/`,
|
|
330
|
+
* optionally filtered by prefix (e.g. `'nexus'`). Sorted newest-first by mtime.
|
|
331
|
+
*
|
|
332
|
+
* Returns an empty array when the backup directory does not exist.
|
|
333
|
+
*
|
|
334
|
+
* @param prefix - Optional prefix filter; when omitted all `.db` snapshot files are listed
|
|
335
|
+
* @param cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
|
|
336
|
+
*
|
|
337
|
+
* @task T306
|
|
338
|
+
* @epic T299
|
|
339
|
+
*/
|
|
340
|
+
export function listGlobalSqliteBackups(prefix, cleoHomeOverride) {
|
|
341
|
+
try {
|
|
342
|
+
const backupDir = resolveGlobalBackupDir(cleoHomeOverride);
|
|
343
|
+
if (!existsSync(backupDir))
|
|
344
|
+
return [];
|
|
345
|
+
const pattern = prefix ? snapshotPattern(prefix) : /^[a-zA-Z0-9_-]+-\d{8}-\d{6}\.db$/;
|
|
346
|
+
return readdirSync(backupDir)
|
|
347
|
+
.filter((f) => pattern.test(f))
|
|
348
|
+
.map((f) => {
|
|
349
|
+
const filePath = join(backupDir, f);
|
|
350
|
+
const s = statSync(filePath);
|
|
351
|
+
return { name: f, path: filePath, size: s.size, mtime: new Date(s.mtimeMs) };
|
|
352
|
+
})
|
|
353
|
+
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); // newest first
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
return [];
|
|
357
|
+
}
|
|
358
|
+
}
|
|
241
359
|
//# sourceMappingURL=sqlite-backup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-backup.js","sourceRoot":"","sources":["../../src/store/sqlite-backup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sqlite-backup.js","sourceRoot":"","sources":["../../src/store/sqlite-backup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,8EAA8E;AAC9E,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,oFAAoF;AACpF,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,aAAa;AAEzC;;;GAGG;AACH,MAAM,gBAAgB,GAA2B,EAAE,CAAC;AAepD;;;GAGG;AACH,MAAM,gBAAgB,GAAqB;IACzC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE;IACvC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE;CAC7C,CAAC;AAEF;;;;;GAKG;AACH,SAAS,eAAe,CAAC,CAAO;IAC9B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjE,OAAO,CACL,GAAG,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE;QAC/D,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CACpE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,mEAAmE;IACnE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC3D,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,sBAAsB,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,SAAiB,EAAE,MAAc;IACxD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;aACjC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACxB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO;SAC9C,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;QAEzD,OAAO,KAAK,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM;gBAAE,MAAM;YACnB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAaD;;;;;;;;;;;;;;GAcG;AACH,SAAS,WAAW,CAAC,MAAsB,EAAE,SAAiB,EAAE,GAAS;IACvE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,qDAAqD;IAEtE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAE5E,2EAA2E;IAC3E,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,uEAAuE;IACvE,0EAA0E;IAC1E,mEAAmE;IACnE,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAE3C,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAE1C,oEAAoE;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,EAAE,CAAC,IAAI,CAAC,gBAAgB,QAAQ,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAsB,EAAE;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC;QAC5C,OAAO,CAAC,YAAY;IACtB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3C,gBAAgB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAsB,EAAE;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC/C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,6CAA6C;IACvD,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC;YAC9C,SAAS,CAAC,oCAAoC;QAChD,CAAC;QACD,IAAI,CAAC;YACH,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;YACpC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,0BAA0B,CACjC,MAAc,EACd,GAAY;IAEZ,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,WAAW,CAAC,SAAS,CAAC;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACxB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO;SAC9C,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAY;IAEZ,OAAO,0BAA0B,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAY;IAEZ,OAAO,0BAA0B,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAY;IAEZ,MAAM,GAAG,GAA2E,EAAE,CAAC;IACvF,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,0BAA0B,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAgBD;;;GAGG;AACH,MAAM,uBAAuB,GAAqB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAEjG;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,gBAAyB;IACvD,MAAM,IAAI,GAAG,gBAAgB,IAAI,WAAW,EAAE,CAAC;IAC/C,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAA8B,EAC9B,IAAuD;IAEvD,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,aAAa,CAAC;IACjD,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAEjE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,YAAY,GAAG,GAAG,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEnD,qEAAqE;IACrE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC;aACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACxB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO;SAC9C,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;QAEzD,yDAAyD;QACzD,OAAO,QAAQ,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM;gBAAE,MAAM;YACnB,IAAI,CAAC;gBACH,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;IAC5D,CAAC;IAED,+DAA+D;IAC/D,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,EAAE,CAAC,IAAI,CAAC,gBAAgB,QAAQ,GAAG,CAAC,CAAC;IAErC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC;AAmBD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAe,EACf,gBAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QAEtC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC;QAEtF,OAAO,WAAW,CAAC,SAAS,CAAC;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/E,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,eAAe;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/system/backup.d.ts
CHANGED
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
*
|
|
23
23
|
* @task T4783
|
|
24
24
|
* @task T5158 — extended to use VACUUM INTO for .db files and atomicWrite for JSON
|
|
25
|
-
* @task T306 — extended to support global-tier scope (nexus.db; epic T299)
|
|
26
25
|
*/
|
|
27
26
|
/** Result shape returned by {@link createBackup}. */
|
|
28
27
|
export interface BackupResult {
|
|
@@ -36,15 +35,6 @@ export interface BackupResult {
|
|
|
36
35
|
type: string;
|
|
37
36
|
/** Files that were successfully captured into this backup. */
|
|
38
37
|
files: string[];
|
|
39
|
-
/**
|
|
40
|
-
* Global-tier snapshot results, populated when `opts.includeGlobal` is true.
|
|
41
|
-
* Key is the DB name (e.g. `'nexus'`), value is the snapshot path or an
|
|
42
|
-
* empty string when the DB was not initialized.
|
|
43
|
-
*
|
|
44
|
-
* @task T306
|
|
45
|
-
* @epic T299
|
|
46
|
-
*/
|
|
47
|
-
global?: Record<string, string>;
|
|
48
38
|
}
|
|
49
39
|
/** Result shape returned by {@link restoreBackup}. */
|
|
50
40
|
export interface RestoreResult {
|
|
@@ -69,28 +59,12 @@ export interface RestoreResult {
|
|
|
69
59
|
* when `safeSqliteSnapshot` asks for them. This makes the function
|
|
70
60
|
* self-contained — callers do not need to pre-open the DBs.
|
|
71
61
|
*
|
|
72
|
-
* When `opts.includeGlobal` is true, also snapshots global-tier databases
|
|
73
|
-
* (currently `nexus.db`) via {@link vacuumIntoGlobalBackup}. Global snapshots
|
|
74
|
-
* are written to `$XDG_DATA_HOME/cleo/backups/sqlite/` and returned in
|
|
75
|
-
* `result.global`.
|
|
76
|
-
*
|
|
77
62
|
* Async because opening the database engines requires async migration
|
|
78
63
|
* reconciliation (ADR-012). The CLI dispatch layer awaits this result.
|
|
79
|
-
*
|
|
80
|
-
* @task T306
|
|
81
|
-
* @epic T299
|
|
82
64
|
*/
|
|
83
65
|
export declare function createBackup(projectRoot: string, opts?: {
|
|
84
66
|
type?: string;
|
|
85
67
|
note?: string;
|
|
86
|
-
/**
|
|
87
|
-
* When true, also snapshot global-tier databases (nexus.db).
|
|
88
|
-
* Defaults to false for backwards compatibility.
|
|
89
|
-
*
|
|
90
|
-
* @task T306
|
|
91
|
-
* @epic T299
|
|
92
|
-
*/
|
|
93
|
-
includeGlobal?: boolean;
|
|
94
68
|
}): Promise<BackupResult>;
|
|
95
69
|
/** A single backup entry returned by listSystemBackups. */
|
|
96
70
|
export interface BackupEntry {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/system/backup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/system/backup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAoDH,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,YAAY,CAAC,CA+FvB;AAED,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAkCpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,aAAa,CA2Df"}
|
package/dist/system/runtime.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/system/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,KAAK,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAUhD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;IACF,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/system/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,KAAK,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAUhD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;IACF,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAuGD,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkE9B"}
|
package/dist/system/runtime.js
CHANGED
|
@@ -38,11 +38,11 @@ function detectFromDataRoot(dataRoot) {
|
|
|
38
38
|
function getExpectedNaming(channel) {
|
|
39
39
|
switch (channel) {
|
|
40
40
|
case 'dev':
|
|
41
|
-
return { cli: 'cleo-dev',
|
|
41
|
+
return { cli: 'cleo-dev', server: 'cleo-dev' };
|
|
42
42
|
case 'beta':
|
|
43
|
-
return { cli: 'cleo-beta',
|
|
43
|
+
return { cli: 'cleo-beta', server: 'cleo-beta' };
|
|
44
44
|
default:
|
|
45
|
-
return { cli: 'cleo',
|
|
45
|
+
return { cli: 'cleo', server: 'cleo' };
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
async function parseVersionFile(dataRoot) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/system/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/system/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks/add.d.ts
CHANGED
package/dist/tasks/add.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/tasks/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAEV,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,2BAA2B,CAAC;AAWnF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/tasks/add.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks/add.js
CHANGED
|
@@ -41,10 +41,16 @@ export function buildDefaultVerification(initializedAt) {
|
|
|
41
41
|
*/
|
|
42
42
|
export function validateTitle(title) {
|
|
43
43
|
if (!title || title.trim().length === 0) {
|
|
44
|
-
throw new CleoError(ExitCode.INVALID_INPUT, 'Task title is required'
|
|
44
|
+
throw new CleoError(ExitCode.INVALID_INPUT, 'Task title is required', {
|
|
45
|
+
fix: 'Provide a title: cleo add "<title>"',
|
|
46
|
+
details: { field: 'title' },
|
|
47
|
+
});
|
|
45
48
|
}
|
|
46
49
|
if (title.length > 200) {
|
|
47
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, 'Task title must be 200 characters or less'
|
|
50
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, 'Task title must be 200 characters or less', {
|
|
51
|
+
fix: 'Shorten title to 200 characters or fewer',
|
|
52
|
+
details: { field: 'title', expected: 200, actual: title.length },
|
|
53
|
+
});
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
56
|
/**
|
|
@@ -53,7 +59,10 @@ export function validateTitle(title) {
|
|
|
53
59
|
*/
|
|
54
60
|
export function validateStatus(status) {
|
|
55
61
|
if (!TASK_STATUSES.includes(status)) {
|
|
56
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid status: ${status} (must be ${TASK_STATUSES.join('|')})
|
|
62
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid status: ${status} (must be ${TASK_STATUSES.join('|')})`, {
|
|
63
|
+
fix: `cleo add ... --status <${TASK_STATUSES.join('|')}>`,
|
|
64
|
+
details: { field: 'status', expected: TASK_STATUSES, actual: status },
|
|
65
|
+
});
|
|
57
66
|
}
|
|
58
67
|
}
|
|
59
68
|
/**
|
|
@@ -90,7 +99,10 @@ export function normalizePriority(priority) {
|
|
|
90
99
|
if (typeof priority === 'number') {
|
|
91
100
|
const mapped = NUMERIC_PRIORITY_MAP[priority];
|
|
92
101
|
if (!mapped) {
|
|
93
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid numeric priority: ${priority} (must be 1-9)
|
|
102
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid numeric priority: ${priority} (must be 1-9)`, {
|
|
103
|
+
fix: `Use a numeric priority 1-9 or one of: ${VALID_PRIORITIES.join('|')}`,
|
|
104
|
+
details: { field: 'priority', expected: '1-9', actual: priority },
|
|
105
|
+
});
|
|
94
106
|
}
|
|
95
107
|
return mapped;
|
|
96
108
|
}
|
|
@@ -104,7 +116,10 @@ export function normalizePriority(priority) {
|
|
|
104
116
|
if (VALID_PRIORITIES.includes(lower)) {
|
|
105
117
|
return lower;
|
|
106
118
|
}
|
|
107
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid priority: ${priority} (must be ${VALID_PRIORITIES.join('|')} or numeric 1-9)
|
|
119
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid priority: ${priority} (must be ${VALID_PRIORITIES.join('|')} or numeric 1-9)`, {
|
|
120
|
+
fix: `cleo add ... --priority <${VALID_PRIORITIES.join('|')}>`,
|
|
121
|
+
details: { field: 'priority', expected: VALID_PRIORITIES, actual: priority },
|
|
122
|
+
});
|
|
108
123
|
}
|
|
109
124
|
/**
|
|
110
125
|
* Validate task priority.
|
|
@@ -121,7 +136,10 @@ export function validatePriority(priority) {
|
|
|
121
136
|
export function validateTaskType(type) {
|
|
122
137
|
const valid = ['epic', 'task', 'subtask'];
|
|
123
138
|
if (!valid.includes(type)) {
|
|
124
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid task type: ${type} (must be ${valid.join('|')})
|
|
139
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid task type: ${type} (must be ${valid.join('|')})`, {
|
|
140
|
+
fix: `cleo add ... --type <${valid.join('|')}>`,
|
|
141
|
+
details: { field: 'type', expected: valid, actual: type },
|
|
142
|
+
});
|
|
125
143
|
}
|
|
126
144
|
}
|
|
127
145
|
/**
|
|
@@ -131,7 +149,10 @@ export function validateTaskType(type) {
|
|
|
131
149
|
export function validateSize(size) {
|
|
132
150
|
const valid = ['small', 'medium', 'large'];
|
|
133
151
|
if (!valid.includes(size)) {
|
|
134
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid size: ${size} (must be ${valid.join('|')})
|
|
152
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid size: ${size} (must be ${valid.join('|')})`, {
|
|
153
|
+
fix: `cleo add ... --size <${valid.join('|')}>`,
|
|
154
|
+
details: { field: 'size', expected: valid, actual: size },
|
|
155
|
+
});
|
|
135
156
|
}
|
|
136
157
|
}
|
|
137
158
|
/**
|
|
@@ -142,7 +163,10 @@ export function validateLabels(labels) {
|
|
|
142
163
|
for (const label of labels) {
|
|
143
164
|
const trimmed = label.trim();
|
|
144
165
|
if (!/^[a-z][a-z0-9.-]*$/.test(trimmed)) {
|
|
145
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid label format: '${trimmed}' (must be lowercase alphanumeric with hyphens/periods)
|
|
166
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid label format: '${trimmed}' (must be lowercase alphanumeric with hyphens/periods)`, {
|
|
167
|
+
fix: `Labels must match pattern ^[a-z][a-z0-9.-]*$ (e.g. my-label, v1.0)`,
|
|
168
|
+
details: { field: 'labels', expected: '^[a-z][a-z0-9.-]*$', actual: trimmed },
|
|
169
|
+
});
|
|
146
170
|
}
|
|
147
171
|
}
|
|
148
172
|
}
|
|
@@ -152,7 +176,10 @@ export function validateLabels(labels) {
|
|
|
152
176
|
*/
|
|
153
177
|
export function validatePhaseFormat(phase) {
|
|
154
178
|
if (!/^[a-z][a-z0-9-]*$/.test(phase)) {
|
|
155
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid phase format: ${phase} (must be lowercase alphanumeric with hyphens)
|
|
179
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid phase format: ${phase} (must be lowercase alphanumeric with hyphens)`, {
|
|
180
|
+
fix: `Phase slugs must match pattern ^[a-z][a-z0-9-]*$ (e.g. dev-phase-1)`,
|
|
181
|
+
details: { field: 'phase', expected: '^[a-z][a-z0-9-]*$', actual: phase },
|
|
182
|
+
});
|
|
156
183
|
}
|
|
157
184
|
}
|
|
158
185
|
/**
|
|
@@ -164,10 +191,16 @@ export function validateDepends(depends, tasks) {
|
|
|
164
191
|
for (const depId of depends) {
|
|
165
192
|
const trimmed = depId.trim();
|
|
166
193
|
if (!/^T\d{3,}$/.test(trimmed)) {
|
|
167
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid dependency ID format: '${trimmed}' (must be T### format)
|
|
194
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid dependency ID format: '${trimmed}' (must be T### format)`, {
|
|
195
|
+
fix: 'Dependency IDs must match T### format (e.g. T123, T4567)',
|
|
196
|
+
details: { field: 'depends', expected: 'T###', actual: trimmed },
|
|
197
|
+
});
|
|
168
198
|
}
|
|
169
199
|
if (!existingIds.has(trimmed)) {
|
|
170
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Dependency task not found: ${trimmed}
|
|
200
|
+
throw new CleoError(ExitCode.NOT_FOUND, `Dependency task not found: ${trimmed}`, {
|
|
201
|
+
fix: `cleo find "${trimmed}"`,
|
|
202
|
+
details: { field: 'depends', actual: trimmed },
|
|
203
|
+
});
|
|
171
204
|
}
|
|
172
205
|
}
|
|
173
206
|
}
|
|
@@ -190,7 +223,10 @@ export function validateParent(parentId, tasks, maxDepth = 3, maxSiblings = 0) {
|
|
|
190
223
|
// Check depth
|
|
191
224
|
const depth = getTaskDepth(parentId, tasks);
|
|
192
225
|
if (depth >= maxDepth) {
|
|
193
|
-
throw new CleoError(ExitCode.DEPTH_EXCEEDED, `Cannot add child to ${parentId}: max hierarchy depth (${maxDepth}) would be exceeded
|
|
226
|
+
throw new CleoError(ExitCode.DEPTH_EXCEEDED, `Cannot add child to ${parentId}: max hierarchy depth (${maxDepth}) would be exceeded`, {
|
|
227
|
+
fix: 'Reparent this task under a higher-level epic',
|
|
228
|
+
details: { field: 'parentId', expected: `depth < ${maxDepth}`, actual: depth },
|
|
229
|
+
});
|
|
194
230
|
}
|
|
195
231
|
// Check sibling count
|
|
196
232
|
if (maxSiblings > 0) {
|
|
@@ -307,7 +343,10 @@ export async function addTask(options, cwd, accessor) {
|
|
|
307
343
|
// Anti-hallucination: title and description must be different (T5698)
|
|
308
344
|
if (options.description &&
|
|
309
345
|
options.title.trim().toLowerCase() === options.description.trim().toLowerCase()) {
|
|
310
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, 'Title and description must be different (anti-hallucination rule)'
|
|
346
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, 'Title and description must be different (anti-hallucination rule)', {
|
|
347
|
+
fix: 'Provide --desc with a description different from the title',
|
|
348
|
+
details: { field: 'description' },
|
|
349
|
+
});
|
|
311
350
|
}
|
|
312
351
|
// Skip session enforcement for dry-run — no data is written
|
|
313
352
|
if (!options.dryRun) {
|
|
@@ -361,11 +400,17 @@ export async function addTask(options, cwd, accessor) {
|
|
|
361
400
|
for (const depId of options.depends) {
|
|
362
401
|
const trimmed = depId.trim();
|
|
363
402
|
if (!/^T\d{3,}$/.test(trimmed)) {
|
|
364
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid dependency ID format: '${trimmed}' (must be T### format)
|
|
403
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid dependency ID format: '${trimmed}' (must be T### format)`, {
|
|
404
|
+
fix: 'Dependency IDs must match T### format (e.g. T123, T4567)',
|
|
405
|
+
details: { field: 'depends', expected: 'T###', actual: trimmed },
|
|
406
|
+
});
|
|
365
407
|
}
|
|
366
408
|
const exists = await dataAccessor.taskExists(trimmed);
|
|
367
409
|
if (!exists) {
|
|
368
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Dependency task not found: ${trimmed}
|
|
410
|
+
throw new CleoError(ExitCode.NOT_FOUND, `Dependency task not found: ${trimmed}`, {
|
|
411
|
+
fix: `cleo find "${trimmed}"`,
|
|
412
|
+
details: { field: 'depends', actual: trimmed },
|
|
413
|
+
});
|
|
369
414
|
}
|
|
370
415
|
}
|
|
371
416
|
}
|
|
@@ -380,7 +425,10 @@ export async function addTask(options, cwd, accessor) {
|
|
|
380
425
|
if (!phases[phase]) {
|
|
381
426
|
if (!options.addPhase) {
|
|
382
427
|
const validPhases = Object.keys(phases).join(', ');
|
|
383
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Phase '${phase}' not found. Valid phases: ${validPhases || 'none'}. Use --add-phase to create new
|
|
428
|
+
throw new CleoError(ExitCode.NOT_FOUND, `Phase '${phase}' not found. Valid phases: ${validPhases || 'none'}. Use --add-phase to create new.`, {
|
|
429
|
+
fix: `cleo add ... --add-phase to create '${phase}', or use one of: ${validPhases || 'none'}`,
|
|
430
|
+
details: { field: 'phase', expected: Object.keys(phases), actual: phase },
|
|
431
|
+
});
|
|
384
432
|
}
|
|
385
433
|
// Create phase
|
|
386
434
|
const order = Object.keys(phases).length + 1;
|
|
@@ -403,12 +451,18 @@ export async function addTask(options, cwd, accessor) {
|
|
|
403
451
|
// Parent hierarchy validation using targeted queries
|
|
404
452
|
if (parentId) {
|
|
405
453
|
if (!/^T\d{3,}$/.test(parentId)) {
|
|
406
|
-
throw new CleoError(ExitCode.INVALID_INPUT, `Invalid parent ID format: ${parentId}
|
|
454
|
+
throw new CleoError(ExitCode.INVALID_INPUT, `Invalid parent ID format: ${parentId}`, {
|
|
455
|
+
fix: 'Parent IDs must match T### format (e.g. T123)',
|
|
456
|
+
details: { field: 'parentId', expected: 'T###', actual: parentId },
|
|
457
|
+
});
|
|
407
458
|
}
|
|
408
459
|
// Validate parent exists
|
|
409
460
|
const parentTask = await dataAccessor.loadSingleTask(parentId);
|
|
410
461
|
if (!parentTask) {
|
|
411
|
-
throw new CleoError(ExitCode.PARENT_NOT_FOUND, `Parent task ${parentId} not found
|
|
462
|
+
throw new CleoError(ExitCode.PARENT_NOT_FOUND, `Parent task ${parentId} not found`, {
|
|
463
|
+
fix: `Use 'cleo find "${parentId}"' to search or create as standalone task`,
|
|
464
|
+
details: { field: 'parentId', actual: parentId },
|
|
465
|
+
});
|
|
412
466
|
}
|
|
413
467
|
// Read hierarchy limits from config via policy module
|
|
414
468
|
const config = await loadConfig(cwd);
|
|
@@ -417,7 +471,14 @@ export async function addTask(options, cwd, accessor) {
|
|
|
417
471
|
const ancestors = await dataAccessor.getAncestorChain(parentId);
|
|
418
472
|
const parentDepth = ancestors.length;
|
|
419
473
|
if (parentDepth + 1 >= policy.maxDepth) {
|
|
420
|
-
throw new CleoError(ExitCode.DEPTH_EXCEEDED, `Maximum nesting depth ${policy.maxDepth} would be exceeded
|
|
474
|
+
throw new CleoError(ExitCode.DEPTH_EXCEEDED, `Maximum nesting depth ${policy.maxDepth} would be exceeded`, {
|
|
475
|
+
fix: 'Reparent this task under a higher-level epic',
|
|
476
|
+
details: {
|
|
477
|
+
field: 'parentId',
|
|
478
|
+
expected: `depth < ${policy.maxDepth}`,
|
|
479
|
+
actual: parentDepth + 1,
|
|
480
|
+
},
|
|
481
|
+
});
|
|
421
482
|
}
|
|
422
483
|
// Sibling limit (0 = unlimited)
|
|
423
484
|
if (policy.maxSiblings > 0) {
|
|
@@ -426,13 +487,27 @@ export async function addTask(options, cwd, accessor) {
|
|
|
426
487
|
? children.length
|
|
427
488
|
: children.filter((t) => t.status !== 'done').length;
|
|
428
489
|
if (counted >= policy.maxSiblings) {
|
|
429
|
-
throw new CleoError(ExitCode.SIBLING_LIMIT, `Parent ${parentId} already has ${counted} children (limit: ${policy.maxSiblings})
|
|
490
|
+
throw new CleoError(ExitCode.SIBLING_LIMIT, `Parent ${parentId} already has ${counted} children (limit: ${policy.maxSiblings})`, {
|
|
491
|
+
fix: 'Create as standalone task or increase hierarchy.maxSiblings in config',
|
|
492
|
+
details: {
|
|
493
|
+
field: 'parentId',
|
|
494
|
+
expected: `<= ${policy.maxSiblings} siblings`,
|
|
495
|
+
actual: counted,
|
|
496
|
+
},
|
|
497
|
+
});
|
|
430
498
|
}
|
|
431
499
|
}
|
|
432
500
|
// Active siblings cap
|
|
433
501
|
const activeCount = await dataAccessor.countActiveChildren(parentId);
|
|
434
502
|
if (policy.maxActiveSiblings > 0 && activeCount >= policy.maxActiveSiblings) {
|
|
435
|
-
throw new CleoError(ExitCode.SIBLING_LIMIT, `Parent ${parentId} already has ${activeCount} active children (maxActiveSiblings=${policy.maxActiveSiblings})
|
|
503
|
+
throw new CleoError(ExitCode.SIBLING_LIMIT, `Parent ${parentId} already has ${activeCount} active children (maxActiveSiblings=${policy.maxActiveSiblings})`, {
|
|
504
|
+
fix: 'Complete or cancel an active sibling before adding a new task here',
|
|
505
|
+
details: {
|
|
506
|
+
field: 'parentId',
|
|
507
|
+
expected: `<= ${policy.maxActiveSiblings} active siblings`,
|
|
508
|
+
actual: activeCount,
|
|
509
|
+
},
|
|
510
|
+
});
|
|
436
511
|
}
|
|
437
512
|
// Validate type constraints
|
|
438
513
|
if (taskType === 'epic') {
|
|
@@ -499,7 +574,7 @@ export async function addTask(options, cwd, accessor) {
|
|
|
499
574
|
const previewTask = {
|
|
500
575
|
id: 'T???',
|
|
501
576
|
title: options.title,
|
|
502
|
-
description: options.description,
|
|
577
|
+
description: options.description ?? '',
|
|
503
578
|
status,
|
|
504
579
|
priority,
|
|
505
580
|
type: taskType,
|
|
@@ -586,7 +661,7 @@ export async function addTask(options, cwd, accessor) {
|
|
|
586
661
|
const task = {
|
|
587
662
|
id: taskId,
|
|
588
663
|
title: options.title,
|
|
589
|
-
description: options.description,
|
|
664
|
+
description: options.description ?? '',
|
|
590
665
|
status,
|
|
591
666
|
priority,
|
|
592
667
|
type: taskType,
|