@cleocode/core 2026.3.65 → 2026.3.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/retry.d.ts.map +1 -1
- package/dist/cleo.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +128 -116
- package/dist/index.js.map +4 -4
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/enforcement.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/agents/retry.ts +18 -46
- package/src/cleo.ts +2 -2
- package/src/config.ts +13 -0
- package/src/index.ts +4 -1
- package/src/tasks/add.ts +5 -5
- package/src/tasks/complete.ts +14 -48
- package/src/tasks/enforcement.ts +12 -24
- 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 -229
- 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 -370
- 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/session-hooks.js +0 -73
- package/dist/hooks/handlers/session-hooks.js.map +0 -1
- package/dist/hooks/handlers/task-hooks.js +0 -63
- 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 -269
- 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 -143
- package/dist/memory/auto-extract.js.map +0 -1
- package/dist/memory/brain-embedding.js +0 -49
- 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-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 -474
- 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/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 -289
- 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 -226
- 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 -61
- 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 -318
- 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.js +0 -107
- package/dist/signaldock/claude-code-transport.js.map +0 -1
- package/dist/signaldock/factory.js +0 -25
- package/dist/signaldock/factory.js.map +0 -1
- package/dist/signaldock/index.js +0 -9
- package/dist/signaldock/index.js.map +0 -1
- package/dist/signaldock/signaldock-transport.js +0 -122
- package/dist/signaldock/signaldock-transport.js.map +0 -1
- package/dist/signaldock/transport.js +0 -11
- package/dist/signaldock/transport.js.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 -271
- 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-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 -554
- 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 -656
- 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 -235
- 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 -89
- 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 -901
- 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/dist/memory/index.js
DELETED
|
@@ -1,773 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Research commands and manifest operations.
|
|
3
|
-
* @task T4465
|
|
4
|
-
* @epic T4454
|
|
5
|
-
*/
|
|
6
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
7
|
-
import { join, resolve } from 'node:path';
|
|
8
|
-
import { ExitCode } from '@cleocode/contracts';
|
|
9
|
-
import { CleoError } from '../errors.js';
|
|
10
|
-
import { getBackupDir, getManifestPath as getCentralManifestPath, getCleoDirAbsolute, getManifestArchivePath, getProjectRoot, } from '../paths.js';
|
|
11
|
-
import { atomicWrite, safeReadFile } from '../store/atomic.js';
|
|
12
|
-
import { appendJsonl, readJson, saveJson } from '../store/json.js';
|
|
13
|
-
import { logOperation } from '../tasks/add.js';
|
|
14
|
-
/**
|
|
15
|
-
* Get the research file path.
|
|
16
|
-
* @task T4465
|
|
17
|
-
*/
|
|
18
|
-
function getResearchPath(cwd) {
|
|
19
|
-
return join(getCleoDirAbsolute(cwd), 'research.json');
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Get the manifest file path.
|
|
23
|
-
* @task T4465
|
|
24
|
-
*/
|
|
25
|
-
function getManifestPath(cwd) {
|
|
26
|
-
return getCentralManifestPath(cwd);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Read or initialize the research file.
|
|
30
|
-
* @task T4465
|
|
31
|
-
*/
|
|
32
|
-
async function readResearch(cwd) {
|
|
33
|
-
const path = getResearchPath(cwd);
|
|
34
|
-
const data = await readJson(path);
|
|
35
|
-
return data ?? { entries: [] };
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Add a research entry.
|
|
39
|
-
* @task T4465
|
|
40
|
-
*/
|
|
41
|
-
export async function addResearch(options, cwd, accessor) {
|
|
42
|
-
// Validate task exists
|
|
43
|
-
const task = await accessor.loadSingleTask(options.taskId);
|
|
44
|
-
if (!task) {
|
|
45
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Task not found: ${options.taskId}`);
|
|
46
|
-
}
|
|
47
|
-
if (!options.topic || options.topic.trim().length === 0) {
|
|
48
|
-
throw new CleoError(ExitCode.INVALID_INPUT, 'Research topic is required');
|
|
49
|
-
}
|
|
50
|
-
const research = await readResearch(cwd);
|
|
51
|
-
const now = new Date().toISOString();
|
|
52
|
-
const entry = {
|
|
53
|
-
id: `R${Date.now().toString(36)}`,
|
|
54
|
-
taskId: options.taskId,
|
|
55
|
-
topic: options.topic.trim(),
|
|
56
|
-
findings: options.findings ?? [],
|
|
57
|
-
sources: options.sources ?? [],
|
|
58
|
-
status: (options.findings?.length ?? 0) > 0 ? 'complete' : 'pending',
|
|
59
|
-
createdAt: now,
|
|
60
|
-
updatedAt: now,
|
|
61
|
-
};
|
|
62
|
-
research.entries.push(entry);
|
|
63
|
-
await saveJson(getResearchPath(cwd), research, { backupDir: getBackupDir(cwd) });
|
|
64
|
-
await logOperation('research_added', entry.id, {
|
|
65
|
-
taskId: options.taskId,
|
|
66
|
-
topic: options.topic,
|
|
67
|
-
}, accessor);
|
|
68
|
-
return entry;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Show a specific research entry.
|
|
72
|
-
* @task T4465
|
|
73
|
-
*/
|
|
74
|
-
export async function showResearch(researchId, cwd) {
|
|
75
|
-
const research = await readResearch(cwd);
|
|
76
|
-
const entry = research.entries.find((e) => e.id === researchId);
|
|
77
|
-
if (!entry) {
|
|
78
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Research entry not found: ${researchId}`);
|
|
79
|
-
}
|
|
80
|
-
return entry;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* List research entries with optional filtering.
|
|
84
|
-
* @task T4465
|
|
85
|
-
*/
|
|
86
|
-
export async function listResearch(options = {}, cwd) {
|
|
87
|
-
const research = await readResearch(cwd);
|
|
88
|
-
let entries = research.entries;
|
|
89
|
-
if (options.taskId) {
|
|
90
|
-
entries = entries.filter((e) => e.taskId === options.taskId);
|
|
91
|
-
}
|
|
92
|
-
if (options.status) {
|
|
93
|
-
entries = entries.filter((e) => e.status === options.status);
|
|
94
|
-
}
|
|
95
|
-
return entries;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* List pending research entries.
|
|
99
|
-
* @task T4465
|
|
100
|
-
*/
|
|
101
|
-
export async function pendingResearch(cwd) {
|
|
102
|
-
return listResearch({ status: 'pending' }, cwd);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Link a research entry to a task.
|
|
106
|
-
* @task T4465
|
|
107
|
-
*/
|
|
108
|
-
export async function linkResearch(researchId, taskId, cwd, accessor) {
|
|
109
|
-
const research = await readResearch(cwd);
|
|
110
|
-
const entry = research.entries.find((e) => e.id === researchId);
|
|
111
|
-
if (!entry) {
|
|
112
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Research entry not found: ${researchId}`);
|
|
113
|
-
}
|
|
114
|
-
// Validate task exists
|
|
115
|
-
const linkedTask = await accessor.loadSingleTask(taskId);
|
|
116
|
-
if (!linkedTask) {
|
|
117
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Task not found: ${taskId}`);
|
|
118
|
-
}
|
|
119
|
-
entry.taskId = taskId;
|
|
120
|
-
entry.updatedAt = new Date().toISOString();
|
|
121
|
-
await saveJson(getResearchPath(cwd), research, { backupDir: getBackupDir(cwd) });
|
|
122
|
-
return { researchId, taskId };
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Update research findings.
|
|
126
|
-
* @task T4465
|
|
127
|
-
*/
|
|
128
|
-
export async function updateResearch(researchId, updates, cwd) {
|
|
129
|
-
const research = await readResearch(cwd);
|
|
130
|
-
const entry = research.entries.find((e) => e.id === researchId);
|
|
131
|
-
if (!entry) {
|
|
132
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Research entry not found: ${researchId}`);
|
|
133
|
-
}
|
|
134
|
-
if (updates.findings)
|
|
135
|
-
entry.findings = updates.findings;
|
|
136
|
-
if (updates.sources)
|
|
137
|
-
entry.sources = updates.sources;
|
|
138
|
-
if (updates.status)
|
|
139
|
-
entry.status = updates.status;
|
|
140
|
-
entry.updatedAt = new Date().toISOString();
|
|
141
|
-
await saveJson(getResearchPath(cwd), research, { backupDir: getBackupDir(cwd) });
|
|
142
|
-
return entry;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Get research statistics.
|
|
146
|
-
* @task T4474
|
|
147
|
-
*/
|
|
148
|
-
export async function statsResearch(cwd) {
|
|
149
|
-
const research = await readResearch(cwd);
|
|
150
|
-
const byStatus = {};
|
|
151
|
-
const byTopic = {};
|
|
152
|
-
for (const entry of research.entries) {
|
|
153
|
-
byStatus[entry.status] = (byStatus[entry.status] || 0) + 1;
|
|
154
|
-
byTopic[entry.topic] = (byTopic[entry.topic] || 0) + 1;
|
|
155
|
-
}
|
|
156
|
-
return {
|
|
157
|
-
total: research.entries.length,
|
|
158
|
-
byStatus,
|
|
159
|
-
byTopic,
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Get research entries linked to a specific task.
|
|
164
|
-
* @task T4474
|
|
165
|
-
*/
|
|
166
|
-
export async function linksResearch(taskId, cwd) {
|
|
167
|
-
if (!taskId) {
|
|
168
|
-
throw new CleoError(ExitCode.INVALID_INPUT, 'Task ID is required');
|
|
169
|
-
}
|
|
170
|
-
const research = await readResearch(cwd);
|
|
171
|
-
return research.entries.filter((e) => e.taskId === taskId);
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Archive old research entries by status.
|
|
175
|
-
* Moves 'complete' entries older than a threshold to an archive,
|
|
176
|
-
* or returns summary of archivable entries.
|
|
177
|
-
* @task T4474
|
|
178
|
-
*/
|
|
179
|
-
export async function archiveResearch(cwd) {
|
|
180
|
-
const research = await readResearch(cwd);
|
|
181
|
-
const completed = research.entries.filter((e) => e.status === 'complete');
|
|
182
|
-
const remaining = research.entries.filter((e) => e.status !== 'complete');
|
|
183
|
-
// Write back only non-complete entries
|
|
184
|
-
await saveJson(getResearchPath(cwd), { entries: remaining }, { backupDir: getBackupDir(cwd) });
|
|
185
|
-
return {
|
|
186
|
-
action: 'archive',
|
|
187
|
-
entriesArchived: completed.length,
|
|
188
|
-
entriesRemaining: remaining.length,
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
// === MANIFEST OPERATIONS ===
|
|
192
|
-
/**
|
|
193
|
-
* Read manifest entries from MANIFEST.jsonl.
|
|
194
|
-
* @task T4465
|
|
195
|
-
*/
|
|
196
|
-
export async function readManifest(cwd) {
|
|
197
|
-
const manifestPath = getManifestPath(cwd);
|
|
198
|
-
const content = await safeReadFile(manifestPath);
|
|
199
|
-
if (!content)
|
|
200
|
-
return [];
|
|
201
|
-
const entries = [];
|
|
202
|
-
for (const line of content.split('\n')) {
|
|
203
|
-
const trimmed = line.trim();
|
|
204
|
-
if (!trimmed)
|
|
205
|
-
continue;
|
|
206
|
-
try {
|
|
207
|
-
entries.push(JSON.parse(trimmed));
|
|
208
|
-
}
|
|
209
|
-
catch {
|
|
210
|
-
// Skip malformed lines
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return entries;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Append a manifest entry.
|
|
217
|
-
* @task T4465
|
|
218
|
-
*/
|
|
219
|
-
export async function appendManifest(entry, cwd) {
|
|
220
|
-
const manifestPath = getManifestPath(cwd);
|
|
221
|
-
await appendJsonl(manifestPath, entry);
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Query manifest entries.
|
|
225
|
-
* @task T4465
|
|
226
|
-
*/
|
|
227
|
-
export async function queryManifest(options = {}, cwd) {
|
|
228
|
-
let entries = await readManifest(cwd);
|
|
229
|
-
if (options.status) {
|
|
230
|
-
entries = entries.filter((e) => e.status === options.status);
|
|
231
|
-
}
|
|
232
|
-
if (options.agentType) {
|
|
233
|
-
entries = entries.filter((e) => e.agent_type === options.agentType);
|
|
234
|
-
}
|
|
235
|
-
if (options.topic) {
|
|
236
|
-
entries = entries.filter((e) => e.topics.includes(options.topic));
|
|
237
|
-
}
|
|
238
|
-
if (options.taskId) {
|
|
239
|
-
entries = entries.filter((e) => e.linked_tasks.includes(options.taskId));
|
|
240
|
-
}
|
|
241
|
-
if (options.limit && options.limit > 0) {
|
|
242
|
-
entries = entries.slice(0, options.limit);
|
|
243
|
-
}
|
|
244
|
-
return entries;
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Read all manifest entries as extended entries.
|
|
248
|
-
* @task T4787
|
|
249
|
-
*/
|
|
250
|
-
export async function readExtendedManifest(cwd) {
|
|
251
|
-
const manifestPath = getManifestPath(cwd);
|
|
252
|
-
const content = await safeReadFile(manifestPath);
|
|
253
|
-
if (!content)
|
|
254
|
-
return [];
|
|
255
|
-
const entries = [];
|
|
256
|
-
for (const line of content.split('\n')) {
|
|
257
|
-
const trimmed = line.trim();
|
|
258
|
-
if (!trimmed)
|
|
259
|
-
continue;
|
|
260
|
-
try {
|
|
261
|
-
entries.push(JSON.parse(trimmed));
|
|
262
|
-
}
|
|
263
|
-
catch {
|
|
264
|
-
// Skip malformed lines
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
return entries;
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Filter manifest entries by criteria.
|
|
271
|
-
* @task T4787
|
|
272
|
-
*/
|
|
273
|
-
export function filterManifestEntries(entries, filter) {
|
|
274
|
-
let filtered = entries;
|
|
275
|
-
if (filter.taskId) {
|
|
276
|
-
const taskId = filter.taskId;
|
|
277
|
-
filtered = filtered.filter((e) => e.id.startsWith(taskId) || e.linked_tasks?.includes(taskId));
|
|
278
|
-
}
|
|
279
|
-
if (filter.status) {
|
|
280
|
-
filtered = filtered.filter((e) => e.status === filter.status);
|
|
281
|
-
}
|
|
282
|
-
if (filter.agent_type) {
|
|
283
|
-
filtered = filtered.filter((e) => e.agent_type === filter.agent_type);
|
|
284
|
-
}
|
|
285
|
-
if (filter.topic) {
|
|
286
|
-
filtered = filtered.filter((e) => e.topics.includes(filter.topic));
|
|
287
|
-
}
|
|
288
|
-
if (filter.actionable !== undefined) {
|
|
289
|
-
filtered = filtered.filter((e) => e.actionable === filter.actionable);
|
|
290
|
-
}
|
|
291
|
-
if (filter.dateAfter) {
|
|
292
|
-
filtered = filtered.filter((e) => e.date > filter.dateAfter);
|
|
293
|
-
}
|
|
294
|
-
if (filter.dateBefore) {
|
|
295
|
-
filtered = filtered.filter((e) => e.date < filter.dateBefore);
|
|
296
|
-
}
|
|
297
|
-
if (filter.offset && filter.offset > 0) {
|
|
298
|
-
filtered = filtered.slice(filter.offset);
|
|
299
|
-
}
|
|
300
|
-
if (filter.limit && filter.limit > 0) {
|
|
301
|
-
filtered = filtered.slice(0, filter.limit);
|
|
302
|
-
}
|
|
303
|
-
return filtered;
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Show a manifest entry by ID with optional file content.
|
|
307
|
-
* @task T4787
|
|
308
|
-
*/
|
|
309
|
-
export async function showManifestEntry(researchId, cwd) {
|
|
310
|
-
const entries = await readExtendedManifest(cwd);
|
|
311
|
-
const entry = entries.find((e) => e.id === researchId);
|
|
312
|
-
if (!entry) {
|
|
313
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Research entry '${researchId}' not found`);
|
|
314
|
-
}
|
|
315
|
-
const root = getProjectRoot(cwd);
|
|
316
|
-
let fileContent = null;
|
|
317
|
-
try {
|
|
318
|
-
const filePath = resolve(root, entry.file);
|
|
319
|
-
if (existsSync(filePath)) {
|
|
320
|
-
fileContent = readFileSync(filePath, 'utf-8');
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
catch {
|
|
324
|
-
// File may not exist or be unreadable
|
|
325
|
-
}
|
|
326
|
-
return {
|
|
327
|
-
...entry,
|
|
328
|
-
fileContent,
|
|
329
|
-
fileExists: fileContent !== null,
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Search manifest entries by text with relevance scoring.
|
|
334
|
-
* @task T4787
|
|
335
|
-
*/
|
|
336
|
-
export async function searchManifest(query, options, cwd) {
|
|
337
|
-
const entries = await readExtendedManifest(cwd);
|
|
338
|
-
const queryLower = query.toLowerCase();
|
|
339
|
-
const scored = entries.map((entry) => {
|
|
340
|
-
let score = 0;
|
|
341
|
-
if (entry.title.toLowerCase().includes(queryLower)) {
|
|
342
|
-
score += 0.5;
|
|
343
|
-
}
|
|
344
|
-
if (entry.topics.some((t) => t.toLowerCase().includes(queryLower))) {
|
|
345
|
-
score += 0.3;
|
|
346
|
-
}
|
|
347
|
-
if (entry.key_findings?.some((f) => f.toLowerCase().includes(queryLower))) {
|
|
348
|
-
score += 0.2;
|
|
349
|
-
}
|
|
350
|
-
if (entry.id.toLowerCase().includes(queryLower)) {
|
|
351
|
-
score += 0.1;
|
|
352
|
-
}
|
|
353
|
-
return { entry, score };
|
|
354
|
-
});
|
|
355
|
-
const minConfidence = options?.confidence ?? 0.1;
|
|
356
|
-
let results = scored.filter((s) => s.score >= minConfidence).sort((a, b) => b.score - a.score);
|
|
357
|
-
if (options?.limit && options.limit > 0) {
|
|
358
|
-
results = results.slice(0, options.limit);
|
|
359
|
-
}
|
|
360
|
-
return results.map((r) => ({
|
|
361
|
-
...r.entry,
|
|
362
|
-
relevanceScore: Math.round(r.score * 100) / 100,
|
|
363
|
-
}));
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Get pending manifest entries (partial, blocked, or needing followup).
|
|
367
|
-
* @task T4787
|
|
368
|
-
*/
|
|
369
|
-
export async function pendingManifestEntries(epicId, cwd) {
|
|
370
|
-
const entries = await readExtendedManifest(cwd);
|
|
371
|
-
let pending = entries.filter((e) => e.status === 'partial' ||
|
|
372
|
-
e.status === 'blocked' ||
|
|
373
|
-
(e.needs_followup && e.needs_followup.length > 0));
|
|
374
|
-
if (epicId) {
|
|
375
|
-
pending = pending.filter((e) => e.id.startsWith(epicId) || e.linked_tasks?.includes(epicId));
|
|
376
|
-
}
|
|
377
|
-
return {
|
|
378
|
-
entries: pending,
|
|
379
|
-
total: pending.length,
|
|
380
|
-
byStatus: {
|
|
381
|
-
partial: pending.filter((e) => e.status === 'partial').length,
|
|
382
|
-
blocked: pending.filter((e) => e.status === 'blocked').length,
|
|
383
|
-
needsFollowup: pending.filter((e) => e.needs_followup && e.needs_followup.length > 0).length,
|
|
384
|
-
},
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Get manifest-based research statistics.
|
|
389
|
-
* @task T4787
|
|
390
|
-
*/
|
|
391
|
-
export async function manifestStats(epicId, cwd) {
|
|
392
|
-
const entries = await readExtendedManifest(cwd);
|
|
393
|
-
let filtered = entries;
|
|
394
|
-
if (epicId) {
|
|
395
|
-
filtered = entries.filter((e) => e.id.startsWith(epicId) || e.linked_tasks?.includes(epicId));
|
|
396
|
-
}
|
|
397
|
-
const byStatus = {};
|
|
398
|
-
const byType = {};
|
|
399
|
-
let actionable = 0;
|
|
400
|
-
let needsFollowup = 0;
|
|
401
|
-
let totalFindings = 0;
|
|
402
|
-
for (const entry of filtered) {
|
|
403
|
-
byStatus[entry.status] = (byStatus[entry.status] || 0) + 1;
|
|
404
|
-
byType[entry.agent_type] = (byType[entry.agent_type] || 0) + 1;
|
|
405
|
-
if (entry.actionable)
|
|
406
|
-
actionable++;
|
|
407
|
-
if (entry.needs_followup && entry.needs_followup.length > 0)
|
|
408
|
-
needsFollowup++;
|
|
409
|
-
if (entry.key_findings)
|
|
410
|
-
totalFindings += entry.key_findings.length;
|
|
411
|
-
}
|
|
412
|
-
return {
|
|
413
|
-
total: filtered.length,
|
|
414
|
-
byStatus,
|
|
415
|
-
byType,
|
|
416
|
-
actionable,
|
|
417
|
-
needsFollowup,
|
|
418
|
-
averageFindings: filtered.length > 0 ? Math.round((totalFindings / filtered.length) * 10) / 10 : 0,
|
|
419
|
-
};
|
|
420
|
-
}
|
|
421
|
-
/**
|
|
422
|
-
* Link a manifest entry to a task (adds taskId to linked_tasks array).
|
|
423
|
-
* @task T4787
|
|
424
|
-
*/
|
|
425
|
-
export async function linkManifestEntry(taskId, researchId, cwd) {
|
|
426
|
-
const manifestPath = getManifestPath(cwd);
|
|
427
|
-
const entries = await readExtendedManifest(cwd);
|
|
428
|
-
const entryIndex = entries.findIndex((e) => e.id === researchId);
|
|
429
|
-
if (entryIndex === -1) {
|
|
430
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Research entry '${researchId}' not found`);
|
|
431
|
-
}
|
|
432
|
-
const entry = entries[entryIndex];
|
|
433
|
-
if (entry.linked_tasks?.includes(taskId)) {
|
|
434
|
-
return { taskId, researchId, alreadyLinked: true };
|
|
435
|
-
}
|
|
436
|
-
if (!entry.linked_tasks) {
|
|
437
|
-
entry.linked_tasks = [];
|
|
438
|
-
}
|
|
439
|
-
entry.linked_tasks.push(taskId);
|
|
440
|
-
const content = entries.map((e) => JSON.stringify(e)).join('\n') + '\n';
|
|
441
|
-
await atomicWrite(manifestPath, content);
|
|
442
|
-
return { taskId, researchId, alreadyLinked: false };
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Append an extended manifest entry.
|
|
446
|
-
* Validates required fields before appending.
|
|
447
|
-
* @task T4787
|
|
448
|
-
*/
|
|
449
|
-
export async function appendExtendedManifest(entry, cwd) {
|
|
450
|
-
const errors = [];
|
|
451
|
-
if (!entry.id)
|
|
452
|
-
errors.push('id is required');
|
|
453
|
-
if (!entry.file)
|
|
454
|
-
errors.push('file is required');
|
|
455
|
-
if (!entry.title)
|
|
456
|
-
errors.push('title is required');
|
|
457
|
-
if (!entry.date)
|
|
458
|
-
errors.push('date is required');
|
|
459
|
-
if (!entry.status)
|
|
460
|
-
errors.push('status is required');
|
|
461
|
-
if (!entry.agent_type)
|
|
462
|
-
errors.push('agent_type is required');
|
|
463
|
-
if (!entry.topics)
|
|
464
|
-
errors.push('topics is required');
|
|
465
|
-
if (entry.actionable === undefined)
|
|
466
|
-
errors.push('actionable is required');
|
|
467
|
-
if (errors.length > 0) {
|
|
468
|
-
throw new CleoError(ExitCode.VALIDATION_ERROR, `Invalid manifest entry: ${errors.join(', ')}`);
|
|
469
|
-
}
|
|
470
|
-
const manifestPath = getManifestPath(cwd);
|
|
471
|
-
await appendJsonl(manifestPath, entry);
|
|
472
|
-
return { entryId: entry.id, file: getManifestPath() };
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* Archive manifest entries older than a date.
|
|
476
|
-
* @task T4787
|
|
477
|
-
*/
|
|
478
|
-
export async function archiveManifestEntries(beforeDate, cwd) {
|
|
479
|
-
const manifestPath = getManifestPath(cwd);
|
|
480
|
-
const archivePath = getManifestArchivePath(cwd);
|
|
481
|
-
const entries = await readExtendedManifest(cwd);
|
|
482
|
-
const toArchive = entries.filter((e) => e.date < beforeDate);
|
|
483
|
-
const toKeep = entries.filter((e) => e.date >= beforeDate);
|
|
484
|
-
if (toArchive.length === 0) {
|
|
485
|
-
return {
|
|
486
|
-
archived: 0,
|
|
487
|
-
remaining: entries.length,
|
|
488
|
-
archiveFile: getManifestArchivePath(),
|
|
489
|
-
};
|
|
490
|
-
}
|
|
491
|
-
// Append archived entries to archive file
|
|
492
|
-
const existingArchive = await safeReadFile(archivePath);
|
|
493
|
-
const archiveContent = toArchive.map((e) => JSON.stringify(e)).join('\n') + '\n';
|
|
494
|
-
const fullArchive = existingArchive
|
|
495
|
-
? existingArchive.trimEnd() + '\n' + archiveContent
|
|
496
|
-
: archiveContent;
|
|
497
|
-
await atomicWrite(archivePath, fullArchive);
|
|
498
|
-
// Rewrite main manifest with remaining entries
|
|
499
|
-
const remainingContent = toKeep.length > 0 ? toKeep.map((e) => JSON.stringify(e)).join('\n') + '\n' : '';
|
|
500
|
-
await atomicWrite(manifestPath, remainingContent);
|
|
501
|
-
return {
|
|
502
|
-
archived: toArchive.length,
|
|
503
|
-
remaining: toKeep.length,
|
|
504
|
-
archiveFile: getManifestArchivePath(),
|
|
505
|
-
};
|
|
506
|
-
}
|
|
507
|
-
/**
|
|
508
|
-
* Find manifest entries with overlapping topics but conflicting key_findings.
|
|
509
|
-
* @task T4787
|
|
510
|
-
*/
|
|
511
|
-
export async function findContradictions(cwd, params) {
|
|
512
|
-
const entries = await readExtendedManifest(cwd);
|
|
513
|
-
const byTopic = new Map();
|
|
514
|
-
for (const entry of entries) {
|
|
515
|
-
if (!entry.key_findings || entry.key_findings.length === 0)
|
|
516
|
-
continue;
|
|
517
|
-
for (const topic of entry.topics) {
|
|
518
|
-
if (params?.topic && topic !== params.topic)
|
|
519
|
-
continue;
|
|
520
|
-
if (!byTopic.has(topic)) {
|
|
521
|
-
byTopic.set(topic, []);
|
|
522
|
-
}
|
|
523
|
-
byTopic.get(topic).push(entry);
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
const contradictions = [];
|
|
527
|
-
const negationPairs = [
|
|
528
|
-
[/\bdoes NOT\b/i, /\bdoes\b(?!.*\bnot\b)/i],
|
|
529
|
-
[/\bcannot\b/i, /\bcan\b(?!.*\bnot\b)/i],
|
|
530
|
-
[/\bno\s+\w+\s+required\b/i, /\brequired\b(?!.*\bno\b)/i],
|
|
531
|
-
[
|
|
532
|
-
/\bnot\s+(?:available|supported|possible|recommended)\b/i,
|
|
533
|
-
/\b(?:available|supported|possible|recommended)\b(?!.*\bnot\b)/i,
|
|
534
|
-
],
|
|
535
|
-
[/\bwithout\b/i, /\brequires?\b/i],
|
|
536
|
-
[/\bavoid\b/i, /\buse\b/i],
|
|
537
|
-
[/\bdeprecated\b/i, /\brecommended\b/i],
|
|
538
|
-
[/\banti-pattern\b/i, /\bbest practice\b/i],
|
|
539
|
-
];
|
|
540
|
-
for (const [topic, topicEntries] of byTopic) {
|
|
541
|
-
if (topicEntries.length < 2)
|
|
542
|
-
continue;
|
|
543
|
-
for (let i = 0; i < topicEntries.length; i++) {
|
|
544
|
-
for (let j = i + 1; j < topicEntries.length; j++) {
|
|
545
|
-
const a = topicEntries[i];
|
|
546
|
-
const b = topicEntries[j];
|
|
547
|
-
const conflicts = [];
|
|
548
|
-
for (const findingA of a.key_findings) {
|
|
549
|
-
for (const findingB of b.key_findings) {
|
|
550
|
-
for (const [patternNeg, patternPos] of negationPairs) {
|
|
551
|
-
if ((patternNeg.test(findingA) && patternPos.test(findingB)) ||
|
|
552
|
-
(patternPos.test(findingA) && patternNeg.test(findingB))) {
|
|
553
|
-
conflicts.push(`"${findingA}" vs "${findingB}"`);
|
|
554
|
-
break;
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
if (conflicts.length > 0) {
|
|
560
|
-
contradictions.push({
|
|
561
|
-
entryA: a,
|
|
562
|
-
entryB: b,
|
|
563
|
-
topic,
|
|
564
|
-
conflictDetails: conflicts.join('; '),
|
|
565
|
-
});
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
return contradictions;
|
|
571
|
-
}
|
|
572
|
-
/**
|
|
573
|
-
* Identify research entries replaced by newer work on same topic.
|
|
574
|
-
* @task T4787
|
|
575
|
-
*/
|
|
576
|
-
export async function findSuperseded(cwd, params) {
|
|
577
|
-
const entries = await readExtendedManifest(cwd);
|
|
578
|
-
const byTopicAndType = new Map();
|
|
579
|
-
for (const entry of entries) {
|
|
580
|
-
for (const topic of entry.topics) {
|
|
581
|
-
if (params?.topic && topic !== params.topic)
|
|
582
|
-
continue;
|
|
583
|
-
const key = `${topic}::${entry.agent_type}`;
|
|
584
|
-
if (!byTopicAndType.has(key)) {
|
|
585
|
-
byTopicAndType.set(key, []);
|
|
586
|
-
}
|
|
587
|
-
byTopicAndType.get(key).push(entry);
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
const superseded = [];
|
|
591
|
-
const seenPairs = new Set();
|
|
592
|
-
for (const [key, groupEntries] of byTopicAndType) {
|
|
593
|
-
if (groupEntries.length < 2)
|
|
594
|
-
continue;
|
|
595
|
-
const topic = key.split('::')[0];
|
|
596
|
-
const sorted = [...groupEntries].sort((a, b) => a.date.localeCompare(b.date));
|
|
597
|
-
for (let i = 0; i < sorted.length - 1; i++) {
|
|
598
|
-
const pairKey = `${sorted[i].id}::${sorted[sorted.length - 1].id}::${topic}`;
|
|
599
|
-
if (seenPairs.has(pairKey))
|
|
600
|
-
continue;
|
|
601
|
-
seenPairs.add(pairKey);
|
|
602
|
-
superseded.push({
|
|
603
|
-
old: sorted[i],
|
|
604
|
-
replacement: sorted[sorted.length - 1],
|
|
605
|
-
topic,
|
|
606
|
-
});
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
return superseded;
|
|
610
|
-
}
|
|
611
|
-
/**
|
|
612
|
-
* Read protocol injection content for a given protocol type.
|
|
613
|
-
* @task T4787
|
|
614
|
-
*/
|
|
615
|
-
export async function readProtocolInjection(protocolType, params, cwd) {
|
|
616
|
-
const root = getProjectRoot(cwd);
|
|
617
|
-
const protocolLocations = [
|
|
618
|
-
resolve(root, 'protocols', `${protocolType}.md`),
|
|
619
|
-
resolve(root, 'skills', '_shared', `${protocolType}.md`),
|
|
620
|
-
resolve(root, 'agents', 'cleo-subagent', 'protocols', `${protocolType}.md`),
|
|
621
|
-
];
|
|
622
|
-
let protocolContent = null;
|
|
623
|
-
let protocolPath = null;
|
|
624
|
-
for (const loc of protocolLocations) {
|
|
625
|
-
if (existsSync(loc)) {
|
|
626
|
-
try {
|
|
627
|
-
protocolContent = readFileSync(loc, 'utf-8');
|
|
628
|
-
protocolPath = loc.replace(root + '/', '');
|
|
629
|
-
break;
|
|
630
|
-
}
|
|
631
|
-
catch { }
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
if (!protocolContent || !protocolPath) {
|
|
635
|
-
throw new CleoError(ExitCode.NOT_FOUND, `Protocol '${protocolType}' not found in src/protocols/, skills/_shared/, or agents/cleo-subagent/protocols/`);
|
|
636
|
-
}
|
|
637
|
-
return {
|
|
638
|
-
protocolType,
|
|
639
|
-
content: protocolContent,
|
|
640
|
-
path: protocolPath,
|
|
641
|
-
contentLength: protocolContent.length,
|
|
642
|
-
estimatedTokens: Math.ceil(protocolContent.length / 4),
|
|
643
|
-
taskId: params?.taskId || null,
|
|
644
|
-
variant: params?.variant || null,
|
|
645
|
-
};
|
|
646
|
-
}
|
|
647
|
-
/**
|
|
648
|
-
* Compact MANIFEST.jsonl by removing duplicate/stale entries.
|
|
649
|
-
* @task T4787
|
|
650
|
-
*/
|
|
651
|
-
export async function compactManifest(cwd) {
|
|
652
|
-
const manifestPath = getManifestPath(cwd);
|
|
653
|
-
const content = await safeReadFile(manifestPath);
|
|
654
|
-
if (!content) {
|
|
655
|
-
return {
|
|
656
|
-
compacted: false,
|
|
657
|
-
originalLines: 0,
|
|
658
|
-
malformedRemoved: 0,
|
|
659
|
-
duplicatesRemoved: 0,
|
|
660
|
-
remainingEntries: 0,
|
|
661
|
-
};
|
|
662
|
-
}
|
|
663
|
-
const lines = content.split('\n');
|
|
664
|
-
const entries = [];
|
|
665
|
-
let malformedCount = 0;
|
|
666
|
-
for (const line of lines) {
|
|
667
|
-
const trimmed = line.trim();
|
|
668
|
-
if (!trimmed)
|
|
669
|
-
continue;
|
|
670
|
-
try {
|
|
671
|
-
entries.push(JSON.parse(trimmed));
|
|
672
|
-
}
|
|
673
|
-
catch {
|
|
674
|
-
malformedCount++;
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
const originalCount = entries.length + malformedCount;
|
|
678
|
-
const idMap = new Map();
|
|
679
|
-
for (const entry of entries) {
|
|
680
|
-
idMap.set(entry.id, entry);
|
|
681
|
-
}
|
|
682
|
-
const compacted = Array.from(idMap.values());
|
|
683
|
-
const duplicatesRemoved = entries.length - compacted.length;
|
|
684
|
-
const compactedContent = compacted.length > 0 ? compacted.map((e) => JSON.stringify(e)).join('\n') + '\n' : '';
|
|
685
|
-
await atomicWrite(manifestPath, compactedContent);
|
|
686
|
-
return {
|
|
687
|
-
compacted: true,
|
|
688
|
-
originalLines: originalCount,
|
|
689
|
-
malformedRemoved: malformedCount,
|
|
690
|
-
duplicatesRemoved,
|
|
691
|
-
remainingEntries: compacted.length,
|
|
692
|
-
};
|
|
693
|
-
}
|
|
694
|
-
/**
|
|
695
|
-
* Validate research entries for a task.
|
|
696
|
-
* @task T4787
|
|
697
|
-
*/
|
|
698
|
-
export async function validateManifestEntries(taskId, cwd) {
|
|
699
|
-
const root = getProjectRoot(cwd);
|
|
700
|
-
const entries = await readExtendedManifest(cwd);
|
|
701
|
-
const linked = entries.filter((e) => e.id.startsWith(taskId) || e.linked_tasks?.includes(taskId));
|
|
702
|
-
if (linked.length === 0) {
|
|
703
|
-
return {
|
|
704
|
-
taskId,
|
|
705
|
-
valid: true,
|
|
706
|
-
entriesFound: 0,
|
|
707
|
-
issues: [],
|
|
708
|
-
errorCount: 0,
|
|
709
|
-
warningCount: 0,
|
|
710
|
-
};
|
|
711
|
-
}
|
|
712
|
-
const issues = [];
|
|
713
|
-
for (const entry of linked) {
|
|
714
|
-
if (!entry.id)
|
|
715
|
-
issues.push({ entryId: entry.id || '(unknown)', issue: 'Missing id', severity: 'error' });
|
|
716
|
-
if (!entry.file)
|
|
717
|
-
issues.push({ entryId: entry.id, issue: 'Missing file path', severity: 'error' });
|
|
718
|
-
if (!entry.title)
|
|
719
|
-
issues.push({ entryId: entry.id, issue: 'Missing title', severity: 'error' });
|
|
720
|
-
if (!entry.date)
|
|
721
|
-
issues.push({ entryId: entry.id, issue: 'Missing date', severity: 'error' });
|
|
722
|
-
if (!entry.status)
|
|
723
|
-
issues.push({ entryId: entry.id, issue: 'Missing status', severity: 'error' });
|
|
724
|
-
if (!entry.agent_type)
|
|
725
|
-
issues.push({ entryId: entry.id, issue: 'Missing agent_type', severity: 'error' });
|
|
726
|
-
if (entry.status && !['completed', 'partial', 'blocked'].includes(entry.status)) {
|
|
727
|
-
issues.push({
|
|
728
|
-
entryId: entry.id,
|
|
729
|
-
issue: `Invalid status: ${entry.status}`,
|
|
730
|
-
severity: 'error',
|
|
731
|
-
});
|
|
732
|
-
}
|
|
733
|
-
if (entry.file) {
|
|
734
|
-
const filePath = resolve(root, entry.file);
|
|
735
|
-
if (!existsSync(filePath)) {
|
|
736
|
-
issues.push({
|
|
737
|
-
entryId: entry.id,
|
|
738
|
-
issue: `Output file not found: ${entry.file}`,
|
|
739
|
-
severity: 'warning',
|
|
740
|
-
});
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
if (entry.agent_type === 'research' &&
|
|
744
|
-
(!entry.key_findings || entry.key_findings.length === 0)) {
|
|
745
|
-
issues.push({
|
|
746
|
-
entryId: entry.id,
|
|
747
|
-
issue: 'Research entry missing key_findings',
|
|
748
|
-
severity: 'warning',
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
return {
|
|
753
|
-
taskId,
|
|
754
|
-
valid: issues.filter((i) => i.severity === 'error').length === 0,
|
|
755
|
-
entriesFound: linked.length,
|
|
756
|
-
issues,
|
|
757
|
-
errorCount: issues.filter((i) => i.severity === 'error').length,
|
|
758
|
-
warningCount: issues.filter((i) => i.severity === 'warning').length,
|
|
759
|
-
};
|
|
760
|
-
}
|
|
761
|
-
// === BRAIN Lifecycle (temporal decay) ===
|
|
762
|
-
export * from './brain-lifecycle.js';
|
|
763
|
-
export * from './brain-links.js';
|
|
764
|
-
export * from './brain-migration.js';
|
|
765
|
-
// === BRAIN Retrieval functions (3-layer pattern) ===
|
|
766
|
-
export * from './brain-retrieval.js';
|
|
767
|
-
export * from './brain-search.js';
|
|
768
|
-
// === BRAIN Memory modules (brain.db backed) ===
|
|
769
|
-
export * from './decisions.js';
|
|
770
|
-
export * from './learnings.js';
|
|
771
|
-
// === JSONL Memory modules (legacy, still active) ===
|
|
772
|
-
export * from './patterns.js';
|
|
773
|
-
//# sourceMappingURL=index.js.map
|