@cleocode/core 2026.3.58 → 2026.3.59
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/agent-registry.d.ts +206 -0
- package/dist/agents/agent-registry.d.ts.map +1 -0
- package/dist/agents/health-monitor.d.ts +161 -0
- package/dist/agents/health-monitor.d.ts.map +1 -0
- package/dist/agents/index.d.ts +3 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/retry.d.ts +57 -4
- package/dist/agents/retry.d.ts.map +1 -1
- package/dist/backfill/index.d.ts +27 -0
- package/dist/backfill/index.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +880 -506
- package/dist/index.js.map +4 -4
- package/dist/intelligence/impact.d.ts +34 -1
- package/dist/intelligence/impact.d.ts.map +1 -1
- package/dist/intelligence/index.d.ts +2 -2
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/types.d.ts +60 -0
- package/dist/intelligence/types.d.ts.map +1 -1
- package/dist/internal.d.ts +5 -4
- package/dist/internal.d.ts.map +1 -1
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/retry.d.ts +128 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/nexus/sharing/index.d.ts +48 -2
- package/dist/nexus/sharing/index.d.ts.map +1 -1
- package/dist/stats/workflow-telemetry.d.ts +15 -0
- package/dist/stats/workflow-telemetry.d.ts.map +1 -1
- package/dist/store/cross-db-cleanup.d.ts +35 -0
- package/dist/store/cross-db-cleanup.d.ts.map +1 -1
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/enforcement.d.ts.map +1 -1
- package/dist/tasks/epic-enforcement.d.ts +61 -0
- package/dist/tasks/epic-enforcement.d.ts.map +1 -1
- package/dist/tasks/pipeline-stage.d.ts +70 -1
- package/dist/tasks/pipeline-stage.d.ts.map +1 -1
- package/package.json +5 -5
- package/schemas/config.schema.json +37 -1547
- package/src/__tests__/sharing.test.ts +24 -0
- package/src/agents/__tests__/agent-registry.test.ts +351 -0
- package/src/agents/__tests__/health-monitor.test.ts +332 -0
- package/src/agents/agent-registry.ts +394 -0
- package/src/agents/health-monitor.ts +279 -0
- package/src/agents/index.ts +24 -1
- package/src/agents/retry.ts +57 -4
- package/src/backfill/index.ts +27 -0
- package/src/config.ts +3 -3
- package/src/index.ts +1 -0
- package/src/intelligence/__tests__/impact.test.ts +165 -1
- package/src/intelligence/impact.ts +203 -0
- package/src/intelligence/index.ts +3 -0
- package/src/intelligence/types.ts +76 -0
- package/src/internal.ts +20 -0
- package/src/lib/__tests__/retry.test.ts +321 -0
- package/src/lib/index.ts +16 -0
- package/src/lib/retry.ts +224 -0
- package/src/nexus/sharing/index.ts +142 -2
- package/src/stats/workflow-telemetry.ts +15 -0
- package/src/store/__tests__/session-store.test.ts +43 -7
- package/src/store/__tests__/task-store.test.ts +1 -1
- package/src/store/__tests__/test-db-helper.ts +7 -3
- package/src/store/cross-db-cleanup.ts +35 -0
- package/src/tasks/__tests__/epic-enforcement.test.ts +9 -4
- package/src/tasks/__tests__/minimal-test.test.ts +2 -2
- package/src/tasks/__tests__/update.test.ts +25 -25
- package/src/tasks/complete.ts +11 -6
- package/src/tasks/enforcement.ts +6 -3
- package/src/tasks/epic-enforcement.ts +61 -0
- package/src/tasks/pipeline-stage.ts +70 -1
- package/templates/config.template.json +5 -116
- package/templates/global-config.template.json +2 -44
- 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-schema.js +0 -80
- 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/index.js +0 -21
- 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 -176
- 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/bootstrap.js +0 -260
- 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 -267
- 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 -287
- 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/impact.js +0 -499
- package/dist/intelligence/impact.js.map +0 -1
- package/dist/intelligence/index.js +0 -17
- 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 -258
- 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/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 -179
- 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 -369
- 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 -89
- 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 -1550
- 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 -1158
- 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 -140
- 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 -339
- package/dist/stats/index.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 -212
- 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 -120
- package/dist/store/converters.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 -221
- 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 -671
- 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 -742
- package/dist/store/sqlite-data-accessor.js.map +0 -1
- package/dist/store/sqlite.js +0 -489
- 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 -344
- package/dist/store/task-store.js.map +0 -1
- package/dist/store/tasks-schema.js +0 -574
- 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 -99
- 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 -510
- 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 -224
- 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 -82
- package/dist/tasks/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/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 -243
- 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/src/agents/index.ts
CHANGED
|
@@ -11,6 +11,17 @@
|
|
|
11
11
|
* @module agents
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
+
// Load-balancing registry: task-count capacity, specializations, performance recording
|
|
15
|
+
export {
|
|
16
|
+
type AgentCapacity,
|
|
17
|
+
type AgentPerformanceMetrics,
|
|
18
|
+
getAgentCapacity,
|
|
19
|
+
getAgentSpecializations,
|
|
20
|
+
getAgentsByCapacity,
|
|
21
|
+
MAX_TASKS_PER_AGENT,
|
|
22
|
+
recordAgentPerformance,
|
|
23
|
+
updateAgentSpecializations,
|
|
24
|
+
} from './agent-registry.js';
|
|
14
25
|
// Schema & types
|
|
15
26
|
export {
|
|
16
27
|
AGENT_INSTANCE_STATUSES,
|
|
@@ -47,10 +58,22 @@ export {
|
|
|
47
58
|
recordFailurePattern,
|
|
48
59
|
storeHealingStrategy,
|
|
49
60
|
} from './execution-learning.js';
|
|
61
|
+
// Health monitoring (T039)
|
|
62
|
+
export {
|
|
63
|
+
type AgentHealthStatus,
|
|
64
|
+
checkAgentHealth,
|
|
65
|
+
detectCrashedAgents,
|
|
66
|
+
detectStaleAgents,
|
|
67
|
+
HEARTBEAT_INTERVAL_MS,
|
|
68
|
+
recordHeartbeat,
|
|
69
|
+
STALE_THRESHOLD_MS,
|
|
70
|
+
} from './health-monitor.js';
|
|
50
71
|
// Registry (CRUD, heartbeat, health, errors)
|
|
72
|
+
// Note: registry.checkAgentHealth (thresholdMs, cwd) -> AgentInstanceRow[] is exported
|
|
73
|
+
// as findStaleAgentRows to avoid conflict with health-monitor.checkAgentHealth (T039).
|
|
51
74
|
export {
|
|
52
75
|
type AgentHealthReport,
|
|
53
|
-
checkAgentHealth,
|
|
76
|
+
checkAgentHealth as findStaleAgentRows,
|
|
54
77
|
classifyError,
|
|
55
78
|
deregisterAgent,
|
|
56
79
|
generateAgentId,
|
package/src/agents/retry.ts
CHANGED
|
@@ -47,6 +47,17 @@ export const DEFAULT_RETRY_POLICY: Readonly<RetryPolicy> = Object.freeze({
|
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
49
|
* Create a retry policy by merging overrides with the default policy.
|
|
50
|
+
*
|
|
51
|
+
* @remarks
|
|
52
|
+
* Unspecified fields fall back to {@link DEFAULT_RETRY_POLICY}.
|
|
53
|
+
*
|
|
54
|
+
* @param overrides - Partial policy to merge with defaults
|
|
55
|
+
* @returns A complete RetryPolicy
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* const policy = createRetryPolicy({ maxRetries: 5 });
|
|
60
|
+
* ```
|
|
50
61
|
*/
|
|
51
62
|
export function createRetryPolicy(overrides?: Partial<RetryPolicy>): RetryPolicy {
|
|
52
63
|
return { ...DEFAULT_RETRY_POLICY, ...overrides };
|
|
@@ -55,8 +66,19 @@ export function createRetryPolicy(overrides?: Partial<RetryPolicy>): RetryPolicy
|
|
|
55
66
|
/**
|
|
56
67
|
* Calculate the delay for a given retry attempt using exponential backoff.
|
|
57
68
|
*
|
|
58
|
-
*
|
|
69
|
+
* @remarks
|
|
70
|
+
* Formula: `min(baseDelay * multiplier^attempt, maxDelay) + jitter`.
|
|
59
71
|
* Jitter adds 0-25% randomness to prevent thundering herd.
|
|
72
|
+
*
|
|
73
|
+
* @param attempt - Zero-based attempt index
|
|
74
|
+
* @param policy - Retry policy with delay configuration
|
|
75
|
+
* @returns Delay in milliseconds before the next attempt
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* const delay = calculateDelay(1, createRetryPolicy());
|
|
80
|
+
* // => ~2000ms (with jitter)
|
|
81
|
+
* ```
|
|
60
82
|
*/
|
|
61
83
|
export function calculateDelay(attempt: number, policy: RetryPolicy): number {
|
|
62
84
|
const exponentialDelay = policy.baseDelayMs * policy.backoffMultiplier ** attempt;
|
|
@@ -73,6 +95,20 @@ export function calculateDelay(attempt: number, policy: RetryPolicy): number {
|
|
|
73
95
|
/**
|
|
74
96
|
* Determine whether an error should be retried based on its classification
|
|
75
97
|
* and the retry policy.
|
|
98
|
+
*
|
|
99
|
+
* @remarks
|
|
100
|
+
* Permanent errors are never retried. Retriable errors are always retried
|
|
101
|
+
* (within attempt limits). Unknown errors defer to `policy.retryOnUnknown`.
|
|
102
|
+
*
|
|
103
|
+
* @param error - The caught error to classify
|
|
104
|
+
* @param attempt - Current attempt number (0-based)
|
|
105
|
+
* @param policy - Retry policy with limits and classification rules
|
|
106
|
+
* @returns True if the error should be retried
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* if (shouldRetry(err, attempt, policy)) { /* retry *\/ }
|
|
111
|
+
* ```
|
|
76
112
|
*/
|
|
77
113
|
export function shouldRetry(error: unknown, attempt: number, policy: RetryPolicy): boolean {
|
|
78
114
|
if (attempt >= policy.maxRetries) return false;
|
|
@@ -102,13 +138,20 @@ export interface RetryResult<T> {
|
|
|
102
138
|
/**
|
|
103
139
|
* Wrap an async function with retry logic using configurable exponential backoff.
|
|
104
140
|
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
141
|
+
* @remarks
|
|
142
|
+
* Agent-specific variant that integrates with error classification from the
|
|
143
|
+
* agent registry. For a dependency-free generic retry, use `lib/retry.ts`.
|
|
108
144
|
*
|
|
145
|
+
* @typeParam T - The resolved type of the async function
|
|
109
146
|
* @param fn - The async function to execute with retries
|
|
110
147
|
* @param policy - Retry policy (uses DEFAULT_RETRY_POLICY if not provided)
|
|
111
148
|
* @returns The result of the operation with retry metadata
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```ts
|
|
152
|
+
* const result = await withRetry(() => fetchAgentTask(agentId));
|
|
153
|
+
* if (!result.success) console.error(result.error);
|
|
154
|
+
* ```
|
|
112
155
|
*/
|
|
113
156
|
export async function withRetry<T>(
|
|
114
157
|
fn: () => Promise<T>,
|
|
@@ -176,9 +219,19 @@ export interface AgentRecoveryResult {
|
|
|
176
219
|
* classified as 'permanent' are abandoned. Agents with retriable errors
|
|
177
220
|
* are reset to 'starting' for the orchestration layer to re-assign.
|
|
178
221
|
*
|
|
222
|
+
* @remarks
|
|
223
|
+
* Two-phase process: first detects stale agents via heartbeat threshold,
|
|
224
|
+
* then evaluates each crashed agent's error history for recoverability.
|
|
225
|
+
*
|
|
179
226
|
* @param thresholdMs - Heartbeat threshold for crash detection (default: 30000)
|
|
180
227
|
* @param cwd - Working directory
|
|
181
228
|
* @returns Recovery results for each crashed agent
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```ts
|
|
232
|
+
* const results = await recoverCrashedAgents(60_000);
|
|
233
|
+
* results.filter(r => r.recovered).forEach(r => console.log(r.agentId));
|
|
234
|
+
* ```
|
|
182
235
|
*/
|
|
183
236
|
export async function recoverCrashedAgents(
|
|
184
237
|
thresholdMs: number = 30_000,
|
package/src/backfill/index.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* backfillTasks(root, {}) -- apply changes
|
|
9
9
|
* backfillTasks(root, { rollback: true }) -- revert backfill
|
|
10
10
|
*
|
|
11
|
+
* @packageDocumentation
|
|
11
12
|
* @epic T056
|
|
12
13
|
* @task T066
|
|
13
14
|
*/
|
|
@@ -60,6 +61,20 @@ export interface BackfillResult {
|
|
|
60
61
|
/**
|
|
61
62
|
* Generate 3 baseline acceptance criteria from a task description.
|
|
62
63
|
* Uses simple text analysis — no LLM required.
|
|
64
|
+
*
|
|
65
|
+
* @remarks
|
|
66
|
+
* Extracts action verbs from the title + description to produce contextually
|
|
67
|
+
* relevant criteria. Falls back to generic criteria when no verbs match.
|
|
68
|
+
*
|
|
69
|
+
* @param title - The task title
|
|
70
|
+
* @param description - The task description
|
|
71
|
+
* @returns Array of 3 acceptance criteria strings
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* generateAcFromDescription('Fix login bug', 'Users cannot log in');
|
|
76
|
+
* // => ['The defect is resolved...', 'No breaking changes...', 'Changes verified...']
|
|
77
|
+
* ```
|
|
63
78
|
*/
|
|
64
79
|
export function generateAcFromDescription(title: string, description: string): string[] {
|
|
65
80
|
const text = `${title} ${description}`.toLowerCase();
|
|
@@ -144,8 +159,20 @@ function isBackfilledTask(task: Task): boolean {
|
|
|
144
159
|
/**
|
|
145
160
|
* Retroactively populate AC and verification metadata for tasks that lack them.
|
|
146
161
|
*
|
|
162
|
+
* @remarks
|
|
163
|
+
* In dry-run mode, computes changes without writing to the database.
|
|
164
|
+
* Backfilled tasks are tagged with a note so they can be identified and
|
|
165
|
+
* optionally rolled back later.
|
|
166
|
+
*
|
|
147
167
|
* @param projectRoot - Project root directory (cwd for CLEO operations)
|
|
148
168
|
* @param options - Backfill options (dryRun, rollback, taskIds)
|
|
169
|
+
* @returns Summary of changes applied (or previewed in dry-run mode)
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```ts
|
|
173
|
+
* const result = await backfillTasks('/my/project', { dryRun: true });
|
|
174
|
+
* console.log(result.changed); // number of tasks that would be modified
|
|
175
|
+
* ```
|
|
149
176
|
*/
|
|
150
177
|
export async function backfillTasks(
|
|
151
178
|
projectRoot: string,
|
package/src/config.ts
CHANGED
|
@@ -348,7 +348,7 @@ export const STRICTNESS_PRESETS: Record<StrictnessPreset, PresetDefinition> = {
|
|
|
348
348
|
'session.autoStart': false,
|
|
349
349
|
'session.requireNotes': true,
|
|
350
350
|
'session.multiSession': false,
|
|
351
|
-
'
|
|
351
|
+
'enforcement.acceptance.mode': 'block',
|
|
352
352
|
'lifecycle.mode': 'strict',
|
|
353
353
|
},
|
|
354
354
|
},
|
|
@@ -359,7 +359,7 @@ export const STRICTNESS_PRESETS: Record<StrictnessPreset, PresetDefinition> = {
|
|
|
359
359
|
'session.autoStart': false,
|
|
360
360
|
'session.requireNotes': false,
|
|
361
361
|
'session.multiSession': true,
|
|
362
|
-
'
|
|
362
|
+
'enforcement.acceptance.mode': 'warn',
|
|
363
363
|
'lifecycle.mode': 'advisory',
|
|
364
364
|
},
|
|
365
365
|
},
|
|
@@ -369,7 +369,7 @@ export const STRICTNESS_PRESETS: Record<StrictnessPreset, PresetDefinition> = {
|
|
|
369
369
|
'session.autoStart': false,
|
|
370
370
|
'session.requireNotes': false,
|
|
371
371
|
'session.multiSession': true,
|
|
372
|
-
'
|
|
372
|
+
'enforcement.acceptance.mode': 'off',
|
|
373
373
|
'lifecycle.mode': 'off',
|
|
374
374
|
},
|
|
375
375
|
},
|
package/src/index.ts
CHANGED
|
@@ -40,6 +40,7 @@ export * as coreHooks from './hooks/index.js';
|
|
|
40
40
|
export * as inject from './inject/index.js';
|
|
41
41
|
export * as intelligence from './intelligence/index.js';
|
|
42
42
|
export * as issue from './issue/index.js';
|
|
43
|
+
export * as lib from './lib/index.js';
|
|
43
44
|
export * as lifecycle from './lifecycle/index.js';
|
|
44
45
|
export * as coreMcp from './mcp/index.js';
|
|
45
46
|
export * as memory from './memory/index.js';
|
|
@@ -8,13 +8,19 @@
|
|
|
8
8
|
* - Blast radius calculation
|
|
9
9
|
* - Critical path detection
|
|
10
10
|
* - Edge cases (orphan tasks, circular refs, no deps)
|
|
11
|
+
* - predictImpact: free-text change description matching (T043)
|
|
11
12
|
*
|
|
12
13
|
* @module intelligence
|
|
13
14
|
*/
|
|
14
15
|
|
|
15
16
|
import type { DataAccessor, Task } from '@cleocode/contracts';
|
|
16
17
|
import { describe, expect, it } from 'vitest';
|
|
17
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
analyzeChangeImpact,
|
|
20
|
+
analyzeTaskImpact,
|
|
21
|
+
calculateBlastRadius,
|
|
22
|
+
predictImpact,
|
|
23
|
+
} from '../impact.js';
|
|
18
24
|
|
|
19
25
|
// ============================================================================
|
|
20
26
|
// Test Helpers
|
|
@@ -451,3 +457,161 @@ describe('calculateBlastRadius', () => {
|
|
|
451
457
|
expect(result.transitiveCount).toBe(2);
|
|
452
458
|
});
|
|
453
459
|
});
|
|
460
|
+
|
|
461
|
+
// ============================================================================
|
|
462
|
+
// predictImpact (T043)
|
|
463
|
+
// ============================================================================
|
|
464
|
+
|
|
465
|
+
describe('predictImpact', () => {
|
|
466
|
+
it('returns empty report when no tasks match the change description', async () => {
|
|
467
|
+
const tasks = [
|
|
468
|
+
makeTask({ id: 'T001', title: 'Set up CI pipeline', description: 'Configure CI runner' }),
|
|
469
|
+
makeTask({ id: 'T002', title: 'Write unit tests', description: 'Add test coverage' }),
|
|
470
|
+
];
|
|
471
|
+
const acc = mockAccessor(tasks);
|
|
472
|
+
|
|
473
|
+
const result = await predictImpact('authentication login oauth', undefined, acc);
|
|
474
|
+
|
|
475
|
+
expect(result.change).toBe('authentication login oauth');
|
|
476
|
+
expect(result.matchedTasks).toHaveLength(0);
|
|
477
|
+
expect(result.affectedTasks).toHaveLength(0);
|
|
478
|
+
expect(result.totalAffected).toBe(0);
|
|
479
|
+
expect(result.summary).toContain('No tasks matched');
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
it('returns direct match when task title contains change keywords', async () => {
|
|
483
|
+
const tasks = [
|
|
484
|
+
makeTask({
|
|
485
|
+
id: 'T001',
|
|
486
|
+
title: 'Implement authentication module',
|
|
487
|
+
description: 'Add JWT auth',
|
|
488
|
+
}),
|
|
489
|
+
makeTask({ id: 'T002', title: 'Set up database schema', description: 'Create tables' }),
|
|
490
|
+
];
|
|
491
|
+
const acc = mockAccessor(tasks);
|
|
492
|
+
|
|
493
|
+
const result = await predictImpact('authentication module', undefined, acc);
|
|
494
|
+
|
|
495
|
+
expect(result.matchedTasks).toHaveLength(1);
|
|
496
|
+
expect(result.matchedTasks[0]?.id).toBe('T001');
|
|
497
|
+
expect(result.matchedTasks[0]?.exposure).toBe('direct');
|
|
498
|
+
expect(result.totalAffected).toBe(1);
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
it('traces downstream dependents from matched seed tasks', async () => {
|
|
502
|
+
const tasks = [
|
|
503
|
+
makeTask({ id: 'T001', title: 'authentication service implementation', description: '' }),
|
|
504
|
+
makeTask({
|
|
505
|
+
id: 'T002',
|
|
506
|
+
title: 'User login form',
|
|
507
|
+
description: 'Depends on auth service',
|
|
508
|
+
depends: ['T001'],
|
|
509
|
+
}),
|
|
510
|
+
makeTask({
|
|
511
|
+
id: 'T003',
|
|
512
|
+
title: 'Dashboard access control',
|
|
513
|
+
description: 'Requires user login',
|
|
514
|
+
depends: ['T002'],
|
|
515
|
+
}),
|
|
516
|
+
makeTask({
|
|
517
|
+
id: 'T004',
|
|
518
|
+
title: 'Unrelated database migration',
|
|
519
|
+
description: 'Schema changes',
|
|
520
|
+
}),
|
|
521
|
+
];
|
|
522
|
+
const acc = mockAccessor(tasks);
|
|
523
|
+
|
|
524
|
+
const result = await predictImpact('authentication service', undefined, acc);
|
|
525
|
+
|
|
526
|
+
// T001 is the direct match (seed)
|
|
527
|
+
expect(result.matchedTasks.map((t) => t.id)).toContain('T001');
|
|
528
|
+
|
|
529
|
+
// T002 and T003 should be in affectedTasks as dependents/transitive
|
|
530
|
+
const ids = result.affectedTasks.map((t) => t.id);
|
|
531
|
+
expect(ids).toContain('T001');
|
|
532
|
+
expect(ids).toContain('T002');
|
|
533
|
+
expect(ids).toContain('T003');
|
|
534
|
+
// T004 is unrelated and should not appear
|
|
535
|
+
expect(ids).not.toContain('T004');
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
it('classifies exposure correctly: direct, dependent, transitive', async () => {
|
|
539
|
+
const tasks = [
|
|
540
|
+
makeTask({ id: 'T001', title: 'auth login service', description: '' }),
|
|
541
|
+
makeTask({ id: 'T002', title: 'Session management', description: '', depends: ['T001'] }),
|
|
542
|
+
makeTask({ id: 'T003', title: 'Profile page', description: '', depends: ['T002'] }),
|
|
543
|
+
];
|
|
544
|
+
const acc = mockAccessor(tasks);
|
|
545
|
+
|
|
546
|
+
const result = await predictImpact('auth login', undefined, acc);
|
|
547
|
+
|
|
548
|
+
const t1 = result.affectedTasks.find((t) => t.id === 'T001');
|
|
549
|
+
const t2 = result.affectedTasks.find((t) => t.id === 'T002');
|
|
550
|
+
const t3 = result.affectedTasks.find((t) => t.id === 'T003');
|
|
551
|
+
|
|
552
|
+
expect(t1?.exposure).toBe('direct');
|
|
553
|
+
expect(t2?.exposure).toBe('dependent');
|
|
554
|
+
expect(t3?.exposure).toBe('transitive');
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
it('sorts affectedTasks: direct first, then dependent, then transitive', async () => {
|
|
558
|
+
const tasks = [
|
|
559
|
+
makeTask({ id: 'T001', title: 'auth service core', description: '' }),
|
|
560
|
+
makeTask({ id: 'T002', title: 'Login controller', description: '', depends: ['T001'] }),
|
|
561
|
+
makeTask({ id: 'T003', title: 'Session store', description: '', depends: ['T002'] }),
|
|
562
|
+
];
|
|
563
|
+
const acc = mockAccessor(tasks);
|
|
564
|
+
|
|
565
|
+
const result = await predictImpact('auth service', undefined, acc);
|
|
566
|
+
|
|
567
|
+
const exposures = result.affectedTasks.map((t) => t.exposure);
|
|
568
|
+
// direct must come before dependent which must come before transitive
|
|
569
|
+
const directIdx = exposures.indexOf('direct');
|
|
570
|
+
const dependentIdx = exposures.indexOf('dependent');
|
|
571
|
+
const transitiveIdx = exposures.indexOf('transitive');
|
|
572
|
+
|
|
573
|
+
if (directIdx !== -1 && dependentIdx !== -1) {
|
|
574
|
+
expect(directIdx).toBeLessThan(dependentIdx);
|
|
575
|
+
}
|
|
576
|
+
if (dependentIdx !== -1 && transitiveIdx !== -1) {
|
|
577
|
+
expect(dependentIdx).toBeLessThan(transitiveIdx);
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
it('respects matchLimit parameter', async () => {
|
|
582
|
+
const tasks = [
|
|
583
|
+
makeTask({ id: 'T001', title: 'auth module setup', description: '' }),
|
|
584
|
+
makeTask({ id: 'T002', title: 'auth token generation', description: '' }),
|
|
585
|
+
makeTask({ id: 'T003', title: 'auth session management', description: '' }),
|
|
586
|
+
];
|
|
587
|
+
const acc = mockAccessor(tasks);
|
|
588
|
+
|
|
589
|
+
// Limit to 1 seed
|
|
590
|
+
const result = await predictImpact('auth', undefined, acc, 1);
|
|
591
|
+
|
|
592
|
+
// Only 1 direct match seeded
|
|
593
|
+
expect(result.matchedTasks).toHaveLength(1);
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
it('produces a meaningful summary string', async () => {
|
|
597
|
+
const tasks = [
|
|
598
|
+
makeTask({ id: 'T001', title: 'auth service', description: '' }),
|
|
599
|
+
makeTask({ id: 'T002', title: 'Login page', description: '', depends: ['T001'] }),
|
|
600
|
+
];
|
|
601
|
+
const acc = mockAccessor(tasks);
|
|
602
|
+
|
|
603
|
+
const result = await predictImpact('auth service', undefined, acc);
|
|
604
|
+
|
|
605
|
+
expect(result.summary).toContain('auth service');
|
|
606
|
+
expect(result.summary).toMatch(/\d+ task/);
|
|
607
|
+
});
|
|
608
|
+
|
|
609
|
+
it('downstreamCount is 0 for leaf tasks with no dependents', async () => {
|
|
610
|
+
const tasks = [makeTask({ id: 'T001', title: 'auth service core', description: '' })];
|
|
611
|
+
const acc = mockAccessor(tasks);
|
|
612
|
+
|
|
613
|
+
const result = await predictImpact('auth service', undefined, acc);
|
|
614
|
+
|
|
615
|
+
expect(result.affectedTasks[0]?.downstreamCount).toBe(0);
|
|
616
|
+
});
|
|
617
|
+
});
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* - Task impact assessment (direct + transitive dependents)
|
|
7
7
|
* - Change impact prediction (cancel, block, complete, reprioritize)
|
|
8
8
|
* - Blast radius calculation (scope quantification)
|
|
9
|
+
* - Free-text impact prediction (predictImpact) — T043
|
|
9
10
|
*
|
|
10
11
|
* @module intelligence
|
|
11
12
|
*/
|
|
@@ -22,6 +23,8 @@ import type {
|
|
|
22
23
|
ChangeImpact,
|
|
23
24
|
ChangeType,
|
|
24
25
|
ImpactAssessment,
|
|
26
|
+
ImpactedTask,
|
|
27
|
+
ImpactReport,
|
|
25
28
|
} from './types.js';
|
|
26
29
|
|
|
27
30
|
// ============================================================================
|
|
@@ -636,3 +639,203 @@ function generateRecommendation(
|
|
|
636
639
|
);
|
|
637
640
|
}
|
|
638
641
|
}
|
|
642
|
+
|
|
643
|
+
// ============================================================================
|
|
644
|
+
// Free-text Impact Prediction (T043)
|
|
645
|
+
// ============================================================================
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* Score a task against a change description using simple keyword matching.
|
|
649
|
+
*
|
|
650
|
+
* Normalises both strings to lowercase and counts overlapping tokens (words).
|
|
651
|
+
* Returns a score in [0, 1] — 1 meaning every non-trivial token in the change
|
|
652
|
+
* description was found in the task text.
|
|
653
|
+
*/
|
|
654
|
+
function scoreTaskMatch(change: string, task: Task): number {
|
|
655
|
+
const STOP_WORDS = new Set([
|
|
656
|
+
'a',
|
|
657
|
+
'an',
|
|
658
|
+
'the',
|
|
659
|
+
'and',
|
|
660
|
+
'or',
|
|
661
|
+
'in',
|
|
662
|
+
'of',
|
|
663
|
+
'to',
|
|
664
|
+
'for',
|
|
665
|
+
'with',
|
|
666
|
+
'on',
|
|
667
|
+
'at',
|
|
668
|
+
'by',
|
|
669
|
+
'is',
|
|
670
|
+
'it',
|
|
671
|
+
'be',
|
|
672
|
+
'as',
|
|
673
|
+
'if',
|
|
674
|
+
'do',
|
|
675
|
+
'not',
|
|
676
|
+
]);
|
|
677
|
+
|
|
678
|
+
const tokenise = (text: string): string[] =>
|
|
679
|
+
text
|
|
680
|
+
.toLowerCase()
|
|
681
|
+
.split(/\W+/)
|
|
682
|
+
.filter((t) => t.length > 2 && !STOP_WORDS.has(t));
|
|
683
|
+
|
|
684
|
+
const changeTokens = new Set(tokenise(change));
|
|
685
|
+
if (changeTokens.size === 0) return 0;
|
|
686
|
+
|
|
687
|
+
const taskText = `${task.title ?? ''} ${task.description ?? ''}`;
|
|
688
|
+
const taskTokens = new Set(tokenise(taskText));
|
|
689
|
+
|
|
690
|
+
let matches = 0;
|
|
691
|
+
for (const token of changeTokens) {
|
|
692
|
+
if (taskTokens.has(token)) matches++;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
return matches / changeTokens.size;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/**
|
|
699
|
+
* Predict the downstream impact of a free-text change description.
|
|
700
|
+
*
|
|
701
|
+
* Uses fuzzy keyword matching to identify candidate tasks that relate to
|
|
702
|
+
* the change, then walks the reverse dependency graph to enumerate all
|
|
703
|
+
* downstream tasks that may be affected.
|
|
704
|
+
*
|
|
705
|
+
* @remarks
|
|
706
|
+
* The matching is purely lexical (no embeddings). Tasks are ranked by
|
|
707
|
+
* how many tokens from the change description appear in their title and
|
|
708
|
+
* description. The top `matchLimit` (default: 5) matched tasks are used
|
|
709
|
+
* as seeds for downstream dependency tracing.
|
|
710
|
+
*
|
|
711
|
+
* @example
|
|
712
|
+
* ```ts
|
|
713
|
+
* import { predictImpact } from '@cleocode/core';
|
|
714
|
+
*
|
|
715
|
+
* const report = await predictImpact('Modify authentication flow', process.cwd());
|
|
716
|
+
* console.log(report.summary);
|
|
717
|
+
* // "3 tasks matched 'Modify authentication flow'; 7 downstream tasks affected."
|
|
718
|
+
* for (const task of report.affectedTasks) {
|
|
719
|
+
* console.log(`${task.id} (${task.exposure}): ${task.reason}`);
|
|
720
|
+
* }
|
|
721
|
+
* ```
|
|
722
|
+
*
|
|
723
|
+
* @param change - Free-text description of the proposed change (e.g. "Modify X")
|
|
724
|
+
* @param cwd - Working directory used to locate the tasks database
|
|
725
|
+
* @param accessor - Optional pre-created DataAccessor (useful in tests)
|
|
726
|
+
* @param matchLimit - Maximum number of seed tasks to match (default: 5)
|
|
727
|
+
* @returns Full impact prediction report
|
|
728
|
+
*/
|
|
729
|
+
export async function predictImpact(
|
|
730
|
+
change: string,
|
|
731
|
+
cwd?: string,
|
|
732
|
+
accessor?: DataAccessor,
|
|
733
|
+
matchLimit = 5,
|
|
734
|
+
): Promise<ImpactReport> {
|
|
735
|
+
const acc = accessor ?? (await getAccessor(cwd));
|
|
736
|
+
const tasks = await loadAllTasks(acc);
|
|
737
|
+
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
738
|
+
const dependentsMap = buildDependentsMap(tasks);
|
|
739
|
+
|
|
740
|
+
// --- Step 1: Score every task against the change description ---
|
|
741
|
+
const scored = tasks
|
|
742
|
+
.map((t) => ({ task: t, score: scoreTaskMatch(change, t) }))
|
|
743
|
+
.filter(({ score }) => score > 0)
|
|
744
|
+
.sort((a, b) => b.score - a.score);
|
|
745
|
+
|
|
746
|
+
const seeds = scored.slice(0, matchLimit).map(({ task }) => task);
|
|
747
|
+
|
|
748
|
+
if (seeds.length === 0) {
|
|
749
|
+
return {
|
|
750
|
+
change,
|
|
751
|
+
matchedTasks: [],
|
|
752
|
+
affectedTasks: [],
|
|
753
|
+
totalAffected: 0,
|
|
754
|
+
summary: `No tasks matched the change description "${change}".`,
|
|
755
|
+
};
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
// --- Step 2: Collect all affected task IDs via reverse dependency graph ---
|
|
759
|
+
const directMatchIds = new Set(seeds.map((t) => t.id));
|
|
760
|
+
|
|
761
|
+
// Map: taskId -> exposure level
|
|
762
|
+
const exposureMap = new Map<string, ImpactedTask['exposure']>();
|
|
763
|
+
for (const id of directMatchIds) {
|
|
764
|
+
exposureMap.set(id, 'direct');
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// BFS over dependents for each seed
|
|
768
|
+
for (const seed of seeds) {
|
|
769
|
+
const transitive = collectTransitiveDependents(seed.id, dependentsMap);
|
|
770
|
+
for (const depId of transitive) {
|
|
771
|
+
if (!exposureMap.has(depId)) {
|
|
772
|
+
// Determine whether this is a direct dependent of the seed or further out
|
|
773
|
+
const isDirectDependent = (dependentsMap.get(seed.id) ?? new Set()).has(depId);
|
|
774
|
+
exposureMap.set(depId, isDirectDependent ? 'dependent' : 'transitive');
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
// --- Step 3: Build ImpactedTask list ---
|
|
780
|
+
const EXPOSURE_ORDER: Record<ImpactedTask['exposure'], number> = {
|
|
781
|
+
direct: 0,
|
|
782
|
+
dependent: 1,
|
|
783
|
+
transitive: 2,
|
|
784
|
+
};
|
|
785
|
+
|
|
786
|
+
const affectedTasks: ImpactedTask[] = [];
|
|
787
|
+
|
|
788
|
+
for (const [id, exposure] of exposureMap) {
|
|
789
|
+
const task = taskMap.get(id);
|
|
790
|
+
if (!task) continue;
|
|
791
|
+
|
|
792
|
+
const downstreamTransitive = collectTransitiveDependents(id, dependentsMap);
|
|
793
|
+
const downstreamCount = downstreamTransitive.size;
|
|
794
|
+
|
|
795
|
+
let reason: string;
|
|
796
|
+
if (exposure === 'direct') {
|
|
797
|
+
reason = `Task title/description matched "${change}".`;
|
|
798
|
+
} else if (exposure === 'dependent') {
|
|
799
|
+
const seedNames = seeds
|
|
800
|
+
.filter((s) => (dependentsMap.get(s.id) ?? new Set()).has(id))
|
|
801
|
+
.map((s) => s.id)
|
|
802
|
+
.join(', ');
|
|
803
|
+
reason = `Directly depends on matched task(s): ${seedNames}.`;
|
|
804
|
+
} else {
|
|
805
|
+
reason = 'Downstream of a matched task via transitive dependency chain.';
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
affectedTasks.push({
|
|
809
|
+
id,
|
|
810
|
+
title: task.title,
|
|
811
|
+
status: task.status,
|
|
812
|
+
priority: task.priority,
|
|
813
|
+
exposure,
|
|
814
|
+
downstreamCount,
|
|
815
|
+
reason,
|
|
816
|
+
});
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// Sort: exposure order first, then descending downstream count
|
|
820
|
+
affectedTasks.sort((a, b) => {
|
|
821
|
+
const expDiff = EXPOSURE_ORDER[a.exposure] - EXPOSURE_ORDER[b.exposure];
|
|
822
|
+
if (expDiff !== 0) return expDiff;
|
|
823
|
+
return b.downstreamCount - a.downstreamCount;
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
const matchedTasks = affectedTasks.filter((t) => t.exposure === 'direct');
|
|
827
|
+
const totalAffected = affectedTasks.length;
|
|
828
|
+
|
|
829
|
+
const summary =
|
|
830
|
+
matchedTasks.length === 0
|
|
831
|
+
? `No tasks matched "${change}".`
|
|
832
|
+
: `${matchedTasks.length} task(s) matched "${change}"; ${totalAffected} total task(s) affected (including downstream).`;
|
|
833
|
+
|
|
834
|
+
return {
|
|
835
|
+
change,
|
|
836
|
+
matchedTasks,
|
|
837
|
+
affectedTasks,
|
|
838
|
+
totalAffected,
|
|
839
|
+
summary,
|
|
840
|
+
};
|
|
841
|
+
}
|
|
@@ -30,6 +30,7 @@ export {
|
|
|
30
30
|
analyzeChangeImpact,
|
|
31
31
|
analyzeTaskImpact,
|
|
32
32
|
calculateBlastRadius,
|
|
33
|
+
predictImpact,
|
|
33
34
|
} from './impact.js';
|
|
34
35
|
// Patterns
|
|
35
36
|
export {
|
|
@@ -53,6 +54,8 @@ export type {
|
|
|
53
54
|
ChangeType,
|
|
54
55
|
DetectedPattern,
|
|
55
56
|
ImpactAssessment,
|
|
57
|
+
ImpactedTask,
|
|
58
|
+
ImpactReport,
|
|
56
59
|
LearningContext,
|
|
57
60
|
PatternExtractionOptions,
|
|
58
61
|
PatternMatch,
|