@cleocode/core 2026.3.74 → 2026.3.76
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/README.md +1 -1
- package/dist/cant/approval.d.ts +110 -0
- package/dist/cant/approval.d.ts.map +1 -0
- package/dist/cant/context-builder.d.ts +79 -0
- package/dist/cant/context-builder.d.ts.map +1 -0
- package/dist/cant/discretion.d.ts +95 -0
- package/dist/cant/discretion.d.ts.map +1 -0
- package/dist/cant/index.d.ts +25 -0
- package/dist/cant/index.d.ts.map +1 -0
- package/dist/cant/parallel-runner.d.ts +38 -0
- package/dist/cant/parallel-runner.d.ts.map +1 -0
- package/dist/cant/types.d.ts +127 -0
- package/dist/cant/types.d.ts.map +1 -0
- package/dist/cant/workflow-executor.d.ts +105 -0
- package/dist/cant/workflow-executor.d.ts.map +1 -0
- package/dist/conduit/conduit-client.d.ts +26 -0
- package/dist/conduit/conduit-client.d.ts.map +1 -0
- package/dist/conduit/factory.d.ts +13 -0
- package/dist/conduit/factory.d.ts.map +1 -0
- package/dist/conduit/http-transport.d.ts +32 -0
- package/dist/conduit/http-transport.d.ts.map +1 -0
- package/dist/conduit/index.d.ts +12 -0
- package/dist/conduit/index.d.ts.map +1 -0
- package/dist/crypto/credentials.d.ts +40 -0
- package/dist/crypto/credentials.d.ts.map +1 -0
- package/dist/engine-result.d.ts +1 -1
- package/dist/engine-result.d.ts.map +1 -1
- package/dist/error-catalog.d.ts +1 -1
- package/dist/error-catalog.d.ts.map +1 -1
- package/dist/error-registry.d.ts +1 -1
- package/dist/error-registry.d.ts.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/hooks/handlers/agent-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/context-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/error-hooks.d.ts +14 -5
- package/dist/hooks/handlers/error-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/file-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/handler-helpers.d.ts +41 -0
- package/dist/hooks/handlers/handler-helpers.d.ts.map +1 -0
- package/dist/hooks/handlers/mcp-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/session-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/task-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/work-capture-hooks.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2285 -767
- package/dist/index.js.map +4 -4
- package/dist/init.d.ts.map +1 -1
- package/dist/internal.d.ts +7 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/memory/brain-retrieval.d.ts +3 -0
- package/dist/memory/brain-retrieval.d.ts.map +1 -1
- package/dist/mvi-helpers.d.ts +52 -0
- package/dist/mvi-helpers.d.ts.map +1 -0
- package/dist/nexus/workspace.d.ts.map +1 -1
- package/dist/output.d.ts +2 -2
- package/dist/output.d.ts.map +1 -1
- package/dist/pagination.d.ts +1 -1
- package/dist/pagination.d.ts.map +1 -1
- package/dist/sessions/find.d.ts +3 -0
- package/dist/sessions/find.d.ts.map +1 -1
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/store/agent-registry-accessor.d.ts +454 -0
- package/dist/store/agent-registry-accessor.d.ts.map +1 -0
- package/dist/store/converters.d.ts.map +1 -1
- package/dist/store/db-helpers.d.ts.map +1 -1
- package/dist/store/safety-data-accessor.d.ts +7 -0
- package/dist/store/safety-data-accessor.d.ts.map +1 -1
- package/dist/store/signaldock-sqlite.d.ts +48 -0
- package/dist/store/signaldock-sqlite.d.ts.map +1 -0
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/task-store.d.ts.map +1 -1
- package/dist/store/tasks-schema.d.ts +240 -0
- package/dist/store/tasks-schema.d.ts.map +1 -1
- package/dist/store/validation-schemas.d.ts +32 -0
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/system/health.d.ts.map +1 -1
- package/dist/task-work/index.d.ts.map +1 -1
- package/dist/tasks/find.d.ts +3 -0
- package/dist/tasks/find.d.ts.map +1 -1
- package/dist/tasks/list.d.ts +5 -2
- package/dist/tasks/list.d.ts.map +1 -1
- package/dist/tasks/show.d.ts +3 -0
- package/dist/tasks/show.d.ts.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/migrations/drizzle-tasks/20260324000000_assignee-column/migration.sql +6 -0
- package/migrations/drizzle-tasks/20260324000000_assignee-column/snapshot.json +9 -0
- package/migrations/drizzle-tasks/20260327000000_agent-credentials/migration.sql +23 -0
- package/package.json +7 -7
- package/src/__tests__/cli-parity.test.js +11 -1
- package/src/__tests__/cli-parity.test.js.map +1 -1
- package/src/__tests__/cli-parity.test.ts +17 -1
- package/src/__tests__/human-output.test.js +11 -1
- package/src/__tests__/human-output.test.js.map +1 -1
- package/src/__tests__/human-output.test.ts +18 -1
- package/src/__tests__/injection-chain.test.js +3 -2
- package/src/__tests__/injection-chain.test.js.map +1 -1
- package/src/__tests__/injection-mvi-tiers.test.d.ts +2 -2
- package/src/__tests__/injection-mvi-tiers.test.js +15 -15
- package/src/__tests__/injection-mvi-tiers.test.js.map +1 -1
- package/src/__tests__/lafs-conformance.test.d.ts +1 -1
- package/src/__tests__/lafs-conformance.test.js +2 -2
- package/src/__tests__/sharing.test.js +19 -0
- package/src/__tests__/sharing.test.js.map +1 -1
- package/src/agents/__tests__/agent-registry.test.d.ts +12 -0
- package/src/agents/__tests__/agent-registry.test.d.ts.map +1 -0
- package/src/agents/__tests__/agent-registry.test.js +262 -0
- package/src/agents/__tests__/agent-registry.test.js.map +1 -0
- package/src/agents/__tests__/execution-learning.test.d.ts +14 -0
- package/src/agents/__tests__/execution-learning.test.d.ts.map +1 -0
- package/src/agents/__tests__/execution-learning.test.js +533 -0
- package/src/agents/__tests__/execution-learning.test.js.map +1 -0
- package/src/agents/__tests__/health-monitor.test.d.ts +10 -0
- package/src/agents/__tests__/health-monitor.test.d.ts.map +1 -0
- package/src/agents/__tests__/health-monitor.test.js +259 -0
- package/src/agents/__tests__/health-monitor.test.js.map +1 -0
- package/src/agents/__tests__/registry.test.js +27 -2
- package/src/agents/__tests__/registry.test.js.map +1 -1
- package/src/cant/__tests__/cant-agent-parse.test.ts +94 -0
- package/src/cant/approval.ts +218 -0
- package/src/cant/context-builder.ts +135 -0
- package/src/cant/discretion.ts +149 -0
- package/src/cant/index.ts +58 -0
- package/src/cant/parallel-runner.ts +205 -0
- package/src/cant/types.ts +158 -0
- package/src/cant/workflow-executor.ts +618 -0
- package/src/conduit/conduit-client.ts +114 -0
- package/src/conduit/factory.ts +45 -0
- package/src/conduit/http-transport.ts +140 -0
- package/src/conduit/index.ts +12 -0
- package/src/crypto/credentials.ts +166 -0
- package/src/engine-result.ts +1 -1
- package/src/error-catalog.ts +1 -1
- package/src/error-registry.ts +1 -1
- package/src/errors.ts +1 -1
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.d.ts +13 -0
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.d.ts.map +1 -0
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js +501 -0
- package/src/hooks/handlers/__tests__/hook-automation-e2e.test.js.map +1 -0
- package/src/hooks/handlers/agent-hooks.ts +1 -30
- package/src/hooks/handlers/context-hooks.ts +1 -30
- package/src/hooks/handlers/error-hooks.ts +14 -5
- package/src/hooks/handlers/file-hooks.ts +1 -6
- package/src/hooks/handlers/handler-helpers.ts +62 -0
- package/src/hooks/handlers/mcp-hooks.ts +2 -14
- package/src/hooks/handlers/session-hooks.ts +1 -6
- package/src/hooks/handlers/task-hooks.ts +1 -6
- package/src/hooks/handlers/work-capture-hooks.ts +1 -10
- package/src/index.ts +11 -1
- package/src/init.ts +12 -0
- package/src/intelligence/__tests__/adaptive-validation.test.d.ts +11 -0
- package/src/intelligence/__tests__/adaptive-validation.test.d.ts.map +1 -0
- package/src/intelligence/__tests__/adaptive-validation.test.js +517 -0
- package/src/intelligence/__tests__/adaptive-validation.test.js.map +1 -0
- package/src/intelligence/__tests__/impact.test.d.ts +1 -0
- package/src/intelligence/__tests__/impact.test.d.ts.map +1 -1
- package/src/intelligence/__tests__/impact.test.js +132 -1
- package/src/intelligence/__tests__/impact.test.js.map +1 -1
- package/src/internal.ts +17 -0
- package/src/lib/__tests__/retry.test.d.ts +7 -0
- package/src/lib/__tests__/retry.test.d.ts.map +1 -0
- package/src/lib/__tests__/retry.test.js +225 -0
- package/src/lib/__tests__/retry.test.js.map +1 -0
- package/src/lifecycle/__tests__/chain-store.test.js +6 -0
- package/src/lifecycle/__tests__/chain-store.test.js.map +1 -1
- package/src/lifecycle/__tests__/tessera-engine.test.js +52 -0
- package/src/lifecycle/__tests__/tessera-engine.test.js.map +1 -1
- package/src/memory/__tests__/brain-automation.test.d.ts +11 -0
- package/src/memory/__tests__/brain-automation.test.d.ts.map +1 -0
- package/src/memory/__tests__/brain-automation.test.js +730 -0
- package/src/memory/__tests__/brain-automation.test.js.map +1 -0
- package/src/memory/brain-retrieval.ts +9 -0
- package/src/mvi-helpers.ts +81 -0
- package/src/nexus/workspace.ts +19 -7
- package/src/output.ts +43 -10
- package/src/pagination.ts +1 -1
- package/src/sessions/__tests__/session-edge-cases.test.js +20 -1
- package/src/sessions/__tests__/session-edge-cases.test.js.map +1 -1
- package/src/sessions/__tests__/session-find.test.js +1 -1
- package/src/sessions/__tests__/session-find.test.js.map +1 -1
- package/src/sessions/__tests__/session-find.test.ts +1 -1
- package/src/sessions/find.ts +6 -1
- package/src/sessions/index.ts +9 -0
- package/src/store/__tests__/migration-safety.test.js +3 -0
- package/src/store/__tests__/migration-safety.test.js.map +1 -1
- package/src/store/__tests__/session-store.test.js +128 -1
- package/src/store/__tests__/session-store.test.js.map +1 -1
- package/src/store/__tests__/task-store.test.js +18 -1
- package/src/store/__tests__/task-store.test.js.map +1 -1
- package/src/store/__tests__/test-db-helper.d.ts.map +1 -1
- package/src/store/__tests__/test-db-helper.js +12 -0
- package/src/store/__tests__/test-db-helper.js.map +1 -1
- package/src/store/agent-registry-accessor.ts +199 -0
- package/src/store/converters.ts +2 -0
- package/src/store/db-helpers.ts +1 -0
- package/src/store/safety-data-accessor.ts +23 -0
- package/src/store/signaldock-sqlite.ts +227 -0
- package/src/store/sqlite-data-accessor.ts +69 -0
- package/src/store/sqlite.ts +4 -1
- package/src/store/task-store.ts +1 -0
- package/src/store/tasks-schema.ts +42 -0
- package/src/system/health.ts +33 -0
- package/src/task-work/index.ts +5 -0
- package/src/tasks/__tests__/add.test.js +19 -1
- package/src/tasks/__tests__/add.test.js.map +1 -1
- package/src/tasks/__tests__/assignee.test.d.ts +14 -0
- package/src/tasks/__tests__/assignee.test.d.ts.map +1 -0
- package/src/tasks/__tests__/assignee.test.js +125 -0
- package/src/tasks/__tests__/assignee.test.js.map +1 -0
- package/src/tasks/__tests__/assignee.test.ts +162 -0
- package/src/tasks/__tests__/complete-unblocks.test.js +13 -1
- package/src/tasks/__tests__/complete-unblocks.test.js.map +1 -1
- package/src/tasks/__tests__/complete.test.js +28 -7
- package/src/tasks/__tests__/complete.test.js.map +1 -1
- package/src/tasks/__tests__/epic-enforcement.test.d.ts +15 -0
- package/src/tasks/__tests__/epic-enforcement.test.d.ts.map +1 -0
- package/src/tasks/__tests__/epic-enforcement.test.js +669 -0
- package/src/tasks/__tests__/epic-enforcement.test.js.map +1 -0
- package/src/tasks/__tests__/hierarchy-policy.test.js +5 -0
- package/src/tasks/__tests__/hierarchy-policy.test.js.map +1 -1
- package/src/tasks/__tests__/minimal-test.test.d.ts +2 -0
- package/src/tasks/__tests__/minimal-test.test.d.ts.map +1 -0
- package/src/tasks/__tests__/minimal-test.test.js +25 -0
- package/src/tasks/__tests__/minimal-test.test.js.map +1 -0
- package/src/tasks/__tests__/pipeline-stage.test.d.ts +14 -0
- package/src/tasks/__tests__/pipeline-stage.test.d.ts.map +1 -0
- package/src/tasks/__tests__/pipeline-stage.test.js +277 -0
- package/src/tasks/__tests__/pipeline-stage.test.js.map +1 -0
- package/src/tasks/__tests__/update.test.js +43 -6
- package/src/tasks/__tests__/update.test.js.map +1 -1
- package/src/tasks/find.ts +11 -1
- package/src/tasks/list.ts +14 -3
- package/src/tasks/show.ts +6 -0
- package/src/upgrade.ts +16 -0
- package/dist/adapters/adapter-registry.js +0 -64
- package/dist/adapters/adapter-registry.js.map +0 -1
- package/dist/adapters/discovery.js +0 -83
- package/dist/adapters/discovery.js.map +0 -1
- package/dist/adapters/index.js +0 -9
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/manager.js +0 -260
- package/dist/adapters/manager.js.map +0 -1
- package/dist/admin/export-tasks.js +0 -171
- package/dist/admin/export-tasks.js.map +0 -1
- package/dist/admin/export.js +0 -103
- package/dist/admin/export.js.map +0 -1
- package/dist/admin/help.js +0 -106
- package/dist/admin/help.js.map +0 -1
- package/dist/admin/import-tasks.js +0 -182
- package/dist/admin/import-tasks.js.map +0 -1
- package/dist/admin/import.js +0 -129
- package/dist/admin/import.js.map +0 -1
- package/dist/admin/index.js +0 -13
- package/dist/admin/index.js.map +0 -1
- package/dist/adrs/find.js +0 -134
- package/dist/adrs/find.js.map +0 -1
- package/dist/adrs/index.js +0 -15
- package/dist/adrs/index.js.map +0 -1
- package/dist/adrs/link-pipeline.js +0 -160
- package/dist/adrs/link-pipeline.js.map +0 -1
- package/dist/adrs/list.js +0 -43
- package/dist/adrs/list.js.map +0 -1
- package/dist/adrs/parse.js +0 -51
- package/dist/adrs/parse.js.map +0 -1
- package/dist/adrs/show.js +0 -22
- package/dist/adrs/show.js.map +0 -1
- package/dist/adrs/sync.js +0 -188
- package/dist/adrs/sync.js.map +0 -1
- package/dist/adrs/types.js +0 -9
- package/dist/adrs/types.js.map +0 -1
- package/dist/adrs/validate.js +0 -57
- package/dist/adrs/validate.js.map +0 -1
- package/dist/agents/agent-registry.js +0 -288
- package/dist/agents/agent-registry.js.map +0 -1
- package/dist/agents/agent-schema.js +0 -85
- package/dist/agents/agent-schema.js.map +0 -1
- package/dist/agents/capacity.js +0 -116
- package/dist/agents/capacity.js.map +0 -1
- package/dist/agents/execution-learning.js +0 -474
- package/dist/agents/execution-learning.js.map +0 -1
- package/dist/agents/health-monitor.js +0 -217
- package/dist/agents/health-monitor.js.map +0 -1
- package/dist/agents/index.js +0 -29
- package/dist/agents/index.js.map +0 -1
- package/dist/agents/registry.js +0 -314
- package/dist/agents/registry.js.map +0 -1
- package/dist/agents/retry.js +0 -210
- package/dist/agents/retry.js.map +0 -1
- package/dist/audit-prune.js +0 -94
- package/dist/audit-prune.js.map +0 -1
- package/dist/audit.js +0 -68
- package/dist/audit.js.map +0 -1
- package/dist/backfill/index.js +0 -229
- package/dist/backfill/index.js.map +0 -1
- package/dist/bootstrap.js +0 -367
- package/dist/bootstrap.js.map +0 -1
- package/dist/caamp/adapter.js +0 -434
- package/dist/caamp/adapter.js.map +0 -1
- package/dist/caamp/capability-check.js +0 -38
- package/dist/caamp/capability-check.js.map +0 -1
- package/dist/caamp/index.js +0 -23
- package/dist/caamp/index.js.map +0 -1
- package/dist/caamp-init.js +0 -16
- package/dist/caamp-init.js.map +0 -1
- package/dist/cleo.js +0 -302
- package/dist/cleo.js.map +0 -1
- package/dist/codebase-map/analyzers/architecture.js +0 -130
- package/dist/codebase-map/analyzers/architecture.js.map +0 -1
- package/dist/codebase-map/analyzers/concerns.js +0 -122
- package/dist/codebase-map/analyzers/concerns.js.map +0 -1
- package/dist/codebase-map/analyzers/conventions.js +0 -149
- package/dist/codebase-map/analyzers/conventions.js.map +0 -1
- package/dist/codebase-map/analyzers/integrations.js +0 -108
- package/dist/codebase-map/analyzers/integrations.js.map +0 -1
- package/dist/codebase-map/analyzers/stack.js +0 -117
- package/dist/codebase-map/analyzers/stack.js.map +0 -1
- package/dist/codebase-map/analyzers/structure.js +0 -137
- package/dist/codebase-map/analyzers/structure.js.map +0 -1
- package/dist/codebase-map/analyzers/testing.js +0 -118
- package/dist/codebase-map/analyzers/testing.js.map +0 -1
- package/dist/codebase-map/index.js +0 -57
- package/dist/codebase-map/index.js.map +0 -1
- package/dist/codebase-map/store.js +0 -122
- package/dist/codebase-map/store.js.map +0 -1
- package/dist/codebase-map/summary.js +0 -152
- package/dist/codebase-map/summary.js.map +0 -1
- package/dist/compliance/index.js +0 -288
- package/dist/compliance/index.js.map +0 -1
- package/dist/compliance/protocol-enforcement.js +0 -332
- package/dist/compliance/protocol-enforcement.js.map +0 -1
- package/dist/compliance/protocol-rules.js +0 -786
- package/dist/compliance/protocol-rules.js.map +0 -1
- package/dist/compliance/protocol-types.js +0 -80
- package/dist/compliance/protocol-types.js.map +0 -1
- package/dist/compliance/store.js +0 -53
- package/dist/compliance/store.js.map +0 -1
- package/dist/config/build-config.js +0 -29
- package/dist/config/build-config.js.map +0 -1
- package/dist/config.js +0 -400
- package/dist/config.js.map +0 -1
- package/dist/constants.js +0 -18
- package/dist/constants.js.map +0 -1
- package/dist/context/index.js +0 -137
- package/dist/context/index.js.map +0 -1
- package/dist/engine-result.js +0 -12
- package/dist/engine-result.js.map +0 -1
- package/dist/error-catalog.js +0 -404
- package/dist/error-catalog.js.map +0 -1
- package/dist/error-registry.js +0 -393
- package/dist/error-registry.js.map +0 -1
- package/dist/errors.js +0 -167
- package/dist/errors.js.map +0 -1
- package/dist/hooks/handlers/error-hooks.js +0 -43
- package/dist/hooks/handlers/error-hooks.js.map +0 -1
- package/dist/hooks/handlers/file-hooks.js +0 -80
- package/dist/hooks/handlers/file-hooks.js.map +0 -1
- package/dist/hooks/handlers/index.js +0 -19
- package/dist/hooks/handlers/index.js.map +0 -1
- package/dist/hooks/handlers/mcp-hooks.js +0 -80
- package/dist/hooks/handlers/mcp-hooks.js.map +0 -1
- package/dist/hooks/handlers/memory-bridge-refresh.js +0 -42
- package/dist/hooks/handlers/memory-bridge-refresh.js.map +0 -1
- package/dist/hooks/handlers/session-hooks.js +0 -109
- package/dist/hooks/handlers/session-hooks.js.map +0 -1
- package/dist/hooks/handlers/task-hooks.js +0 -70
- package/dist/hooks/handlers/task-hooks.js.map +0 -1
- package/dist/hooks/index.js +0 -13
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/payload-schemas.js +0 -163
- package/dist/hooks/payload-schemas.js.map +0 -1
- package/dist/hooks/provider-hooks.js +0 -34
- package/dist/hooks/provider-hooks.js.map +0 -1
- package/dist/hooks/registry.js +0 -176
- package/dist/hooks/registry.js.map +0 -1
- package/dist/hooks/types.js +0 -62
- package/dist/hooks/types.js.map +0 -1
- package/dist/hooks.js +0 -136
- package/dist/hooks.js.map +0 -1
- package/dist/init.js +0 -711
- package/dist/init.js.map +0 -1
- package/dist/inject/index.js +0 -82
- package/dist/inject/index.js.map +0 -1
- package/dist/injection.js +0 -343
- package/dist/injection.js.map +0 -1
- package/dist/intelligence/adaptive-validation.js +0 -497
- package/dist/intelligence/adaptive-validation.js.map +0 -1
- package/dist/intelligence/impact.js +0 -675
- package/dist/intelligence/impact.js.map +0 -1
- package/dist/intelligence/index.js +0 -22
- package/dist/intelligence/index.js.map +0 -1
- package/dist/intelligence/patterns.js +0 -492
- package/dist/intelligence/patterns.js.map +0 -1
- package/dist/intelligence/prediction.js +0 -499
- package/dist/intelligence/prediction.js.map +0 -1
- package/dist/intelligence/types.js +0 -13
- package/dist/intelligence/types.js.map +0 -1
- package/dist/internal.js +0 -276
- package/dist/internal.js.map +0 -1
- package/dist/issue/create.js +0 -121
- package/dist/issue/create.js.map +0 -1
- package/dist/issue/diagnostics.js +0 -59
- package/dist/issue/diagnostics.js.map +0 -1
- package/dist/issue/index.js +0 -10
- package/dist/issue/index.js.map +0 -1
- package/dist/issue/template-parser.js +0 -267
- package/dist/issue/template-parser.js.map +0 -1
- package/dist/json-schema-validator.js +0 -76
- package/dist/json-schema-validator.js.map +0 -1
- package/dist/lib/index.js +0 -10
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/retry.js +0 -152
- package/dist/lib/retry.js.map +0 -1
- package/dist/lifecycle/chain-composition.js +0 -152
- package/dist/lifecycle/chain-composition.js.map +0 -1
- package/dist/lifecycle/chain-store.js +0 -246
- package/dist/lifecycle/chain-store.js.map +0 -1
- package/dist/lifecycle/consolidate-rcasd.js +0 -352
- package/dist/lifecycle/consolidate-rcasd.js.map +0 -1
- package/dist/lifecycle/default-chain.js +0 -167
- package/dist/lifecycle/default-chain.js.map +0 -1
- package/dist/lifecycle/evidence.js +0 -180
- package/dist/lifecycle/evidence.js.map +0 -1
- package/dist/lifecycle/frontmatter.js +0 -363
- package/dist/lifecycle/frontmatter.js.map +0 -1
- package/dist/lifecycle/index.js +0 -753
- package/dist/lifecycle/index.js.map +0 -1
- package/dist/lifecycle/pipeline.js +0 -656
- package/dist/lifecycle/pipeline.js.map +0 -1
- package/dist/lifecycle/rcasd-index.js +0 -326
- package/dist/lifecycle/rcasd-index.js.map +0 -1
- package/dist/lifecycle/rcasd-paths.js +0 -220
- package/dist/lifecycle/rcasd-paths.js.map +0 -1
- package/dist/lifecycle/resume.js +0 -864
- package/dist/lifecycle/resume.js.map +0 -1
- package/dist/lifecycle/stage-artifacts.js +0 -94
- package/dist/lifecycle/stage-artifacts.js.map +0 -1
- package/dist/lifecycle/stages.js +0 -534
- package/dist/lifecycle/stages.js.map +0 -1
- package/dist/lifecycle/state-machine.js +0 -516
- package/dist/lifecycle/state-machine.js.map +0 -1
- package/dist/lifecycle/tessera-engine.js +0 -249
- package/dist/lifecycle/tessera-engine.js.map +0 -1
- package/dist/logger.js +0 -140
- package/dist/logger.js.map +0 -1
- package/dist/mcp/index.js +0 -146
- package/dist/mcp/index.js.map +0 -1
- package/dist/memory/auto-extract.js +0 -177
- package/dist/memory/auto-extract.js.map +0 -1
- package/dist/memory/brain-embedding.js +0 -66
- package/dist/memory/brain-embedding.js.map +0 -1
- package/dist/memory/brain-lifecycle.js +0 -298
- package/dist/memory/brain-lifecycle.js.map +0 -1
- package/dist/memory/brain-links.js +0 -148
- package/dist/memory/brain-links.js.map +0 -1
- package/dist/memory/brain-maintenance.js +0 -98
- package/dist/memory/brain-maintenance.js.map +0 -1
- package/dist/memory/brain-migration.js +0 -149
- package/dist/memory/brain-migration.js.map +0 -1
- package/dist/memory/brain-reasoning.js +0 -215
- package/dist/memory/brain-reasoning.js.map +0 -1
- package/dist/memory/brain-retrieval.js +0 -521
- package/dist/memory/brain-retrieval.js.map +0 -1
- package/dist/memory/brain-row-types.js +0 -10
- package/dist/memory/brain-row-types.js.map +0 -1
- package/dist/memory/brain-search.js +0 -519
- package/dist/memory/brain-search.js.map +0 -1
- package/dist/memory/brain-similarity.js +0 -145
- package/dist/memory/brain-similarity.js.map +0 -1
- package/dist/memory/claude-mem-migration.js +0 -277
- package/dist/memory/claude-mem-migration.js.map +0 -1
- package/dist/memory/decisions.js +0 -148
- package/dist/memory/decisions.js.map +0 -1
- package/dist/memory/embedding-local.js +0 -97
- package/dist/memory/embedding-local.js.map +0 -1
- package/dist/memory/embedding-queue.js +0 -271
- package/dist/memory/embedding-queue.js.map +0 -1
- package/dist/memory/embedding-worker.js +0 -58
- package/dist/memory/embedding-worker.js.map +0 -1
- package/dist/memory/engine-compat.js +0 -1030
- package/dist/memory/engine-compat.js.map +0 -1
- package/dist/memory/index.js +0 -773
- package/dist/memory/index.js.map +0 -1
- package/dist/memory/learnings.js +0 -121
- package/dist/memory/learnings.js.map +0 -1
- package/dist/memory/memory-bridge.js +0 -370
- package/dist/memory/memory-bridge.js.map +0 -1
- package/dist/memory/patterns.js +0 -122
- package/dist/memory/patterns.js.map +0 -1
- package/dist/memory/pipeline-manifest-sqlite.js +0 -975
- package/dist/memory/pipeline-manifest-sqlite.js.map +0 -1
- package/dist/memory/session-memory.js +0 -331
- package/dist/memory/session-memory.js.map +0 -1
- package/dist/metrics/ab-test.js +0 -260
- package/dist/metrics/ab-test.js.map +0 -1
- package/dist/metrics/aggregation.js +0 -363
- package/dist/metrics/aggregation.js.map +0 -1
- package/dist/metrics/common.js +0 -64
- package/dist/metrics/common.js.map +0 -1
- package/dist/metrics/enums.js +0 -78
- package/dist/metrics/enums.js.map +0 -1
- package/dist/metrics/index.js +0 -19
- package/dist/metrics/index.js.map +0 -1
- package/dist/metrics/model-provider-registry.js +0 -88
- package/dist/metrics/model-provider-registry.js.map +0 -1
- package/dist/metrics/otel-integration.js +0 -263
- package/dist/metrics/otel-integration.js.map +0 -1
- package/dist/metrics/provider-detection.js +0 -103
- package/dist/metrics/provider-detection.js.map +0 -1
- package/dist/metrics/token-estimation.js +0 -253
- package/dist/metrics/token-estimation.js.map +0 -1
- package/dist/metrics/token-service.js +0 -450
- package/dist/metrics/token-service.js.map +0 -1
- package/dist/migration/agent-outputs.js +0 -316
- package/dist/migration/agent-outputs.js.map +0 -1
- package/dist/migration/checksum.js +0 -92
- package/dist/migration/checksum.js.map +0 -1
- package/dist/migration/index.js +0 -282
- package/dist/migration/index.js.map +0 -1
- package/dist/migration/logger.js +0 -360
- package/dist/migration/logger.js.map +0 -1
- package/dist/migration/preflight.js +0 -9
- package/dist/migration/preflight.js.map +0 -1
- package/dist/migration/state.js +0 -421
- package/dist/migration/state.js.map +0 -1
- package/dist/migration/validate.js +0 -241
- package/dist/migration/validate.js.map +0 -1
- package/dist/nexus/deps.js +0 -375
- package/dist/nexus/deps.js.map +0 -1
- package/dist/nexus/discover.js +0 -288
- package/dist/nexus/discover.js.map +0 -1
- package/dist/nexus/hash.js +0 -10
- package/dist/nexus/hash.js.map +0 -1
- package/dist/nexus/index.js +0 -38
- package/dist/nexus/index.js.map +0 -1
- package/dist/nexus/migrate-json-to-sqlite.js +0 -115
- package/dist/nexus/migrate-json-to-sqlite.js.map +0 -1
- package/dist/nexus/permissions.js +0 -105
- package/dist/nexus/permissions.js.map +0 -1
- package/dist/nexus/query.js +0 -175
- package/dist/nexus/query.js.map +0 -1
- package/dist/nexus/registry.js +0 -584
- package/dist/nexus/registry.js.map +0 -1
- package/dist/nexus/sharing/index.js +0 -288
- package/dist/nexus/sharing/index.js.map +0 -1
- package/dist/nexus/transfer-types.js +0 -8
- package/dist/nexus/transfer-types.js.map +0 -1
- package/dist/nexus/transfer.js +0 -263
- package/dist/nexus/transfer.js.map +0 -1
- package/dist/observability/index.js +0 -103
- package/dist/observability/index.js.map +0 -1
- package/dist/observability/log-filter.js +0 -63
- package/dist/observability/log-filter.js.map +0 -1
- package/dist/observability/log-parser.js +0 -99
- package/dist/observability/log-parser.js.map +0 -1
- package/dist/observability/log-reader.js +0 -139
- package/dist/observability/log-reader.js.map +0 -1
- package/dist/observability/types.js +0 -19
- package/dist/observability/types.js.map +0 -1
- package/dist/orchestration/analyze.js +0 -107
- package/dist/orchestration/analyze.js.map +0 -1
- package/dist/orchestration/bootstrap.js +0 -132
- package/dist/orchestration/bootstrap.js.map +0 -1
- package/dist/orchestration/context.js +0 -56
- package/dist/orchestration/context.js.map +0 -1
- package/dist/orchestration/critical-path.js +0 -100
- package/dist/orchestration/critical-path.js.map +0 -1
- package/dist/orchestration/index.js +0 -286
- package/dist/orchestration/index.js.map +0 -1
- package/dist/orchestration/parallel.js +0 -89
- package/dist/orchestration/parallel.js.map +0 -1
- package/dist/orchestration/protocol-validators.js +0 -524
- package/dist/orchestration/protocol-validators.js.map +0 -1
- package/dist/orchestration/skill-ops.js +0 -98
- package/dist/orchestration/skill-ops.js.map +0 -1
- package/dist/orchestration/status.js +0 -107
- package/dist/orchestration/status.js.map +0 -1
- package/dist/orchestration/unblock.js +0 -103
- package/dist/orchestration/unblock.js.map +0 -1
- package/dist/orchestration/validate-spawn.js +0 -67
- package/dist/orchestration/validate-spawn.js.map +0 -1
- package/dist/orchestration/waves.js +0 -86
- package/dist/orchestration/waves.js.map +0 -1
- package/dist/otel/index.js +0 -163
- package/dist/otel/index.js.map +0 -1
- package/dist/output.js +0 -132
- package/dist/output.js.map +0 -1
- package/dist/pagination.js +0 -64
- package/dist/pagination.js.map +0 -1
- package/dist/paths.js +0 -337
- package/dist/paths.js.map +0 -1
- package/dist/phases/deps.js +0 -372
- package/dist/phases/deps.js.map +0 -1
- package/dist/phases/index.js +0 -349
- package/dist/phases/index.js.map +0 -1
- package/dist/pipeline/index.js +0 -10
- package/dist/pipeline/index.js.map +0 -1
- package/dist/pipeline/phase.js +0 -45
- package/dist/pipeline/phase.js.map +0 -1
- package/dist/platform.js +0 -211
- package/dist/platform.js.map +0 -1
- package/dist/project-info.js +0 -84
- package/dist/project-info.js.map +0 -1
- package/dist/reconciliation/index.js +0 -10
- package/dist/reconciliation/index.js.map +0 -1
- package/dist/reconciliation/link-store.js +0 -129
- package/dist/reconciliation/link-store.js.map +0 -1
- package/dist/reconciliation/reconciliation-engine.js +0 -298
- package/dist/reconciliation/reconciliation-engine.js.map +0 -1
- package/dist/release/artifacts.js +0 -427
- package/dist/release/artifacts.js.map +0 -1
- package/dist/release/changelog-writer.js +0 -151
- package/dist/release/changelog-writer.js.map +0 -1
- package/dist/release/channel.js +0 -144
- package/dist/release/channel.js.map +0 -1
- package/dist/release/ci.js +0 -166
- package/dist/release/ci.js.map +0 -1
- package/dist/release/github-pr.js +0 -225
- package/dist/release/github-pr.js.map +0 -1
- package/dist/release/guards.js +0 -116
- package/dist/release/guards.js.map +0 -1
- package/dist/release/index.js +0 -22
- package/dist/release/index.js.map +0 -1
- package/dist/release/release-config.js +0 -158
- package/dist/release/release-config.js.map +0 -1
- package/dist/release/release-manifest.js +0 -1019
- package/dist/release/release-manifest.js.map +0 -1
- package/dist/release/version-bump.js +0 -255
- package/dist/release/version-bump.js.map +0 -1
- package/dist/remote/index.js +0 -257
- package/dist/remote/index.js.map +0 -1
- package/dist/repair.js +0 -130
- package/dist/repair.js.map +0 -1
- package/dist/research/index.js +0 -2
- package/dist/research/index.js.map +0 -1
- package/dist/roadmap/index.js +0 -59
- package/dist/roadmap/index.js.map +0 -1
- package/dist/routing/capability-matrix.js +0 -1557
- package/dist/routing/capability-matrix.js.map +0 -1
- package/dist/routing/index.js +0 -9
- package/dist/routing/index.js.map +0 -1
- package/dist/scaffold.js +0 -1178
- package/dist/scaffold.js.map +0 -1
- package/dist/schema-management.js +0 -295
- package/dist/schema-management.js.map +0 -1
- package/dist/security/index.js +0 -9
- package/dist/security/index.js.map +0 -1
- package/dist/security/input-sanitization.js +0 -321
- package/dist/security/input-sanitization.js.map +0 -1
- package/dist/sequence/index.js +0 -295
- package/dist/sequence/index.js.map +0 -1
- package/dist/sessions/assumptions.js +0 -54
- package/dist/sessions/assumptions.js.map +0 -1
- package/dist/sessions/briefing.js +0 -377
- package/dist/sessions/briefing.js.map +0 -1
- package/dist/sessions/context-alert.js +0 -222
- package/dist/sessions/context-alert.js.map +0 -1
- package/dist/sessions/context-inject.js +0 -61
- package/dist/sessions/context-inject.js.map +0 -1
- package/dist/sessions/context-monitor.js +0 -98
- package/dist/sessions/context-monitor.js.map +0 -1
- package/dist/sessions/decisions.js +0 -65
- package/dist/sessions/decisions.js.map +0 -1
- package/dist/sessions/find.js +0 -63
- package/dist/sessions/find.js.map +0 -1
- package/dist/sessions/handoff.js +0 -328
- package/dist/sessions/handoff.js.map +0 -1
- package/dist/sessions/hitl-warnings.js +0 -254
- package/dist/sessions/hitl-warnings.js.map +0 -1
- package/dist/sessions/index.js +0 -314
- package/dist/sessions/index.js.map +0 -1
- package/dist/sessions/session-archive.js +0 -40
- package/dist/sessions/session-archive.js.map +0 -1
- package/dist/sessions/session-cleanup.js +0 -59
- package/dist/sessions/session-cleanup.js.map +0 -1
- package/dist/sessions/session-drift.js +0 -134
- package/dist/sessions/session-drift.js.map +0 -1
- package/dist/sessions/session-enforcement.js +0 -144
- package/dist/sessions/session-enforcement.js.map +0 -1
- package/dist/sessions/session-grade.js +0 -253
- package/dist/sessions/session-grade.js.map +0 -1
- package/dist/sessions/session-history.js +0 -42
- package/dist/sessions/session-history.js.map +0 -1
- package/dist/sessions/session-id.js +0 -81
- package/dist/sessions/session-id.js.map +0 -1
- package/dist/sessions/session-memory-bridge.js +0 -52
- package/dist/sessions/session-memory-bridge.js.map +0 -1
- package/dist/sessions/session-show.js +0 -24
- package/dist/sessions/session-show.js.map +0 -1
- package/dist/sessions/session-stats.js +0 -69
- package/dist/sessions/session-stats.js.map +0 -1
- package/dist/sessions/session-suspend.js +0 -39
- package/dist/sessions/session-suspend.js.map +0 -1
- package/dist/sessions/session-switch.js +0 -51
- package/dist/sessions/session-switch.js.map +0 -1
- package/dist/sessions/session-view.js +0 -76
- package/dist/sessions/session-view.js.map +0 -1
- package/dist/sessions/statusline-setup.js +0 -85
- package/dist/sessions/statusline-setup.js.map +0 -1
- package/dist/sessions/types.js +0 -8
- package/dist/sessions/types.js.map +0 -1
- package/dist/signaldock/claude-code-transport.d.ts +0 -34
- package/dist/signaldock/claude-code-transport.d.ts.map +0 -1
- package/dist/signaldock/claude-code-transport.js +0 -107
- package/dist/signaldock/claude-code-transport.js.map +0 -1
- package/dist/signaldock/factory.d.ts +0 -22
- package/dist/signaldock/factory.d.ts.map +0 -1
- package/dist/signaldock/factory.js +0 -25
- package/dist/signaldock/factory.js.map +0 -1
- package/dist/signaldock/index.d.ts +0 -13
- package/dist/signaldock/index.d.ts.map +0 -1
- package/dist/signaldock/index.js +0 -9
- package/dist/signaldock/index.js.map +0 -1
- package/dist/signaldock/signaldock-transport.d.ts +0 -45
- package/dist/signaldock/signaldock-transport.d.ts.map +0 -1
- package/dist/signaldock/signaldock-transport.js +0 -122
- package/dist/signaldock/signaldock-transport.js.map +0 -1
- package/dist/signaldock/transport.d.ts +0 -49
- package/dist/signaldock/transport.d.ts.map +0 -1
- package/dist/signaldock/transport.js +0 -11
- package/dist/signaldock/transport.js.map +0 -1
- package/dist/signaldock/types.d.ts +0 -88
- package/dist/signaldock/types.d.ts.map +0 -1
- package/dist/signaldock/types.js +0 -11
- package/dist/signaldock/types.js.map +0 -1
- package/dist/skills/agents/config.js +0 -94
- package/dist/skills/agents/config.js.map +0 -1
- package/dist/skills/agents/install.js +0 -116
- package/dist/skills/agents/install.js.map +0 -1
- package/dist/skills/agents/registry.js +0 -161
- package/dist/skills/agents/registry.js.map +0 -1
- package/dist/skills/discovery.js +0 -333
- package/dist/skills/discovery.js.map +0 -1
- package/dist/skills/dispatch.js +0 -347
- package/dist/skills/dispatch.js.map +0 -1
- package/dist/skills/dynamic-skill-generator.js +0 -100
- package/dist/skills/dynamic-skill-generator.js.map +0 -1
- package/dist/skills/index.js +0 -44
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/injection/subagent.js +0 -195
- package/dist/skills/injection/subagent.js.map +0 -1
- package/dist/skills/injection/token.js +0 -260
- package/dist/skills/injection/token.js.map +0 -1
- package/dist/skills/install.js +0 -40
- package/dist/skills/install.js.map +0 -1
- package/dist/skills/manifests/contribution.js +0 -175
- package/dist/skills/manifests/contribution.js.map +0 -1
- package/dist/skills/manifests/research.js +0 -281
- package/dist/skills/manifests/research.js.map +0 -1
- package/dist/skills/manifests/resolver.js +0 -146
- package/dist/skills/manifests/resolver.js.map +0 -1
- package/dist/skills/marketplace.js +0 -90
- package/dist/skills/marketplace.js.map +0 -1
- package/dist/skills/orchestrator/spawn.js +0 -178
- package/dist/skills/orchestrator/spawn.js.map +0 -1
- package/dist/skills/orchestrator/startup.js +0 -451
- package/dist/skills/orchestrator/startup.js.map +0 -1
- package/dist/skills/orchestrator/validator.js +0 -301
- package/dist/skills/orchestrator/validator.js.map +0 -1
- package/dist/skills/precedence-integration.js +0 -73
- package/dist/skills/precedence-integration.js.map +0 -1
- package/dist/skills/precedence-types.js +0 -16
- package/dist/skills/precedence-types.js.map +0 -1
- package/dist/skills/routing-table.js +0 -63
- package/dist/skills/routing-table.js.map +0 -1
- package/dist/skills/skill-paths.js +0 -220
- package/dist/skills/skill-paths.js.map +0 -1
- package/dist/skills/test-utility.js +0 -55
- package/dist/skills/test-utility.js.map +0 -1
- package/dist/skills/types.js +0 -118
- package/dist/skills/types.js.map +0 -1
- package/dist/skills/validation.js +0 -183
- package/dist/skills/validation.js.map +0 -1
- package/dist/skills/version.js +0 -57
- package/dist/skills/version.js.map +0 -1
- package/dist/snapshot/index.js +0 -188
- package/dist/snapshot/index.js.map +0 -1
- package/dist/spawn/adapter-registry.js +0 -246
- package/dist/spawn/adapter-registry.js.map +0 -1
- package/dist/spawn/index.js +0 -10
- package/dist/spawn/index.js.map +0 -1
- package/dist/stats/index.js +0 -343
- package/dist/stats/index.js.map +0 -1
- package/dist/stats/workflow-telemetry.js +0 -400
- package/dist/stats/workflow-telemetry.js.map +0 -1
- package/dist/sticky/archive.js +0 -47
- package/dist/sticky/archive.js.map +0 -1
- package/dist/sticky/convert.js +0 -235
- package/dist/sticky/convert.js.map +0 -1
- package/dist/sticky/create.js +0 -48
- package/dist/sticky/create.js.map +0 -1
- package/dist/sticky/id.js +0 -35
- package/dist/sticky/id.js.map +0 -1
- package/dist/sticky/index.js +0 -16
- package/dist/sticky/index.js.map +0 -1
- package/dist/sticky/list.js +0 -44
- package/dist/sticky/list.js.map +0 -1
- package/dist/sticky/purge.js +0 -45
- package/dist/sticky/purge.js.map +0 -1
- package/dist/sticky/show.js +0 -42
- package/dist/sticky/show.js.map +0 -1
- package/dist/sticky/types.js +0 -10
- package/dist/sticky/types.js.map +0 -1
- package/dist/store/atomic.js +0 -167
- package/dist/store/atomic.js.map +0 -1
- package/dist/store/backup.js +0 -94
- package/dist/store/backup.js.map +0 -1
- package/dist/store/brain-accessor.js +0 -397
- package/dist/store/brain-accessor.js.map +0 -1
- package/dist/store/brain-schema.js +0 -215
- package/dist/store/brain-schema.js.map +0 -1
- package/dist/store/brain-sqlite.js +0 -222
- package/dist/store/brain-sqlite.js.map +0 -1
- package/dist/store/cache.js +0 -168
- package/dist/store/cache.js.map +0 -1
- package/dist/store/chain-schema.js +0 -51
- package/dist/store/chain-schema.js.map +0 -1
- package/dist/store/converters.js +0 -122
- package/dist/store/converters.js.map +0 -1
- package/dist/store/cross-db-cleanup.js +0 -169
- package/dist/store/cross-db-cleanup.js.map +0 -1
- package/dist/store/data-accessor.js +0 -26
- package/dist/store/data-accessor.js.map +0 -1
- package/dist/store/data-safety-central.js +0 -269
- package/dist/store/data-safety-central.js.map +0 -1
- package/dist/store/data-safety.js +0 -274
- package/dist/store/data-safety.js.map +0 -1
- package/dist/store/db-helpers.js +0 -223
- package/dist/store/db-helpers.js.map +0 -1
- package/dist/store/export.js +0 -155
- package/dist/store/export.js.map +0 -1
- package/dist/store/file-utils.js +0 -270
- package/dist/store/file-utils.js.map +0 -1
- package/dist/store/git-checkpoint.js +0 -365
- package/dist/store/git-checkpoint.js.map +0 -1
- package/dist/store/import-logging.js +0 -139
- package/dist/store/import-logging.js.map +0 -1
- package/dist/store/import-remap.js +0 -145
- package/dist/store/import-remap.js.map +0 -1
- package/dist/store/import-sort.js +0 -121
- package/dist/store/import-sort.js.map +0 -1
- package/dist/store/index.js +0 -28
- package/dist/store/index.js.map +0 -1
- package/dist/store/json.js +0 -208
- package/dist/store/json.js.map +0 -1
- package/dist/store/lifecycle-store.js +0 -249
- package/dist/store/lifecycle-store.js.map +0 -1
- package/dist/store/lock.js +0 -70
- package/dist/store/lock.js.map +0 -1
- package/dist/store/migration-manager.js +0 -151
- package/dist/store/migration-manager.js.map +0 -1
- package/dist/store/migration-sqlite.js +0 -676
- package/dist/store/migration-sqlite.js.map +0 -1
- package/dist/store/nexus-schema.js +0 -62
- package/dist/store/nexus-schema.js.map +0 -1
- package/dist/store/nexus-sqlite.js +0 -217
- package/dist/store/nexus-sqlite.js.map +0 -1
- package/dist/store/nexus-validation-schemas.js +0 -40
- package/dist/store/nexus-validation-schemas.js.map +0 -1
- package/dist/store/parsers.js +0 -37
- package/dist/store/parsers.js.map +0 -1
- package/dist/store/project-detect.js +0 -457
- package/dist/store/project-detect.js.map +0 -1
- package/dist/store/provider.js +0 -101
- package/dist/store/provider.js.map +0 -1
- package/dist/store/safety-data-accessor.js +0 -243
- package/dist/store/safety-data-accessor.js.map +0 -1
- package/dist/store/schema.js +0 -7
- package/dist/store/schema.js.map +0 -1
- package/dist/store/session-store.js +0 -219
- package/dist/store/session-store.js.map +0 -1
- package/dist/store/sqlite-backup.js +0 -105
- package/dist/store/sqlite-backup.js.map +0 -1
- package/dist/store/sqlite-data-accessor.js +0 -734
- package/dist/store/sqlite-data-accessor.js.map +0 -1
- package/dist/store/sqlite.js +0 -436
- package/dist/store/sqlite.js.map +0 -1
- package/dist/store/status-registry.js +0 -8
- package/dist/store/status-registry.js.map +0 -1
- package/dist/store/task-store.js +0 -348
- package/dist/store/task-store.js.map +0 -1
- package/dist/store/tasks-schema.js +0 -604
- package/dist/store/tasks-schema.js.map +0 -1
- package/dist/store/typed-query.js +0 -15
- package/dist/store/typed-query.js.map +0 -1
- package/dist/store/validation-schemas.js +0 -278
- package/dist/store/validation-schemas.js.map +0 -1
- package/dist/system/archive-analytics.js +0 -277
- package/dist/system/archive-analytics.js.map +0 -1
- package/dist/system/archive-stats.js +0 -64
- package/dist/system/archive-stats.js.map +0 -1
- package/dist/system/audit.js +0 -145
- package/dist/system/audit.js.map +0 -1
- package/dist/system/backup.js +0 -141
- package/dist/system/backup.js.map +0 -1
- package/dist/system/cleanup.js +0 -134
- package/dist/system/cleanup.js.map +0 -1
- package/dist/system/health.js +0 -1054
- package/dist/system/health.js.map +0 -1
- package/dist/system/index.js +0 -18
- package/dist/system/index.js.map +0 -1
- package/dist/system/inject-generate.js +0 -122
- package/dist/system/inject-generate.js.map +0 -1
- package/dist/system/labels.js +0 -38
- package/dist/system/labels.js.map +0 -1
- package/dist/system/metrics.js +0 -61
- package/dist/system/metrics.js.map +0 -1
- package/dist/system/migrate.js +0 -43
- package/dist/system/migrate.js.map +0 -1
- package/dist/system/platform-paths.js +0 -80
- package/dist/system/platform-paths.js.map +0 -1
- package/dist/system/runtime.js +0 -161
- package/dist/system/runtime.js.map +0 -1
- package/dist/system/safestop.js +0 -99
- package/dist/system/safestop.js.map +0 -1
- package/dist/system/storage-preflight.js +0 -123
- package/dist/system/storage-preflight.js.map +0 -1
- package/dist/task-work/index.js +0 -155
- package/dist/task-work/index.js.map +0 -1
- package/dist/tasks/add.js +0 -661
- package/dist/tasks/add.js.map +0 -1
- package/dist/tasks/analyze.js +0 -85
- package/dist/tasks/analyze.js.map +0 -1
- package/dist/tasks/archive.js +0 -90
- package/dist/tasks/archive.js.map +0 -1
- package/dist/tasks/atomicity.js +0 -83
- package/dist/tasks/atomicity.js.map +0 -1
- package/dist/tasks/cancel-ops.js +0 -83
- package/dist/tasks/cancel-ops.js.map +0 -1
- package/dist/tasks/complete.js +0 -208
- package/dist/tasks/complete.js.map +0 -1
- package/dist/tasks/crossref-extract.js +0 -73
- package/dist/tasks/crossref-extract.js.map +0 -1
- package/dist/tasks/delete-preview.js +0 -192
- package/dist/tasks/delete-preview.js.map +0 -1
- package/dist/tasks/delete.js +0 -120
- package/dist/tasks/delete.js.map +0 -1
- package/dist/tasks/deletion-strategy.js +0 -200
- package/dist/tasks/deletion-strategy.js.map +0 -1
- package/dist/tasks/dependency-check.js +0 -278
- package/dist/tasks/dependency-check.js.map +0 -1
- package/dist/tasks/deps-ready.js +0 -32
- package/dist/tasks/deps-ready.js.map +0 -1
- package/dist/tasks/enforcement.js +0 -86
- package/dist/tasks/enforcement.js.map +0 -1
- package/dist/tasks/epic-enforcement.js +0 -294
- package/dist/tasks/epic-enforcement.js.map +0 -1
- package/dist/tasks/find.js +0 -148
- package/dist/tasks/find.js.map +0 -1
- package/dist/tasks/graph-cache.js +0 -127
- package/dist/tasks/graph-cache.js.map +0 -1
- package/dist/tasks/graph-ops.js +0 -171
- package/dist/tasks/graph-ops.js.map +0 -1
- package/dist/tasks/graph-rag.js +0 -328
- package/dist/tasks/graph-rag.js.map +0 -1
- package/dist/tasks/hierarchy-policy.js +0 -149
- package/dist/tasks/hierarchy-policy.js.map +0 -1
- package/dist/tasks/hierarchy.js +0 -185
- package/dist/tasks/hierarchy.js.map +0 -1
- package/dist/tasks/id-generator.js +0 -65
- package/dist/tasks/id-generator.js.map +0 -1
- package/dist/tasks/index.js +0 -14
- package/dist/tasks/index.js.map +0 -1
- package/dist/tasks/labels.js +0 -52
- package/dist/tasks/labels.js.map +0 -1
- package/dist/tasks/list.js +0 -68
- package/dist/tasks/list.js.map +0 -1
- package/dist/tasks/phase-tracking.js +0 -133
- package/dist/tasks/phase-tracking.js.map +0 -1
- package/dist/tasks/pipeline-stage.js +0 -248
- package/dist/tasks/pipeline-stage.js.map +0 -1
- package/dist/tasks/plan.js +0 -268
- package/dist/tasks/plan.js.map +0 -1
- package/dist/tasks/relates.js +0 -89
- package/dist/tasks/relates.js.map +0 -1
- package/dist/tasks/reparent.d.ts +0 -38
- package/dist/tasks/reparent.d.ts.map +0 -1
- package/dist/tasks/show.js +0 -78
- package/dist/tasks/show.js.map +0 -1
- package/dist/tasks/size-weighting.js +0 -86
- package/dist/tasks/size-weighting.js.map +0 -1
- package/dist/tasks/staleness.js +0 -86
- package/dist/tasks/staleness.js.map +0 -1
- package/dist/tasks/task-ops.js +0 -1340
- package/dist/tasks/task-ops.js.map +0 -1
- package/dist/tasks/update.js +0 -271
- package/dist/tasks/update.js.map +0 -1
- package/dist/templates/index.js +0 -10
- package/dist/templates/index.js.map +0 -1
- package/dist/templates/parser.js +0 -254
- package/dist/templates/parser.js.map +0 -1
- package/dist/ui/aliases.js +0 -153
- package/dist/ui/aliases.js.map +0 -1
- package/dist/ui/changelog.js +0 -184
- package/dist/ui/changelog.js.map +0 -1
- package/dist/ui/command-registry.js +0 -168
- package/dist/ui/command-registry.js.map +0 -1
- package/dist/ui/flags.js +0 -94
- package/dist/ui/flags.js.map +0 -1
- package/dist/ui/index.js +0 -24
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/injection-legacy.d.ts +0 -26
- package/dist/ui/injection-legacy.d.ts.map +0 -1
- package/dist/ui/injection-legacy.js +0 -42
- package/dist/ui/injection-legacy.js.map +0 -1
- package/dist/upgrade.js +0 -1144
- package/dist/upgrade.js.map +0 -1
- package/dist/validation/chain-validation.js +0 -146
- package/dist/validation/chain-validation.js.map +0 -1
- package/dist/validation/compliance.js +0 -155
- package/dist/validation/compliance.js.map +0 -1
- package/dist/validation/docs-sync.js +0 -212
- package/dist/validation/docs-sync.js.map +0 -1
- package/dist/validation/doctor/checks.js +0 -1069
- package/dist/validation/doctor/checks.js.map +0 -1
- package/dist/validation/doctor/index.js +0 -9
- package/dist/validation/doctor/index.js.map +0 -1
- package/dist/validation/doctor/project-cache.js +0 -160
- package/dist/validation/doctor/project-cache.js.map +0 -1
- package/dist/validation/doctor/utils.js +0 -155
- package/dist/validation/doctor/utils.js.map +0 -1
- package/dist/validation/engine.js +0 -902
- package/dist/validation/engine.js.map +0 -1
- package/dist/validation/gap-check.js +0 -175
- package/dist/validation/gap-check.js.map +0 -1
- package/dist/validation/index.js +0 -40
- package/dist/validation/index.js.map +0 -1
- package/dist/validation/manifest.js +0 -237
- package/dist/validation/manifest.js.map +0 -1
- package/dist/validation/operation-gate-validators.js +0 -724
- package/dist/validation/operation-gate-validators.js.map +0 -1
- package/dist/validation/operation-verification-gates.js +0 -532
- package/dist/validation/operation-verification-gates.js.map +0 -1
- package/dist/validation/param-utils.js +0 -139
- package/dist/validation/param-utils.js.map +0 -1
- package/dist/validation/protocol-common.js +0 -300
- package/dist/validation/protocol-common.js.map +0 -1
- package/dist/validation/protocols/consensus.js +0 -71
- package/dist/validation/protocols/consensus.js.map +0 -1
- package/dist/validation/protocols/contribution.js +0 -59
- package/dist/validation/protocols/contribution.js.map +0 -1
- package/dist/validation/protocols/decomposition.js +0 -59
- package/dist/validation/protocols/decomposition.js.map +0 -1
- package/dist/validation/protocols/implementation.js +0 -59
- package/dist/validation/protocols/implementation.js.map +0 -1
- package/dist/validation/protocols/release-protocol.js +0 -60
- package/dist/validation/protocols/release-protocol.js.map +0 -1
- package/dist/validation/protocols/research.js +0 -77
- package/dist/validation/protocols/research.js.map +0 -1
- package/dist/validation/protocols/specification.js +0 -84
- package/dist/validation/protocols/specification.js.map +0 -1
- package/dist/validation/protocols/testing-protocol.js +0 -70
- package/dist/validation/protocols/testing-protocol.js.map +0 -1
- package/dist/validation/protocols/validation-protocol.js +0 -70
- package/dist/validation/protocols/validation-protocol.js.map +0 -1
- package/dist/validation/schema-integrity.js +0 -170
- package/dist/validation/schema-integrity.js.map +0 -1
- package/dist/validation/schema-validator.js +0 -176
- package/dist/validation/schema-validator.js.map +0 -1
- package/dist/validation/validate-ops.js +0 -937
- package/dist/validation/validate-ops.js.map +0 -1
- package/dist/validation/validation-rules.js +0 -226
- package/dist/validation/validation-rules.js.map +0 -1
- package/dist/validation/verification.js +0 -321
- package/dist/validation/verification.js.map +0 -1
- package/src/signaldock/__tests__/claude-code-transport.test.d.ts +0 -7
- package/src/signaldock/__tests__/claude-code-transport.test.d.ts.map +0 -1
- package/src/signaldock/__tests__/claude-code-transport.test.js +0 -147
- package/src/signaldock/__tests__/claude-code-transport.test.js.map +0 -1
- package/src/signaldock/__tests__/claude-code-transport.test.ts +0 -180
- package/src/signaldock/__tests__/factory.test.d.ts +0 -7
- package/src/signaldock/__tests__/factory.test.d.ts.map +0 -1
- package/src/signaldock/__tests__/factory.test.js +0 -55
- package/src/signaldock/__tests__/factory.test.js.map +0 -1
- package/src/signaldock/__tests__/factory.test.ts +0 -61
- package/src/signaldock/__tests__/signaldock-transport.test.d.ts +0 -9
- package/src/signaldock/__tests__/signaldock-transport.test.d.ts.map +0 -1
- package/src/signaldock/__tests__/signaldock-transport.test.js +0 -321
- package/src/signaldock/__tests__/signaldock-transport.test.js.map +0 -1
- package/src/signaldock/__tests__/signaldock-transport.test.ts +0 -421
- package/src/signaldock/claude-code-transport.ts +0 -137
- package/src/signaldock/factory.ts +0 -39
- package/src/signaldock/index.ts +0 -28
- package/src/signaldock/signaldock-transport.ts +0 -194
- package/src/signaldock/transport.ts +0 -78
- package/src/signaldock/types.ts +0 -100
package/dist/scaffold.js
DELETED
|
@@ -1,1178 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Directory & file scaffolding utilities.
|
|
3
|
-
*
|
|
4
|
-
* Shared ensure/check functions extracted from init.ts for reuse
|
|
5
|
-
* by init.ts, upgrade.ts, and doctor health checks.
|
|
6
|
-
*
|
|
7
|
-
* Rules:
|
|
8
|
-
* - All ensure functions are idempotent (safe to call multiple times)
|
|
9
|
-
* - All check functions are read-only (no side effects)
|
|
10
|
-
* - Uses imports from ./paths.js for path resolution
|
|
11
|
-
*/
|
|
12
|
-
import { execFile } from 'node:child_process';
|
|
13
|
-
import { randomUUID } from 'node:crypto';
|
|
14
|
-
import { existsSync, constants as fsConstants, readFileSync, statSync } from 'node:fs';
|
|
15
|
-
import { access, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
16
|
-
import { homedir as getHomedir } from 'node:os';
|
|
17
|
-
import { dirname, join, resolve } from 'node:path';
|
|
18
|
-
import { fileURLToPath } from 'node:url';
|
|
19
|
-
import { promisify } from 'node:util';
|
|
20
|
-
import { generateProjectHash } from './nexus/hash.js';
|
|
21
|
-
import { getCleoDirAbsolute, getCleoHome, getCleoTemplatesDir, getConfigPath } from './paths.js';
|
|
22
|
-
import { saveJson } from './store/json.js';
|
|
23
|
-
const execFileAsync = promisify(execFile);
|
|
24
|
-
// ── Constants ────────────────────────────────────────────────────────
|
|
25
|
-
/** Required subdirectories under .cleo/. */
|
|
26
|
-
export const REQUIRED_CLEO_SUBDIRS = [
|
|
27
|
-
'backups/operational',
|
|
28
|
-
'backups/safety',
|
|
29
|
-
'agent-outputs',
|
|
30
|
-
'logs',
|
|
31
|
-
'rcasd',
|
|
32
|
-
'adrs',
|
|
33
|
-
];
|
|
34
|
-
/** Embedded fallback for .cleo/.gitignore content (deny-by-default). */
|
|
35
|
-
export const CLEO_GITIGNORE_FALLBACK = `# .cleo/.gitignore — Deny-by-default for CLEO project data
|
|
36
|
-
# Ignore everything, then explicitly allow only tracked files.
|
|
37
|
-
|
|
38
|
-
# Step 1: Ignore everything
|
|
39
|
-
*
|
|
40
|
-
|
|
41
|
-
# Allow list
|
|
42
|
-
!.gitignore
|
|
43
|
-
!config.json
|
|
44
|
-
!project-context.json
|
|
45
|
-
!project-info.json
|
|
46
|
-
!setup-otel.sh
|
|
47
|
-
!DATA-SAFETY-IMPLEMENTATION-SUMMARY.md
|
|
48
|
-
!adrs/
|
|
49
|
-
!adrs/**
|
|
50
|
-
!rcasd/
|
|
51
|
-
!rcasd/**
|
|
52
|
-
!agent-outputs/
|
|
53
|
-
!agent-outputs/**
|
|
54
|
-
|
|
55
|
-
# Explicit deny safety net
|
|
56
|
-
*.db
|
|
57
|
-
*.db-shm
|
|
58
|
-
*.db-wal
|
|
59
|
-
*.db-journal
|
|
60
|
-
log.json
|
|
61
|
-
bypass-log.json
|
|
62
|
-
qa-log.json
|
|
63
|
-
.deps-cache/
|
|
64
|
-
.context-alert-state.json
|
|
65
|
-
.context-state*.json
|
|
66
|
-
context-states/
|
|
67
|
-
.git-checkpoint-state
|
|
68
|
-
.migration-state.json
|
|
69
|
-
migrations.json
|
|
70
|
-
sync/
|
|
71
|
-
metrics/
|
|
72
|
-
.backups/
|
|
73
|
-
backups/
|
|
74
|
-
`;
|
|
75
|
-
// ── Pure helpers ─────────────────────────────────────────────────────
|
|
76
|
-
/**
|
|
77
|
-
* Check if a file exists and is readable.
|
|
78
|
-
*/
|
|
79
|
-
export async function fileExists(path) {
|
|
80
|
-
try {
|
|
81
|
-
await access(path, fsConstants.R_OK);
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Strip legacy <!-- CLEO:START -->...<!-- CLEO:END --> blocks from a file.
|
|
90
|
-
* Called before CAAMP injection to prevent competing blocks.
|
|
91
|
-
*
|
|
92
|
-
* Handles both bare markers (<!-- CLEO:START -->) and versioned markers
|
|
93
|
-
* (<!-- CLEO:START v0.53.4 -->, <!-- CLEO:START v1.2.3 -->).
|
|
94
|
-
*/
|
|
95
|
-
export async function stripCLEOBlocks(filePath) {
|
|
96
|
-
if (!existsSync(filePath))
|
|
97
|
-
return;
|
|
98
|
-
const content = await readFile(filePath, 'utf8');
|
|
99
|
-
const stripped = content.replace(/\n?<!-- CLEO:START[^>]*-->[\s\S]*?<!-- CLEO:END -->\n?/g, '');
|
|
100
|
-
if (stripped !== content)
|
|
101
|
-
await writeFile(filePath, stripped, 'utf8');
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Remove .cleo/ or .cleo entries from the project root .gitignore.
|
|
105
|
-
*/
|
|
106
|
-
export async function removeCleoFromRootGitignore(projectRoot) {
|
|
107
|
-
const rootGitignorePath = join(projectRoot, '.gitignore');
|
|
108
|
-
if (!(await fileExists(rootGitignorePath))) {
|
|
109
|
-
return { removed: false };
|
|
110
|
-
}
|
|
111
|
-
const content = await readFile(rootGitignorePath, 'utf-8');
|
|
112
|
-
const lines = content.split('\n');
|
|
113
|
-
const filtered = lines.filter((line) => {
|
|
114
|
-
const trimmed = line.trim();
|
|
115
|
-
return !/^\/?\.cleo\/?(\*)?$/.test(trimmed);
|
|
116
|
-
});
|
|
117
|
-
if (filtered.length === lines.length) {
|
|
118
|
-
return { removed: false };
|
|
119
|
-
}
|
|
120
|
-
await writeFile(rootGitignorePath, filtered.join('\n'));
|
|
121
|
-
return { removed: true };
|
|
122
|
-
}
|
|
123
|
-
// generateProjectHash moved to src/core/nexus/hash.ts (canonical location)
|
|
124
|
-
export { generateProjectHash } from './nexus/hash.js';
|
|
125
|
-
/**
|
|
126
|
-
* Resolve the package root directory (where schemas/ and templates/ live).
|
|
127
|
-
* scaffold.ts lives in packages/core/src/, so 1 level up reaches the package root.
|
|
128
|
-
*/
|
|
129
|
-
export function getPackageRoot() {
|
|
130
|
-
const thisFile = fileURLToPath(import.meta.url);
|
|
131
|
-
return resolve(dirname(thisFile), '..');
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Load the gitignore template from the package's templates/ directory.
|
|
135
|
-
* Falls back to embedded content if file not found.
|
|
136
|
-
*/
|
|
137
|
-
export function getGitignoreContent() {
|
|
138
|
-
try {
|
|
139
|
-
const packageRoot = getPackageRoot();
|
|
140
|
-
const templatePath = join(packageRoot, 'templates', 'cleo-gitignore');
|
|
141
|
-
if (existsSync(templatePath)) {
|
|
142
|
-
return readFileSync(templatePath, 'utf-8');
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
catch {
|
|
146
|
-
// fallback
|
|
147
|
-
}
|
|
148
|
-
return CLEO_GITIGNORE_FALLBACK;
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Read CLEO version from package.json.
|
|
152
|
-
*/
|
|
153
|
-
export function getCleoVersion() {
|
|
154
|
-
try {
|
|
155
|
-
const pkgPath = join(getPackageRoot(), 'package.json');
|
|
156
|
-
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
157
|
-
return pkg.version ?? '0.0.0';
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
return '0.0.0';
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Create default config.json content.
|
|
165
|
-
*/
|
|
166
|
-
/**
|
|
167
|
-
* Detect whether projectRoot is the CLEO source repository itself.
|
|
168
|
-
* Verified by fingerprinting the expected source layout and package identity.
|
|
169
|
-
* Only the canonical CLEO repository matches all criteria (ADR-029).
|
|
170
|
-
*/
|
|
171
|
-
function isCleoContributorProject(projectRoot) {
|
|
172
|
-
const exists = (p) => existsSync(join(projectRoot, p));
|
|
173
|
-
// Must have all three canonical source directories
|
|
174
|
-
if (!exists('src/mcp') || !exists('src/dispatch') || !exists('src/core'))
|
|
175
|
-
return false;
|
|
176
|
-
// Must have package.json identifying as @cleocode/cleo
|
|
177
|
-
try {
|
|
178
|
-
const pkg = JSON.parse(readFileSync(join(projectRoot, 'package.json'), 'utf-8'));
|
|
179
|
-
return pkg.name === '@cleocode/cleo';
|
|
180
|
-
}
|
|
181
|
-
catch {
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
export function createDefaultConfig() {
|
|
186
|
-
return {
|
|
187
|
-
version: '2.10.0',
|
|
188
|
-
output: {
|
|
189
|
-
defaultFormat: 'json',
|
|
190
|
-
showColor: true,
|
|
191
|
-
showUnicode: true,
|
|
192
|
-
dateFormat: 'relative',
|
|
193
|
-
},
|
|
194
|
-
backup: {
|
|
195
|
-
maxOperationalBackups: 10,
|
|
196
|
-
maxSafetyBackups: 5,
|
|
197
|
-
},
|
|
198
|
-
hierarchy: {
|
|
199
|
-
maxDepth: 3,
|
|
200
|
-
maxSiblings: 0,
|
|
201
|
-
},
|
|
202
|
-
session: {
|
|
203
|
-
autoStart: false,
|
|
204
|
-
multiSession: false,
|
|
205
|
-
},
|
|
206
|
-
lifecycle: {
|
|
207
|
-
mode: 'strict',
|
|
208
|
-
},
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
// ── ensure* functions (idempotent) ───────────────────────────────────
|
|
212
|
-
/**
|
|
213
|
-
* Create .cleo/ directory and all required subdirectories.
|
|
214
|
-
* Idempotent: skips directories that already exist.
|
|
215
|
-
*/
|
|
216
|
-
export async function ensureCleoStructure(projectRoot) {
|
|
217
|
-
// Guard: reject global home as project root to prevent project-level
|
|
218
|
-
// subdirectories (adrs/, rcasd/, backups/, etc.) from polluting ~/.cleo/
|
|
219
|
-
const resolvedRoot = resolve(projectRoot);
|
|
220
|
-
if (resolvedRoot === resolve(getCleoHome())) {
|
|
221
|
-
return {
|
|
222
|
-
action: 'skipped',
|
|
223
|
-
path: join(resolvedRoot, '.cleo'),
|
|
224
|
-
details: 'Refused to scaffold project structure inside global CLEO home',
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
228
|
-
const alreadyExists = existsSync(cleoDir);
|
|
229
|
-
await mkdir(cleoDir, { recursive: true });
|
|
230
|
-
for (const subdir of REQUIRED_CLEO_SUBDIRS) {
|
|
231
|
-
await mkdir(join(cleoDir, subdir), { recursive: true });
|
|
232
|
-
}
|
|
233
|
-
return {
|
|
234
|
-
action: alreadyExists ? 'skipped' : 'created',
|
|
235
|
-
path: cleoDir,
|
|
236
|
-
details: alreadyExists
|
|
237
|
-
? 'Directory already existed, ensured subdirs'
|
|
238
|
-
: `Created .cleo/ with ${REQUIRED_CLEO_SUBDIRS.length} subdirectories`,
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Create or repair .cleo/.gitignore from template.
|
|
243
|
-
* Idempotent: skips if file already exists with correct content.
|
|
244
|
-
*/
|
|
245
|
-
export async function ensureGitignore(projectRoot) {
|
|
246
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
247
|
-
const gitignorePath = join(cleoDir, '.gitignore');
|
|
248
|
-
const templateContent = getGitignoreContent();
|
|
249
|
-
if (existsSync(gitignorePath)) {
|
|
250
|
-
const existing = readFileSync(gitignorePath, 'utf-8');
|
|
251
|
-
const normalize = (s) => s.trim().replace(/\r\n/g, '\n');
|
|
252
|
-
if (normalize(existing) === normalize(templateContent)) {
|
|
253
|
-
return { action: 'skipped', path: gitignorePath, details: 'Already matches template' };
|
|
254
|
-
}
|
|
255
|
-
await writeFile(gitignorePath, templateContent);
|
|
256
|
-
return { action: 'repaired', path: gitignorePath, details: 'Updated to match template' };
|
|
257
|
-
}
|
|
258
|
-
await writeFile(gitignorePath, templateContent);
|
|
259
|
-
return { action: 'created', path: gitignorePath };
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Create default config.json if missing.
|
|
263
|
-
* Idempotent: skips if file already exists.
|
|
264
|
-
*/
|
|
265
|
-
export async function ensureConfig(projectRoot, opts) {
|
|
266
|
-
const configPath = getConfigPath(projectRoot);
|
|
267
|
-
if (existsSync(configPath) && !opts?.force) {
|
|
268
|
-
// Backfill contributor block for existing configs that predate ADR-029
|
|
269
|
-
try {
|
|
270
|
-
const existing = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
271
|
-
if (!existing['contributor'] && isCleoContributorProject(projectRoot)) {
|
|
272
|
-
existing['contributor'] = {
|
|
273
|
-
isContributorProject: true,
|
|
274
|
-
devCli: 'cleo-dev',
|
|
275
|
-
verifiedAt: new Date().toISOString(),
|
|
276
|
-
};
|
|
277
|
-
await writeFile(configPath, JSON.stringify(existing, null, 2));
|
|
278
|
-
return {
|
|
279
|
-
action: 'repaired',
|
|
280
|
-
path: configPath,
|
|
281
|
-
details: 'Added contributor block (ADR-029)',
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
catch {
|
|
286
|
-
/* non-fatal */
|
|
287
|
-
}
|
|
288
|
-
return { action: 'skipped', path: configPath, details: 'Config already exists' };
|
|
289
|
-
}
|
|
290
|
-
const config = createDefaultConfig();
|
|
291
|
-
if (isCleoContributorProject(projectRoot)) {
|
|
292
|
-
config['contributor'] = {
|
|
293
|
-
isContributorProject: true,
|
|
294
|
-
devCli: 'cleo-dev',
|
|
295
|
-
verifiedAt: new Date().toISOString(),
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
await saveJson(configPath, config);
|
|
299
|
-
return {
|
|
300
|
-
action: existsSync(configPath) ? 'repaired' : 'created',
|
|
301
|
-
path: configPath,
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Create or refresh project-info.json.
|
|
306
|
-
* Idempotent: skips if file already exists (unless force).
|
|
307
|
-
*/
|
|
308
|
-
export async function ensureProjectInfo(projectRoot, opts) {
|
|
309
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
310
|
-
const projectInfoPath = join(cleoDir, 'project-info.json');
|
|
311
|
-
// Backfill projectId on existing files that lack it (T5333)
|
|
312
|
-
if (existsSync(projectInfoPath) && !opts?.force) {
|
|
313
|
-
try {
|
|
314
|
-
const existing = JSON.parse(readFileSync(projectInfoPath, 'utf-8'));
|
|
315
|
-
if (typeof existing.projectId !== 'string' || existing.projectId.length === 0) {
|
|
316
|
-
existing.projectId = randomUUID();
|
|
317
|
-
existing.lastUpdated = new Date().toISOString();
|
|
318
|
-
await writeFile(projectInfoPath, JSON.stringify(existing, null, 2));
|
|
319
|
-
return { action: 'repaired', path: projectInfoPath, details: 'Added projectId' };
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
catch {
|
|
323
|
-
// If parse fails, fall through to regenerate
|
|
324
|
-
}
|
|
325
|
-
return { action: 'skipped', path: projectInfoPath, details: 'Already exists' };
|
|
326
|
-
}
|
|
327
|
-
const projectHash = generateProjectHash(projectRoot);
|
|
328
|
-
const cleoVersion = getCleoVersion();
|
|
329
|
-
const now = new Date().toISOString();
|
|
330
|
-
const { readSchemaVersionFromFile } = await import('./validation/schema-integrity.js');
|
|
331
|
-
const { SQLITE_SCHEMA_VERSION } = await import('./store/sqlite.js');
|
|
332
|
-
const configSchemaVersion = readSchemaVersionFromFile('config.schema.json') ?? cleoVersion;
|
|
333
|
-
const projectContextSchemaVersion = readSchemaVersionFromFile('project-context.schema.json') ?? '1.0.0';
|
|
334
|
-
const projectInfo = {
|
|
335
|
-
$schema: './schemas/project-info.schema.json',
|
|
336
|
-
schemaVersion: '1.0.0',
|
|
337
|
-
projectId: randomUUID(),
|
|
338
|
-
projectHash,
|
|
339
|
-
cleoVersion,
|
|
340
|
-
lastUpdated: now,
|
|
341
|
-
schemas: {
|
|
342
|
-
config: configSchemaVersion,
|
|
343
|
-
sqlite: SQLITE_SCHEMA_VERSION,
|
|
344
|
-
projectContext: projectContextSchemaVersion,
|
|
345
|
-
},
|
|
346
|
-
injection: {
|
|
347
|
-
'CLAUDE.md': null,
|
|
348
|
-
'AGENTS.md': null,
|
|
349
|
-
'GEMINI.md': null,
|
|
350
|
-
},
|
|
351
|
-
health: {
|
|
352
|
-
status: 'unknown',
|
|
353
|
-
lastCheck: null,
|
|
354
|
-
issues: [],
|
|
355
|
-
},
|
|
356
|
-
features: {
|
|
357
|
-
multiSession: false,
|
|
358
|
-
verification: false,
|
|
359
|
-
contextAlerts: false,
|
|
360
|
-
},
|
|
361
|
-
};
|
|
362
|
-
await writeFile(projectInfoPath, JSON.stringify(projectInfo, null, 2));
|
|
363
|
-
return { action: 'created', path: projectInfoPath };
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Ensure .mcp.json contains a cleo-dev server entry pointing to the local build.
|
|
367
|
-
* Only runs when isCleoContributorProject() is true (ADR-029).
|
|
368
|
-
*
|
|
369
|
-
* Writes the server entry:
|
|
370
|
-
* cleo-dev → node <projectRoot>/dist/mcp/index.js
|
|
371
|
-
*
|
|
372
|
-
* This ensures Claude Code loads the LOCAL dev build MCP server for this project,
|
|
373
|
-
* not the published @cleocode/cleo@latest. Idempotent: preserves other entries.
|
|
374
|
-
*/
|
|
375
|
-
export async function ensureContributorMcp(projectRoot) {
|
|
376
|
-
if (!isCleoContributorProject(projectRoot)) {
|
|
377
|
-
return {
|
|
378
|
-
action: 'skipped',
|
|
379
|
-
path: join(projectRoot, '.mcp.json'),
|
|
380
|
-
details: 'Not a contributor project',
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
const mcpJsonPath = join(projectRoot, '.mcp.json');
|
|
384
|
-
const mcpEntry = {
|
|
385
|
-
command: 'node',
|
|
386
|
-
args: ['--disable-warning=ExperimentalWarning', join(projectRoot, 'dist', 'mcp', 'index.js')],
|
|
387
|
-
env: {},
|
|
388
|
-
};
|
|
389
|
-
let config = { mcpServers: {} };
|
|
390
|
-
if (existsSync(mcpJsonPath)) {
|
|
391
|
-
try {
|
|
392
|
-
config = JSON.parse(readFileSync(mcpJsonPath, 'utf-8'));
|
|
393
|
-
}
|
|
394
|
-
catch {
|
|
395
|
-
/* start fresh */
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
const servers = (config['mcpServers'] ?? {});
|
|
399
|
-
const existing = servers['cleo-dev'];
|
|
400
|
-
// Skip if already pointing to the same dist path
|
|
401
|
-
const existingArgs = existing?.['args'];
|
|
402
|
-
const targetArg = join(projectRoot, 'dist', 'mcp', 'index.js');
|
|
403
|
-
if (existing && existingArgs?.includes(targetArg)) {
|
|
404
|
-
return { action: 'skipped', path: mcpJsonPath, details: 'cleo-dev MCP entry already current' };
|
|
405
|
-
}
|
|
406
|
-
servers['cleo-dev'] = mcpEntry;
|
|
407
|
-
// Remove production 'cleo' entry from project-level config — production cleo
|
|
408
|
-
// is global-only. Project-level .mcp.json for contributor projects should
|
|
409
|
-
// only contain cleo-dev (ADR-016 §2.3, ADR-029).
|
|
410
|
-
const removedProduction = 'cleo' in servers;
|
|
411
|
-
delete servers['cleo'];
|
|
412
|
-
config['mcpServers'] = servers;
|
|
413
|
-
await writeFile(mcpJsonPath, JSON.stringify(config, null, 2));
|
|
414
|
-
const details = [
|
|
415
|
-
`cleo-dev → node ${targetArg}`,
|
|
416
|
-
...(removedProduction ? ['removed production cleo entry (global-only per ADR-029)'] : []),
|
|
417
|
-
].join('; ');
|
|
418
|
-
return {
|
|
419
|
-
action: existing ? 'repaired' : 'created',
|
|
420
|
-
path: mcpJsonPath,
|
|
421
|
-
details,
|
|
422
|
-
};
|
|
423
|
-
}
|
|
424
|
-
/**
|
|
425
|
-
* Detect and write project-context.json.
|
|
426
|
-
* Idempotent: skips if file exists and is less than staleDays old (default: 30).
|
|
427
|
-
*/
|
|
428
|
-
export async function ensureProjectContext(projectRoot, opts) {
|
|
429
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
430
|
-
const contextPath = join(cleoDir, 'project-context.json');
|
|
431
|
-
const staleDays = opts?.staleDays ?? 30;
|
|
432
|
-
if (existsSync(contextPath) && !opts?.force) {
|
|
433
|
-
try {
|
|
434
|
-
const content = JSON.parse(readFileSync(contextPath, 'utf-8'));
|
|
435
|
-
if (content.detectedAt) {
|
|
436
|
-
const detectedAt = new Date(content.detectedAt);
|
|
437
|
-
const ageMs = Date.now() - detectedAt.getTime();
|
|
438
|
-
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
439
|
-
if (ageDays < staleDays) {
|
|
440
|
-
return {
|
|
441
|
-
action: 'skipped',
|
|
442
|
-
path: contextPath,
|
|
443
|
-
details: `Fresh (${Math.floor(ageDays)}d old)`,
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
catch {
|
|
449
|
-
// If we can't parse it, regenerate
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
const { detectProjectType } = await import('./store/project-detect.js');
|
|
453
|
-
const context = detectProjectType(projectRoot);
|
|
454
|
-
// Validate against schema before writing (best-effort, never blocks write)
|
|
455
|
-
try {
|
|
456
|
-
const schemaPath = join(dirname(fileURLToPath(import.meta.url)), '../schemas/project-context.schema.json');
|
|
457
|
-
if (existsSync(schemaPath)) {
|
|
458
|
-
const AjvModule = await import('ajv');
|
|
459
|
-
const ajvMod = AjvModule;
|
|
460
|
-
const AjvClass = (typeof ajvMod.default === 'function' ? ajvMod.default : AjvModule.default);
|
|
461
|
-
const schema = JSON.parse(readFileSync(schemaPath, 'utf-8'));
|
|
462
|
-
const ajv = new AjvClass({ strict: false });
|
|
463
|
-
const valid = ajv.validate(schema, context);
|
|
464
|
-
if (!valid) {
|
|
465
|
-
// eslint-disable-next-line no-console
|
|
466
|
-
console.warn('[CLEO] project-context.json schema validation warnings:', ajv.errors);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
catch {
|
|
471
|
-
// Schema validation is best-effort — never block the write
|
|
472
|
-
}
|
|
473
|
-
await writeFile(contextPath, JSON.stringify(context, null, 2));
|
|
474
|
-
return {
|
|
475
|
-
action: existsSync(contextPath) ? 'repaired' : 'created',
|
|
476
|
-
path: contextPath,
|
|
477
|
-
};
|
|
478
|
-
}
|
|
479
|
-
/**
|
|
480
|
-
* Initialize isolated .cleo/.git checkpoint repository.
|
|
481
|
-
* Idempotent: skips if .cleo/.git already exists.
|
|
482
|
-
*/
|
|
483
|
-
export async function ensureCleoGitRepo(projectRoot) {
|
|
484
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
485
|
-
const cleoGitDir = join(cleoDir, '.git');
|
|
486
|
-
if (existsSync(cleoGitDir)) {
|
|
487
|
-
return { action: 'skipped', path: cleoGitDir, details: 'Already initialized' };
|
|
488
|
-
}
|
|
489
|
-
const gitEnv = {
|
|
490
|
-
...process.env,
|
|
491
|
-
GIT_DIR: cleoGitDir,
|
|
492
|
-
GIT_WORK_TREE: cleoDir,
|
|
493
|
-
};
|
|
494
|
-
await execFileAsync('git', ['init', '--quiet'], { cwd: cleoDir, env: gitEnv });
|
|
495
|
-
await execFileAsync('git', ['config', 'user.email', 'cleo@local'], { cwd: cleoDir, env: gitEnv });
|
|
496
|
-
await execFileAsync('git', ['config', 'user.name', 'CLEO'], { cwd: cleoDir, env: gitEnv });
|
|
497
|
-
return { action: 'created', path: cleoGitDir, details: 'Isolated checkpoint repository' };
|
|
498
|
-
}
|
|
499
|
-
/**
|
|
500
|
-
* Create SQLite database if missing.
|
|
501
|
-
* Idempotent: skips if tasks.db already exists.
|
|
502
|
-
*/
|
|
503
|
-
export async function ensureSqliteDb(projectRoot) {
|
|
504
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
505
|
-
const dbPath = join(cleoDir, 'tasks.db');
|
|
506
|
-
if (existsSync(dbPath)) {
|
|
507
|
-
return { action: 'skipped', path: dbPath, details: 'tasks.db already exists' };
|
|
508
|
-
}
|
|
509
|
-
try {
|
|
510
|
-
const { getDb } = await import('./store/sqlite.js');
|
|
511
|
-
await getDb(projectRoot);
|
|
512
|
-
return { action: 'created', path: dbPath, details: 'SQLite database initialized' };
|
|
513
|
-
}
|
|
514
|
-
catch (err) {
|
|
515
|
-
return {
|
|
516
|
-
action: 'skipped',
|
|
517
|
-
path: dbPath,
|
|
518
|
-
details: `Failed to initialize SQLite: ${err instanceof Error ? err.message : String(err)}`,
|
|
519
|
-
};
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
// ── check* functions (read-only) ─────────────────────────────────────
|
|
523
|
-
/**
|
|
524
|
-
* Verify all required .cleo/ subdirectories exist.
|
|
525
|
-
*/
|
|
526
|
-
export function checkCleoStructure(projectRoot) {
|
|
527
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
528
|
-
const missing = [];
|
|
529
|
-
if (!existsSync(cleoDir)) {
|
|
530
|
-
return {
|
|
531
|
-
id: 'cleo_structure',
|
|
532
|
-
category: 'scaffold',
|
|
533
|
-
status: 'failed',
|
|
534
|
-
message: '.cleo/ directory does not exist',
|
|
535
|
-
details: { path: cleoDir, exists: false },
|
|
536
|
-
fix: 'cleo init',
|
|
537
|
-
};
|
|
538
|
-
}
|
|
539
|
-
for (const subdir of REQUIRED_CLEO_SUBDIRS) {
|
|
540
|
-
if (!existsSync(join(cleoDir, subdir))) {
|
|
541
|
-
missing.push(subdir);
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
if (missing.length > 0) {
|
|
545
|
-
return {
|
|
546
|
-
id: 'cleo_structure',
|
|
547
|
-
category: 'scaffold',
|
|
548
|
-
status: 'warning',
|
|
549
|
-
message: `Missing subdirectories: ${missing.join(', ')}`,
|
|
550
|
-
details: { path: cleoDir, missing },
|
|
551
|
-
fix: 'cleo init',
|
|
552
|
-
};
|
|
553
|
-
}
|
|
554
|
-
return {
|
|
555
|
-
id: 'cleo_structure',
|
|
556
|
-
category: 'scaffold',
|
|
557
|
-
status: 'passed',
|
|
558
|
-
message: 'All required .cleo/ subdirectories exist',
|
|
559
|
-
details: { path: cleoDir, subdirs: [...REQUIRED_CLEO_SUBDIRS] },
|
|
560
|
-
fix: null,
|
|
561
|
-
};
|
|
562
|
-
}
|
|
563
|
-
/**
|
|
564
|
-
* Verify .cleo/.gitignore exists and matches template.
|
|
565
|
-
*/
|
|
566
|
-
export function checkGitignore(projectRoot) {
|
|
567
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
568
|
-
const gitignorePath = join(cleoDir, '.gitignore');
|
|
569
|
-
if (!existsSync(gitignorePath)) {
|
|
570
|
-
return {
|
|
571
|
-
id: 'cleo_gitignore',
|
|
572
|
-
category: 'scaffold',
|
|
573
|
-
status: 'warning',
|
|
574
|
-
message: '.cleo/.gitignore not found',
|
|
575
|
-
details: { path: gitignorePath, exists: false },
|
|
576
|
-
fix: 'cleo init --force',
|
|
577
|
-
};
|
|
578
|
-
}
|
|
579
|
-
const installed = readFileSync(gitignorePath, 'utf-8');
|
|
580
|
-
const template = getGitignoreContent();
|
|
581
|
-
const normalize = (s) => s.trim().replace(/\r\n/g, '\n');
|
|
582
|
-
const matches = normalize(installed) === normalize(template);
|
|
583
|
-
return {
|
|
584
|
-
id: 'cleo_gitignore',
|
|
585
|
-
category: 'scaffold',
|
|
586
|
-
status: matches ? 'passed' : 'warning',
|
|
587
|
-
message: matches
|
|
588
|
-
? '.cleo/.gitignore matches template'
|
|
589
|
-
: '.cleo/.gitignore has drifted from template',
|
|
590
|
-
details: { path: gitignorePath, matchesTemplate: matches },
|
|
591
|
-
fix: matches ? null : 'cleo upgrade',
|
|
592
|
-
};
|
|
593
|
-
}
|
|
594
|
-
/**
|
|
595
|
-
* Verify config.json exists and is valid JSON.
|
|
596
|
-
*/
|
|
597
|
-
export function checkConfig(projectRoot) {
|
|
598
|
-
const configPath = getConfigPath(projectRoot);
|
|
599
|
-
if (!existsSync(configPath)) {
|
|
600
|
-
return {
|
|
601
|
-
id: 'cleo_config',
|
|
602
|
-
category: 'scaffold',
|
|
603
|
-
status: 'failed',
|
|
604
|
-
message: 'config.json not found',
|
|
605
|
-
details: { path: configPath, exists: false },
|
|
606
|
-
fix: 'cleo init',
|
|
607
|
-
};
|
|
608
|
-
}
|
|
609
|
-
try {
|
|
610
|
-
JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
611
|
-
}
|
|
612
|
-
catch (err) {
|
|
613
|
-
return {
|
|
614
|
-
id: 'cleo_config',
|
|
615
|
-
category: 'scaffold',
|
|
616
|
-
status: 'failed',
|
|
617
|
-
message: `config.json is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
618
|
-
details: { path: configPath, valid: false },
|
|
619
|
-
fix: 'cleo init --force',
|
|
620
|
-
};
|
|
621
|
-
}
|
|
622
|
-
return {
|
|
623
|
-
id: 'cleo_config',
|
|
624
|
-
category: 'scaffold',
|
|
625
|
-
status: 'passed',
|
|
626
|
-
message: 'config.json exists and is valid JSON',
|
|
627
|
-
details: { path: configPath, valid: true },
|
|
628
|
-
fix: null,
|
|
629
|
-
};
|
|
630
|
-
}
|
|
631
|
-
/**
|
|
632
|
-
* Verify project-info.json exists with required fields.
|
|
633
|
-
*/
|
|
634
|
-
export function checkProjectInfo(projectRoot) {
|
|
635
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
636
|
-
const infoPath = join(cleoDir, 'project-info.json');
|
|
637
|
-
if (!existsSync(infoPath)) {
|
|
638
|
-
return {
|
|
639
|
-
id: 'cleo_project_info',
|
|
640
|
-
category: 'scaffold',
|
|
641
|
-
status: 'warning',
|
|
642
|
-
message: 'project-info.json not found',
|
|
643
|
-
details: { path: infoPath, exists: false },
|
|
644
|
-
fix: 'cleo init',
|
|
645
|
-
};
|
|
646
|
-
}
|
|
647
|
-
try {
|
|
648
|
-
const content = JSON.parse(readFileSync(infoPath, 'utf-8'));
|
|
649
|
-
const requiredFields = ['projectHash', 'cleoVersion', 'lastUpdated'];
|
|
650
|
-
const missing = requiredFields.filter((f) => !(f in content));
|
|
651
|
-
if (missing.length > 0) {
|
|
652
|
-
return {
|
|
653
|
-
id: 'cleo_project_info',
|
|
654
|
-
category: 'scaffold',
|
|
655
|
-
status: 'warning',
|
|
656
|
-
message: `project-info.json missing fields: ${missing.join(', ')}`,
|
|
657
|
-
details: { path: infoPath, missingFields: missing },
|
|
658
|
-
fix: 'cleo init --force',
|
|
659
|
-
};
|
|
660
|
-
}
|
|
661
|
-
return {
|
|
662
|
-
id: 'cleo_project_info',
|
|
663
|
-
category: 'scaffold',
|
|
664
|
-
status: 'passed',
|
|
665
|
-
message: 'project-info.json exists with all required fields',
|
|
666
|
-
details: { path: infoPath, valid: true },
|
|
667
|
-
fix: null,
|
|
668
|
-
};
|
|
669
|
-
}
|
|
670
|
-
catch (err) {
|
|
671
|
-
return {
|
|
672
|
-
id: 'cleo_project_info',
|
|
673
|
-
category: 'scaffold',
|
|
674
|
-
status: 'failed',
|
|
675
|
-
message: `project-info.json is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
676
|
-
details: { path: infoPath, valid: false },
|
|
677
|
-
fix: 'cleo init --force',
|
|
678
|
-
};
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
/**
|
|
682
|
-
* Verify project-context.json exists and is not stale (default: 30 days).
|
|
683
|
-
*/
|
|
684
|
-
export function checkProjectContext(projectRoot, staleDays = 30) {
|
|
685
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
686
|
-
const contextPath = join(cleoDir, 'project-context.json');
|
|
687
|
-
if (!existsSync(contextPath)) {
|
|
688
|
-
return {
|
|
689
|
-
id: 'cleo_project_context',
|
|
690
|
-
category: 'scaffold',
|
|
691
|
-
status: 'warning',
|
|
692
|
-
message: 'project-context.json not found',
|
|
693
|
-
details: { path: contextPath, exists: false },
|
|
694
|
-
fix: 'cleo init --detect',
|
|
695
|
-
};
|
|
696
|
-
}
|
|
697
|
-
try {
|
|
698
|
-
const content = JSON.parse(readFileSync(contextPath, 'utf-8'));
|
|
699
|
-
if (!content.detectedAt) {
|
|
700
|
-
return {
|
|
701
|
-
id: 'cleo_project_context',
|
|
702
|
-
category: 'scaffold',
|
|
703
|
-
status: 'warning',
|
|
704
|
-
message: 'project-context.json missing detectedAt timestamp',
|
|
705
|
-
details: { path: contextPath, hasTimestamp: false },
|
|
706
|
-
fix: 'cleo init --detect',
|
|
707
|
-
};
|
|
708
|
-
}
|
|
709
|
-
const detectedAt = new Date(content.detectedAt);
|
|
710
|
-
const ageMs = Date.now() - detectedAt.getTime();
|
|
711
|
-
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
712
|
-
if (ageDays > staleDays) {
|
|
713
|
-
return {
|
|
714
|
-
id: 'cleo_project_context',
|
|
715
|
-
category: 'scaffold',
|
|
716
|
-
status: 'warning',
|
|
717
|
-
message: `project-context.json is stale (${Math.floor(ageDays)} days old, threshold: ${staleDays})`,
|
|
718
|
-
details: { path: contextPath, ageDays: Math.floor(ageDays), staleDays },
|
|
719
|
-
fix: 'cleo init --detect',
|
|
720
|
-
};
|
|
721
|
-
}
|
|
722
|
-
return {
|
|
723
|
-
id: 'cleo_project_context',
|
|
724
|
-
category: 'scaffold',
|
|
725
|
-
status: 'passed',
|
|
726
|
-
message: `project-context.json is fresh (${Math.floor(ageDays)} days old)`,
|
|
727
|
-
details: { path: contextPath, ageDays: Math.floor(ageDays), staleDays },
|
|
728
|
-
fix: null,
|
|
729
|
-
};
|
|
730
|
-
}
|
|
731
|
-
catch (err) {
|
|
732
|
-
return {
|
|
733
|
-
id: 'cleo_project_context',
|
|
734
|
-
category: 'scaffold',
|
|
735
|
-
status: 'failed',
|
|
736
|
-
message: `project-context.json is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
737
|
-
details: { path: contextPath, valid: false },
|
|
738
|
-
fix: 'cleo init --detect',
|
|
739
|
-
};
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
/**
|
|
743
|
-
* Verify .cleo/.git checkpoint repository exists.
|
|
744
|
-
*/
|
|
745
|
-
export function checkCleoGitRepo(projectRoot) {
|
|
746
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
747
|
-
const cleoGitDir = join(cleoDir, '.git');
|
|
748
|
-
if (!existsSync(cleoGitDir)) {
|
|
749
|
-
return {
|
|
750
|
-
id: 'cleo_git_repo',
|
|
751
|
-
category: 'scaffold',
|
|
752
|
-
status: 'warning',
|
|
753
|
-
message: '.cleo/.git checkpoint repository not found',
|
|
754
|
-
details: { path: cleoGitDir, exists: false },
|
|
755
|
-
fix: 'cleo init',
|
|
756
|
-
};
|
|
757
|
-
}
|
|
758
|
-
return {
|
|
759
|
-
id: 'cleo_git_repo',
|
|
760
|
-
category: 'scaffold',
|
|
761
|
-
status: 'passed',
|
|
762
|
-
message: '.cleo/.git checkpoint repository exists',
|
|
763
|
-
details: { path: cleoGitDir, exists: true },
|
|
764
|
-
fix: null,
|
|
765
|
-
};
|
|
766
|
-
}
|
|
767
|
-
/**
|
|
768
|
-
* Verify .cleo/tasks.db exists and is non-empty.
|
|
769
|
-
*/
|
|
770
|
-
export function checkSqliteDb(projectRoot) {
|
|
771
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
772
|
-
const dbPath = join(cleoDir, 'tasks.db');
|
|
773
|
-
if (!existsSync(dbPath)) {
|
|
774
|
-
return {
|
|
775
|
-
id: 'sqlite_db',
|
|
776
|
-
category: 'scaffold',
|
|
777
|
-
status: 'failed',
|
|
778
|
-
message: 'tasks.db not found',
|
|
779
|
-
details: { path: dbPath, exists: false },
|
|
780
|
-
fix: 'cleo init',
|
|
781
|
-
};
|
|
782
|
-
}
|
|
783
|
-
const stat = statSync(dbPath);
|
|
784
|
-
if (stat.size === 0) {
|
|
785
|
-
return {
|
|
786
|
-
id: 'sqlite_db',
|
|
787
|
-
category: 'scaffold',
|
|
788
|
-
status: 'warning',
|
|
789
|
-
message: 'tasks.db exists but is empty (0 bytes)',
|
|
790
|
-
details: { path: dbPath, exists: true, size: 0 },
|
|
791
|
-
fix: 'cleo upgrade',
|
|
792
|
-
};
|
|
793
|
-
}
|
|
794
|
-
return {
|
|
795
|
-
id: 'sqlite_db',
|
|
796
|
-
category: 'scaffold',
|
|
797
|
-
status: 'passed',
|
|
798
|
-
message: `tasks.db exists (${stat.size} bytes)`,
|
|
799
|
-
details: { path: dbPath, exists: true, size: stat.size },
|
|
800
|
-
fix: null,
|
|
801
|
-
};
|
|
802
|
-
}
|
|
803
|
-
/**
|
|
804
|
-
* Create brain.db if missing.
|
|
805
|
-
* Idempotent: skips if brain.db already exists.
|
|
806
|
-
*/
|
|
807
|
-
export async function ensureBrainDb(projectRoot) {
|
|
808
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
809
|
-
const dbPath = join(cleoDir, 'brain.db');
|
|
810
|
-
if (existsSync(dbPath)) {
|
|
811
|
-
// Ensure FTS5 tables exist even for pre-existing brain.db (T5698)
|
|
812
|
-
try {
|
|
813
|
-
const { getBrainNativeDb } = await import('./store/brain-sqlite.js');
|
|
814
|
-
const nativeDb = getBrainNativeDb();
|
|
815
|
-
if (nativeDb) {
|
|
816
|
-
const { ensureFts5Tables } = await import('./memory/brain-search.js');
|
|
817
|
-
ensureFts5Tables(nativeDb);
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
catch {
|
|
821
|
-
// Non-fatal — FTS5 may not be available
|
|
822
|
-
}
|
|
823
|
-
return { action: 'skipped', path: dbPath, details: 'brain.db already exists' };
|
|
824
|
-
}
|
|
825
|
-
try {
|
|
826
|
-
const { getBrainDb, getBrainNativeDb } = await import('./store/brain-sqlite.js');
|
|
827
|
-
await getBrainDb(projectRoot);
|
|
828
|
-
// Create FTS5 virtual tables eagerly so search works immediately (T5698)
|
|
829
|
-
try {
|
|
830
|
-
const nativeDb = getBrainNativeDb();
|
|
831
|
-
if (nativeDb) {
|
|
832
|
-
const { ensureFts5Tables } = await import('./memory/brain-search.js');
|
|
833
|
-
ensureFts5Tables(nativeDb);
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
catch {
|
|
837
|
-
// FTS5 may not be available in all SQLite builds — non-fatal
|
|
838
|
-
}
|
|
839
|
-
return { action: 'created', path: dbPath, details: 'Brain database initialized with FTS5' };
|
|
840
|
-
}
|
|
841
|
-
catch (err) {
|
|
842
|
-
return {
|
|
843
|
-
action: 'skipped',
|
|
844
|
-
path: dbPath,
|
|
845
|
-
details: `Failed to initialize brain.db: ${err instanceof Error ? err.message : String(err)}`,
|
|
846
|
-
};
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
/**
|
|
850
|
-
* Verify .cleo/brain.db exists and is non-empty.
|
|
851
|
-
*/
|
|
852
|
-
export function checkBrainDb(projectRoot) {
|
|
853
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
854
|
-
const dbPath = join(cleoDir, 'brain.db');
|
|
855
|
-
if (!existsSync(dbPath)) {
|
|
856
|
-
return {
|
|
857
|
-
id: 'brain_db',
|
|
858
|
-
category: 'scaffold',
|
|
859
|
-
status: 'failed',
|
|
860
|
-
message: 'brain.db not found',
|
|
861
|
-
details: { path: dbPath, exists: false },
|
|
862
|
-
fix: 'cleo init',
|
|
863
|
-
};
|
|
864
|
-
}
|
|
865
|
-
const stat = statSync(dbPath);
|
|
866
|
-
if (stat.size === 0) {
|
|
867
|
-
return {
|
|
868
|
-
id: 'brain_db',
|
|
869
|
-
category: 'scaffold',
|
|
870
|
-
status: 'warning',
|
|
871
|
-
message: 'brain.db exists but is empty (0 bytes)',
|
|
872
|
-
details: { path: dbPath, exists: true, size: 0 },
|
|
873
|
-
fix: 'cleo upgrade',
|
|
874
|
-
};
|
|
875
|
-
}
|
|
876
|
-
return {
|
|
877
|
-
id: 'brain_db',
|
|
878
|
-
category: 'scaffold',
|
|
879
|
-
status: 'passed',
|
|
880
|
-
message: `brain.db exists (${stat.size} bytes)`,
|
|
881
|
-
details: { path: dbPath, exists: true, size: stat.size },
|
|
882
|
-
fix: null,
|
|
883
|
-
};
|
|
884
|
-
}
|
|
885
|
-
/**
|
|
886
|
-
* Verify .cleo/memory-bridge.md exists.
|
|
887
|
-
* Warning level if missing (not failure) — it is auto-generated.
|
|
888
|
-
*/
|
|
889
|
-
export function checkMemoryBridge(projectRoot) {
|
|
890
|
-
const cleoDir = getCleoDirAbsolute(projectRoot);
|
|
891
|
-
const bridgePath = join(cleoDir, 'memory-bridge.md');
|
|
892
|
-
if (!existsSync(bridgePath)) {
|
|
893
|
-
return {
|
|
894
|
-
id: 'memory_bridge',
|
|
895
|
-
category: 'scaffold',
|
|
896
|
-
status: 'warning',
|
|
897
|
-
message: 'memory-bridge.md not found',
|
|
898
|
-
details: { path: bridgePath, exists: false },
|
|
899
|
-
fix: 'cleo init or cleo refresh-memory',
|
|
900
|
-
};
|
|
901
|
-
}
|
|
902
|
-
return {
|
|
903
|
-
id: 'memory_bridge',
|
|
904
|
-
category: 'scaffold',
|
|
905
|
-
status: 'passed',
|
|
906
|
-
message: 'memory-bridge.md exists',
|
|
907
|
-
details: { path: bridgePath, exists: true },
|
|
908
|
-
fix: null,
|
|
909
|
-
};
|
|
910
|
-
}
|
|
911
|
-
// ── Global (~/.cleo) scaffold functions ──────────────────────────────
|
|
912
|
-
/**
|
|
913
|
-
* Required subdirectories under the global ~/.cleo/ home.
|
|
914
|
-
* These are infrastructure directories managed by CLEO itself,
|
|
915
|
-
* not project-specific data.
|
|
916
|
-
*
|
|
917
|
-
* Truly global:
|
|
918
|
-
* - logs — global log output
|
|
919
|
-
* - templates — CLEO-INJECTION.md symlink target
|
|
920
|
-
*
|
|
921
|
-
* Note: nexus.db lives directly in ~/.cleo/, not a subdir.
|
|
922
|
-
* Schemas are read at runtime from getPackageRoot()/schemas/ — no copy needed.
|
|
923
|
-
* Project-level dirs (adrs/, rcasd/, agent-outputs/, backups/) live in .cleo/ only.
|
|
924
|
-
*/
|
|
925
|
-
export const REQUIRED_GLOBAL_SUBDIRS = ['logs', 'templates'];
|
|
926
|
-
/**
|
|
927
|
-
* Stale entries that must NOT exist at the global ~/.cleo/ level.
|
|
928
|
-
* These were project-level artefacts accidentally placed in the global home
|
|
929
|
-
* by old versions of CLEO. They are safe to remove because:
|
|
930
|
-
* - adrs/, rcasd/, agent-outputs/, backups/ — project-level, live in .cleo/
|
|
931
|
-
* - sandbox/ — unused
|
|
932
|
-
* - tasks.db / tasks.db-shm / tasks.db-wal — project-level database files
|
|
933
|
-
* - brain-worker.pid — stale PID file
|
|
934
|
-
* - VERSION — redundant (read from package.json)
|
|
935
|
-
* - schemas/ — now read from npm binary at runtime
|
|
936
|
-
* - bin/ — stale dev symlink directory
|
|
937
|
-
*/
|
|
938
|
-
export const STALE_GLOBAL_ENTRIES = [
|
|
939
|
-
'adrs',
|
|
940
|
-
'rcasd',
|
|
941
|
-
'agent-outputs',
|
|
942
|
-
'backups',
|
|
943
|
-
'sandbox',
|
|
944
|
-
'tasks.db',
|
|
945
|
-
'tasks.db-shm',
|
|
946
|
-
'tasks.db-wal',
|
|
947
|
-
'brain-worker.pid',
|
|
948
|
-
'VERSION',
|
|
949
|
-
'schemas',
|
|
950
|
-
'bin',
|
|
951
|
-
'.install-state',
|
|
952
|
-
'templates/templates',
|
|
953
|
-
];
|
|
954
|
-
/**
|
|
955
|
-
* Ensure the global ~/.cleo/ home directory and its required
|
|
956
|
-
* subdirectories exist. Idempotent: skips directories that already exist.
|
|
957
|
-
*
|
|
958
|
-
* Also removes known stale project-level entries that old CLEO versions
|
|
959
|
-
* incorrectly placed at the global level (see STALE_GLOBAL_ENTRIES).
|
|
960
|
-
*
|
|
961
|
-
* This is the SSoT for global home scaffolding, replacing raw mkdirSync
|
|
962
|
-
* calls that were previously scattered across global-bootstrap.ts.
|
|
963
|
-
*/
|
|
964
|
-
export async function ensureGlobalHome() {
|
|
965
|
-
const cleoHome = getCleoHome();
|
|
966
|
-
const alreadyExists = existsSync(cleoHome);
|
|
967
|
-
await mkdir(cleoHome, { recursive: true });
|
|
968
|
-
for (const subdir of REQUIRED_GLOBAL_SUBDIRS) {
|
|
969
|
-
await mkdir(join(cleoHome, subdir), { recursive: true });
|
|
970
|
-
}
|
|
971
|
-
// Create global config.json from template if it doesn't exist
|
|
972
|
-
const globalConfigPath = join(cleoHome, 'config.json');
|
|
973
|
-
if (!existsSync(globalConfigPath)) {
|
|
974
|
-
const templatePath = join(getPackageRoot(), 'templates', 'global-config.template.json');
|
|
975
|
-
if (existsSync(templatePath)) {
|
|
976
|
-
const template = readFileSync(templatePath, 'utf-8');
|
|
977
|
-
const resolved = template.replace('{{SCHEMA_VERSION_GLOBAL_CONFIG}}', '1.0.0');
|
|
978
|
-
await writeFile(globalConfigPath, resolved);
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
// Remove stale project-level entries from both the current global home
|
|
982
|
-
// AND the legacy ~/.cleo/ path (old CLEO versions used ~/.cleo/ before
|
|
983
|
-
// env-paths moved it to the XDG-compliant location).
|
|
984
|
-
const homedir = (await import('node:os')).homedir();
|
|
985
|
-
const legacyCleoHome = join(homedir, '.cleo');
|
|
986
|
-
const cleanupPaths = [cleoHome];
|
|
987
|
-
if (legacyCleoHome !== cleoHome && existsSync(legacyCleoHome)) {
|
|
988
|
-
cleanupPaths.push(legacyCleoHome);
|
|
989
|
-
}
|
|
990
|
-
for (const homeDir of cleanupPaths) {
|
|
991
|
-
for (const stale of STALE_GLOBAL_ENTRIES) {
|
|
992
|
-
const stalePath = join(homeDir, stale);
|
|
993
|
-
if (existsSync(stalePath)) {
|
|
994
|
-
try {
|
|
995
|
-
await rm(stalePath, { recursive: true, force: true });
|
|
996
|
-
// eslint-disable-next-line no-console
|
|
997
|
-
console.warn(`[CLEO] Removed stale global entry: ${stalePath}`);
|
|
998
|
-
}
|
|
999
|
-
catch (err) {
|
|
1000
|
-
// eslint-disable-next-line no-console
|
|
1001
|
-
console.warn(`[CLEO] Could not remove stale global entry ${stalePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
1002
|
-
}
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
}
|
|
1006
|
-
return {
|
|
1007
|
-
action: alreadyExists ? 'skipped' : 'created',
|
|
1008
|
-
path: cleoHome,
|
|
1009
|
-
details: alreadyExists
|
|
1010
|
-
? 'Global home already existed, ensured subdirs'
|
|
1011
|
-
: `Created ~/.cleo/ with ${REQUIRED_GLOBAL_SUBDIRS.length} subdirectories`,
|
|
1012
|
-
};
|
|
1013
|
-
}
|
|
1014
|
-
/**
|
|
1015
|
-
* Ensure the global CLEO injection template is installed.
|
|
1016
|
-
* Delegates to injection.ts for the template content, but owns the
|
|
1017
|
-
* filesystem write to maintain SSoT for scaffolding.
|
|
1018
|
-
*
|
|
1019
|
-
* Idempotent: skips if the template already exists with correct content.
|
|
1020
|
-
*/
|
|
1021
|
-
export async function ensureGlobalTemplates() {
|
|
1022
|
-
// Lazy import to avoid circular dependency (injection imports scaffold)
|
|
1023
|
-
const { getInjectionTemplateContent } = await import('./injection.js');
|
|
1024
|
-
const templatesDir = getCleoTemplatesDir();
|
|
1025
|
-
const injectionPath = join(templatesDir, 'CLEO-INJECTION.md');
|
|
1026
|
-
// Ensure directory exists (idempotent via ensureGlobalHome, but defensive)
|
|
1027
|
-
await mkdir(templatesDir, { recursive: true });
|
|
1028
|
-
const templateContent = getInjectionTemplateContent();
|
|
1029
|
-
if (!templateContent) {
|
|
1030
|
-
return {
|
|
1031
|
-
action: 'skipped',
|
|
1032
|
-
path: injectionPath,
|
|
1033
|
-
details: 'Bundled injection template not found; skipped',
|
|
1034
|
-
};
|
|
1035
|
-
}
|
|
1036
|
-
if (existsSync(injectionPath)) {
|
|
1037
|
-
const existing = readFileSync(injectionPath, 'utf-8');
|
|
1038
|
-
if (existing === templateContent) {
|
|
1039
|
-
return { action: 'skipped', path: injectionPath, details: 'Template already current' };
|
|
1040
|
-
}
|
|
1041
|
-
// Content differs — repair
|
|
1042
|
-
await writeFile(injectionPath, templateContent, 'utf-8');
|
|
1043
|
-
return {
|
|
1044
|
-
action: 'repaired',
|
|
1045
|
-
path: injectionPath,
|
|
1046
|
-
details: 'Updated injection template to match bundled version',
|
|
1047
|
-
};
|
|
1048
|
-
}
|
|
1049
|
-
await writeFile(injectionPath, templateContent, 'utf-8');
|
|
1050
|
-
return { action: 'created', path: injectionPath };
|
|
1051
|
-
}
|
|
1052
|
-
/**
|
|
1053
|
-
* Perform a complete global scaffold operation: ensure home and templates
|
|
1054
|
-
* are all present and current. This is the single entry point for global
|
|
1055
|
-
* infrastructure scaffolding.
|
|
1056
|
-
*
|
|
1057
|
-
* Schemas are NOT copied here — they are read at runtime from the npm
|
|
1058
|
-
* package path (getPackageRoot() + '/schemas/'). Use ensureGlobalSchemas()
|
|
1059
|
-
* explicitly from init or upgrade if a copy is needed for a specific workflow.
|
|
1060
|
-
*
|
|
1061
|
-
* Used by:
|
|
1062
|
-
* - MCP startup (via startupHealthCheck in health.ts)
|
|
1063
|
-
* - init (for first-time global setup)
|
|
1064
|
-
* - upgrade (for global repair)
|
|
1065
|
-
*/
|
|
1066
|
-
export async function ensureGlobalScaffold() {
|
|
1067
|
-
const home = await ensureGlobalHome();
|
|
1068
|
-
const templates = await ensureGlobalTemplates();
|
|
1069
|
-
return { home, templates };
|
|
1070
|
-
}
|
|
1071
|
-
// ── Global check* functions (read-only diagnostics) ──────────────────
|
|
1072
|
-
/**
|
|
1073
|
-
* Check that the global ~/.cleo/ home and its required subdirectories exist.
|
|
1074
|
-
* Read-only: no side effects.
|
|
1075
|
-
*/
|
|
1076
|
-
export function checkGlobalHome() {
|
|
1077
|
-
const cleoHome = getCleoHome();
|
|
1078
|
-
if (!existsSync(cleoHome)) {
|
|
1079
|
-
return {
|
|
1080
|
-
id: 'global_home',
|
|
1081
|
-
category: 'global',
|
|
1082
|
-
status: 'failed',
|
|
1083
|
-
message: 'Global ~/.cleo/ directory not found',
|
|
1084
|
-
details: { path: cleoHome, exists: false },
|
|
1085
|
-
fix: 'cleo init (or restart MCP server)',
|
|
1086
|
-
};
|
|
1087
|
-
}
|
|
1088
|
-
const missingDirs = REQUIRED_GLOBAL_SUBDIRS.filter((dir) => !existsSync(join(cleoHome, dir)));
|
|
1089
|
-
if (missingDirs.length > 0) {
|
|
1090
|
-
return {
|
|
1091
|
-
id: 'global_home',
|
|
1092
|
-
category: 'global',
|
|
1093
|
-
status: 'warning',
|
|
1094
|
-
message: `Global home exists but missing subdirs: ${missingDirs.join(', ')}`,
|
|
1095
|
-
details: { path: cleoHome, exists: true, missingDirs },
|
|
1096
|
-
fix: 'cleo upgrade --include-global',
|
|
1097
|
-
};
|
|
1098
|
-
}
|
|
1099
|
-
return {
|
|
1100
|
-
id: 'global_home',
|
|
1101
|
-
category: 'global',
|
|
1102
|
-
status: 'passed',
|
|
1103
|
-
message: 'Global ~/.cleo/ home and subdirectories present',
|
|
1104
|
-
details: { path: cleoHome, exists: true, subdirs: REQUIRED_GLOBAL_SUBDIRS.length },
|
|
1105
|
-
fix: null,
|
|
1106
|
-
};
|
|
1107
|
-
}
|
|
1108
|
-
/**
|
|
1109
|
-
* Check that the global injection template is present and current.
|
|
1110
|
-
* Read-only: no side effects.
|
|
1111
|
-
*/
|
|
1112
|
-
export function checkGlobalTemplates() {
|
|
1113
|
-
const templatesDir = getCleoTemplatesDir();
|
|
1114
|
-
const injectionPath = join(templatesDir, 'CLEO-INJECTION.md');
|
|
1115
|
-
if (!existsSync(injectionPath)) {
|
|
1116
|
-
return {
|
|
1117
|
-
id: 'global_templates',
|
|
1118
|
-
category: 'global',
|
|
1119
|
-
status: 'failed',
|
|
1120
|
-
message: 'CLEO-INJECTION.md template not found in global templates',
|
|
1121
|
-
details: { path: injectionPath, exists: false },
|
|
1122
|
-
fix: 'cleo init (or restart MCP server)',
|
|
1123
|
-
};
|
|
1124
|
-
}
|
|
1125
|
-
// Check version sync between XDG and legacy paths
|
|
1126
|
-
const xdgContent = readFileSync(injectionPath, 'utf-8');
|
|
1127
|
-
const xdgVersion = xdgContent.match(/^Version:\s*(.+)$/m)?.[1]?.trim();
|
|
1128
|
-
const home = getHomedir();
|
|
1129
|
-
const legacyPath = join(home, '.cleo', 'templates', 'CLEO-INJECTION.md');
|
|
1130
|
-
if (existsSync(legacyPath)) {
|
|
1131
|
-
const legacyContent = readFileSync(legacyPath, 'utf-8');
|
|
1132
|
-
const legacyVersion = legacyContent.match(/^Version:\s*(.+)$/m)?.[1]?.trim();
|
|
1133
|
-
if (legacyVersion && xdgVersion && legacyVersion !== xdgVersion) {
|
|
1134
|
-
return {
|
|
1135
|
-
id: 'global_templates',
|
|
1136
|
-
category: 'global',
|
|
1137
|
-
status: 'warning',
|
|
1138
|
-
message: `Legacy template version (${legacyVersion}) out of sync with XDG (${xdgVersion})`,
|
|
1139
|
-
details: { path: injectionPath, exists: true, xdgVersion, legacyVersion, legacyPath },
|
|
1140
|
-
fix: 'npm install -g @cleocode/cleo (reinstall syncs both paths)',
|
|
1141
|
-
};
|
|
1142
|
-
}
|
|
1143
|
-
}
|
|
1144
|
-
return {
|
|
1145
|
-
id: 'global_templates',
|
|
1146
|
-
category: 'global',
|
|
1147
|
-
status: 'passed',
|
|
1148
|
-
message: `Global injection template present (v${xdgVersion ?? 'unknown'})`,
|
|
1149
|
-
details: { path: injectionPath, exists: true, version: xdgVersion },
|
|
1150
|
-
fix: null,
|
|
1151
|
-
};
|
|
1152
|
-
}
|
|
1153
|
-
/**
|
|
1154
|
-
* Check that the project log directory exists.
|
|
1155
|
-
* Read-only: no side effects.
|
|
1156
|
-
*/
|
|
1157
|
-
export function checkLogDir(projectRoot) {
|
|
1158
|
-
const logDir = join(getCleoDirAbsolute(projectRoot), 'logs');
|
|
1159
|
-
if (!existsSync(logDir)) {
|
|
1160
|
-
return {
|
|
1161
|
-
id: 'log_dir',
|
|
1162
|
-
category: 'scaffold',
|
|
1163
|
-
status: 'warning',
|
|
1164
|
-
message: 'Log directory .cleo/logs/ not found',
|
|
1165
|
-
details: { path: logDir, exists: false },
|
|
1166
|
-
fix: 'cleo upgrade',
|
|
1167
|
-
};
|
|
1168
|
-
}
|
|
1169
|
-
return {
|
|
1170
|
-
id: 'log_dir',
|
|
1171
|
-
category: 'scaffold',
|
|
1172
|
-
status: 'passed',
|
|
1173
|
-
message: 'Log directory .cleo/logs/ present',
|
|
1174
|
-
details: { path: logDir, exists: true },
|
|
1175
|
-
fix: null,
|
|
1176
|
-
};
|
|
1177
|
-
}
|
|
1178
|
-
//# sourceMappingURL=scaffold.js.map
|