@cleocode/core 2026.4.9 → 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/adapters/adapter-registry.js +64 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/discovery.js +83 -0
- package/dist/adapters/discovery.js.map +1 -0
- package/dist/adapters/index.js +9 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/manager.js +260 -0
- package/dist/adapters/manager.js.map +1 -0
- package/dist/admin/export-tasks.js +171 -0
- package/dist/admin/export-tasks.js.map +1 -0
- package/dist/admin/export.js +103 -0
- package/dist/admin/export.js.map +1 -0
- package/dist/admin/help.js +106 -0
- package/dist/admin/help.js.map +1 -0
- package/dist/admin/import-tasks.js +182 -0
- package/dist/admin/import-tasks.js.map +1 -0
- package/dist/admin/import.js +129 -0
- package/dist/admin/import.js.map +1 -0
- package/dist/admin/index.js +13 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/adrs/find.js +134 -0
- package/dist/adrs/find.js.map +1 -0
- package/dist/adrs/index.js +15 -0
- package/dist/adrs/index.js.map +1 -0
- package/dist/adrs/link-pipeline.js +160 -0
- package/dist/adrs/link-pipeline.js.map +1 -0
- package/dist/adrs/list.js +43 -0
- package/dist/adrs/list.js.map +1 -0
- package/dist/adrs/parse.js +51 -0
- package/dist/adrs/parse.js.map +1 -0
- package/dist/adrs/show.js +22 -0
- package/dist/adrs/show.js.map +1 -0
- package/dist/adrs/sync.js +188 -0
- package/dist/adrs/sync.js.map +1 -0
- package/dist/adrs/types.js +9 -0
- package/dist/adrs/types.js.map +1 -0
- package/dist/adrs/validate.js +57 -0
- package/dist/adrs/validate.js.map +1 -0
- package/dist/agents/agent-registry.js +288 -0
- package/dist/agents/agent-registry.js.map +1 -0
- package/dist/agents/agent-schema.d.ts +2 -2
- package/dist/agents/agent-schema.js +82 -0
- package/dist/agents/agent-schema.js.map +1 -0
- package/dist/agents/capacity.js +116 -0
- package/dist/agents/capacity.js.map +1 -0
- package/dist/agents/execution-learning.js +474 -0
- package/dist/agents/execution-learning.js.map +1 -0
- package/dist/agents/health-monitor.js +217 -0
- package/dist/agents/health-monitor.js.map +1 -0
- package/dist/agents/index.js +29 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/registry.js +314 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/retry.js +215 -0
- package/dist/agents/retry.js.map +1 -0
- package/dist/audit-prune.js +94 -0
- package/dist/audit-prune.js.map +1 -0
- package/dist/audit.js +68 -0
- package/dist/audit.js.map +1 -0
- package/dist/backfill/index.js +229 -0
- package/dist/backfill/index.js.map +1 -0
- package/dist/bootstrap.js +344 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/caamp/adapter.js +259 -0
- package/dist/caamp/adapter.js.map +1 -0
- package/dist/caamp/capability-check.js +38 -0
- package/dist/caamp/capability-check.js.map +1 -0
- package/dist/caamp/index.js +21 -0
- package/dist/caamp/index.js.map +1 -0
- package/dist/caamp-init.js +16 -0
- package/dist/caamp-init.js.map +1 -0
- package/dist/cleo.js +322 -0
- package/dist/cleo.js.map +1 -0
- package/dist/code/index.js +10 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code/outline.js +165 -0
- package/dist/code/outline.js.map +1 -0
- package/dist/code/parser.js +295 -0
- package/dist/code/parser.js.map +1 -0
- package/dist/code/search.js +135 -0
- package/dist/code/search.js.map +1 -0
- package/dist/code/unfold.js +155 -0
- package/dist/code/unfold.js.map +1 -0
- package/dist/codebase-map/analyzers/architecture.d.ts.map +1 -1
- package/dist/codebase-map/analyzers/architecture.js +129 -0
- package/dist/codebase-map/analyzers/architecture.js.map +1 -0
- package/dist/codebase-map/analyzers/concerns.js +122 -0
- package/dist/codebase-map/analyzers/concerns.js.map +1 -0
- package/dist/codebase-map/analyzers/conventions.js +149 -0
- package/dist/codebase-map/analyzers/conventions.js.map +1 -0
- package/dist/codebase-map/analyzers/integrations.js +108 -0
- package/dist/codebase-map/analyzers/integrations.js.map +1 -0
- package/dist/codebase-map/analyzers/stack.js +117 -0
- package/dist/codebase-map/analyzers/stack.js.map +1 -0
- package/dist/codebase-map/analyzers/structure.js +137 -0
- package/dist/codebase-map/analyzers/structure.js.map +1 -0
- package/dist/codebase-map/analyzers/testing.js +118 -0
- package/dist/codebase-map/analyzers/testing.js.map +1 -0
- package/dist/codebase-map/index.js +57 -0
- package/dist/codebase-map/index.js.map +1 -0
- package/dist/codebase-map/store.js +122 -0
- package/dist/codebase-map/store.js.map +1 -0
- package/dist/codebase-map/summary.js +152 -0
- package/dist/codebase-map/summary.js.map +1 -0
- package/dist/compliance/index.js +288 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/protocol-enforcement.js +332 -0
- package/dist/compliance/protocol-enforcement.js.map +1 -0
- package/dist/compliance/protocol-rules.js +786 -0
- package/dist/compliance/protocol-rules.js.map +1 -0
- package/dist/compliance/protocol-types.js +79 -0
- package/dist/compliance/protocol-types.js.map +1 -0
- package/dist/compliance/store.js +53 -0
- package/dist/compliance/store.js.map +1 -0
- package/dist/conduit/conduit-client.js +107 -0
- package/dist/conduit/conduit-client.js.map +1 -0
- package/dist/conduit/factory.js +52 -0
- package/dist/conduit/factory.js.map +1 -0
- package/dist/conduit/http-transport.js +155 -0
- package/dist/conduit/http-transport.js.map +1 -0
- package/dist/conduit/index.js +15 -0
- package/dist/conduit/index.js.map +1 -0
- 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 +255 -0
- package/dist/conduit/local-transport.js.map +1 -0
- package/dist/conduit/sse-transport.js +299 -0
- package/dist/conduit/sse-transport.js.map +1 -0
- package/dist/config/build-config.js +29 -0
- package/dist/config/build-config.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +400 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -0
- package/dist/context/index.js +137 -0
- package/dist/context/index.js.map +1 -0
- package/dist/crypto/credentials.js +191 -0
- package/dist/crypto/credentials.js.map +1 -0
- package/dist/discovery.js +182 -0
- package/dist/discovery.js.map +1 -0
- package/dist/engine-result.js +12 -0
- package/dist/engine-result.js.map +1 -0
- package/dist/error-catalog.js +404 -0
- package/dist/error-catalog.js.map +1 -0
- package/dist/error-registry.js +393 -0
- package/dist/error-registry.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +173 -0
- package/dist/errors.js.map +1 -0
- package/dist/hooks/handlers/agent-hooks.js +106 -0
- package/dist/hooks/handlers/agent-hooks.js.map +1 -0
- package/dist/hooks/handlers/context-hooks.js +111 -0
- package/dist/hooks/handlers/context-hooks.js.map +1 -0
- package/dist/hooks/handlers/error-hooks.js +52 -0
- package/dist/hooks/handlers/error-hooks.js.map +1 -0
- package/dist/hooks/handlers/file-hooks.js +104 -0
- package/dist/hooks/handlers/file-hooks.js.map +1 -0
- package/dist/hooks/handlers/handler-helpers.js +61 -0
- package/dist/hooks/handlers/handler-helpers.js.map +1 -0
- package/dist/hooks/handlers/index.js +28 -0
- package/dist/hooks/handlers/index.js.map +1 -0
- package/dist/hooks/handlers/memory-bridge-refresh.js +42 -0
- package/dist/hooks/handlers/memory-bridge-refresh.js.map +1 -0
- package/dist/hooks/handlers/notification-hooks.js +62 -0
- package/dist/hooks/handlers/notification-hooks.js.map +1 -0
- package/dist/hooks/handlers/session-hooks.d.ts +21 -0
- package/dist/hooks/handlers/session-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/session-hooks.js +142 -0
- package/dist/hooks/handlers/session-hooks.js.map +1 -0
- package/dist/hooks/handlers/task-hooks.js +65 -0
- package/dist/hooks/handlers/task-hooks.js.map +1 -0
- package/dist/hooks/handlers/work-capture-hooks.js +165 -0
- package/dist/hooks/handlers/work-capture-hooks.js.map +1 -0
- package/dist/hooks/index.js +13 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/payload-schemas.d.ts +2 -2
- package/dist/hooks/payload-schemas.js +220 -0
- package/dist/hooks/payload-schemas.js.map +1 -0
- package/dist/hooks/provider-hooks.js +66 -0
- package/dist/hooks/provider-hooks.js.map +1 -0
- package/dist/hooks/registry.js +229 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/types.js +66 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/hooks.js +136 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.js +175 -68684
- 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 +851 -0
- package/dist/init.js.map +1 -0
- package/dist/inject/index.js +82 -0
- package/dist/inject/index.js.map +1 -0
- package/dist/injection.js +343 -0
- package/dist/injection.js.map +1 -0
- package/dist/intelligence/adaptive-validation.js +497 -0
- package/dist/intelligence/adaptive-validation.js.map +1 -0
- package/dist/intelligence/impact.js +675 -0
- package/dist/intelligence/impact.js.map +1 -0
- package/dist/intelligence/index.js +22 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/intelligence/patterns.js +492 -0
- package/dist/intelligence/patterns.js.map +1 -0
- package/dist/intelligence/prediction.js +499 -0
- package/dist/intelligence/prediction.js.map +1 -0
- package/dist/intelligence/types.js +13 -0
- package/dist/intelligence/types.js.map +1 -0
- package/dist/internal.d.ts +15 -5
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +306 -0
- package/dist/internal.js.map +1 -0
- package/dist/issue/create.js +121 -0
- package/dist/issue/create.js.map +1 -0
- package/dist/issue/diagnostics.js +59 -0
- package/dist/issue/diagnostics.js.map +1 -0
- package/dist/issue/index.js +10 -0
- package/dist/issue/index.js.map +1 -0
- package/dist/issue/template-parser.js +267 -0
- package/dist/issue/template-parser.js.map +1 -0
- package/dist/json-schema-validator.js +76 -0
- package/dist/json-schema-validator.js.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/retry.js +152 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/tree-sitter-languages.js +71 -0
- package/dist/lib/tree-sitter-languages.js.map +1 -0
- package/dist/lifecycle/chain-composition.js +152 -0
- package/dist/lifecycle/chain-composition.js.map +1 -0
- package/dist/lifecycle/chain-store.js +246 -0
- package/dist/lifecycle/chain-store.js.map +1 -0
- package/dist/lifecycle/consolidate-rcasd.js +352 -0
- package/dist/lifecycle/consolidate-rcasd.js.map +1 -0
- package/dist/lifecycle/default-chain.js +176 -0
- package/dist/lifecycle/default-chain.js.map +1 -0
- package/dist/lifecycle/evidence.js +180 -0
- package/dist/lifecycle/evidence.js.map +1 -0
- package/dist/lifecycle/frontmatter.js +363 -0
- package/dist/lifecycle/frontmatter.js.map +1 -0
- package/dist/lifecycle/index.js +756 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lifecycle/pipeline.js +656 -0
- package/dist/lifecycle/pipeline.js.map +1 -0
- package/dist/lifecycle/rcasd-index.js +326 -0
- package/dist/lifecycle/rcasd-index.js.map +1 -0
- package/dist/lifecycle/rcasd-paths.js +220 -0
- package/dist/lifecycle/rcasd-paths.js.map +1 -0
- package/dist/lifecycle/resume.js +864 -0
- package/dist/lifecycle/resume.js.map +1 -0
- package/dist/lifecycle/stage-artifacts.js +94 -0
- package/dist/lifecycle/stage-artifacts.js.map +1 -0
- package/dist/lifecycle/stage-guidance.js +234 -0
- package/dist/lifecycle/stage-guidance.js.map +1 -0
- package/dist/lifecycle/stages.js +534 -0
- package/dist/lifecycle/stages.js.map +1 -0
- package/dist/lifecycle/state-machine.js +516 -0
- package/dist/lifecycle/state-machine.js.map +1 -0
- package/dist/lifecycle/tessera-engine.js +249 -0
- package/dist/lifecycle/tessera-engine.js.map +1 -0
- package/dist/logger.js +140 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory/auto-extract.js +177 -0
- package/dist/memory/auto-extract.js.map +1 -0
- package/dist/memory/brain-embedding.js +66 -0
- package/dist/memory/brain-embedding.js.map +1 -0
- package/dist/memory/brain-lifecycle.js +298 -0
- package/dist/memory/brain-lifecycle.js.map +1 -0
- package/dist/memory/brain-links.js +161 -0
- package/dist/memory/brain-links.js.map +1 -0
- package/dist/memory/brain-maintenance.js +114 -0
- package/dist/memory/brain-maintenance.js.map +1 -0
- package/dist/memory/brain-migration.js +149 -0
- package/dist/memory/brain-migration.js.map +1 -0
- package/dist/memory/brain-reasoning.js +215 -0
- package/dist/memory/brain-reasoning.js.map +1 -0
- package/dist/memory/brain-retrieval.js +542 -0
- package/dist/memory/brain-retrieval.js.map +1 -0
- package/dist/memory/brain-row-types.js +10 -0
- package/dist/memory/brain-row-types.js.map +1 -0
- package/dist/memory/brain-search.js +519 -0
- package/dist/memory/brain-search.js.map +1 -0
- package/dist/memory/brain-similarity.js +145 -0
- package/dist/memory/brain-similarity.js.map +1 -0
- package/dist/memory/claude-mem-migration.js +277 -0
- package/dist/memory/claude-mem-migration.js.map +1 -0
- package/dist/memory/decisions.js +162 -0
- package/dist/memory/decisions.js.map +1 -0
- package/dist/memory/embedding-local.js +97 -0
- package/dist/memory/embedding-local.js.map +1 -0
- package/dist/memory/embedding-queue.js +271 -0
- package/dist/memory/embedding-queue.js.map +1 -0
- package/dist/memory/embedding-worker.js +58 -0
- package/dist/memory/embedding-worker.js.map +1 -0
- package/dist/memory/engine-compat.js +1397 -0
- package/dist/memory/engine-compat.js.map +1 -0
- package/dist/memory/index.js +1140 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/learnings.d.ts +2 -2
- package/dist/memory/learnings.js +121 -0
- package/dist/memory/learnings.js.map +1 -0
- package/dist/memory/memory-bridge.js +370 -0
- package/dist/memory/memory-bridge.js.map +1 -0
- package/dist/memory/patterns.d.ts +4 -4
- package/dist/memory/patterns.js +122 -0
- package/dist/memory/patterns.js.map +1 -0
- package/dist/memory/pipeline-manifest-sqlite.js +975 -0
- package/dist/memory/pipeline-manifest-sqlite.js.map +1 -0
- package/dist/memory/session-memory.js +331 -0
- package/dist/memory/session-memory.js.map +1 -0
- package/dist/metrics/ab-test.js +260 -0
- package/dist/metrics/ab-test.js.map +1 -0
- package/dist/metrics/aggregation.js +363 -0
- package/dist/metrics/aggregation.js.map +1 -0
- package/dist/metrics/common.js +64 -0
- package/dist/metrics/common.js.map +1 -0
- package/dist/metrics/enums.js +78 -0
- package/dist/metrics/enums.js.map +1 -0
- package/dist/metrics/index.js +19 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/model-provider-registry.js +88 -0
- package/dist/metrics/model-provider-registry.js.map +1 -0
- package/dist/metrics/otel-integration.js +263 -0
- package/dist/metrics/otel-integration.js.map +1 -0
- package/dist/metrics/provider-detection.js +103 -0
- package/dist/metrics/provider-detection.js.map +1 -0
- package/dist/metrics/token-estimation.js +253 -0
- package/dist/metrics/token-estimation.js.map +1 -0
- package/dist/metrics/token-service.js +450 -0
- package/dist/metrics/token-service.js.map +1 -0
- package/dist/migration/agent-outputs.js +316 -0
- package/dist/migration/agent-outputs.js.map +1 -0
- package/dist/migration/checksum.js +92 -0
- package/dist/migration/checksum.js.map +1 -0
- package/dist/migration/index.js +282 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/logger.js +360 -0
- package/dist/migration/logger.js.map +1 -0
- package/dist/migration/preflight.js +9 -0
- package/dist/migration/preflight.js.map +1 -0
- package/dist/migration/state.js +421 -0
- package/dist/migration/state.js.map +1 -0
- package/dist/migration/validate.js +241 -0
- package/dist/migration/validate.js.map +1 -0
- package/dist/mvi-helpers.js +74 -0
- package/dist/mvi-helpers.js.map +1 -0
- package/dist/nexus/deps.js +375 -0
- package/dist/nexus/deps.js.map +1 -0
- package/dist/nexus/discover.js +288 -0
- package/dist/nexus/discover.js.map +1 -0
- package/dist/nexus/hash.js +10 -0
- package/dist/nexus/hash.js.map +1 -0
- package/dist/nexus/index.js +40 -0
- package/dist/nexus/index.js.map +1 -0
- package/dist/nexus/migrate-json-to-sqlite.js +115 -0
- package/dist/nexus/migrate-json-to-sqlite.js.map +1 -0
- package/dist/nexus/permissions.js +105 -0
- package/dist/nexus/permissions.js.map +1 -0
- package/dist/nexus/query.js +175 -0
- package/dist/nexus/query.js.map +1 -0
- package/dist/nexus/registry.js +584 -0
- package/dist/nexus/registry.js.map +1 -0
- package/dist/nexus/sharing/index.js +288 -0
- package/dist/nexus/sharing/index.js.map +1 -0
- package/dist/nexus/transfer-types.js +8 -0
- package/dist/nexus/transfer-types.js.map +1 -0
- package/dist/nexus/transfer.js +263 -0
- package/dist/nexus/transfer.js.map +1 -0
- package/dist/nexus/workspace.js +355 -0
- package/dist/nexus/workspace.js.map +1 -0
- package/dist/observability/index.js +103 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/log-filter.js +63 -0
- package/dist/observability/log-filter.js.map +1 -0
- package/dist/observability/log-parser.js +99 -0
- package/dist/observability/log-parser.js.map +1 -0
- package/dist/observability/log-reader.js +139 -0
- package/dist/observability/log-reader.js.map +1 -0
- package/dist/observability/types.js +19 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/orchestration/analyze.js +107 -0
- package/dist/orchestration/analyze.js.map +1 -0
- package/dist/orchestration/bootstrap.js +132 -0
- package/dist/orchestration/bootstrap.js.map +1 -0
- package/dist/orchestration/context.js +56 -0
- package/dist/orchestration/context.js.map +1 -0
- package/dist/orchestration/critical-path.js +100 -0
- package/dist/orchestration/critical-path.js.map +1 -0
- package/dist/orchestration/hierarchy.js +183 -0
- package/dist/orchestration/hierarchy.js.map +1 -0
- package/dist/orchestration/index.js +287 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/parallel.js +89 -0
- package/dist/orchestration/parallel.js.map +1 -0
- package/dist/orchestration/protocol-validators.js +815 -0
- package/dist/orchestration/protocol-validators.js.map +1 -0
- package/dist/orchestration/skill-ops.js +98 -0
- package/dist/orchestration/skill-ops.js.map +1 -0
- package/dist/orchestration/status.js +107 -0
- package/dist/orchestration/status.js.map +1 -0
- package/dist/orchestration/unblock.js +103 -0
- package/dist/orchestration/unblock.js.map +1 -0
- package/dist/orchestration/validate-spawn.js +67 -0
- package/dist/orchestration/validate-spawn.js.map +1 -0
- package/dist/orchestration/waves.js +86 -0
- package/dist/orchestration/waves.js.map +1 -0
- package/dist/otel/index.js +163 -0
- package/dist/otel/index.js.map +1 -0
- package/dist/output.d.ts +32 -11
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +164 -0
- package/dist/output.js.map +1 -0
- package/dist/pagination.js +64 -0
- package/dist/pagination.js.map +1 -0
- package/dist/paths.d.ts +39 -9
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +842 -0
- package/dist/paths.js.map +1 -0
- package/dist/phases/deps.js +372 -0
- package/dist/phases/deps.js.map +1 -0
- package/dist/phases/index.js +349 -0
- package/dist/phases/index.js.map +1 -0
- package/dist/pipeline/index.js +10 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/phase.js +45 -0
- package/dist/pipeline/phase.js.map +1 -0
- package/dist/platform.js +211 -0
- package/dist/platform.js.map +1 -0
- package/dist/project-info.js +84 -0
- package/dist/project-info.js.map +1 -0
- package/dist/reconciliation/index.js +10 -0
- package/dist/reconciliation/index.js.map +1 -0
- package/dist/reconciliation/link-store.js +129 -0
- package/dist/reconciliation/link-store.js.map +1 -0
- package/dist/reconciliation/reconciliation-engine.js +298 -0
- package/dist/reconciliation/reconciliation-engine.js.map +1 -0
- package/dist/release/artifacts.js +427 -0
- package/dist/release/artifacts.js.map +1 -0
- package/dist/release/changelog-writer.js +151 -0
- package/dist/release/changelog-writer.js.map +1 -0
- package/dist/release/channel.js +144 -0
- package/dist/release/channel.js.map +1 -0
- package/dist/release/ci.js +166 -0
- package/dist/release/ci.js.map +1 -0
- package/dist/release/github-pr.js +225 -0
- package/dist/release/github-pr.js.map +1 -0
- package/dist/release/guards.js +116 -0
- package/dist/release/guards.js.map +1 -0
- package/dist/release/index.js +22 -0
- package/dist/release/index.js.map +1 -0
- package/dist/release/release-config.js +158 -0
- package/dist/release/release-config.js.map +1 -0
- package/dist/release/release-manifest.js +1019 -0
- package/dist/release/release-manifest.js.map +1 -0
- package/dist/release/version-bump.js +255 -0
- package/dist/release/version-bump.js.map +1 -0
- package/dist/remote/index.js +257 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/repair.js +130 -0
- package/dist/repair.js.map +1 -0
- package/dist/research/index.js +2 -0
- package/dist/research/index.js.map +1 -0
- package/dist/roadmap/index.js +59 -0
- package/dist/roadmap/index.js.map +1 -0
- package/dist/routing/capability-matrix.js +1556 -0
- package/dist/routing/capability-matrix.js.map +1 -0
- package/dist/routing/index.js +9 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/scaffold.d.ts +15 -2
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +1759 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/schema-management.js +295 -0
- package/dist/schema-management.js.map +1 -0
- package/dist/security/index.js +9 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/input-sanitization.js +321 -0
- package/dist/security/input-sanitization.js.map +1 -0
- package/dist/sequence/index.js +295 -0
- package/dist/sequence/index.js.map +1 -0
- package/dist/sessions/assumptions.js +54 -0
- package/dist/sessions/assumptions.js.map +1 -0
- package/dist/sessions/briefing.js +377 -0
- package/dist/sessions/briefing.js.map +1 -0
- package/dist/sessions/context-alert.js +222 -0
- package/dist/sessions/context-alert.js.map +1 -0
- package/dist/sessions/context-inject.js +61 -0
- package/dist/sessions/context-inject.js.map +1 -0
- package/dist/sessions/context-monitor.js +98 -0
- package/dist/sessions/context-monitor.js.map +1 -0
- package/dist/sessions/decisions.js +65 -0
- package/dist/sessions/decisions.js.map +1 -0
- package/dist/sessions/find.js +65 -0
- package/dist/sessions/find.js.map +1 -0
- package/dist/sessions/handoff.js +328 -0
- package/dist/sessions/handoff.js.map +1 -0
- package/dist/sessions/hitl-warnings.js +254 -0
- package/dist/sessions/hitl-warnings.js.map +1 -0
- package/dist/sessions/index.js +327 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/session-archive.js +40 -0
- package/dist/sessions/session-archive.js.map +1 -0
- package/dist/sessions/session-cleanup.js +59 -0
- package/dist/sessions/session-cleanup.js.map +1 -0
- package/dist/sessions/session-drift.js +134 -0
- package/dist/sessions/session-drift.js.map +1 -0
- package/dist/sessions/session-enforcement.js +144 -0
- package/dist/sessions/session-enforcement.js.map +1 -0
- package/dist/sessions/session-grade.js +253 -0
- package/dist/sessions/session-grade.js.map +1 -0
- package/dist/sessions/session-history.js +42 -0
- package/dist/sessions/session-history.js.map +1 -0
- package/dist/sessions/session-id.js +81 -0
- package/dist/sessions/session-id.js.map +1 -0
- package/dist/sessions/session-memory-bridge.js +52 -0
- package/dist/sessions/session-memory-bridge.js.map +1 -0
- package/dist/sessions/session-show.js +24 -0
- package/dist/sessions/session-show.js.map +1 -0
- package/dist/sessions/session-stats.js +69 -0
- package/dist/sessions/session-stats.js.map +1 -0
- package/dist/sessions/session-suspend.js +39 -0
- package/dist/sessions/session-suspend.js.map +1 -0
- package/dist/sessions/session-switch.js +51 -0
- package/dist/sessions/session-switch.js.map +1 -0
- package/dist/sessions/session-view.js +76 -0
- package/dist/sessions/session-view.js.map +1 -0
- package/dist/sessions/snapshot.js +213 -0
- package/dist/sessions/snapshot.js.map +1 -0
- package/dist/sessions/statusline-setup.js +85 -0
- package/dist/sessions/statusline-setup.js.map +1 -0
- package/dist/sessions/types.js +8 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/skills/agents/config.js +94 -0
- package/dist/skills/agents/config.js.map +1 -0
- package/dist/skills/agents/install.js +116 -0
- package/dist/skills/agents/install.js.map +1 -0
- package/dist/skills/agents/registry.js +161 -0
- package/dist/skills/agents/registry.js.map +1 -0
- package/dist/skills/discovery.js +333 -0
- package/dist/skills/discovery.js.map +1 -0
- package/dist/skills/dispatch.js +347 -0
- package/dist/skills/dispatch.js.map +1 -0
- 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 +87 -0
- package/dist/skills/dynamic-skill-generator.js.map +1 -0
- package/dist/skills/index.js +44 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/injection/subagent.js +195 -0
- package/dist/skills/injection/subagent.js.map +1 -0
- package/dist/skills/injection/token.js +260 -0
- package/dist/skills/injection/token.js.map +1 -0
- package/dist/skills/install.js +40 -0
- package/dist/skills/install.js.map +1 -0
- package/dist/skills/manifests/contribution.js +175 -0
- package/dist/skills/manifests/contribution.js.map +1 -0
- package/dist/skills/manifests/research.js +281 -0
- package/dist/skills/manifests/research.js.map +1 -0
- package/dist/skills/manifests/resolver.js +146 -0
- package/dist/skills/manifests/resolver.js.map +1 -0
- package/dist/skills/marketplace.js +90 -0
- package/dist/skills/marketplace.js.map +1 -0
- package/dist/skills/orchestrator/spawn.js +178 -0
- package/dist/skills/orchestrator/spawn.js.map +1 -0
- package/dist/skills/orchestrator/startup.js +451 -0
- package/dist/skills/orchestrator/startup.js.map +1 -0
- package/dist/skills/orchestrator/validator.js +301 -0
- package/dist/skills/orchestrator/validator.js.map +1 -0
- package/dist/skills/precedence-integration.js +73 -0
- package/dist/skills/precedence-integration.js.map +1 -0
- package/dist/skills/precedence-types.js +16 -0
- package/dist/skills/precedence-types.js.map +1 -0
- package/dist/skills/routing-table.js +63 -0
- package/dist/skills/routing-table.js.map +1 -0
- package/dist/skills/skill-paths.js +217 -0
- package/dist/skills/skill-paths.js.map +1 -0
- package/dist/skills/test-utility.js +55 -0
- package/dist/skills/test-utility.js.map +1 -0
- package/dist/skills/types.js +118 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validation.js +183 -0
- package/dist/skills/validation.js.map +1 -0
- package/dist/skills/version.js +57 -0
- package/dist/skills/version.js.map +1 -0
- package/dist/snapshot/index.js +188 -0
- package/dist/snapshot/index.js.map +1 -0
- package/dist/spawn/adapter-registry.js +246 -0
- package/dist/spawn/adapter-registry.js.map +1 -0
- package/dist/spawn/index.js +10 -0
- package/dist/spawn/index.js.map +1 -0
- package/dist/stats/index.js +343 -0
- package/dist/stats/index.js.map +1 -0
- package/dist/stats/workflow-telemetry.js +400 -0
- package/dist/stats/workflow-telemetry.js.map +1 -0
- package/dist/sticky/archive.js +47 -0
- package/dist/sticky/archive.js.map +1 -0
- package/dist/sticky/convert.js +235 -0
- package/dist/sticky/convert.js.map +1 -0
- package/dist/sticky/create.js +48 -0
- package/dist/sticky/create.js.map +1 -0
- package/dist/sticky/id.js +35 -0
- package/dist/sticky/id.js.map +1 -0
- package/dist/sticky/index.js +16 -0
- package/dist/sticky/index.js.map +1 -0
- package/dist/sticky/list.js +44 -0
- package/dist/sticky/list.js.map +1 -0
- package/dist/sticky/purge.js +45 -0
- package/dist/sticky/purge.js.map +1 -0
- package/dist/sticky/show.js +42 -0
- package/dist/sticky/show.js.map +1 -0
- package/dist/sticky/types.js +10 -0
- package/dist/sticky/types.js.map +1 -0
- 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 +783 -0
- package/dist/store/agent-registry-accessor.js.map +1 -0
- 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/atomic.js +167 -0
- package/dist/store/atomic.js.map +1 -0
- package/dist/store/backup.js +94 -0
- package/dist/store/backup.js.map +1 -0
- package/dist/store/brain-accessor.js +397 -0
- package/dist/store/brain-accessor.js.map +1 -0
- package/dist/store/brain-schema.d.ts +8 -8
- package/dist/store/brain-schema.js +215 -0
- package/dist/store/brain-schema.js.map +1 -0
- package/dist/store/brain-sqlite.js +222 -0
- package/dist/store/brain-sqlite.js.map +1 -0
- package/dist/store/cache.js +168 -0
- package/dist/store/cache.js.map +1 -0
- package/dist/store/chain-schema.js +51 -0
- package/dist/store/chain-schema.js.map +1 -0
- package/dist/store/cleanup-legacy.d.ts +128 -0
- package/dist/store/cleanup-legacy.d.ts.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/converters.js +124 -0
- package/dist/store/converters.js.map +1 -0
- package/dist/store/cross-db-cleanup.js +319 -0
- package/dist/store/cross-db-cleanup.js.map +1 -0
- package/dist/store/data-accessor.js +26 -0
- package/dist/store/data-accessor.js.map +1 -0
- package/dist/store/data-safety-central.js +269 -0
- package/dist/store/data-safety-central.js.map +1 -0
- package/dist/store/data-safety.js +274 -0
- package/dist/store/data-safety.js.map +1 -0
- package/dist/store/db-helpers.js +224 -0
- package/dist/store/db-helpers.js.map +1 -0
- package/dist/store/export.js +155 -0
- package/dist/store/export.js.map +1 -0
- package/dist/store/file-utils.js +270 -0
- package/dist/store/file-utils.js.map +1 -0
- package/dist/store/git-checkpoint.js +365 -0
- package/dist/store/git-checkpoint.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/import-logging.js +139 -0
- package/dist/store/import-logging.js.map +1 -0
- package/dist/store/import-remap.js +145 -0
- package/dist/store/import-remap.js.map +1 -0
- package/dist/store/import-sort.js +121 -0
- package/dist/store/import-sort.js.map +1 -0
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +29 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/json.js +208 -0
- package/dist/store/json.js.map +1 -0
- package/dist/store/lifecycle-store.js +249 -0
- package/dist/store/lifecycle-store.js.map +1 -0
- package/dist/store/lock.js +70 -0
- package/dist/store/lock.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/migration-manager.js +151 -0
- package/dist/store/migration-manager.js.map +1 -0
- package/dist/store/migration-sqlite.js +676 -0
- package/dist/store/migration-sqlite.js.map +1 -0
- package/dist/store/nexus-schema.js +62 -0
- package/dist/store/nexus-schema.js.map +1 -0
- package/dist/store/nexus-sqlite.d.ts +14 -2
- package/dist/store/nexus-sqlite.d.ts.map +1 -1
- package/dist/store/nexus-sqlite.js +242 -0
- package/dist/store/nexus-sqlite.js.map +1 -0
- package/dist/store/nexus-validation-schemas.js +40 -0
- package/dist/store/nexus-validation-schemas.js.map +1 -0
- package/dist/store/parsers.js +37 -0
- package/dist/store/parsers.js.map +1 -0
- package/dist/store/project-detect.js +457 -0
- package/dist/store/project-detect.js.map +1 -0
- package/dist/store/provider.js +101 -0
- package/dist/store/provider.js.map +1 -0
- package/dist/store/safety-data-accessor.js +257 -0
- package/dist/store/safety-data-accessor.js.map +1 -0
- package/dist/store/schema.js +7 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/session-store.js +219 -0
- package/dist/store/session-store.js.map +1 -0
- 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 +550 -0
- package/dist/store/signaldock-sqlite.js.map +1 -0
- package/dist/store/sqlite-backup.d.ts +121 -10
- package/dist/store/sqlite-backup.d.ts.map +1 -1
- package/dist/store/sqlite-backup.js +359 -0
- package/dist/store/sqlite-backup.js.map +1 -0
- package/dist/store/sqlite-data-accessor.js +787 -0
- package/dist/store/sqlite-data-accessor.js.map +1 -0
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +481 -0
- package/dist/store/sqlite.js.map +1 -0
- package/dist/store/status-registry.js +8 -0
- package/dist/store/status-registry.js.map +1 -0
- package/dist/store/task-store.js +358 -0
- package/dist/store/task-store.js.map +1 -0
- package/dist/store/tasks-schema.d.ts +8 -8
- package/dist/store/tasks-schema.js +610 -0
- package/dist/store/tasks-schema.js.map +1 -0
- package/dist/store/typed-query.js +15 -0
- package/dist/store/typed-query.js.map +1 -0
- package/dist/store/validation-schemas.d.ts +37 -37
- package/dist/store/validation-schemas.js +278 -0
- package/dist/store/validation-schemas.js.map +1 -0
- package/dist/system/archive-analytics.js +277 -0
- package/dist/system/archive-analytics.js.map +1 -0
- package/dist/system/archive-stats.js +64 -0
- package/dist/system/archive-stats.js.map +1 -0
- package/dist/system/audit.js +145 -0
- package/dist/system/audit.js.map +1 -0
- package/dist/system/backup.d.ts +65 -3
- package/dist/system/backup.d.ts.map +1 -1
- package/dist/system/backup.js +280 -0
- package/dist/system/backup.js.map +1 -0
- package/dist/system/cleanup.js +134 -0
- package/dist/system/cleanup.js.map +1 -0
- package/dist/system/health.js +1100 -0
- package/dist/system/health.js.map +1 -0
- package/dist/system/index.js +18 -0
- package/dist/system/index.js.map +1 -0
- package/dist/system/inject-generate.js +122 -0
- package/dist/system/inject-generate.js.map +1 -0
- package/dist/system/labels.js +38 -0
- package/dist/system/labels.js.map +1 -0
- package/dist/system/metrics.js +61 -0
- package/dist/system/metrics.js.map +1 -0
- package/dist/system/migrate.js +43 -0
- package/dist/system/migrate.js.map +1 -0
- package/dist/system/platform-paths.js +80 -0
- package/dist/system/platform-paths.js.map +1 -0
- package/dist/system/runtime.d.ts +0 -2
- package/dist/system/runtime.d.ts.map +1 -1
- package/dist/system/runtime.js +161 -0
- package/dist/system/runtime.js.map +1 -0
- package/dist/system/safestop.js +99 -0
- package/dist/system/safestop.js.map +1 -0
- package/dist/system/storage-preflight.js +123 -0
- package/dist/system/storage-preflight.js.map +1 -0
- package/dist/task-work/index.js +159 -0
- package/dist/task-work/index.js.map +1 -0
- package/dist/tasks/add.d.ts +1 -1
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/add.js +736 -0
- package/dist/tasks/add.js.map +1 -0
- package/dist/tasks/analyze.js +85 -0
- package/dist/tasks/analyze.js.map +1 -0
- package/dist/tasks/archive.js +90 -0
- package/dist/tasks/archive.js.map +1 -0
- package/dist/tasks/atomicity.js +83 -0
- package/dist/tasks/atomicity.js.map +1 -0
- package/dist/tasks/cancel-ops.js +83 -0
- package/dist/tasks/cancel-ops.js.map +1 -0
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +214 -0
- package/dist/tasks/complete.js.map +1 -0
- package/dist/tasks/crossref-extract.js +73 -0
- package/dist/tasks/crossref-extract.js.map +1 -0
- package/dist/tasks/delete-preview.js +192 -0
- package/dist/tasks/delete-preview.js.map +1 -0
- package/dist/tasks/delete.js +120 -0
- package/dist/tasks/delete.js.map +1 -0
- package/dist/tasks/deletion-strategy.js +200 -0
- package/dist/tasks/deletion-strategy.js.map +1 -0
- package/dist/tasks/dependency-check.js +278 -0
- package/dist/tasks/dependency-check.js.map +1 -0
- package/dist/tasks/deps-ready.js +32 -0
- package/dist/tasks/deps-ready.js.map +1 -0
- package/dist/tasks/enforcement.js +86 -0
- package/dist/tasks/enforcement.js.map +1 -0
- package/dist/tasks/epic-enforcement.js +294 -0
- package/dist/tasks/epic-enforcement.js.map +1 -0
- package/dist/tasks/find.d.ts.map +1 -1
- package/dist/tasks/find.js +157 -0
- package/dist/tasks/find.js.map +1 -0
- package/dist/tasks/graph-cache.js +127 -0
- package/dist/tasks/graph-cache.js.map +1 -0
- package/dist/tasks/graph-ops.js +171 -0
- package/dist/tasks/graph-ops.js.map +1 -0
- package/dist/tasks/graph-rag.js +328 -0
- package/dist/tasks/graph-rag.js.map +1 -0
- package/dist/tasks/hierarchy-policy.js +149 -0
- package/dist/tasks/hierarchy-policy.js.map +1 -0
- package/dist/tasks/hierarchy.js +185 -0
- package/dist/tasks/hierarchy.js.map +1 -0
- package/dist/tasks/id-generator.js +65 -0
- package/dist/tasks/id-generator.js.map +1 -0
- package/dist/tasks/index.js +14 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/labels.d.ts.map +1 -1
- package/dist/tasks/labels.js +55 -0
- package/dist/tasks/labels.js.map +1 -0
- package/dist/tasks/list.js +75 -0
- package/dist/tasks/list.js.map +1 -0
- package/dist/tasks/phase-tracking.js +133 -0
- package/dist/tasks/phase-tracking.js.map +1 -0
- package/dist/tasks/pipeline-stage.js +248 -0
- package/dist/tasks/pipeline-stage.js.map +1 -0
- package/dist/tasks/plan.js +268 -0
- package/dist/tasks/plan.js.map +1 -0
- package/dist/tasks/relates.d.ts.map +1 -1
- package/dist/tasks/relates.js +101 -0
- package/dist/tasks/relates.js.map +1 -0
- package/dist/tasks/show.d.ts.map +1 -1
- package/dist/tasks/show.js +83 -0
- package/dist/tasks/show.js.map +1 -0
- package/dist/tasks/size-weighting.js +86 -0
- package/dist/tasks/size-weighting.js.map +1 -0
- package/dist/tasks/staleness.js +86 -0
- package/dist/tasks/staleness.js.map +1 -0
- package/dist/tasks/task-ops.js +1741 -0
- package/dist/tasks/task-ops.js.map +1 -0
- package/dist/tasks/update.d.ts.map +1 -1
- package/dist/tasks/update.js +303 -0
- package/dist/tasks/update.js.map +1 -0
- package/dist/templates/index.js +10 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/parser.js +254 -0
- package/dist/templates/parser.js.map +1 -0
- package/dist/ui/aliases.js +153 -0
- package/dist/ui/aliases.js.map +1 -0
- package/dist/ui/changelog.js +184 -0
- package/dist/ui/changelog.js.map +1 -0
- package/dist/ui/command-registry.js +168 -0
- package/dist/ui/command-registry.js.map +1 -0
- package/dist/ui/flags.js +94 -0
- package/dist/ui/flags.js.map +1 -0
- package/dist/ui/index.js +24 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/upgrade.js +1148 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/validation/chain-validation.js +146 -0
- package/dist/validation/chain-validation.js.map +1 -0
- package/dist/validation/compliance.js +155 -0
- package/dist/validation/compliance.js.map +1 -0
- package/dist/validation/docs-sync.js +212 -0
- package/dist/validation/docs-sync.js.map +1 -0
- package/dist/validation/doctor/checks.js +1069 -0
- package/dist/validation/doctor/checks.js.map +1 -0
- package/dist/validation/doctor/index.js +9 -0
- package/dist/validation/doctor/index.js.map +1 -0
- package/dist/validation/doctor/project-cache.js +160 -0
- package/dist/validation/doctor/project-cache.js.map +1 -0
- package/dist/validation/doctor/utils.js +155 -0
- package/dist/validation/doctor/utils.js.map +1 -0
- package/dist/validation/engine.d.ts.map +1 -1
- package/dist/validation/engine.js +914 -0
- package/dist/validation/engine.js.map +1 -0
- package/dist/validation/gap-check.js +175 -0
- package/dist/validation/gap-check.js.map +1 -0
- package/dist/validation/index.js +40 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/manifest.js +237 -0
- package/dist/validation/manifest.js.map +1 -0
- package/dist/validation/operation-gate-validators.js +724 -0
- package/dist/validation/operation-gate-validators.js.map +1 -0
- package/dist/validation/operation-verification-gates.js +532 -0
- package/dist/validation/operation-verification-gates.js.map +1 -0
- 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 +141 -0
- package/dist/validation/param-utils.js.map +1 -0
- package/dist/validation/protocol-common.js +300 -0
- package/dist/validation/protocol-common.js.map +1 -0
- package/dist/validation/protocols/_shared.d.ts.map +1 -1
- package/dist/validation/protocols/_shared.js +82 -0
- package/dist/validation/protocols/_shared.js.map +1 -0
- package/dist/validation/protocols/architecture-decision.js +31 -0
- package/dist/validation/protocols/architecture-decision.js.map +1 -0
- package/dist/validation/protocols/artifact-publish.js +28 -0
- package/dist/validation/protocols/artifact-publish.js.map +1 -0
- package/dist/validation/protocols/consensus.js +41 -0
- package/dist/validation/protocols/consensus.js.map +1 -0
- package/dist/validation/protocols/contribution.js +27 -0
- package/dist/validation/protocols/contribution.js.map +1 -0
- package/dist/validation/protocols/decomposition.js +28 -0
- package/dist/validation/protocols/decomposition.js.map +1 -0
- package/dist/validation/protocols/implementation.js +24 -0
- package/dist/validation/protocols/implementation.js.map +1 -0
- package/dist/validation/protocols/provenance.js +29 -0
- package/dist/validation/protocols/provenance.js.map +1 -0
- package/dist/validation/protocols/release.js +29 -0
- package/dist/validation/protocols/release.js.map +1 -0
- package/dist/validation/protocols/research.js +24 -0
- package/dist/validation/protocols/research.js.map +1 -0
- package/dist/validation/protocols/specification.js +27 -0
- package/dist/validation/protocols/specification.js.map +1 -0
- package/dist/validation/protocols/testing.js +30 -0
- package/dist/validation/protocols/testing.js.map +1 -0
- package/dist/validation/protocols/validation.js +30 -0
- package/dist/validation/protocols/validation.js.map +1 -0
- package/dist/validation/schema-integrity.js +170 -0
- package/dist/validation/schema-integrity.js.map +1 -0
- package/dist/validation/schema-validator.js +176 -0
- package/dist/validation/schema-validator.js.map +1 -0
- package/dist/validation/validate-ops.js +937 -0
- package/dist/validation/validate-ops.js.map +1 -0
- package/dist/validation/validation-rules.js +226 -0
- package/dist/validation/validation-rules.js.map +1 -0
- package/dist/validation/verification.js +321 -0
- package/dist/validation/verification.js.map +1 -0
- package/package.json +10 -8
- package/src/__tests__/paths-walkup.test.ts +305 -0
- package/src/__tests__/paths.test.ts +61 -17
- 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/hooks/handlers/session-hooks.ts +42 -0
- package/src/init.ts +1 -2
- package/src/internal.ts +67 -3
- 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/paths.ts +91 -14
- package/src/scaffold.ts +22 -3
- 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__/cleanup-legacy.test.ts +268 -0
- package/src/store/__tests__/conduit-sqlite.test.ts +413 -0
- package/src/store/__tests__/database-topology-integration.test.ts +504 -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 +585 -0
- package/src/store/__tests__/sqlite-backup.test.ts +122 -10
- 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/cleanup-legacy.ts +208 -0
- package/src/store/conduit-sqlite.ts +655 -0
- package/src/store/global-salt.ts +175 -0
- package/src/store/index.ts +7 -0
- package/src/store/migrate-signaldock-to-conduit.ts +669 -0
- package/src/store/nexus-sqlite.ts +32 -3
- package/src/store/signaldock-sqlite.ts +431 -254
- package/src/store/sqlite-backup.ts +544 -38
- package/src/store/sqlite.ts +19 -3
- package/src/system/__tests__/backup.test.ts +237 -0
- package/src/system/backup.ts +186 -26
- 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/cleo-gitignore +19 -3
- package/templates/config.template.json +0 -1
- package/templates/global-config.template.json +0 -1
|
@@ -1,25 +1,83 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SQLite backup via VACUUM INTO with snapshot rotation.
|
|
3
3
|
*
|
|
4
|
-
* Produces self-contained, WAL-free copies of
|
|
5
|
-
* .
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Produces self-contained, WAL-free copies of CLEO SQLite databases
|
|
5
|
+
* (tasks.db, brain.db, conduit.db at project tier; nexus.db, signaldock.db at
|
|
6
|
+
* global tier) into `.cleo/backups/sqlite/` (project) or
|
|
7
|
+
* `$XDG_DATA_HOME/cleo/backups/sqlite/` (global) with a configurable rotation
|
|
8
|
+
* limit. Also provides raw-file backup for the global-salt binary (not SQLite).
|
|
9
|
+
* All errors are swallowed — backup failure must never interrupt normal operation.
|
|
8
10
|
*
|
|
9
11
|
* @task T4873
|
|
12
|
+
* @task T5158 — extended to cover brain.db
|
|
13
|
+
* @task T306 — extended to cover global-tier nexus.db (epic T299)
|
|
14
|
+
* @task T369 — extended to cover conduit.db (project), signaldock.db (global),
|
|
15
|
+
* and global-salt raw-file backup (epic T310)
|
|
10
16
|
* @epic T4867
|
|
11
17
|
*/
|
|
12
18
|
|
|
13
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
chmodSync,
|
|
21
|
+
copyFileSync,
|
|
22
|
+
existsSync,
|
|
23
|
+
mkdirSync,
|
|
24
|
+
readdirSync,
|
|
25
|
+
statSync,
|
|
26
|
+
unlinkSync,
|
|
27
|
+
} from 'node:fs';
|
|
14
28
|
import { join } from 'node:path';
|
|
15
|
-
import { getCleoDir } from '../paths.js';
|
|
29
|
+
import { getCleoDir, getCleoHome } from '../paths.js';
|
|
30
|
+
import { getBrainNativeDb } from './brain-sqlite.js';
|
|
31
|
+
import { getConduitNativeDb } from './conduit-sqlite.js';
|
|
32
|
+
import { getGlobalSaltPath } from './global-salt.js';
|
|
33
|
+
import { getNexusNativeDb } from './nexus-sqlite.js';
|
|
34
|
+
import { getGlobalSignaldockNativeDb } from './signaldock-sqlite.js';
|
|
16
35
|
import { getNativeDb } from './sqlite.js';
|
|
17
36
|
|
|
37
|
+
/** Maximum number of snapshots retained per database (oldest rotated out). */
|
|
18
38
|
const MAX_SNAPSHOTS = 10;
|
|
39
|
+
/** Debounce window (ms) during which duplicate snapshot requests are suppressed. */
|
|
19
40
|
const DEBOUNCE_MS = 30_000; // 30 seconds
|
|
20
41
|
|
|
21
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Per-database snapshot book-keeping: last snapshot timestamp (epoch ms)
|
|
44
|
+
* keyed by the canonical snapshot prefix (e.g. `"tasks"` / `"brain"`).
|
|
45
|
+
*/
|
|
46
|
+
const _lastBackupEpoch: Record<string, number> = {};
|
|
22
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Registered snapshot target — each one maps a logical key (prefix used in
|
|
50
|
+
* snapshot filenames) to a function returning the live {@link DatabaseSync}
|
|
51
|
+
* handle. `null` means the database has not been initialized in the current
|
|
52
|
+
* process and its snapshot step should be skipped.
|
|
53
|
+
*/
|
|
54
|
+
interface SnapshotTarget {
|
|
55
|
+
/** Canonical name used in snapshot filenames, e.g. `"tasks"` or `"brain"`. */
|
|
56
|
+
prefix: string;
|
|
57
|
+
/** Resolves the live native handle, or `null` if not yet initialized. */
|
|
58
|
+
getDb: () => { exec: (sql: string) => void } | null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Canonical list of snapshot targets. Ordering is insertion order — tasks.db
|
|
63
|
+
* snapshots first (highest-value operational state), then brain.db, then
|
|
64
|
+
* conduit.db (project messaging state).
|
|
65
|
+
*
|
|
66
|
+
* @task T369
|
|
67
|
+
* @epic T310
|
|
68
|
+
*/
|
|
69
|
+
const SNAPSHOT_TARGETS: SnapshotTarget[] = [
|
|
70
|
+
{ prefix: 'tasks', getDb: getNativeDb },
|
|
71
|
+
{ prefix: 'brain', getDb: getBrainNativeDb },
|
|
72
|
+
{ prefix: 'conduit', getDb: getConduitNativeDb }, // Added T369 — project messaging DB
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Format a Date as `YYYYMMDD-HHmmss` (local time) for snapshot filenames.
|
|
77
|
+
*
|
|
78
|
+
* Matches the regex `/^(?:tasks|brain)-\d{8}-\d{6}\.db$/` used by the rotation
|
|
79
|
+
* and listing logic below.
|
|
80
|
+
*/
|
|
23
81
|
function formatTimestamp(d: Date): string {
|
|
24
82
|
const pad = (n: number, len = 2) => String(n).padStart(len, '0');
|
|
25
83
|
return (
|
|
@@ -28,10 +86,26 @@ function formatTimestamp(d: Date): string {
|
|
|
28
86
|
);
|
|
29
87
|
}
|
|
30
88
|
|
|
31
|
-
|
|
89
|
+
/**
|
|
90
|
+
* Build the regex that matches snapshot filenames for the given prefix.
|
|
91
|
+
* Isolated so both {@link rotateSnapshots} and {@link listSqliteBackupsForPrefix}
|
|
92
|
+
* share a single source of truth.
|
|
93
|
+
*/
|
|
94
|
+
function snapshotPattern(prefix: string): RegExp {
|
|
95
|
+
// Escape the prefix in case it ever contains regex metacharacters.
|
|
96
|
+
const safe = prefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
97
|
+
return new RegExp(`^${safe}-\\d{8}-\\d{6}\\.db$`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Rotate snapshots for a single prefix: delete the oldest files until fewer
|
|
102
|
+
* than {@link MAX_SNAPSHOTS} remain. Non-fatal on any filesystem error.
|
|
103
|
+
*/
|
|
104
|
+
function rotateSnapshots(backupDir: string, prefix: string): void {
|
|
32
105
|
try {
|
|
106
|
+
const pattern = snapshotPattern(prefix);
|
|
33
107
|
const files = readdirSync(backupDir)
|
|
34
|
-
.filter((f) =>
|
|
108
|
+
.filter((f) => pattern.test(f))
|
|
35
109
|
.map((f) => ({
|
|
36
110
|
name: f,
|
|
37
111
|
path: join(backupDir, f),
|
|
@@ -40,7 +114,8 @@ function rotateSnapshots(backupDir: string): void {
|
|
|
40
114
|
.sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first
|
|
41
115
|
|
|
42
116
|
while (files.length >= MAX_SNAPSHOTS) {
|
|
43
|
-
const oldest = files.shift()
|
|
117
|
+
const oldest = files.shift();
|
|
118
|
+
if (!oldest) break;
|
|
44
119
|
unlinkSync(oldest.path);
|
|
45
120
|
}
|
|
46
121
|
} catch {
|
|
@@ -48,23 +123,73 @@ function rotateSnapshots(backupDir: string): void {
|
|
|
48
123
|
}
|
|
49
124
|
}
|
|
50
125
|
|
|
126
|
+
/** Options accepted by {@link vacuumIntoBackup} and {@link vacuumIntoBackupAll}. */
|
|
51
127
|
export interface VacuumOptions {
|
|
128
|
+
/**
|
|
129
|
+
* Working directory used to resolve the project-local `.cleo/backups/sqlite/`
|
|
130
|
+
* directory. Defaults to `process.cwd()` (delegated to {@link getCleoDir}).
|
|
131
|
+
*/
|
|
52
132
|
cwd?: string;
|
|
133
|
+
/** When true, bypass the {@link DEBOUNCE_MS} debounce window. */
|
|
53
134
|
force?: boolean;
|
|
54
135
|
}
|
|
55
136
|
|
|
56
137
|
/**
|
|
57
|
-
* Create a VACUUM INTO snapshot of
|
|
138
|
+
* Create a VACUUM INTO snapshot of a single SQLite database.
|
|
58
139
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
140
|
+
* Runs `PRAGMA wal_checkpoint(TRUNCATE)` first to flush the WAL for a
|
|
141
|
+
* consistent snapshot, then issues `VACUUM INTO '<dest>'` which SQLite
|
|
142
|
+
* implements as an atomic, fully defragmented clone.
|
|
62
143
|
*
|
|
63
|
-
* Non-fatal: all errors are swallowed
|
|
144
|
+
* Non-fatal: all errors are swallowed via the outer try in
|
|
145
|
+
* {@link vacuumIntoBackupAll}; failures here must never block normal
|
|
146
|
+
* operation.
|
|
147
|
+
*
|
|
148
|
+
* @param target — snapshot target descriptor (prefix + native DB getter)
|
|
149
|
+
* @param backupDir — absolute path to `.cleo/backups/sqlite/`
|
|
150
|
+
* @param now — reference timestamp for the filename
|
|
151
|
+
*/
|
|
152
|
+
function snapshotOne(target: SnapshotTarget, backupDir: string, now: Date): void {
|
|
153
|
+
const db = target.getDb();
|
|
154
|
+
if (!db) return; // DB not initialized in this process — skip silently
|
|
155
|
+
|
|
156
|
+
const dest = join(backupDir, `${target.prefix}-${formatTimestamp(now)}.db`);
|
|
157
|
+
|
|
158
|
+
// TRUNCATE checkpoint: flushes all WAL frames to the main DB and truncates
|
|
159
|
+
// the WAL file to zero bytes, ensuring a consistent DB state before the
|
|
160
|
+
// VACUUM INTO snapshot (ADR-013, section 3 point 7). This is safe because
|
|
161
|
+
// the .db files are excluded from project git tracking (.gitignore + git
|
|
162
|
+
// rm --cached), so git operations cannot restore a stale WAL. The root
|
|
163
|
+
// cause of the 2026-02-25 data loss was that WAL files were still tracked
|
|
164
|
+
// in the project git index; that has been resolved (T4894, T5158).
|
|
165
|
+
db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
166
|
+
|
|
167
|
+
rotateSnapshots(backupDir, target.prefix);
|
|
168
|
+
|
|
169
|
+
// Escape single quotes in path (path is programmatic, but be safe).
|
|
170
|
+
const safeDest = dest.replace(/'/g, "''");
|
|
171
|
+
db.exec(`VACUUM INTO '${safeDest}'`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Create a VACUUM INTO snapshot of the primary SQLite database (tasks.db).
|
|
176
|
+
*
|
|
177
|
+
* Debounced by default (30s). Pass `force: true` to bypass debounce. This
|
|
178
|
+
* function is retained for backward compatibility with existing call sites
|
|
179
|
+
* in `data-safety.ts` / `data-safety-central.ts` that only snapshot tasks.db.
|
|
180
|
+
*
|
|
181
|
+
* Prefer {@link vacuumIntoBackupAll} for new code — it snapshots every
|
|
182
|
+
* registered database (currently tasks.db + brain.db) and shares the same
|
|
183
|
+
* debounce + rotation guarantees.
|
|
184
|
+
*
|
|
185
|
+
* Non-fatal: all errors are swallowed — backup failure must never
|
|
186
|
+
* interrupt normal operation.
|
|
64
187
|
*/
|
|
65
188
|
export async function vacuumIntoBackup(opts: VacuumOptions = {}): Promise<void> {
|
|
66
189
|
const now = Date.now();
|
|
67
|
-
|
|
190
|
+
const prefix = 'tasks';
|
|
191
|
+
const last = _lastBackupEpoch[prefix] ?? 0;
|
|
192
|
+
if (!opts.force && now - last < DEBOUNCE_MS) {
|
|
68
193
|
return; // debounced
|
|
69
194
|
}
|
|
70
195
|
|
|
@@ -73,36 +198,61 @@ export async function vacuumIntoBackup(opts: VacuumOptions = {}): Promise<void>
|
|
|
73
198
|
const backupDir = join(cleoDir, 'backups', 'sqlite');
|
|
74
199
|
mkdirSync(backupDir, { recursive: true });
|
|
75
200
|
|
|
76
|
-
const
|
|
77
|
-
if (!
|
|
201
|
+
const target = SNAPSHOT_TARGETS.find((t) => t.prefix === prefix);
|
|
202
|
+
if (!target) return;
|
|
78
203
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
// git rm --cached), so git operations cannot restore a stale WAL.
|
|
86
|
-
// The root cause of the 2026-02-25 data loss was that WAL files were
|
|
87
|
-
// still tracked in the project git index; that has been resolved (T4894).
|
|
88
|
-
db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
89
|
-
|
|
90
|
-
rotateSnapshots(backupDir);
|
|
204
|
+
snapshotOne(target, backupDir, new Date());
|
|
205
|
+
_lastBackupEpoch[prefix] = Date.now();
|
|
206
|
+
} catch {
|
|
207
|
+
// non-fatal — backup failure must never interrupt normal operation
|
|
208
|
+
}
|
|
209
|
+
}
|
|
91
210
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Create VACUUM INTO snapshots of all registered CLEO SQLite databases
|
|
213
|
+
* (currently tasks.db + brain.db). Each database is debounced independently.
|
|
214
|
+
*
|
|
215
|
+
* This is the preferred entry point for session-lifecycle hooks and
|
|
216
|
+
* pre-destructive-operation snapshots — it guarantees that BRAIN memory is
|
|
217
|
+
* snapshotted alongside task state.
|
|
218
|
+
*
|
|
219
|
+
* Non-fatal: errors are swallowed per database so a brain.db failure cannot
|
|
220
|
+
* block a tasks.db snapshot (and vice versa).
|
|
221
|
+
*/
|
|
222
|
+
export async function vacuumIntoBackupAll(opts: VacuumOptions = {}): Promise<void> {
|
|
223
|
+
const nowMs = Date.now();
|
|
224
|
+
const now = new Date();
|
|
95
225
|
|
|
96
|
-
|
|
226
|
+
let backupDir: string;
|
|
227
|
+
try {
|
|
228
|
+
const cleoDir = getCleoDir(opts.cwd);
|
|
229
|
+
backupDir = join(cleoDir, 'backups', 'sqlite');
|
|
230
|
+
mkdirSync(backupDir, { recursive: true });
|
|
97
231
|
} catch {
|
|
98
|
-
//
|
|
232
|
+
return; // cannot resolve backup dir — abort silently
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
for (const target of SNAPSHOT_TARGETS) {
|
|
236
|
+
const last = _lastBackupEpoch[target.prefix] ?? 0;
|
|
237
|
+
if (!opts.force && nowMs - last < DEBOUNCE_MS) {
|
|
238
|
+
continue; // debounced — skip this target only
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
snapshotOne(target, backupDir, now);
|
|
242
|
+
_lastBackupEpoch[target.prefix] = Date.now();
|
|
243
|
+
} catch {
|
|
244
|
+
// non-fatal — continue with remaining targets
|
|
245
|
+
}
|
|
99
246
|
}
|
|
100
247
|
}
|
|
101
248
|
|
|
102
249
|
/**
|
|
103
|
-
* List existing
|
|
250
|
+
* List existing snapshots for a given prefix (`"tasks"` or `"brain"`),
|
|
251
|
+
* newest first. Returns an empty array if the backup directory does not
|
|
252
|
+
* exist.
|
|
104
253
|
*/
|
|
105
|
-
|
|
254
|
+
function listSqliteBackupsForPrefix(
|
|
255
|
+
prefix: string,
|
|
106
256
|
cwd?: string,
|
|
107
257
|
): Array<{ name: string; path: string; mtimeMs: number }> {
|
|
108
258
|
try {
|
|
@@ -110,8 +260,9 @@ export function listSqliteBackups(
|
|
|
110
260
|
const backupDir = join(cleoDir, 'backups', 'sqlite');
|
|
111
261
|
if (!existsSync(backupDir)) return [];
|
|
112
262
|
|
|
263
|
+
const pattern = snapshotPattern(prefix);
|
|
113
264
|
return readdirSync(backupDir)
|
|
114
|
-
.filter((f) =>
|
|
265
|
+
.filter((f) => pattern.test(f))
|
|
115
266
|
.map((f) => ({
|
|
116
267
|
name: f,
|
|
117
268
|
path: join(backupDir, f),
|
|
@@ -122,3 +273,358 @@ export function listSqliteBackups(
|
|
|
122
273
|
return [];
|
|
123
274
|
}
|
|
124
275
|
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* List existing tasks.db snapshots (newest first).
|
|
279
|
+
*
|
|
280
|
+
* Retained for backward compatibility. For new code prefer
|
|
281
|
+
* {@link listSqliteBackupsAll}.
|
|
282
|
+
*/
|
|
283
|
+
export function listSqliteBackups(
|
|
284
|
+
cwd?: string,
|
|
285
|
+
): Array<{ name: string; path: string; mtimeMs: number }> {
|
|
286
|
+
return listSqliteBackupsForPrefix('tasks', cwd);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* List existing brain.db snapshots (newest first).
|
|
291
|
+
*/
|
|
292
|
+
export function listBrainBackups(
|
|
293
|
+
cwd?: string,
|
|
294
|
+
): Array<{ name: string; path: string; mtimeMs: number }> {
|
|
295
|
+
return listSqliteBackupsForPrefix('brain', cwd);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Aggregated listing of all registered SQLite snapshots.
|
|
300
|
+
*
|
|
301
|
+
* Returns an object keyed by snapshot prefix (`tasks`, `brain`) where each
|
|
302
|
+
* value is the per-prefix list sorted newest-first. Missing prefixes are
|
|
303
|
+
* represented as empty arrays.
|
|
304
|
+
*/
|
|
305
|
+
export function listSqliteBackupsAll(
|
|
306
|
+
cwd?: string,
|
|
307
|
+
): Record<string, Array<{ name: string; path: string; mtimeMs: number }>> {
|
|
308
|
+
const out: Record<string, Array<{ name: string; path: string; mtimeMs: number }>> = {};
|
|
309
|
+
for (const target of SNAPSHOT_TARGETS) {
|
|
310
|
+
out[target.prefix] = listSqliteBackupsForPrefix(target.prefix, cwd);
|
|
311
|
+
}
|
|
312
|
+
return out;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// ============================================================================
|
|
316
|
+
// Global-tier backup (ADR-036 §Backup Mechanism)
|
|
317
|
+
// @task T306
|
|
318
|
+
// @epic T299
|
|
319
|
+
// ============================================================================
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Backup scope: project (per-project `.cleo/`) or global (`$XDG_DATA_HOME/cleo/`).
|
|
323
|
+
*
|
|
324
|
+
* @task T306
|
|
325
|
+
* @epic T299
|
|
326
|
+
*/
|
|
327
|
+
export type BackupScope = 'project' | 'global';
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Registered global-tier snapshot targets. Both `nexus` and `signaldock` are
|
|
331
|
+
* active as of T369 (epic T310).
|
|
332
|
+
*
|
|
333
|
+
* @task T369
|
|
334
|
+
* @epic T310
|
|
335
|
+
*/
|
|
336
|
+
const GLOBAL_SNAPSHOT_TARGETS: SnapshotTarget[] = [
|
|
337
|
+
{ prefix: 'nexus', getDb: getNexusNativeDb },
|
|
338
|
+
{ prefix: 'signaldock', getDb: getGlobalSignaldockNativeDb }, // Activated T369 — global agent registry
|
|
339
|
+
];
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Resolve the global-tier backup directory, creating it on first use.
|
|
343
|
+
*
|
|
344
|
+
* Uses `cleoHomeOverride` when provided (test isolation) or falls back to
|
|
345
|
+
* `getCleoHome()` (XDG-compliant; never hardcodes `~/.cleo`).
|
|
346
|
+
*/
|
|
347
|
+
function resolveGlobalBackupDir(cleoHomeOverride?: string): string {
|
|
348
|
+
const base = cleoHomeOverride ?? getCleoHome();
|
|
349
|
+
return join(base, 'backups', 'sqlite');
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Snapshot a global-tier SQLite database via VACUUM INTO.
|
|
354
|
+
*
|
|
355
|
+
* Writes to `$XDG_DATA_HOME/cleo/backups/sqlite/<dbName>-YYYYMMDD-HHmmss.db`
|
|
356
|
+
* and enforces a per-prefix rotation window (default 10 snapshots).
|
|
357
|
+
*
|
|
358
|
+
* Non-fatal: errors from any individual step are surfaced via the return value
|
|
359
|
+
* but never thrown — a failed snapshot MUST NOT interrupt normal operation.
|
|
360
|
+
*
|
|
361
|
+
* @param dbName - Which global-tier DB to snapshot (`'nexus'` or `'signaldock'`)
|
|
362
|
+
* @param opts.rotation - Maximum retained snapshots per prefix (default 10)
|
|
363
|
+
* @param opts.cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
|
|
364
|
+
* @returns Object containing the new snapshot path and any rotated (deleted) file paths
|
|
365
|
+
*
|
|
366
|
+
* @task T306
|
|
367
|
+
* @task T369 — activated signaldock target (epic T310)
|
|
368
|
+
* @epic T299
|
|
369
|
+
* @why ADR-036 §Backup Mechanism requires VACUUM INTO rotation at the global tier;
|
|
370
|
+
* nexus.db has zero backup coverage prior to v2026.4.11.
|
|
371
|
+
*/
|
|
372
|
+
export async function vacuumIntoGlobalBackup(
|
|
373
|
+
dbName: 'nexus' | 'signaldock',
|
|
374
|
+
opts?: { rotation?: number; cleoHomeOverride?: string },
|
|
375
|
+
): Promise<{ snapshotPath: string; rotated: string[] }> {
|
|
376
|
+
const maxSnaps = opts?.rotation ?? MAX_SNAPSHOTS;
|
|
377
|
+
const backupDir = resolveGlobalBackupDir(opts?.cleoHomeOverride);
|
|
378
|
+
|
|
379
|
+
mkdirSync(backupDir, { recursive: true });
|
|
380
|
+
|
|
381
|
+
const target = GLOBAL_SNAPSHOT_TARGETS.find((t) => t.prefix === dbName);
|
|
382
|
+
if (!target) {
|
|
383
|
+
return { snapshotPath: '', rotated: [] };
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
const db = target.getDb();
|
|
387
|
+
if (!db) {
|
|
388
|
+
return { snapshotPath: '', rotated: [] };
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
const now = new Date();
|
|
392
|
+
const snapshotName = `${dbName}-${formatTimestamp(now)}.db`;
|
|
393
|
+
const snapshotPath = join(backupDir, snapshotName);
|
|
394
|
+
|
|
395
|
+
// Collect files that will be rotated out before writing the new one.
|
|
396
|
+
const rotated: string[] = [];
|
|
397
|
+
try {
|
|
398
|
+
const pattern = snapshotPattern(dbName);
|
|
399
|
+
const existing = readdirSync(backupDir)
|
|
400
|
+
.filter((f) => pattern.test(f))
|
|
401
|
+
.map((f) => ({
|
|
402
|
+
name: f,
|
|
403
|
+
path: join(backupDir, f),
|
|
404
|
+
mtimeMs: statSync(join(backupDir, f)).mtimeMs,
|
|
405
|
+
}))
|
|
406
|
+
.sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first
|
|
407
|
+
|
|
408
|
+
// Remove oldest until we have room for the new snapshot.
|
|
409
|
+
while (existing.length >= maxSnaps) {
|
|
410
|
+
const oldest = existing.shift();
|
|
411
|
+
if (!oldest) break;
|
|
412
|
+
try {
|
|
413
|
+
unlinkSync(oldest.path);
|
|
414
|
+
rotated.push(oldest.path);
|
|
415
|
+
} catch {
|
|
416
|
+
// non-fatal rotation failure
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
} catch {
|
|
420
|
+
// non-fatal — continue even if rotation enumeration fails
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// Checkpoint then VACUUM INTO for a WAL-free, atomic snapshot.
|
|
424
|
+
db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
425
|
+
const safeDest = snapshotPath.replace(/'/g, "''");
|
|
426
|
+
db.exec(`VACUUM INTO '${safeDest}'`);
|
|
427
|
+
|
|
428
|
+
return { snapshotPath, rotated };
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* A single entry returned by {@link listGlobalSqliteBackups}.
|
|
433
|
+
*
|
|
434
|
+
* @task T306
|
|
435
|
+
* @epic T299
|
|
436
|
+
*/
|
|
437
|
+
export interface GlobalBackupEntry {
|
|
438
|
+
/** Snapshot filename, e.g. `nexus-20260408-143022.db`. */
|
|
439
|
+
name: string;
|
|
440
|
+
/** Absolute path to the snapshot file. */
|
|
441
|
+
path: string;
|
|
442
|
+
/** File size in bytes. */
|
|
443
|
+
size: number;
|
|
444
|
+
/** Last-modified timestamp. */
|
|
445
|
+
mtime: Date;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* List global-tier SQLite backups from `$XDG_DATA_HOME/cleo/backups/sqlite/`,
|
|
450
|
+
* optionally filtered by prefix (e.g. `'nexus'`). Sorted newest-first by mtime.
|
|
451
|
+
*
|
|
452
|
+
* Returns an empty array when the backup directory does not exist.
|
|
453
|
+
*
|
|
454
|
+
* @param prefix - Optional prefix filter; when omitted all `.db` snapshot files are listed
|
|
455
|
+
* @param cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
|
|
456
|
+
*
|
|
457
|
+
* @task T306
|
|
458
|
+
* @epic T299
|
|
459
|
+
*/
|
|
460
|
+
export function listGlobalSqliteBackups(
|
|
461
|
+
prefix?: string,
|
|
462
|
+
cleoHomeOverride?: string,
|
|
463
|
+
): GlobalBackupEntry[] {
|
|
464
|
+
try {
|
|
465
|
+
const backupDir = resolveGlobalBackupDir(cleoHomeOverride);
|
|
466
|
+
if (!existsSync(backupDir)) return [];
|
|
467
|
+
|
|
468
|
+
const pattern = prefix ? snapshotPattern(prefix) : /^[a-zA-Z0-9_-]+-\d{8}-\d{6}\.db$/;
|
|
469
|
+
|
|
470
|
+
return readdirSync(backupDir)
|
|
471
|
+
.filter((f) => pattern.test(f))
|
|
472
|
+
.map((f) => {
|
|
473
|
+
const filePath = join(backupDir, f);
|
|
474
|
+
const s = statSync(filePath);
|
|
475
|
+
return { name: f, path: filePath, size: s.size, mtime: new Date(s.mtimeMs) };
|
|
476
|
+
})
|
|
477
|
+
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); // newest first
|
|
478
|
+
} catch {
|
|
479
|
+
return [];
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// ============================================================================
|
|
484
|
+
// Global-salt raw-file backup (ADR-037 §5)
|
|
485
|
+
// @task T369
|
|
486
|
+
// @epic T310
|
|
487
|
+
// ============================================================================
|
|
488
|
+
|
|
489
|
+
/** Filename prefix for global-salt backup files. */
|
|
490
|
+
const GLOBAL_SALT_BACKUP_PREFIX = 'global-salt';
|
|
491
|
+
|
|
492
|
+
/** Regex matching global-salt backup filenames: `global-salt-YYYYMMDD-HHmmss`. */
|
|
493
|
+
const GLOBAL_SALT_BACKUP_PATTERN = /^global-salt-\d{8}-\d{6}$/;
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Resolve the backup directory for global-salt files: `{cleoHome}/backups/`.
|
|
497
|
+
* Global-salt backups live directly under `backups/` (not `backups/sqlite/`)
|
|
498
|
+
* to make clear they are binary files, not SQLite databases.
|
|
499
|
+
*/
|
|
500
|
+
function resolveGlobalSaltBackupDir(cleoHomeOverride?: string): string {
|
|
501
|
+
const base = cleoHomeOverride ?? getCleoHome();
|
|
502
|
+
return join(base, 'backups');
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* Rotate global-salt backup files: delete the oldest until fewer than
|
|
507
|
+
* {@link MAX_SNAPSHOTS} remain. Returns the paths of deleted files.
|
|
508
|
+
* Non-fatal on any filesystem error.
|
|
509
|
+
*/
|
|
510
|
+
function rotateGlobalSaltBackups(backupDir: string): string[] {
|
|
511
|
+
const rotated: string[] = [];
|
|
512
|
+
try {
|
|
513
|
+
const files = readdirSync(backupDir)
|
|
514
|
+
.filter((f) => GLOBAL_SALT_BACKUP_PATTERN.test(f))
|
|
515
|
+
.map((f) => ({
|
|
516
|
+
name: f,
|
|
517
|
+
path: join(backupDir, f),
|
|
518
|
+
mtimeMs: statSync(join(backupDir, f)).mtimeMs,
|
|
519
|
+
}))
|
|
520
|
+
.sort((a, b) => a.mtimeMs - b.mtimeMs); // oldest first
|
|
521
|
+
|
|
522
|
+
while (files.length >= MAX_SNAPSHOTS) {
|
|
523
|
+
const oldest = files.shift();
|
|
524
|
+
if (!oldest) break;
|
|
525
|
+
try {
|
|
526
|
+
unlinkSync(oldest.path);
|
|
527
|
+
rotated.push(oldest.path);
|
|
528
|
+
} catch {
|
|
529
|
+
// non-fatal rotation failure
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
} catch {
|
|
533
|
+
// non-fatal
|
|
534
|
+
}
|
|
535
|
+
return rotated;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Creates a raw-file backup of the global-salt binary at
|
|
540
|
+
* `${getCleoHome()}/backups/global-salt-YYYYMMDD-HHmmss` with `0o600`
|
|
541
|
+
* permissions. Rotates to {@link MAX_SNAPSHOTS} (10) copies, deleting the
|
|
542
|
+
* oldest when the limit is reached.
|
|
543
|
+
*
|
|
544
|
+
* Non-fatal: errors are swallowed — salt backup failure must never block cleo.
|
|
545
|
+
* Returns empty strings and no rotated paths on failure.
|
|
546
|
+
*
|
|
547
|
+
* @param opts.cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
|
|
548
|
+
* @returns Object with the new snapshot path and any rotated (deleted) file paths
|
|
549
|
+
*
|
|
550
|
+
* @task T369
|
|
551
|
+
* @epic T310
|
|
552
|
+
* @why ADR-037 §5 — global-salt is security-critical; losing it invalidates
|
|
553
|
+
* all API keys. Backup enables recovery from accidental deletion.
|
|
554
|
+
*/
|
|
555
|
+
export async function backupGlobalSalt(opts?: {
|
|
556
|
+
cleoHomeOverride?: string;
|
|
557
|
+
}): Promise<{ snapshotPath: string; rotated: string[] }> {
|
|
558
|
+
try {
|
|
559
|
+
const cleoHome = opts?.cleoHomeOverride ?? getCleoHome();
|
|
560
|
+
const saltSourcePath = opts?.cleoHomeOverride
|
|
561
|
+
? join(cleoHome, 'global-salt')
|
|
562
|
+
: getGlobalSaltPath();
|
|
563
|
+
|
|
564
|
+
if (!existsSync(saltSourcePath)) {
|
|
565
|
+
return { snapshotPath: '', rotated: [] };
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
const backupDir = resolveGlobalSaltBackupDir(opts?.cleoHomeOverride);
|
|
569
|
+
mkdirSync(backupDir, { recursive: true });
|
|
570
|
+
|
|
571
|
+
const rotated = rotateGlobalSaltBackups(backupDir);
|
|
572
|
+
|
|
573
|
+
const snapshotName = `${GLOBAL_SALT_BACKUP_PREFIX}-${formatTimestamp(new Date())}`;
|
|
574
|
+
const snapshotPath = join(backupDir, snapshotName);
|
|
575
|
+
|
|
576
|
+
copyFileSync(saltSourcePath, snapshotPath);
|
|
577
|
+
chmodSync(snapshotPath, 0o600);
|
|
578
|
+
|
|
579
|
+
return { snapshotPath, rotated };
|
|
580
|
+
} catch {
|
|
581
|
+
// non-fatal — backup failure must never interrupt normal operation
|
|
582
|
+
return { snapshotPath: '', rotated: [] };
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
/**
|
|
587
|
+
* A single entry returned by {@link listGlobalSaltBackups}.
|
|
588
|
+
*
|
|
589
|
+
* @task T369
|
|
590
|
+
* @epic T310
|
|
591
|
+
*/
|
|
592
|
+
export interface GlobalSaltBackupEntry {
|
|
593
|
+
/** Backup filename, e.g. `global-salt-20260408-143022`. */
|
|
594
|
+
name: string;
|
|
595
|
+
/** Absolute path to the backup file. */
|
|
596
|
+
path: string;
|
|
597
|
+
/** File size in bytes (should be 32 for a valid global-salt). */
|
|
598
|
+
size: number;
|
|
599
|
+
/** Last-modified timestamp. */
|
|
600
|
+
mtime: Date;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* List global-salt backup files from `$XDG_DATA_HOME/cleo/backups/`, sorted
|
|
605
|
+
* newest-first by mtime.
|
|
606
|
+
*
|
|
607
|
+
* Returns an empty array when the backup directory does not exist.
|
|
608
|
+
*
|
|
609
|
+
* @param cleoHomeOverride - Override `getCleoHome()` path (use in tests to target a tmp dir)
|
|
610
|
+
*
|
|
611
|
+
* @task T369
|
|
612
|
+
* @epic T310
|
|
613
|
+
*/
|
|
614
|
+
export function listGlobalSaltBackups(cleoHomeOverride?: string): GlobalSaltBackupEntry[] {
|
|
615
|
+
try {
|
|
616
|
+
const backupDir = resolveGlobalSaltBackupDir(cleoHomeOverride);
|
|
617
|
+
if (!existsSync(backupDir)) return [];
|
|
618
|
+
|
|
619
|
+
return readdirSync(backupDir)
|
|
620
|
+
.filter((f) => GLOBAL_SALT_BACKUP_PATTERN.test(f))
|
|
621
|
+
.map((f) => {
|
|
622
|
+
const filePath = join(backupDir, f);
|
|
623
|
+
const s = statSync(filePath);
|
|
624
|
+
return { name: f, path: filePath, size: s.size, mtime: new Date(s.mtimeMs) };
|
|
625
|
+
})
|
|
626
|
+
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); // newest first
|
|
627
|
+
} catch {
|
|
628
|
+
return [];
|
|
629
|
+
}
|
|
630
|
+
}
|