@soleri/core 9.0.4 → 9.3.0
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/data/flows/build.flow.yaml +8 -9
- package/data/flows/deliver.flow.yaml +9 -10
- package/data/flows/design.flow.yaml +3 -4
- package/data/flows/enhance.flow.yaml +5 -6
- package/data/flows/explore.flow.yaml +3 -4
- package/data/flows/fix.flow.yaml +5 -6
- package/data/flows/plan.flow.yaml +4 -5
- package/data/flows/review.flow.yaml +3 -4
- package/dist/brain/intelligence.d.ts +27 -0
- package/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +160 -14
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/learning-radar.d.ts +4 -0
- package/dist/brain/learning-radar.d.ts.map +1 -1
- package/dist/brain/learning-radar.js +20 -1
- package/dist/brain/learning-radar.js.map +1 -1
- package/dist/brain/strength-scorer.d.ts +31 -0
- package/dist/brain/strength-scorer.d.ts.map +1 -0
- package/dist/brain/strength-scorer.js +264 -0
- package/dist/brain/strength-scorer.js.map +1 -0
- package/dist/chat/agent-loop.d.ts.map +1 -1
- package/dist/chat/agent-loop.js +2 -0
- package/dist/chat/agent-loop.js.map +1 -1
- package/dist/chat/notifications.d.ts.map +1 -1
- package/dist/chat/notifications.js +2 -0
- package/dist/chat/notifications.js.map +1 -1
- package/dist/claudemd/compose.js +1 -1
- package/dist/claudemd/compose.js.map +1 -1
- package/dist/control/intent-router.d.ts.map +1 -1
- package/dist/control/intent-router.js +12 -4
- package/dist/control/intent-router.js.map +1 -1
- package/dist/curator/contradiction-detector.d.ts +27 -0
- package/dist/curator/contradiction-detector.d.ts.map +1 -0
- package/dist/curator/contradiction-detector.js +62 -0
- package/dist/curator/contradiction-detector.js.map +1 -0
- package/dist/curator/curator.d.ts +3 -4
- package/dist/curator/curator.d.ts.map +1 -1
- package/dist/curator/curator.js +94 -453
- package/dist/curator/curator.js.map +1 -1
- package/dist/curator/duplicate-detector.d.ts +14 -0
- package/dist/curator/duplicate-detector.d.ts.map +1 -0
- package/dist/curator/duplicate-detector.js +77 -0
- package/dist/curator/duplicate-detector.js.map +1 -0
- package/dist/curator/health-audit.d.ts +15 -0
- package/dist/curator/health-audit.d.ts.map +1 -0
- package/dist/curator/health-audit.js +97 -0
- package/dist/curator/health-audit.js.map +1 -0
- package/dist/curator/metadata-enricher.d.ts +17 -0
- package/dist/curator/metadata-enricher.d.ts.map +1 -0
- package/dist/curator/metadata-enricher.js +60 -0
- package/dist/curator/metadata-enricher.js.map +1 -0
- package/dist/curator/schema.d.ts +7 -0
- package/dist/curator/schema.d.ts.map +1 -0
- package/dist/curator/schema.js +62 -0
- package/dist/curator/schema.js.map +1 -0
- package/dist/curator/tag-manager.d.ts +36 -0
- package/dist/curator/tag-manager.d.ts.map +1 -0
- package/dist/curator/tag-manager.js +78 -0
- package/dist/curator/tag-manager.js.map +1 -0
- package/dist/engine/bin/soleri-engine.js +24 -3
- package/dist/engine/bin/soleri-engine.js.map +1 -1
- package/dist/engine/core-ops.d.ts.map +1 -1
- package/dist/engine/core-ops.js +23 -8
- package/dist/engine/core-ops.js.map +1 -1
- package/dist/engine/module-manifest.d.ts.map +1 -1
- package/dist/engine/module-manifest.js +42 -2
- package/dist/engine/module-manifest.js.map +1 -1
- package/dist/engine/register-engine.d.ts.map +1 -1
- package/dist/engine/register-engine.js +50 -2
- package/dist/engine/register-engine.js.map +1 -1
- package/dist/errors/retry.d.ts.map +1 -1
- package/dist/errors/retry.js +2 -0
- package/dist/errors/retry.js.map +1 -1
- package/dist/facades/types.d.ts +1 -1
- package/dist/flows/chain-types.d.ts +18 -18
- package/dist/flows/gate-evaluator.d.ts.map +1 -1
- package/dist/flows/gate-evaluator.js +22 -0
- package/dist/flows/gate-evaluator.js.map +1 -1
- package/dist/flows/types.d.ts +157 -28
- package/dist/flows/types.d.ts.map +1 -1
- package/dist/flows/types.js +4 -0
- package/dist/flows/types.js.map +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/intake/intake-pipeline.d.ts.map +1 -1
- package/dist/intake/intake-pipeline.js +1 -0
- package/dist/intake/intake-pipeline.js.map +1 -1
- package/dist/intake/text-ingester.d.ts.map +1 -1
- package/dist/intake/text-ingester.js +2 -0
- package/dist/intake/text-ingester.js.map +1 -1
- package/dist/llm/key-pool.d.ts +1 -1
- package/dist/llm/key-pool.d.ts.map +1 -1
- package/dist/llm/key-pool.js +3 -4
- package/dist/llm/key-pool.js.map +1 -1
- package/dist/llm/utils.d.ts.map +1 -1
- package/dist/llm/utils.js +2 -0
- package/dist/llm/utils.js.map +1 -1
- package/dist/migrations/migration-runner.test-helpers.d.ts +13 -0
- package/dist/migrations/migration-runner.test-helpers.d.ts.map +1 -0
- package/dist/migrations/migration-runner.test-helpers.js +47 -0
- package/dist/migrations/migration-runner.test-helpers.js.map +1 -0
- package/dist/operator/operator-profile.d.ts +44 -0
- package/dist/operator/operator-profile.d.ts.map +1 -0
- package/dist/operator/operator-profile.js +383 -0
- package/dist/operator/operator-profile.js.map +1 -0
- package/dist/operator/operator-signals.d.ts +45 -0
- package/dist/operator/operator-signals.d.ts.map +1 -0
- package/dist/operator/operator-signals.js +228 -0
- package/dist/operator/operator-signals.js.map +1 -0
- package/dist/operator/operator-types.d.ts +360 -0
- package/dist/operator/operator-types.d.ts.map +1 -0
- package/dist/operator/operator-types.js +24 -0
- package/dist/operator/operator-types.js.map +1 -0
- package/dist/packs/types.d.ts +27 -27
- package/dist/paths.d.ts +40 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +98 -0
- package/dist/paths.js.map +1 -0
- package/dist/persistence/index.d.ts +1 -1
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +1 -1
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/sqlite-provider.d.ts +2 -0
- package/dist/persistence/sqlite-provider.d.ts.map +1 -1
- package/dist/persistence/sqlite-provider.js +8 -5
- package/dist/persistence/sqlite-provider.js.map +1 -1
- package/dist/planning/evidence-collector.d.ts +13 -1
- package/dist/planning/evidence-collector.d.ts.map +1 -1
- package/dist/planning/evidence-collector.js +33 -0
- package/dist/planning/evidence-collector.js.map +1 -1
- package/dist/planning/gap-analysis.d.ts +5 -4
- package/dist/planning/gap-analysis.d.ts.map +1 -1
- package/dist/planning/gap-analysis.js +7 -341
- package/dist/planning/gap-analysis.js.map +1 -1
- package/dist/planning/gap-passes.d.ts +19 -0
- package/dist/planning/gap-passes.d.ts.map +1 -0
- package/dist/planning/gap-passes.js +174 -0
- package/dist/planning/gap-passes.js.map +1 -0
- package/dist/planning/gap-patterns.d.ts +29 -0
- package/dist/planning/gap-patterns.d.ts.map +1 -0
- package/dist/planning/gap-patterns.js +175 -0
- package/dist/planning/gap-patterns.js.map +1 -0
- package/dist/planning/gap-types.d.ts +1 -1
- package/dist/planning/gap-types.d.ts.map +1 -1
- package/dist/planning/gap-types.js +1 -0
- package/dist/planning/gap-types.js.map +1 -1
- package/dist/planning/github-projection.d.ts +122 -0
- package/dist/planning/github-projection.d.ts.map +1 -0
- package/dist/planning/github-projection.js +313 -0
- package/dist/planning/github-projection.js.map +1 -0
- package/dist/planning/impact-analyzer.d.ts +26 -0
- package/dist/planning/impact-analyzer.d.ts.map +1 -0
- package/dist/planning/impact-analyzer.js +201 -0
- package/dist/planning/impact-analyzer.js.map +1 -0
- package/dist/planning/plan-lifecycle.d.ts +136 -0
- package/dist/planning/plan-lifecycle.d.ts.map +1 -0
- package/dist/planning/plan-lifecycle.js +309 -0
- package/dist/planning/plan-lifecycle.js.map +1 -0
- package/dist/planning/planner-types.d.ts +202 -0
- package/dist/planning/planner-types.d.ts.map +1 -0
- package/dist/planning/planner-types.js +6 -0
- package/dist/planning/planner-types.js.map +1 -0
- package/dist/planning/planner.d.ts +31 -383
- package/dist/planning/planner.d.ts.map +1 -1
- package/dist/planning/planner.js +151 -832
- package/dist/planning/planner.js.map +1 -1
- package/dist/planning/rationalization-detector.d.ts +32 -0
- package/dist/planning/rationalization-detector.d.ts.map +1 -0
- package/dist/planning/rationalization-detector.js +89 -0
- package/dist/planning/rationalization-detector.js.map +1 -0
- package/dist/planning/reconciliation-engine.d.ts +47 -0
- package/dist/planning/reconciliation-engine.d.ts.map +1 -0
- package/dist/planning/reconciliation-engine.js +128 -0
- package/dist/planning/reconciliation-engine.js.map +1 -0
- package/dist/planning/task-verifier.d.ts +85 -0
- package/dist/planning/task-verifier.d.ts.map +1 -0
- package/dist/planning/task-verifier.js +235 -0
- package/dist/planning/task-verifier.js.map +1 -0
- package/dist/plugins/types.d.ts +4 -4
- package/dist/runtime/admin-ops.d.ts +2 -2
- package/dist/runtime/admin-ops.d.ts.map +1 -1
- package/dist/runtime/admin-ops.js +44 -17
- package/dist/runtime/admin-ops.js.map +1 -1
- package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
- package/dist/runtime/admin-setup-ops.js +22 -46
- package/dist/runtime/admin-setup-ops.js.map +1 -1
- package/dist/runtime/archive-ops.d.ts +10 -0
- package/dist/runtime/archive-ops.d.ts.map +1 -0
- package/dist/runtime/archive-ops.js +310 -0
- package/dist/runtime/archive-ops.js.map +1 -0
- package/dist/runtime/branching-ops.d.ts +12 -0
- package/dist/runtime/branching-ops.d.ts.map +1 -0
- package/dist/runtime/branching-ops.js +100 -0
- package/dist/runtime/branching-ops.js.map +1 -0
- package/dist/runtime/capture-ops.d.ts.map +1 -1
- package/dist/runtime/capture-ops.js +42 -7
- package/dist/runtime/capture-ops.js.map +1 -1
- package/dist/runtime/claude-md-helpers.js +1 -1
- package/dist/runtime/claude-md-helpers.js.map +1 -1
- package/dist/runtime/context-health.d.ts +31 -0
- package/dist/runtime/context-health.d.ts.map +1 -0
- package/dist/runtime/context-health.js +57 -0
- package/dist/runtime/context-health.js.map +1 -0
- package/dist/runtime/facades/archive-facade.d.ts +10 -0
- package/dist/runtime/facades/archive-facade.d.ts.map +1 -0
- package/dist/runtime/facades/archive-facade.js +11 -0
- package/dist/runtime/facades/archive-facade.js.map +1 -0
- package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
- package/dist/runtime/facades/brain-facade.js +2 -0
- package/dist/runtime/facades/brain-facade.js.map +1 -1
- package/dist/runtime/facades/branching-facade.d.ts +7 -0
- package/dist/runtime/facades/branching-facade.d.ts.map +1 -0
- package/dist/runtime/facades/branching-facade.js +8 -0
- package/dist/runtime/facades/branching-facade.js.map +1 -0
- package/dist/runtime/facades/chat-facade.d.ts +7 -0
- package/dist/runtime/facades/chat-facade.d.ts.map +1 -1
- package/dist/runtime/facades/chat-facade.js +15 -800
- package/dist/runtime/facades/chat-facade.js.map +1 -1
- package/dist/runtime/facades/chat-service-ops.d.ts +9 -0
- package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -0
- package/dist/runtime/facades/chat-service-ops.js +332 -0
- package/dist/runtime/facades/chat-service-ops.js.map +1 -0
- package/dist/runtime/facades/chat-session-ops.d.ts +8 -0
- package/dist/runtime/facades/chat-session-ops.d.ts.map +1 -0
- package/dist/runtime/facades/chat-session-ops.js +136 -0
- package/dist/runtime/facades/chat-session-ops.js.map +1 -0
- package/dist/runtime/facades/chat-state.d.ts +31 -0
- package/dist/runtime/facades/chat-state.d.ts.map +1 -0
- package/dist/runtime/facades/chat-state.js +32 -0
- package/dist/runtime/facades/chat-state.js.map +1 -0
- package/dist/runtime/facades/chat-transport-ops.d.ts +9 -0
- package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -0
- package/dist/runtime/facades/chat-transport-ops.js +337 -0
- package/dist/runtime/facades/chat-transport-ops.js.map +1 -0
- package/dist/runtime/facades/control-facade.d.ts.map +1 -1
- package/dist/runtime/facades/control-facade.js +4 -1
- package/dist/runtime/facades/control-facade.js.map +1 -1
- package/dist/runtime/facades/index.d.ts.map +1 -1
- package/dist/runtime/facades/index.js +48 -0
- package/dist/runtime/facades/index.js.map +1 -1
- package/dist/runtime/facades/intake-facade.d.ts +9 -0
- package/dist/runtime/facades/intake-facade.d.ts.map +1 -0
- package/dist/runtime/facades/intake-facade.js +11 -0
- package/dist/runtime/facades/intake-facade.js.map +1 -0
- package/dist/runtime/facades/links-facade.d.ts +9 -0
- package/dist/runtime/facades/links-facade.d.ts.map +1 -0
- package/dist/runtime/facades/links-facade.js +10 -0
- package/dist/runtime/facades/links-facade.js.map +1 -0
- package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
- package/dist/runtime/facades/memory-facade.js +75 -6
- package/dist/runtime/facades/memory-facade.js.map +1 -1
- package/dist/runtime/facades/operator-facade.d.ts +8 -0
- package/dist/runtime/facades/operator-facade.d.ts.map +1 -0
- package/dist/runtime/facades/operator-facade.js +220 -0
- package/dist/runtime/facades/operator-facade.js.map +1 -0
- package/dist/runtime/facades/orchestrate-facade.js +3 -3
- package/dist/runtime/facades/orchestrate-facade.js.map +1 -1
- package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
- package/dist/runtime/facades/plan-facade.js +42 -6
- package/dist/runtime/facades/plan-facade.js.map +1 -1
- package/dist/runtime/facades/review-facade.d.ts +7 -0
- package/dist/runtime/facades/review-facade.d.ts.map +1 -0
- package/dist/runtime/facades/review-facade.js +8 -0
- package/dist/runtime/facades/review-facade.js.map +1 -0
- package/dist/runtime/facades/sync-facade.d.ts +7 -0
- package/dist/runtime/facades/sync-facade.d.ts.map +1 -0
- package/dist/runtime/facades/sync-facade.js +8 -0
- package/dist/runtime/facades/sync-facade.js.map +1 -0
- package/dist/runtime/facades/tier-facade.d.ts +7 -0
- package/dist/runtime/facades/tier-facade.d.ts.map +1 -0
- package/dist/runtime/facades/tier-facade.js +8 -0
- package/dist/runtime/facades/tier-facade.js.map +1 -0
- package/dist/runtime/facades/vault-facade.d.ts +12 -1
- package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
- package/dist/runtime/facades/vault-facade.js +55 -251
- package/dist/runtime/facades/vault-facade.js.map +1 -1
- package/dist/runtime/github-integration.d.ts +49 -0
- package/dist/runtime/github-integration.d.ts.map +1 -0
- package/dist/runtime/github-integration.js +120 -0
- package/dist/runtime/github-integration.js.map +1 -0
- package/dist/runtime/grading-ops.js +1 -1
- package/dist/runtime/grading-ops.js.map +1 -1
- package/dist/runtime/memory-extra-ops.d.ts.map +1 -1
- package/dist/runtime/memory-extra-ops.js +6 -2
- package/dist/runtime/memory-extra-ops.js.map +1 -1
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
- package/dist/runtime/orchestrate-ops.js +386 -37
- package/dist/runtime/orchestrate-ops.js.map +1 -1
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
- package/dist/runtime/planning-extra-ops.js +69 -4
- package/dist/runtime/planning-extra-ops.js.map +1 -1
- package/dist/runtime/review-ops.d.ts +10 -0
- package/dist/runtime/review-ops.d.ts.map +1 -0
- package/dist/runtime/review-ops.js +97 -0
- package/dist/runtime/review-ops.js.map +1 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +29 -12
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/session-briefing.d.ts +3 -0
- package/dist/runtime/session-briefing.d.ts.map +1 -1
- package/dist/runtime/session-briefing.js +72 -1
- package/dist/runtime/session-briefing.js.map +1 -1
- package/dist/runtime/sync-ops.d.ts +12 -0
- package/dist/runtime/sync-ops.d.ts.map +1 -0
- package/dist/runtime/sync-ops.js +288 -0
- package/dist/runtime/sync-ops.js.map +1 -0
- package/dist/runtime/tier-ops.d.ts +13 -0
- package/dist/runtime/tier-ops.d.ts.map +1 -0
- package/dist/runtime/tier-ops.js +110 -0
- package/dist/runtime/tier-ops.js.map +1 -0
- package/dist/runtime/types.d.ts +10 -4
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/vault-extra-ops.d.ts +5 -4
- package/dist/runtime/vault-extra-ops.d.ts.map +1 -1
- package/dist/runtime/vault-extra-ops.js +5 -300
- package/dist/runtime/vault-extra-ops.js.map +1 -1
- package/dist/runtime/vault-sharing-ops.d.ts +4 -4
- package/dist/runtime/vault-sharing-ops.d.ts.map +1 -1
- package/dist/runtime/vault-sharing-ops.js +5 -300
- package/dist/runtime/vault-sharing-ops.js.map +1 -1
- package/dist/skills/sync-skills.d.ts +27 -0
- package/dist/skills/sync-skills.d.ts.map +1 -0
- package/dist/skills/sync-skills.js +81 -0
- package/dist/skills/sync-skills.js.map +1 -0
- package/dist/update-check.d.ts +14 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +96 -0
- package/dist/update-check.js.map +1 -0
- package/dist/vault/linking.d.ts +10 -12
- package/dist/vault/linking.d.ts.map +1 -1
- package/dist/vault/linking.js +140 -161
- package/dist/vault/linking.js.map +1 -1
- package/dist/vault/vault-entries.d.ts +69 -0
- package/dist/vault/vault-entries.d.ts.map +1 -0
- package/dist/vault/vault-entries.js +299 -0
- package/dist/vault/vault-entries.js.map +1 -0
- package/dist/vault/vault-interfaces.d.ts +153 -0
- package/dist/vault/vault-interfaces.d.ts.map +1 -0
- package/dist/vault/vault-interfaces.js +2 -0
- package/dist/vault/vault-interfaces.js.map +1 -0
- package/dist/vault/vault-maintenance.d.ts +40 -0
- package/dist/vault/vault-maintenance.d.ts.map +1 -0
- package/dist/vault/vault-maintenance.js +146 -0
- package/dist/vault/vault-maintenance.js.map +1 -0
- package/dist/vault/vault-markdown-sync.d.ts +22 -0
- package/dist/vault/vault-markdown-sync.d.ts.map +1 -0
- package/dist/vault/vault-markdown-sync.js +143 -0
- package/dist/vault/vault-markdown-sync.js.map +1 -0
- package/dist/vault/vault-memories.d.ts +61 -0
- package/dist/vault/vault-memories.d.ts.map +1 -0
- package/dist/vault/vault-memories.js +242 -0
- package/dist/vault/vault-memories.js.map +1 -0
- package/dist/vault/vault-schema.d.ts +9 -0
- package/dist/vault/vault-schema.d.ts.map +1 -0
- package/dist/vault/vault-schema.js +205 -0
- package/dist/vault/vault-schema.js.map +1 -0
- package/dist/vault/vault.d.ts +29 -81
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +82 -931
- package/dist/vault/vault.js.map +1 -1
- package/package.json +7 -7
- package/src/agency/agency-manager.test.ts +620 -0
- package/src/agency/default-rules.test.ts +236 -0
- package/src/{__tests__ → brain}/brain-intelligence.test.ts +37 -14
- package/src/{__tests__ → brain}/brain.test.ts +1 -1
- package/src/brain/intelligence.ts +196 -15
- package/src/brain/learning-radar.ts +22 -1
- package/src/{__tests__ → brain}/second-brain-features.test.ts +4 -4
- package/src/{__tests__ → brain}/session-lifecycle.test.ts +2 -2
- package/src/capabilities/chain-mapping.test.ts +66 -0
- package/src/capabilities/registry.test.ts +359 -0
- package/src/chat/agent-loop.test.ts +384 -0
- package/src/chat/agent-loop.ts +2 -0
- package/src/{__tests__ → chat}/chat-differentiators.test.ts +3 -3
- package/src/{__tests__ → chat}/chat-enhanced.test.ts +4 -4
- package/src/{__tests__ → chat}/chat-transport.test.ts +6 -6
- package/src/chat/mcp-bridge.test.ts +178 -0
- package/src/chat/notifications.ts +2 -0
- package/src/chat/output-compressor.test.ts +164 -0
- package/src/claudemd/compose.test.ts +178 -0
- package/src/claudemd/compose.ts +1 -1
- package/src/claudemd/inject.test.ts +201 -0
- package/src/context/context-engine.test.ts +506 -0
- package/src/control/identity-manager.test.ts +305 -0
- package/src/control/intent-router.test.ts +360 -0
- package/src/control/intent-router.ts +13 -4
- package/src/curator/classifier.test.ts +110 -0
- package/src/curator/contradiction-detector.test.ts +205 -0
- package/src/curator/contradiction-detector.ts +87 -0
- package/src/{__tests__ → curator}/curator-pipeline-e2e.test.ts +10 -10
- package/src/{__tests__ → curator}/curator.test.ts +77 -1
- package/src/curator/curator.ts +160 -600
- package/src/curator/duplicate-detector.test.ts +245 -0
- package/src/curator/duplicate-detector.ts +103 -0
- package/src/curator/health-audit.ts +126 -0
- package/src/curator/metadata-enricher.ts +84 -0
- package/src/curator/quality-gate.test.ts +175 -0
- package/src/curator/schema.ts +65 -0
- package/src/curator/tag-manager.test.ts +173 -0
- package/src/curator/tag-manager.ts +109 -0
- package/src/domain-packs/inject-rules.test.ts +117 -0
- package/src/domain-packs/knowledge-installer.test.ts +163 -0
- package/src/domain-packs/loader.test.ts +86 -0
- package/src/domain-packs/pack-runtime.test.ts +140 -0
- package/src/domain-packs/skills-installer.test.ts +135 -0
- package/src/domain-packs/token-resolver.test.ts +148 -0
- package/src/domain-packs/types.test.ts +144 -0
- package/src/enforcement/adapters/claude-code.test.ts +216 -0
- package/src/enforcement/registry.test.ts +258 -0
- package/src/engine/bin/soleri-engine.ts +30 -4
- package/src/engine/core-ops.test.ts +254 -0
- package/src/engine/core-ops.ts +25 -8
- package/src/engine/module-manifest.test.ts +125 -0
- package/src/engine/module-manifest.ts +42 -2
- package/src/engine/register-engine.test.ts +235 -0
- package/src/engine/register-engine.ts +50 -3
- package/src/errors/classify.test.ts +203 -0
- package/src/errors/retry.test.ts +153 -0
- package/src/errors/retry.ts +2 -0
- package/src/errors/types.test.ts +108 -0
- package/src/events/event-bus.test.ts +149 -0
- package/src/extensions/middleware.test.ts +234 -0
- package/src/facades/facade-factory.test.ts +470 -0
- package/src/flows/chain-runner.test.ts +273 -0
- package/src/flows/context-router.test.ts +52 -0
- package/src/flows/dispatch-registry.test.ts +128 -0
- package/src/flows/epilogue.test.ts +113 -0
- package/src/flows/executor.test.ts +263 -0
- package/src/flows/gate-evaluator.test.ts +200 -0
- package/src/flows/gate-evaluator.ts +23 -0
- package/src/flows/types.ts +4 -0
- package/src/governance/governance.test.ts +842 -0
- package/src/{__tests__ → health}/health-registry.test.ts +75 -55
- package/src/health/vault-integrity.test.ts +110 -0
- package/src/index.ts +92 -0
- package/src/intake/content-classifier.test.ts +279 -0
- package/src/intake/dedup-gate.test.ts +147 -0
- package/src/intake/intake-pipeline.test.ts +508 -0
- package/src/intake/intake-pipeline.ts +1 -0
- package/src/intake/text-ingester.test.ts +200 -0
- package/src/intake/text-ingester.ts +2 -0
- package/src/llm/key-pool.test.ts +234 -0
- package/src/llm/key-pool.ts +3 -4
- package/src/llm/llm-client.test.ts +342 -0
- package/src/llm/oauth-discovery.test.ts +180 -0
- package/src/llm/utils.test.ts +371 -0
- package/src/llm/utils.ts +2 -0
- package/src/{__tests__ → logging}/logger.test.ts +44 -62
- package/src/loop/loop-manager.test.ts +515 -0
- package/src/migrations/migration-runner.edge-cases.test.ts +314 -0
- package/src/migrations/migration-runner.test-helpers.ts +64 -0
- package/src/migrations/migration-runner.test.ts +385 -0
- package/src/operator/auto-signal-pipeline.test.ts +207 -0
- package/src/operator/operator-profile-extended.test.ts +330 -0
- package/src/operator/operator-profile.test.ts +332 -0
- package/src/operator/operator-profile.ts +485 -0
- package/src/operator/operator-signals-extended.test.ts +257 -0
- package/src/operator/operator-signals.test.ts +277 -0
- package/src/operator/operator-signals.ts +262 -0
- package/src/operator/operator-types.ts +444 -0
- package/src/operator/prompts/hook-precompact-operator-dispatch.md +98 -0
- package/src/operator/prompts/subagent-soft-signal-extractor.md +130 -0
- package/src/operator/prompts/subagent-synthesis-cognition.md +190 -0
- package/src/operator/prompts/subagent-synthesis-communication.md +146 -0
- package/src/operator/prompts/subagent-synthesis-technical.md +170 -0
- package/src/operator/prompts/subagent-synthesis-trust.md +149 -0
- package/src/{__tests__ → packs}/pack-lockfile.test.ts +3 -3
- package/src/{__tests__ → packs}/pack-system.test.ts +2 -2
- package/src/paths.ts +115 -0
- package/src/persistence/index.ts +1 -1
- package/src/persistence/sqlite-provider.test.ts +540 -0
- package/src/persistence/sqlite-provider.ts +8 -5
- package/src/persona/defaults.test.ts +55 -0
- package/src/persona/loader.test.ts +67 -0
- package/src/persona/prompt-generator.test.ts +127 -0
- package/src/planning/evidence-collector.test.ts +515 -0
- package/src/planning/evidence-collector.ts +47 -0
- package/src/planning/gap-analysis-alternatives.test.ts +199 -0
- package/src/planning/gap-analysis.ts +21 -636
- package/src/planning/gap-passes.test.ts +554 -0
- package/src/planning/gap-passes.ts +367 -0
- package/src/planning/gap-patterns.test.ts +394 -0
- package/src/planning/gap-patterns.ts +317 -0
- package/src/planning/gap-types.ts +4 -1
- package/src/planning/github-projection.test.ts +182 -0
- package/src/planning/github-projection.ts +446 -0
- package/src/planning/impact-analyzer.test.ts +167 -0
- package/src/planning/impact-analyzer.ts +251 -0
- package/src/planning/plan-lifecycle.test.ts +379 -0
- package/src/planning/plan-lifecycle.ts +377 -0
- package/src/planning/planner-types.ts +215 -0
- package/src/{__tests__ → planning}/planner.test.ts +179 -15
- package/src/planning/planner.ts +221 -1112
- package/src/planning/rationalization-detector.test.ts +156 -0
- package/src/planning/rationalization-detector.ts +136 -0
- package/src/planning/reconciliation-engine.test.ts +158 -0
- package/src/planning/reconciliation-engine.ts +161 -0
- package/src/planning/task-verifier.test.ts +267 -0
- package/src/planning/task-verifier.ts +309 -0
- package/src/planning/verification-protocol.test.ts +201 -0
- package/src/playbooks/generic/generic-playbooks.test.ts +438 -0
- package/src/playbooks/index.test.ts +77 -0
- package/src/playbooks/playbook-executor.test.ts +253 -0
- package/src/playbooks/playbook-registry.test.ts +232 -0
- package/src/playbooks/playbook-seeder.test.ts +153 -0
- package/src/plugins/plugin-loader.test.ts +217 -0
- package/src/plugins/plugin-registry.test.ts +284 -0
- package/src/project/project-registry.test.ts +439 -0
- package/src/prompts/parser.test.ts +100 -0
- package/src/prompts/template-manager.test.ts +112 -0
- package/src/{__tests__ → queue}/async-infrastructure.test.ts +3 -3
- package/src/queue/job-queue.test.ts +327 -0
- package/src/queue/pipeline-runner.test.ts +209 -0
- package/src/runtime/admin-extra-ops.test.ts +513 -0
- package/src/runtime/admin-ops.test.ts +255 -0
- package/src/runtime/admin-ops.ts +45 -17
- package/src/runtime/admin-setup-ops.test.ts +327 -0
- package/src/runtime/admin-setup-ops.ts +26 -42
- package/src/runtime/archive-ops.test.ts +272 -0
- package/src/runtime/archive-ops.ts +347 -0
- package/src/runtime/branching-ops.test.ts +144 -0
- package/src/runtime/branching-ops.ts +107 -0
- package/src/runtime/capture-ops.test.ts +419 -0
- package/src/runtime/capture-ops.ts +50 -8
- package/src/runtime/chain-ops.test.ts +159 -0
- package/src/runtime/claude-md-helpers.test.ts +189 -0
- package/src/runtime/claude-md-helpers.ts +1 -1
- package/src/runtime/context-health.test.ts +76 -0
- package/src/runtime/context-health.ts +83 -0
- package/src/runtime/curator-extra-ops.test.ts +204 -0
- package/src/runtime/deprecation.test.ts +98 -0
- package/src/runtime/domain-ops.test.ts +278 -0
- package/src/runtime/facades/admin-facade.test.ts +330 -0
- package/src/runtime/facades/agency-facade.test.ts +278 -0
- package/src/runtime/facades/archive-facade.test.ts +308 -0
- package/src/runtime/facades/archive-facade.ts +14 -0
- package/src/runtime/facades/brain-facade.test.ts +818 -0
- package/src/runtime/facades/brain-facade.ts +2 -0
- package/src/runtime/facades/branching-facade.test.ts +43 -0
- package/src/runtime/facades/branching-facade.ts +11 -0
- package/src/runtime/facades/chat-facade.test.ts +219 -0
- package/src/runtime/facades/chat-facade.ts +15 -906
- package/src/runtime/facades/chat-service-ops.test.ts +381 -0
- package/src/runtime/facades/chat-service-ops.ts +376 -0
- package/src/runtime/facades/chat-session-ops.test.ts +212 -0
- package/src/runtime/facades/chat-session-ops.ts +146 -0
- package/src/runtime/facades/chat-state.ts +60 -0
- package/src/runtime/facades/chat-transport-ops.test.ts +336 -0
- package/src/runtime/facades/chat-transport-ops.ts +379 -0
- package/src/runtime/facades/context-facade.test.ts +123 -0
- package/src/runtime/facades/control-facade.test.ts +436 -0
- package/src/runtime/facades/control-facade.ts +6 -1
- package/src/runtime/facades/curator-facade.test.ts +303 -0
- package/src/runtime/facades/index.ts +48 -0
- package/src/runtime/facades/intake-facade.test.ts +215 -0
- package/src/runtime/facades/intake-facade.ts +14 -0
- package/src/runtime/facades/links-facade.test.ts +203 -0
- package/src/runtime/facades/links-facade.ts +13 -0
- package/src/runtime/facades/loop-facade.test.ts +262 -0
- package/src/runtime/facades/memory-facade.test.ts +283 -0
- package/src/runtime/facades/memory-facade.ts +78 -6
- package/src/runtime/facades/operator-facade.test.ts +221 -0
- package/src/runtime/facades/operator-facade.ts +244 -0
- package/src/runtime/facades/orchestrate-facade.test.ts +191 -0
- package/src/runtime/facades/orchestrate-facade.ts +3 -3
- package/src/runtime/facades/plan-facade.test.ts +283 -0
- package/src/runtime/facades/plan-facade.ts +47 -6
- package/src/runtime/facades/review-facade.test.ts +82 -0
- package/src/runtime/facades/review-facade.ts +11 -0
- package/src/runtime/facades/sync-facade.test.ts +113 -0
- package/src/runtime/facades/sync-facade.ts +11 -0
- package/src/runtime/facades/tier-facade.test.ts +47 -0
- package/src/runtime/facades/tier-facade.ts +11 -0
- package/src/runtime/facades/vault-facade.test.ts +563 -0
- package/src/runtime/facades/vault-facade.ts +66 -265
- package/src/runtime/feature-flags.test.ts +140 -0
- package/src/runtime/github-integration.test.ts +89 -0
- package/src/runtime/github-integration.ts +162 -0
- package/src/runtime/grading-ops.test.ts +172 -0
- package/src/runtime/grading-ops.ts +1 -1
- package/src/runtime/intake-ops.test.ts +261 -0
- package/src/runtime/loop-ops.test.ts +248 -0
- package/src/runtime/memory-cross-project-ops.test.ts +188 -0
- package/src/runtime/memory-extra-ops.test.ts +453 -0
- package/src/runtime/memory-extra-ops.ts +6 -2
- package/src/runtime/orchestrate-ops.test.ts +302 -0
- package/src/runtime/orchestrate-ops.ts +461 -45
- package/src/runtime/pack-ops.test.ts +175 -0
- package/src/runtime/planning-extra-ops.test.ts +593 -0
- package/src/runtime/planning-extra-ops.ts +74 -4
- package/src/{__tests__ → runtime}/playbook-ops-execution.test.ts +3 -3
- package/src/runtime/playbook-ops.test.ts +285 -0
- package/src/runtime/plugin-ops.test.ts +259 -0
- package/src/runtime/project-ops.test.ts +255 -0
- package/src/runtime/review-ops.test.ts +142 -0
- package/src/runtime/review-ops.ts +99 -0
- package/src/runtime/runtime.test.ts +363 -0
- package/src/runtime/runtime.ts +41 -12
- package/src/runtime/session-briefing.test.ts +431 -0
- package/src/runtime/session-briefing.ts +86 -1
- package/src/runtime/sync-ops.test.ts +212 -0
- package/src/runtime/sync-ops.ts +325 -0
- package/src/runtime/telemetry-ops.test.ts +157 -0
- package/src/runtime/tier-ops.test.ts +159 -0
- package/src/runtime/tier-ops.ts +119 -0
- package/src/runtime/types.ts +10 -4
- package/src/runtime/vault-extra-ops.test.ts +270 -0
- package/src/runtime/vault-extra-ops.ts +5 -332
- package/src/runtime/vault-linking-ops.test.ts +237 -0
- package/src/runtime/vault-sharing-ops.test.ts +127 -0
- package/src/runtime/vault-sharing-ops.ts +5 -329
- package/src/skills/sync-skills.ts +98 -0
- package/src/streams/normalize.test.ts +95 -0
- package/src/streams/replayable-stream.test.ts +166 -0
- package/src/telemetry/telemetry.test.ts +143 -0
- package/src/transport/http-server.test.ts +394 -0
- package/src/transport/lsp-server.test.ts +458 -0
- package/src/transport/rate-limiter.test.ts +126 -0
- package/src/transport/session-manager.test.ts +133 -0
- package/src/transport/token-auth.test.ts +136 -0
- package/src/transport/ws-server.test.ts +297 -0
- package/src/update-check.ts +111 -0
- package/src/vault/__tests__/vault-characterization.test.ts +579 -0
- package/src/vault/content-hash.test.ts +78 -0
- package/src/vault/git-vault-sync.test.ts +234 -0
- package/src/vault/knowledge-review.test.ts +269 -0
- package/src/vault/linking.test.ts +391 -0
- package/src/vault/linking.ts +188 -181
- package/src/vault/obsidian-sync.test.ts +345 -0
- package/src/vault/playbook.test.ts +152 -0
- package/src/vault/scope-detector.test.ts +185 -0
- package/src/vault/vault-branching.test.ts +252 -0
- package/src/{__tests__ → vault}/vault-connect.test.ts +1 -1
- package/src/vault/vault-entries.ts +426 -0
- package/src/vault/vault-maintenance.ts +200 -0
- package/src/vault/vault-manager.test.ts +206 -0
- package/src/vault/vault-markdown-sync.test.ts +203 -0
- package/src/vault/vault-markdown-sync.ts +163 -0
- package/src/vault/vault-memories.ts +339 -0
- package/src/{__tests__ → vault}/vault-scaling.test.ts +1 -1
- package/src/vault/vault-schema.ts +238 -0
- package/src/{__tests__ → vault}/vault-sharing.test.ts +4 -4
- package/src/{__tests__ → vault}/vault.test.ts +2 -2
- package/src/vault/vault.ts +87 -1123
- package/dist/cognee/client.d.ts +0 -43
- package/dist/cognee/client.d.ts.map +0 -1
- package/dist/cognee/client.js +0 -375
- package/dist/cognee/client.js.map +0 -1
- package/dist/cognee/sync-manager.d.ts +0 -153
- package/dist/cognee/sync-manager.d.ts.map +0 -1
- package/dist/cognee/sync-manager.js +0 -390
- package/dist/cognee/sync-manager.js.map +0 -1
- package/dist/cognee/types.d.ts +0 -62
- package/dist/cognee/types.d.ts.map +0 -1
- package/dist/cognee/types.js +0 -3
- package/dist/cognee/types.js.map +0 -1
- package/dist/governance/index.d.ts +0 -3
- package/dist/governance/index.d.ts.map +0 -1
- package/dist/governance/index.js +0 -2
- package/dist/governance/index.js.map +0 -1
- package/dist/health/doctor-checks.d.ts +0 -15
- package/dist/health/doctor-checks.d.ts.map +0 -1
- package/dist/health/doctor-checks.js +0 -98
- package/dist/health/doctor-checks.js.map +0 -1
- package/dist/persistence/postgres-provider.d.ts +0 -81
- package/dist/persistence/postgres-provider.d.ts.map +0 -1
- package/dist/persistence/postgres-provider.js +0 -256
- package/dist/persistence/postgres-provider.js.map +0 -1
- package/dist/runtime/cognee-sync-ops.d.ts +0 -12
- package/dist/runtime/cognee-sync-ops.d.ts.map +0 -1
- package/dist/runtime/cognee-sync-ops.js +0 -93
- package/dist/runtime/cognee-sync-ops.js.map +0 -1
- package/dist/runtime/core-ops.d.ts +0 -23
- package/dist/runtime/core-ops.d.ts.map +0 -1
- package/dist/runtime/core-ops.js +0 -1296
- package/dist/runtime/core-ops.js.map +0 -1
- package/dist/runtime/facades/cognee-facade.d.ts +0 -8
- package/dist/runtime/facades/cognee-facade.d.ts.map +0 -1
- package/dist/runtime/facades/cognee-facade.js +0 -156
- package/dist/runtime/facades/cognee-facade.js.map +0 -1
- package/src/__tests__/admin-extra-ops.test.ts +0 -484
- package/src/__tests__/admin-ops.test.ts +0 -268
- package/src/__tests__/admin-setup-ops.test.ts +0 -355
- package/src/__tests__/agency-manager.test.ts +0 -374
- package/src/__tests__/agent-loop.test.ts +0 -256
- package/src/__tests__/capture-ops.test.ts +0 -784
- package/src/__tests__/claudemd.test.ts +0 -282
- package/src/__tests__/content-hash.test.ts +0 -60
- package/src/__tests__/context-engine.test.ts +0 -251
- package/src/__tests__/core-ops.test.ts +0 -550
- package/src/__tests__/curator-extra-ops.test.ts +0 -383
- package/src/__tests__/deprecation.test.ts +0 -78
- package/src/__tests__/domain-ops.test.ts +0 -226
- package/src/__tests__/domain-packs.test.ts +0 -421
- package/src/__tests__/enforcement.test.ts +0 -153
- package/src/__tests__/errors.test.ts +0 -388
- package/src/__tests__/extensions.test.ts +0 -233
- package/src/__tests__/facade-factory.test.ts +0 -271
- package/src/__tests__/feature-flags.test.ts +0 -137
- package/src/__tests__/flows.test.ts +0 -604
- package/src/__tests__/git-vault-sync.test.ts +0 -230
- package/src/__tests__/governance.test.ts +0 -522
- package/src/__tests__/grading-ops.test.ts +0 -361
- package/src/__tests__/identity-manager.test.ts +0 -243
- package/src/__tests__/intake-pipeline.test.ts +0 -162
- package/src/__tests__/intent-router.test.ts +0 -222
- package/src/__tests__/knowledge-review.test.ts +0 -104
- package/src/__tests__/llm-client.test.ts +0 -69
- package/src/__tests__/llm.test.ts +0 -556
- package/src/__tests__/loader.test.ts +0 -176
- package/src/__tests__/loop-ops.test.ts +0 -469
- package/src/__tests__/lsp-transport.test.ts +0 -442
- package/src/__tests__/memory-cross-project-ops.test.ts +0 -248
- package/src/__tests__/memory-extra-ops.test.ts +0 -352
- package/src/__tests__/migration-runner.test.ts +0 -170
- package/src/__tests__/module-manifest-drift.test.ts +0 -59
- package/src/__tests__/normalize.test.ts +0 -85
- package/src/__tests__/obsidian-sync.test.ts +0 -354
- package/src/__tests__/orchestrate-ops.test.ts +0 -289
- package/src/__tests__/pack-ops.test.ts +0 -146
- package/src/__tests__/persistence.test.ts +0 -291
- package/src/__tests__/planning-extra-ops.test.ts +0 -706
- package/src/__tests__/playbook-executor.test.ts +0 -249
- package/src/__tests__/playbook-registry.test.ts +0 -326
- package/src/__tests__/playbook-seeder.test.ts +0 -163
- package/src/__tests__/playbook.test.ts +0 -389
- package/src/__tests__/plugin-ops.test.ts +0 -411
- package/src/__tests__/plugin-system.test.ts +0 -509
- package/src/__tests__/project-ops.test.ts +0 -381
- package/src/__tests__/replayable-stream.test.ts +0 -177
- package/src/__tests__/runtime.test.ts +0 -95
- package/src/__tests__/scope-detector.test.ts +0 -121
- package/src/__tests__/template-manager.test.ts +0 -222
- package/src/__tests__/token-resolver.test.ts +0 -79
- package/src/__tests__/transport.test.ts +0 -758
- package/src/__tests__/vault-branching.test.ts +0 -274
- package/src/__tests__/vault-extra-ops.test.ts +0 -482
- package/src/__tests__/vault-integrity.test.ts +0 -71
- package/src/__tests__/vault-manager.test.ts +0 -238
- package/src/__tests__/ws-transport.test.ts +0 -479
- package/src/engine/index.ts +0 -21
- package/src/persona/index.ts +0 -9
|
@@ -17,6 +17,24 @@ import { FlowExecutor } from '../flows/executor.js';
|
|
|
17
17
|
import { createDispatcher } from '../flows/dispatch-registry.js';
|
|
18
18
|
import { runEpilogue } from '../flows/epilogue.js';
|
|
19
19
|
import type { OrchestrationPlan, ExecutionResult } from '../flows/types.js';
|
|
20
|
+
import type { ContextHealthStatus } from './context-health.js';
|
|
21
|
+
import {
|
|
22
|
+
detectGitHubContext,
|
|
23
|
+
findMatchingMilestone,
|
|
24
|
+
findDuplicateIssue,
|
|
25
|
+
formatIssueBody,
|
|
26
|
+
createGitHubIssue,
|
|
27
|
+
updateGitHubIssueBody,
|
|
28
|
+
} from '../planning/github-projection.js';
|
|
29
|
+
import type { PlanMetadataForIssue, GitHubProjection } from '../planning/github-projection.js';
|
|
30
|
+
import {
|
|
31
|
+
extractIssueNumber,
|
|
32
|
+
detectGitHubRemote as detectGitHubRemoteAsync,
|
|
33
|
+
getIssueDetails,
|
|
34
|
+
} from './github-integration.js';
|
|
35
|
+
import { detectRationalizations } from '../planning/rationalization-detector.js';
|
|
36
|
+
import { ImpactAnalyzer } from '../planning/impact-analyzer.js';
|
|
37
|
+
import type { ImpactReport } from '../planning/impact-analyzer.js';
|
|
20
38
|
|
|
21
39
|
// ---------------------------------------------------------------------------
|
|
22
40
|
// Intent detection — keyword-based mapping from prompt to intent
|
|
@@ -61,11 +79,7 @@ const planStore = new Map<string, PlanEntry>();
|
|
|
61
79
|
* If facades are provided, uses the full dispatch registry.
|
|
62
80
|
* Otherwise, falls back to a simple runtime-based dispatcher.
|
|
63
81
|
*/
|
|
64
|
-
function buildDispatch(
|
|
65
|
-
agentId: string,
|
|
66
|
-
runtime: AgentRuntime,
|
|
67
|
-
facades?: FacadeConfig[],
|
|
68
|
-
) {
|
|
82
|
+
function buildDispatch(agentId: string, runtime: AgentRuntime, facades?: FacadeConfig[]) {
|
|
69
83
|
if (facades && facades.length > 0) {
|
|
70
84
|
return createDispatcher(agentId, facades);
|
|
71
85
|
}
|
|
@@ -110,6 +124,102 @@ function buildDispatch(
|
|
|
110
124
|
};
|
|
111
125
|
}
|
|
112
126
|
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Context health warning builder
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
|
|
131
|
+
interface HealthWarning {
|
|
132
|
+
level: string;
|
|
133
|
+
recommendation: string;
|
|
134
|
+
sessionCaptured?: boolean;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Build a context health warning if level is yellow or red.
|
|
139
|
+
* On red: auto-triggers a session capture to vault memory.
|
|
140
|
+
*/
|
|
141
|
+
function buildHealthWarning(
|
|
142
|
+
status: ContextHealthStatus,
|
|
143
|
+
vault: AgentRuntime['vault'],
|
|
144
|
+
): HealthWarning | null {
|
|
145
|
+
if (status.level === 'green') return null;
|
|
146
|
+
|
|
147
|
+
const warning: HealthWarning = {
|
|
148
|
+
level: status.level,
|
|
149
|
+
recommendation: status.recommendation,
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
if (status.level === 'red') {
|
|
153
|
+
try {
|
|
154
|
+
vault.captureMemory({
|
|
155
|
+
projectPath: '.',
|
|
156
|
+
type: 'session',
|
|
157
|
+
context: 'Auto-captured by context health monitor (red level)',
|
|
158
|
+
summary: `Context fill at ${(status.estimatedFill * 100).toFixed(0)}% (${status.toolCallCount} tool calls, ~${status.estimatedTokens} tokens). Session capture recommended.`,
|
|
159
|
+
topics: ['context-health'],
|
|
160
|
+
filesModified: [],
|
|
161
|
+
toolsUsed: [],
|
|
162
|
+
intent: null,
|
|
163
|
+
decisions: [],
|
|
164
|
+
currentState: `Context health: ${status.level}`,
|
|
165
|
+
nextSteps: ['Compact context or start a new session'],
|
|
166
|
+
vaultEntriesReferenced: [],
|
|
167
|
+
});
|
|
168
|
+
warning.sessionCaptured = true;
|
|
169
|
+
} catch {
|
|
170
|
+
warning.sessionCaptured = false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return warning;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Anti-rationalization helpers
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Collect all acceptance criteria from a plan's tasks.
|
|
183
|
+
* Returns empty array if plan not found or has no criteria (graceful skip).
|
|
184
|
+
*/
|
|
185
|
+
function collectAcceptanceCriteria(plannerRef: AgentRuntime['planner'], planId: string): string[] {
|
|
186
|
+
const plan = plannerRef.get(planId);
|
|
187
|
+
if (!plan) return [];
|
|
188
|
+
const criteria: string[] = [];
|
|
189
|
+
for (const task of plan.tasks) {
|
|
190
|
+
if (task.acceptanceCriteria) {
|
|
191
|
+
criteria.push(...task.acceptanceCriteria);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return criteria;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Capture detected rationalization as an anti-pattern in vault.
|
|
199
|
+
* Best-effort — never throws.
|
|
200
|
+
*/
|
|
201
|
+
function captureRationalizationAntiPattern(
|
|
202
|
+
vaultRef: AgentRuntime['vault'],
|
|
203
|
+
report: import('../planning/rationalization-detector.js').RationalizationReport,
|
|
204
|
+
): void {
|
|
205
|
+
try {
|
|
206
|
+
const patterns = report.items.map((i) => i.pattern).join(', ');
|
|
207
|
+
vaultRef.add({
|
|
208
|
+
id: `antipattern-rationalization-${Date.now()}`,
|
|
209
|
+
title: 'Rationalization detected in completion claim',
|
|
210
|
+
description:
|
|
211
|
+
`Detected rationalization patterns: ${patterns}. ` +
|
|
212
|
+
`Items: ${report.items.map((i) => `"${i.phrase}" (${i.pattern})`).join('; ')}.`,
|
|
213
|
+
type: 'anti-pattern',
|
|
214
|
+
domain: 'planning',
|
|
215
|
+
severity: 'warning',
|
|
216
|
+
tags: ['rationalization', 'anti-pattern', 'completion-gate'],
|
|
217
|
+
});
|
|
218
|
+
} catch {
|
|
219
|
+
// Vault capture is best-effort
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
113
223
|
// ---------------------------------------------------------------------------
|
|
114
224
|
// Op factory
|
|
115
225
|
// ---------------------------------------------------------------------------
|
|
@@ -122,7 +232,7 @@ export function createOrchestrateOps(
|
|
|
122
232
|
runtime: AgentRuntime,
|
|
123
233
|
facades?: FacadeConfig[],
|
|
124
234
|
): OpDefinition[] {
|
|
125
|
-
const { planner, brainIntelligence, vault } = runtime;
|
|
235
|
+
const { planner, brainIntelligence, vault, contextHealth } = runtime;
|
|
126
236
|
const agentId = runtime.config.agentId;
|
|
127
237
|
|
|
128
238
|
return [
|
|
@@ -136,26 +246,14 @@ export function createOrchestrateOps(
|
|
|
136
246
|
auth: 'write',
|
|
137
247
|
schema: z.object({
|
|
138
248
|
prompt: z
|
|
139
|
-
.string()
|
|
140
|
-
.describe('Natural language description of what to do'),
|
|
141
|
-
projectPath: z
|
|
142
249
|
.string()
|
|
143
250
|
.optional()
|
|
144
|
-
.
|
|
145
|
-
|
|
251
|
+
.describe('Natural language description of what to do (or use objective)'),
|
|
252
|
+
projectPath: z.string().optional().default('.').describe('Project root path'),
|
|
146
253
|
// Legacy params — still accepted for backward compat
|
|
147
|
-
objective: z
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
.describe('(Legacy) Plan objective — use prompt instead'),
|
|
151
|
-
scope: z
|
|
152
|
-
.string()
|
|
153
|
-
.optional()
|
|
154
|
-
.describe('(Legacy) Plan scope'),
|
|
155
|
-
domain: z
|
|
156
|
-
.string()
|
|
157
|
-
.optional()
|
|
158
|
-
.describe('Domain hint for brain recommendations'),
|
|
254
|
+
objective: z.string().optional().describe('(Legacy) Plan objective — use prompt instead'),
|
|
255
|
+
scope: z.string().optional().describe('(Legacy) Plan scope'),
|
|
256
|
+
domain: z.string().optional().describe('Domain hint for brain recommendations'),
|
|
159
257
|
tasks: z
|
|
160
258
|
.array(z.object({ title: z.string(), description: z.string() }))
|
|
161
259
|
.optional()
|
|
@@ -170,17 +268,22 @@ export function createOrchestrateOps(
|
|
|
170
268
|
const intent = detectIntent(prompt);
|
|
171
269
|
|
|
172
270
|
// 2. Get brain recommendations — graceful degradation
|
|
173
|
-
let recommendations: Array<{ pattern: string; strength: number }> = [];
|
|
271
|
+
let recommendations: Array<{ pattern: string; strength: number; entryId?: string }> = [];
|
|
174
272
|
try {
|
|
175
273
|
const raw = brainIntelligence.recommend({
|
|
176
274
|
domain,
|
|
177
275
|
task: prompt,
|
|
178
276
|
limit: 5,
|
|
179
277
|
});
|
|
180
|
-
recommendations = raw.map((r) =>
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
278
|
+
recommendations = raw.map((r) => {
|
|
279
|
+
// Look up vault entry ID by title for feedback tracking
|
|
280
|
+
const entries = vault.search(r.pattern, { limit: 1 });
|
|
281
|
+
const entryId =
|
|
282
|
+
entries.length > 0 && entries[0].entry.title === r.pattern
|
|
283
|
+
? entries[0].entry.id
|
|
284
|
+
: undefined;
|
|
285
|
+
return { pattern: r.pattern, strength: r.strength, entryId };
|
|
286
|
+
});
|
|
184
287
|
} catch {
|
|
185
288
|
// Brain has no data yet
|
|
186
289
|
}
|
|
@@ -192,6 +295,7 @@ export function createOrchestrateOps(
|
|
|
192
295
|
recommendations = vaultResults.map((r) => ({
|
|
193
296
|
pattern: r.entry.title,
|
|
194
297
|
strength: 50,
|
|
298
|
+
entryId: r.entry.id,
|
|
195
299
|
}));
|
|
196
300
|
} catch {
|
|
197
301
|
// Vault search failed
|
|
@@ -205,19 +309,44 @@ export function createOrchestrateOps(
|
|
|
205
309
|
planStore.set(plan.planId, { plan, createdAt: Date.now() });
|
|
206
310
|
|
|
207
311
|
// 5. Also create a planner plan for lifecycle tracking (backward compat)
|
|
208
|
-
const decisions = recommendations.map(
|
|
209
|
-
|
|
210
|
-
|
|
312
|
+
const decisions = recommendations.map((r) => {
|
|
313
|
+
const base = `Brain pattern: ${r.pattern} (strength: ${r.strength.toFixed(1)})`;
|
|
314
|
+
return r.entryId ? `${base} [entryId:${r.entryId}]` : base;
|
|
315
|
+
});
|
|
211
316
|
const tasks = (params.tasks as Array<{ title: string; description: string }>) ?? [];
|
|
212
317
|
|
|
318
|
+
// 5b. Extract GitHub issue context if prompt references #NNN
|
|
319
|
+
let githubIssue: { owner: string; repo: string; number: number } | undefined;
|
|
320
|
+
const issueNum = extractIssueNumber(prompt);
|
|
321
|
+
if (issueNum) {
|
|
322
|
+
const remote = await detectGitHubRemoteAsync(projectPath);
|
|
323
|
+
if (remote) {
|
|
324
|
+
githubIssue = { owner: remote.owner, repo: remote.repo, number: issueNum };
|
|
325
|
+
const details = await getIssueDetails(remote.owner, remote.repo, issueNum);
|
|
326
|
+
if (details) {
|
|
327
|
+
// Enrich objective with issue context
|
|
328
|
+
const enriched = `${prompt}\n\n--- GitHub Issue #${issueNum}: ${details.title} ---\n${details.body}`;
|
|
329
|
+
decisions.unshift(`Source: GitHub issue #${issueNum} — ${details.title}`);
|
|
330
|
+
// Replace prompt for plan creation
|
|
331
|
+
Object.assign(params, { _enrichedObjective: enriched });
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const planObjective =
|
|
337
|
+
((params as Record<string, unknown>)._enrichedObjective as string | undefined) ?? prompt;
|
|
338
|
+
|
|
213
339
|
let legacyPlan;
|
|
214
340
|
try {
|
|
215
341
|
legacyPlan = planner.create({
|
|
216
|
-
objective:
|
|
342
|
+
objective: planObjective,
|
|
217
343
|
scope: (params.scope as string) ?? `${intent} workflow`,
|
|
218
344
|
decisions,
|
|
219
345
|
tasks,
|
|
220
346
|
});
|
|
347
|
+
if (legacyPlan && githubIssue) {
|
|
348
|
+
legacyPlan.githubIssue = githubIssue;
|
|
349
|
+
}
|
|
221
350
|
} catch {
|
|
222
351
|
// Planner creation failed — flow plan still valid
|
|
223
352
|
}
|
|
@@ -271,13 +400,25 @@ export function createOrchestrateOps(
|
|
|
271
400
|
// Store result
|
|
272
401
|
entry.executionResult = executionResult;
|
|
273
402
|
|
|
274
|
-
//
|
|
275
|
-
const
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
403
|
+
// Reuse brain session from plan_split if one exists, otherwise start new
|
|
404
|
+
const existingSession = brainIntelligence.getSessionByPlanId(planId);
|
|
405
|
+
const session =
|
|
406
|
+
existingSession && !existingSession.endedAt
|
|
407
|
+
? existingSession
|
|
408
|
+
: brainIntelligence.lifecycle({
|
|
409
|
+
action: 'start',
|
|
410
|
+
domain,
|
|
411
|
+
context,
|
|
412
|
+
planId,
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
// Track execution in context health monitor
|
|
416
|
+
contextHealth.track({
|
|
417
|
+
type: 'orchestrate_execute',
|
|
418
|
+
payloadSize: JSON.stringify(executionResult).length,
|
|
280
419
|
});
|
|
420
|
+
const healthStatus = contextHealth.check();
|
|
421
|
+
const healthWarning = buildHealthWarning(healthStatus, vault);
|
|
281
422
|
|
|
282
423
|
return {
|
|
283
424
|
plan: { id: planId, status: 'executing' },
|
|
@@ -289,19 +430,37 @@ export function createOrchestrateOps(
|
|
|
289
430
|
toolsCalled: executionResult.toolsCalled,
|
|
290
431
|
durationMs: executionResult.durationMs,
|
|
291
432
|
},
|
|
433
|
+
...(healthWarning ? { contextHealth: healthWarning } : {}),
|
|
292
434
|
};
|
|
293
435
|
}
|
|
294
436
|
|
|
295
437
|
// Legacy path: no flow plan found, use planner directly
|
|
296
438
|
const plan = planner.startExecution(planId);
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
439
|
+
// Reuse brain session from plan_split if one exists, otherwise start new
|
|
440
|
+
const existingSession = brainIntelligence.getSessionByPlanId(planId);
|
|
441
|
+
const session =
|
|
442
|
+
existingSession && !existingSession.endedAt
|
|
443
|
+
? existingSession
|
|
444
|
+
: brainIntelligence.lifecycle({
|
|
445
|
+
action: 'start',
|
|
446
|
+
domain,
|
|
447
|
+
context,
|
|
448
|
+
planId,
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
// Track legacy execution in context health monitor
|
|
452
|
+
contextHealth.track({
|
|
453
|
+
type: 'orchestrate_execute_legacy',
|
|
454
|
+
payloadSize: JSON.stringify(plan).length,
|
|
302
455
|
});
|
|
456
|
+
const healthStatus = contextHealth.check();
|
|
457
|
+
const healthWarning = buildHealthWarning(healthStatus, vault);
|
|
303
458
|
|
|
304
|
-
return {
|
|
459
|
+
return {
|
|
460
|
+
plan,
|
|
461
|
+
session,
|
|
462
|
+
...(healthWarning ? { contextHealth: healthWarning } : {}),
|
|
463
|
+
};
|
|
305
464
|
},
|
|
306
465
|
},
|
|
307
466
|
|
|
@@ -320,15 +479,75 @@ export function createOrchestrateOps(
|
|
|
320
479
|
.optional()
|
|
321
480
|
.default('completed')
|
|
322
481
|
.describe('Plan outcome'),
|
|
482
|
+
summary: z
|
|
483
|
+
.string()
|
|
484
|
+
.optional()
|
|
485
|
+
.describe('Completion summary — checked for rationalization language'),
|
|
323
486
|
toolsUsed: z.array(z.string()).optional().describe('Tools used during execution'),
|
|
324
487
|
filesModified: z.array(z.string()).optional().describe('Files modified during execution'),
|
|
488
|
+
projectPath: z
|
|
489
|
+
.string()
|
|
490
|
+
.optional()
|
|
491
|
+
.default('.')
|
|
492
|
+
.describe('Project root path for impact analysis'),
|
|
493
|
+
overrideRationalization: z
|
|
494
|
+
.boolean()
|
|
495
|
+
.optional()
|
|
496
|
+
.default(false)
|
|
497
|
+
.describe('Set true to bypass rationalization gate and impact warnings after review'),
|
|
325
498
|
}),
|
|
326
499
|
handler: async (params) => {
|
|
327
500
|
const planId = params.planId as string;
|
|
328
501
|
const sessionId = params.sessionId as string;
|
|
329
502
|
const outcome = (params.outcome as string) ?? 'completed';
|
|
503
|
+
const completionSummary = (params.summary as string) ?? '';
|
|
330
504
|
const toolsUsed = (params.toolsUsed as string[]) ?? [];
|
|
331
505
|
const filesModified = (params.filesModified as string[]) ?? [];
|
|
506
|
+
const overrideRationalization = (params.overrideRationalization as boolean) ?? false;
|
|
507
|
+
|
|
508
|
+
// Anti-rationalization gate: check completion summary before completing
|
|
509
|
+
if (outcome === 'completed' && !overrideRationalization) {
|
|
510
|
+
const criteria = collectAcceptanceCriteria(planner, planId);
|
|
511
|
+
if (criteria.length > 0 && completionSummary) {
|
|
512
|
+
const report = detectRationalizations(criteria, completionSummary);
|
|
513
|
+
if (report.detected) {
|
|
514
|
+
captureRationalizationAntiPattern(vault, report);
|
|
515
|
+
return {
|
|
516
|
+
blocked: true,
|
|
517
|
+
reason: 'Rationalization language detected in completion summary',
|
|
518
|
+
rationalization: report,
|
|
519
|
+
hint: 'Address the unmet criteria, or set overrideRationalization: true to bypass this gate.',
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// Impact analysis gate: assess downstream impact of modified files
|
|
526
|
+
let impactReport: ImpactReport | null = null;
|
|
527
|
+
if (filesModified.length > 0) {
|
|
528
|
+
try {
|
|
529
|
+
const analyzer = new ImpactAnalyzer();
|
|
530
|
+
const planObj = planner.get(planId);
|
|
531
|
+
const scopeHints = planObj?.scope ? [planObj.scope] : undefined;
|
|
532
|
+
impactReport = analyzer.analyzeImpact(
|
|
533
|
+
filesModified,
|
|
534
|
+
(params.projectPath as string) ?? '.',
|
|
535
|
+
scopeHints,
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
// If high risk and not overridden, warn the user
|
|
539
|
+
if (impactReport.riskLevel === 'high' && !overrideRationalization) {
|
|
540
|
+
return {
|
|
541
|
+
warning: true,
|
|
542
|
+
reason: 'High impact detected — review before completing',
|
|
543
|
+
impactReport,
|
|
544
|
+
hint: 'Review affected consumers and re-run with overrideRationalization: true or address the issues.',
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
} catch {
|
|
548
|
+
// Impact analysis is best-effort — never blocks
|
|
549
|
+
}
|
|
550
|
+
}
|
|
332
551
|
|
|
333
552
|
// Complete the planner plan (legacy lifecycle)
|
|
334
553
|
const plan = planner.complete(planId);
|
|
@@ -372,7 +591,13 @@ export function createOrchestrateOps(
|
|
|
372
591
|
planStore.delete(planId);
|
|
373
592
|
}
|
|
374
593
|
|
|
375
|
-
return {
|
|
594
|
+
return {
|
|
595
|
+
plan,
|
|
596
|
+
session,
|
|
597
|
+
extraction,
|
|
598
|
+
epilogue: epilogueResult,
|
|
599
|
+
...(impactReport ? { impactAnalysis: impactReport } : {}),
|
|
600
|
+
};
|
|
376
601
|
},
|
|
377
602
|
},
|
|
378
603
|
|
|
@@ -483,5 +708,196 @@ export function createOrchestrateOps(
|
|
|
483
708
|
return { session: endedSession, extraction };
|
|
484
709
|
},
|
|
485
710
|
},
|
|
711
|
+
|
|
712
|
+
// ─── orchestrate_project_to_github ─────────────────────────────
|
|
713
|
+
{
|
|
714
|
+
name: 'orchestrate_project_to_github',
|
|
715
|
+
description:
|
|
716
|
+
'Project plan tasks as GitHub issues. Detects the GitHub remote, checks milestones ' +
|
|
717
|
+
'and existing issues for duplicates, creates issues with plan metadata linked, and ' +
|
|
718
|
+
'stores the projection on the plan. Opt-in: the agent suggests, user confirms.',
|
|
719
|
+
auth: 'write',
|
|
720
|
+
schema: z.object({
|
|
721
|
+
planId: z.string().describe('ID of the plan to project to GitHub'),
|
|
722
|
+
projectPath: z
|
|
723
|
+
.string()
|
|
724
|
+
.optional()
|
|
725
|
+
.default('.')
|
|
726
|
+
.describe('Project root path for git detection'),
|
|
727
|
+
milestone: z.number().optional().describe('GitHub milestone number to assign issues to'),
|
|
728
|
+
labels: z.array(z.string()).optional().describe('Labels to apply to created issues'),
|
|
729
|
+
linkToIssue: z
|
|
730
|
+
.number()
|
|
731
|
+
.optional()
|
|
732
|
+
.describe('Existing issue number to link plan to instead of creating new issues'),
|
|
733
|
+
dryRun: z
|
|
734
|
+
.boolean()
|
|
735
|
+
.optional()
|
|
736
|
+
.default(false)
|
|
737
|
+
.describe('Preview what would be created without actually creating issues'),
|
|
738
|
+
}),
|
|
739
|
+
handler: async (params) => {
|
|
740
|
+
const planId = params.planId as string;
|
|
741
|
+
const projectPath = (params.projectPath as string) ?? '.';
|
|
742
|
+
const milestone = params.milestone as number | undefined;
|
|
743
|
+
const labels = (params.labels as string[]) ?? [];
|
|
744
|
+
const linkToIssue = params.linkToIssue as number | undefined;
|
|
745
|
+
const dryRun = (params.dryRun as boolean) ?? false;
|
|
746
|
+
|
|
747
|
+
// 1. Find the plan
|
|
748
|
+
const plan = planner.get(planId);
|
|
749
|
+
if (!plan) throw new Error(`Plan not found: ${planId}`);
|
|
750
|
+
|
|
751
|
+
if (plan.tasks.length === 0) {
|
|
752
|
+
throw new Error(
|
|
753
|
+
'Plan has no tasks — run plan_split first to define tasks before projecting to GitHub',
|
|
754
|
+
);
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
// 2. Detect GitHub context
|
|
758
|
+
const ctx = detectGitHubContext(projectPath);
|
|
759
|
+
if (!ctx) {
|
|
760
|
+
return {
|
|
761
|
+
status: 'skipped',
|
|
762
|
+
reason: 'No GitHub remote detected or gh CLI not authenticated',
|
|
763
|
+
};
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
const repoSlug = `${ctx.repo.owner}/${ctx.repo.repo}`;
|
|
767
|
+
|
|
768
|
+
// 3. Build plan metadata for issue body
|
|
769
|
+
const planMeta: PlanMetadataForIssue = {
|
|
770
|
+
planId: plan.id,
|
|
771
|
+
grade: plan.latestCheck?.grade ?? 'N/A',
|
|
772
|
+
score: plan.latestCheck?.score ?? 0,
|
|
773
|
+
objective: plan.objective,
|
|
774
|
+
decisions: plan.decisions,
|
|
775
|
+
tasks: plan.tasks.map((t) => ({
|
|
776
|
+
id: t.id,
|
|
777
|
+
title: t.title,
|
|
778
|
+
description: t.description,
|
|
779
|
+
dependsOn: t.dependsOn,
|
|
780
|
+
})),
|
|
781
|
+
};
|
|
782
|
+
|
|
783
|
+
// 4. Handle "link to existing issue" flow
|
|
784
|
+
if (linkToIssue) {
|
|
785
|
+
const body = formatIssueBody(planMeta, plan.objective, plan.scope);
|
|
786
|
+
if (dryRun) {
|
|
787
|
+
return {
|
|
788
|
+
status: 'dry_run',
|
|
789
|
+
action: 'update_existing',
|
|
790
|
+
repo: repoSlug,
|
|
791
|
+
issueNumber: linkToIssue,
|
|
792
|
+
bodyPreview: body.slice(0, 500),
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
const updated = updateGitHubIssueBody(ctx.repo, linkToIssue, body);
|
|
797
|
+
if (!updated) {
|
|
798
|
+
return {
|
|
799
|
+
status: 'error',
|
|
800
|
+
reason: `Failed to update issue #${linkToIssue}`,
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
const projection: GitHubProjection = {
|
|
805
|
+
repo: repoSlug,
|
|
806
|
+
issues: [{ taskId: 'all', issueNumber: linkToIssue }],
|
|
807
|
+
projectedAt: Date.now(),
|
|
808
|
+
};
|
|
809
|
+
planner.setGitHubProjection(planId, projection);
|
|
810
|
+
|
|
811
|
+
return {
|
|
812
|
+
status: 'linked',
|
|
813
|
+
repo: repoSlug,
|
|
814
|
+
issueNumber: linkToIssue,
|
|
815
|
+
message: `Plan linked to existing issue #${linkToIssue}`,
|
|
816
|
+
};
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// 5. Milestone matching
|
|
820
|
+
let milestoneNumber = milestone;
|
|
821
|
+
let milestoneMatch: string | undefined;
|
|
822
|
+
if (!milestoneNumber && ctx.milestones.length > 0 && plan.scope) {
|
|
823
|
+
const match = findMatchingMilestone(plan.scope, ctx.milestones);
|
|
824
|
+
if (match) {
|
|
825
|
+
milestoneNumber = match.number;
|
|
826
|
+
milestoneMatch = match.title;
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
// 6. Create issues per task (with duplicate detection)
|
|
831
|
+
const created: Array<{ taskId: string; issueNumber: number; title: string }> = [];
|
|
832
|
+
const skipped: Array<{
|
|
833
|
+
taskId: string;
|
|
834
|
+
title: string;
|
|
835
|
+
existingIssue: number;
|
|
836
|
+
reason: string;
|
|
837
|
+
}> = [];
|
|
838
|
+
const failed: Array<{ taskId: string; title: string; reason: string }> = [];
|
|
839
|
+
|
|
840
|
+
for (const task of plan.tasks) {
|
|
841
|
+
// Duplicate detection
|
|
842
|
+
const dup = findDuplicateIssue(task.title, ctx.existingIssues);
|
|
843
|
+
if (dup) {
|
|
844
|
+
skipped.push({
|
|
845
|
+
taskId: task.id,
|
|
846
|
+
title: task.title,
|
|
847
|
+
existingIssue: dup.number,
|
|
848
|
+
reason: `Existing issue #${dup.number} "${dup.title}" looks like it covers this task`,
|
|
849
|
+
});
|
|
850
|
+
continue;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
const body = formatIssueBody(planMeta, task.title, task.description);
|
|
854
|
+
|
|
855
|
+
if (dryRun) {
|
|
856
|
+
created.push({ taskId: task.id, issueNumber: 0, title: task.title });
|
|
857
|
+
continue;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
const issueNumber = createGitHubIssue(ctx.repo, task.title, body, {
|
|
861
|
+
milestone: milestoneNumber,
|
|
862
|
+
labels: labels.length > 0 ? labels : undefined,
|
|
863
|
+
});
|
|
864
|
+
|
|
865
|
+
if (issueNumber) {
|
|
866
|
+
created.push({ taskId: task.id, issueNumber, title: task.title });
|
|
867
|
+
} else {
|
|
868
|
+
failed.push({ taskId: task.id, title: task.title, reason: 'gh issue create failed' });
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// 7. Store projection on the plan (unless dry run)
|
|
873
|
+
if (!dryRun && created.length > 0) {
|
|
874
|
+
const projection: GitHubProjection = {
|
|
875
|
+
repo: repoSlug,
|
|
876
|
+
milestone: milestoneNumber,
|
|
877
|
+
issues: created.map((c) => ({ taskId: c.taskId, issueNumber: c.issueNumber })),
|
|
878
|
+
projectedAt: Date.now(),
|
|
879
|
+
};
|
|
880
|
+
planner.setGitHubProjection(planId, projection);
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
return {
|
|
884
|
+
status: dryRun ? 'dry_run' : 'projected',
|
|
885
|
+
repo: repoSlug,
|
|
886
|
+
milestone: milestoneMatch
|
|
887
|
+
? { number: milestoneNumber, title: milestoneMatch }
|
|
888
|
+
: milestoneNumber
|
|
889
|
+
? { number: milestoneNumber }
|
|
890
|
+
: null,
|
|
891
|
+
created,
|
|
892
|
+
skipped,
|
|
893
|
+
failed,
|
|
894
|
+
context: {
|
|
895
|
+
milestonesFound: ctx.milestones.length,
|
|
896
|
+
existingIssuesChecked: ctx.existingIssues.length,
|
|
897
|
+
labelsAvailable: ctx.labels.length,
|
|
898
|
+
},
|
|
899
|
+
};
|
|
900
|
+
},
|
|
901
|
+
},
|
|
486
902
|
];
|
|
487
903
|
}
|