@winspan/claude-forge 9.2.0 → 9.12.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/DEVELOPMENT.md +80 -19
- package/README.md +13 -6
- package/dist/catalogs/agents.json +19 -24
- package/dist/catalogs/skills.json +139 -27
- package/dist/claudemd/templates/swarm-protocol.md +1 -1
- package/dist/cli/commands/agent.d.ts +169 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +690 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/codegraph.d.ts +17 -0
- package/dist/cli/commands/codegraph.d.ts.map +1 -0
- package/dist/cli/commands/codegraph.js +263 -0
- package/dist/cli/commands/codegraph.js.map +1 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -1
- package/dist/cli/commands/decisions.js +46 -9
- package/dist/cli/commands/decisions.js.map +1 -1
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +2 -1
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/insights-goal-check.d.ts +5 -1
- package/dist/cli/commands/insights-goal-check.d.ts.map +1 -1
- package/dist/cli/commands/insights-goal-check.js +15 -15
- package/dist/cli/commands/insights-goal-check.js.map +1 -1
- package/dist/cli/commands/knowledge.d.ts +51 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -1
- package/dist/cli/commands/knowledge.js +202 -29
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/loop.d.ts +95 -0
- package/dist/cli/commands/loop.d.ts.map +1 -0
- package/dist/cli/commands/loop.js +408 -0
- package/dist/cli/commands/loop.js.map +1 -0
- package/dist/cli/commands/maintenance.d.ts +33 -0
- package/dist/cli/commands/maintenance.d.ts.map +1 -0
- package/dist/cli/commands/maintenance.js +75 -0
- package/dist/cli/commands/maintenance.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +23 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +82 -0
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/skills.d.ts +131 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +409 -9
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +9 -2
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/constants.d.ts +37 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +43 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/diagnostics/checks.d.ts.map +1 -1
- package/dist/core/diagnostics/checks.js +2 -1
- package/dist/core/diagnostics/checks.js.map +1 -1
- package/dist/core/diagnostics/daemon-status.d.ts +1 -1
- package/dist/core/diagnostics/daemon-status.d.ts.map +1 -1
- package/dist/core/diagnostics/daemon-status.js +1 -1
- package/dist/core/diagnostics/daemon-status.js.map +1 -1
- package/dist/core/diagnostics/entropy-checks.d.ts +3 -2
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -1
- package/dist/core/diagnostics/entropy-checks.js +10 -5
- package/dist/core/diagnostics/entropy-checks.js.map +1 -1
- package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
- package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
- package/dist/core/diagnostics/heartbeat-reader.js +50 -0
- package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
- package/dist/core/event-fields.d.ts +27 -0
- package/dist/core/event-fields.d.ts.map +1 -1
- package/dist/core/event-fields.js +43 -0
- package/dist/core/event-fields.js.map +1 -1
- package/dist/core/governance/global-inject.d.ts +34 -4
- package/dist/core/governance/global-inject.d.ts.map +1 -1
- package/dist/core/governance/global-inject.js +80 -25
- package/dist/core/governance/global-inject.js.map +1 -1
- package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
- package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
- package/dist/core/insights/agent-anchor-guard.js +119 -0
- package/dist/core/insights/agent-anchor-guard.js.map +1 -0
- package/dist/core/insights/agent-distill-context.d.ts +55 -0
- package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-context.js +146 -0
- package/dist/core/insights/agent-distill-context.js.map +1 -0
- package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
- package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-spawn.js +179 -0
- package/dist/core/insights/agent-distill-spawn.js.map +1 -0
- package/dist/core/insights/agent-drift.d.ts +66 -0
- package/dist/core/insights/agent-drift.d.ts.map +1 -0
- package/dist/core/insights/agent-drift.js +109 -0
- package/dist/core/insights/agent-drift.js.map +1 -0
- package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
- package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
- package/dist/core/insights/agent-evolution-sources.js +36 -0
- package/dist/core/insights/agent-evolution-sources.js.map +1 -0
- package/dist/core/insights/agent-health.d.ts +142 -0
- package/dist/core/insights/agent-health.d.ts.map +1 -0
- package/dist/core/insights/agent-health.js +296 -0
- package/dist/core/insights/agent-health.js.map +1 -0
- package/dist/core/insights/agent-patch-apply.d.ts +45 -0
- package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
- package/dist/core/insights/agent-patch-apply.js +165 -0
- package/dist/core/insights/agent-patch-apply.js.map +1 -0
- package/dist/core/insights/agent-suggest.d.ts +128 -0
- package/dist/core/insights/agent-suggest.d.ts.map +1 -0
- package/dist/core/insights/agent-suggest.js +284 -0
- package/dist/core/insights/agent-suggest.js.map +1 -0
- package/dist/core/insights/coverage-tiers.d.ts +46 -0
- package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
- package/dist/core/insights/coverage-tiers.js +95 -0
- package/dist/core/insights/coverage-tiers.js.map +1 -0
- package/dist/{daemon/services → core/insights}/experience-extractor.d.ts +0 -7
- package/dist/core/insights/experience-extractor.d.ts.map +1 -0
- package/dist/{daemon/services → core/insights}/experience-extractor.js +5 -9
- package/dist/core/insights/experience-extractor.js.map +1 -0
- package/dist/{daemon/services → core/insights}/violation-reporter.d.ts +20 -1
- package/dist/core/insights/violation-reporter.d.ts.map +1 -0
- package/dist/{daemon/services → core/insights}/violation-reporter.js +56 -4
- package/dist/core/insights/violation-reporter.js.map +1 -0
- package/dist/core/loop/loop-engine.d.ts +140 -0
- package/dist/core/loop/loop-engine.d.ts.map +1 -0
- package/dist/core/loop/loop-engine.js +266 -0
- package/dist/core/loop/loop-engine.js.map +1 -0
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +2 -1
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +159 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +523 -0
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/codegraph-types.d.ts +79 -0
- package/dist/core/storage/codegraph-types.d.ts.map +1 -0
- package/dist/core/storage/codegraph-types.js +14 -0
- package/dist/core/storage/codegraph-types.js.map +1 -0
- package/dist/core/storage/codegraph.d.ts +186 -0
- package/dist/core/storage/codegraph.d.ts.map +1 -0
- package/dist/core/storage/codegraph.js +452 -0
- package/dist/core/storage/codegraph.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +30 -5
- package/dist/core/storage/decisions.d.ts.map +1 -1
- package/dist/core/storage/decisions.js +45 -13
- package/dist/core/storage/decisions.js.map +1 -1
- package/dist/core/storage/events.d.ts +127 -0
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +318 -3
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +3 -23
- package/dist/core/storage/feedback.d.ts.map +1 -1
- package/dist/core/storage/feedback.js +37 -38
- package/dist/core/storage/feedback.js.map +1 -1
- package/dist/core/storage/injections.d.ts +40 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +69 -0
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +226 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -1
- package/dist/core/storage/knowledge.js +391 -4
- package/dist/core/storage/knowledge.js.map +1 -1
- package/dist/core/storage/pipeline-rollup.d.ts +1 -7
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -1
- package/dist/core/storage/pipeline-rollup.js +18 -57
- package/dist/core/storage/pipeline-rollup.js.map +1 -1
- package/dist/core/storage/routing.d.ts +34 -0
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +92 -2
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +5 -25
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +92 -27
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +2 -1
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +159 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +350 -4
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +81 -25
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +143 -45
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +270 -0
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +495 -16
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/tool-intercepts.d.ts +1 -1
- package/dist/core/storage/tool-intercepts.js +1 -1
- package/dist/core/types.d.ts +26 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/binary-paths.d.ts +32 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -1
- package/dist/core/utils/binary-paths.js +52 -0
- package/dist/core/utils/binary-paths.js.map +1 -1
- package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
- package/dist/{skills/distill → core/utils}/claude-cli-resolver.js +1 -1
- package/dist/core/utils/claude-cli-resolver.js.map +1 -0
- package/dist/core/utils/claude-cli-spawn.d.ts +1 -1
- package/dist/core/utils/claude-cli-spawn.js +2 -2
- package/dist/core/utils/claude-cli-spawn.js.map +1 -1
- package/dist/core/utils/noise-prompt.d.ts +1 -1
- package/dist/core/utils/noise-prompt.js +1 -1
- package/dist/core/utils/time.d.ts +26 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +33 -0
- package/dist/core/utils/time.js.map +1 -1
- package/dist/daemon/config-store.d.ts.map +1 -1
- package/dist/daemon/config-store.js +14 -5
- package/dist/daemon/config-store.js.map +1 -1
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +5 -0
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +24 -16
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +76 -116
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +35 -10
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.js +71 -38
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +20 -0
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +96 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +16 -1
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +97 -56
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
- package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
- package/dist/daemon/handlers/violation-content-backfill.js +167 -0
- package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
- package/dist/daemon/index.d.ts +19 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +125 -200
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/rules/defaults.d.ts.map +1 -1
- package/dist/daemon/rules/defaults.js +151 -64
- package/dist/daemon/rules/defaults.js.map +1 -1
- package/dist/daemon/rules/types.d.ts +28 -22
- package/dist/daemon/rules/types.d.ts.map +1 -1
- package/dist/daemon/rules/workflow-defaults.js +9 -9
- package/dist/daemon/rules/workflow-defaults.js.map +1 -1
- package/dist/daemon/services/codegraph-sync.d.ts +94 -0
- package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
- package/dist/daemon/services/codegraph-sync.js +159 -0
- package/dist/daemon/services/codegraph-sync.js.map +1 -0
- package/dist/daemon/services/decision-hint.d.ts +47 -10
- package/dist/daemon/services/decision-hint.d.ts.map +1 -1
- package/dist/daemon/services/decision-hint.js +99 -24
- package/dist/daemon/services/decision-hint.js.map +1 -1
- package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -1
- package/dist/daemon/services/event-ttl-sweep.js +3 -2
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -1
- package/dist/daemon/services/feedback-aggregator.d.ts +14 -26
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -1
- package/dist/daemon/services/feedback-aggregator.js +23 -63
- package/dist/daemon/services/feedback-aggregator.js.map +1 -1
- package/dist/daemon/services/heartbeat-writer.d.ts +6 -15
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -1
- package/dist/daemon/services/heartbeat-writer.js +7 -36
- package/dist/daemon/services/heartbeat-writer.js.map +1 -1
- package/dist/daemon/services/kb-injector.d.ts +1 -1
- package/dist/daemon/services/kb-injector.d.ts.map +1 -1
- package/dist/daemon/services/kb-injector.js +10 -2
- package/dist/daemon/services/kb-injector.js.map +1 -1
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
- package/dist/daemon/services/loop-hint.d.ts +139 -0
- package/dist/daemon/services/loop-hint.d.ts.map +1 -0
- package/dist/daemon/services/loop-hint.js +272 -0
- package/dist/daemon/services/loop-hint.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.js +1 -1
- package/dist/daemon/services/outcome-classification-service.js.map +1 -1
- package/dist/daemon/services/task-segmenter.d.ts +11 -0
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +48 -2
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
- package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
- package/dist/daemon/startup/maintenance-schedulers.js +294 -0
- package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
- package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
- package/dist/daemon/templates/agents/claudemd-writer.md +1 -0
- package/dist/daemon/templates/agents/coder.md +165 -8
- package/dist/daemon/templates/agents/decision-maker.md +107 -21
- package/dist/daemon/templates/agents/doc-reviewer.md +4 -1
- package/dist/daemon/templates/agents/harness-debug-full.md +85 -3
- package/dist/daemon/templates/agents/knowledge-builder.md +1 -0
- package/dist/daemon/templates/agents/patch-applier.md +1 -0
- package/dist/daemon/templates/agents/planner.md +55 -3
- package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
- package/dist/daemon/templates/agents/skill-distiller.md +1 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +1 -0
- package/dist/daemon/templates/agents/verify-agent.md +128 -5
- package/dist/hooks/stop.sh +7 -1
- package/dist/knowledge/builder.js +36 -7
- package/dist/knowledge/builder.js.map +1 -1
- package/dist/knowledge/constants.d.ts +10 -5
- package/dist/knowledge/constants.d.ts.map +1 -1
- package/dist/knowledge/constants.js +10 -5
- package/dist/knowledge/constants.js.map +1 -1
- package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
- package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
- package/dist/knowledge/graph/edge-extractor.js +242 -0
- package/dist/knowledge/graph/edge-extractor.js.map +1 -0
- package/dist/knowledge/graph/impact.d.ts +73 -0
- package/dist/knowledge/graph/impact.d.ts.map +1 -0
- package/dist/knowledge/graph/impact.js +94 -0
- package/dist/knowledge/graph/impact.js.map +1 -0
- package/dist/knowledge/graph/types.d.ts +22 -0
- package/dist/knowledge/graph/types.d.ts.map +1 -0
- package/dist/knowledge/graph/types.js +13 -0
- package/dist/knowledge/graph/types.js.map +1 -0
- package/dist/knowledge/prompt.d.ts +9 -0
- package/dist/knowledge/prompt.d.ts.map +1 -1
- package/dist/knowledge/prompt.js +17 -5
- package/dist/knowledge/prompt.js.map +1 -1
- package/dist/knowledge/query.d.ts +13 -0
- package/dist/knowledge/query.d.ts.map +1 -1
- package/dist/knowledge/query.js +107 -10
- package/dist/knowledge/query.js.map +1 -1
- package/dist/knowledge/repo-map.d.ts +11 -5
- package/dist/knowledge/repo-map.d.ts.map +1 -1
- package/dist/knowledge/repo-map.js +42 -3
- package/dist/knowledge/repo-map.js.map +1 -1
- package/dist/knowledge/validator.d.ts.map +1 -1
- package/dist/knowledge/validator.js +69 -2
- package/dist/knowledge/validator.js.map +1 -1
- package/dist/mcp/server.d.ts +64 -8
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +233 -18
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/distill/distiller.js +1 -1
- package/dist/skills/distill/distiller.js.map +1 -1
- package/dist/skills/distilled/distilled-api-design.md +4 -0
- package/dist/skills/distilled/distilled-brainstorming.md +79 -0
- package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
- package/dist/skills/distilled/distilled-canvas-design.md +128 -0
- package/dist/skills/distilled/distilled-claude-api.md +185 -0
- package/dist/skills/distilled/distilled-creator.md +5 -2
- package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
- package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
- package/dist/skills/distilled/distilled-docx.md +231 -0
- package/dist/skills/distilled/distilled-executing-plans.md +85 -50
- package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
- package/dist/skills/distilled/distilled-frontend-design.md +118 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +1 -1
- package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
- package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +108 -260
- package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
- package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +88 -78
- package/dist/skills/distilled/distilled-writing-skills.md +175 -0
- package/dist/skills/registry.d.ts +10 -50
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +7 -118
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +2 -2
- package/dist/skills/tools/pipeline-suggest.js.map +1 -1
- package/dist/skills/tools/skill-invoke.d.ts +2 -1
- package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
- package/dist/skills/tools/skill-invoke.js +3 -1
- package/dist/skills/tools/skill-invoke.js.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.js +6 -1
- package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
- package/dist/web/analytics/drift-detector.d.ts +6 -0
- package/dist/web/analytics/drift-detector.d.ts.map +1 -1
- package/dist/web/analytics/drift-detector.js +15 -8
- package/dist/web/analytics/drift-detector.js.map +1 -1
- package/dist/web/analytics/weekly-report.d.ts +13 -0
- package/dist/web/analytics/weekly-report.d.ts.map +1 -1
- package/dist/web/analytics/weekly-report.js +17 -3
- package/dist/web/analytics/weekly-report.js.map +1 -1
- package/dist/web/routes/_helpers.d.ts +31 -0
- package/dist/web/routes/_helpers.d.ts.map +1 -1
- package/dist/web/routes/_helpers.js +33 -0
- package/dist/web/routes/_helpers.js.map +1 -1
- package/dist/web/routes/agent-distill.d.ts +49 -0
- package/dist/web/routes/agent-distill.d.ts.map +1 -0
- package/dist/web/routes/agent-distill.js +526 -0
- package/dist/web/routes/agent-distill.js.map +1 -0
- package/dist/web/routes/config.d.ts +56 -0
- package/dist/web/routes/config.d.ts.map +1 -0
- package/dist/web/routes/config.js +243 -0
- package/dist/web/routes/config.js.map +1 -0
- package/dist/web/routes/decisions.js +1 -1
- package/dist/web/routes/decisions.js.map +1 -1
- package/dist/web/routes/error-handler.d.ts +0 -4
- package/dist/web/routes/error-handler.d.ts.map +1 -1
- package/dist/web/routes/error-handler.js +0 -8
- package/dist/web/routes/error-handler.js.map +1 -1
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +2 -1
- package/dist/web/routes/events.js.map +1 -1
- package/dist/web/routes/insights.d.ts.map +1 -1
- package/dist/web/routes/insights.js +0 -0
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +43 -2
- package/dist/web/routes/knowledge.d.ts.map +1 -1
- package/dist/web/routes/knowledge.js +117 -6
- package/dist/web/routes/knowledge.js.map +1 -1
- package/dist/web/routes/pipeline.d.ts +0 -9
- package/dist/web/routes/pipeline.d.ts.map +1 -1
- package/dist/web/routes/pipeline.js +0 -4
- package/dist/web/routes/pipeline.js.map +1 -1
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +20 -6
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +8 -7
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-stats.d.ts.map +1 -1
- package/dist/web/routes/skill-stats.js +153 -16
- package/dist/web/routes/skill-stats.js.map +1 -1
- package/dist/web/routes/skills-distill.js +1 -1
- package/dist/web/routes/skills-distill.js.map +1 -1
- package/dist/web/routes/stats.d.ts.map +1 -1
- package/dist/web/routes/stats.js +2 -1
- package/dist/web/routes/stats.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +95 -19
- package/dist/web/routes/task-timeline.d.ts.map +1 -1
- package/dist/web/routes/task-timeline.js +344 -88
- package/dist/web/routes/task-timeline.js.map +1 -1
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +52 -30
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/violations.d.ts +1 -1
- package/dist/web/routes/violations.d.ts.map +1 -1
- package/dist/web/routes/violations.js +3 -2
- package/dist/web/routes/violations.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +20 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/agent-distill-manager.d.ts +122 -0
- package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
- package/dist/web/services/agent-distill-manager.js +397 -0
- package/dist/web/services/agent-distill-manager.js.map +1 -0
- package/dist/web/services/distill-manager.d.ts +47 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -1
- package/dist/web/services/distill-manager.js +103 -0
- package/dist/web/services/distill-manager.js.map +1 -1
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
- package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js → MarkdownRenderer-DlDQNihj.js} +2 -2
- package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js.map → MarkdownRenderer-DlDQNihj.js.map} +1 -1
- package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
- package/dist/web/static/assets/{NotFound-BQPh0vaF.js.map → NotFound-LMzbP51V.js.map} +1 -1
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
- package/dist/web/static/assets/{index-7bl3kbcx.css → index-B_v_MKlb.css} +1 -1
- package/dist/web/static/assets/index-DileOOE4.js +4 -0
- package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
- package/dist/web/static/assets/{outcome-DUn1NjlC.js → outcome-BKGy9azt.js} +2 -2
- package/dist/web/static/assets/{outcome-DUn1NjlC.js.map → outcome-BKGy9azt.js.map} +1 -1
- package/dist/web/static/assets/{query-S6X1S7K9.js → query-CgCOpYWf.js} +2 -2
- package/dist/web/static/assets/{query-S6X1S7K9.js.map → query-CgCOpYWf.js.map} +1 -1
- package/dist/web/static/assets/{react-router-JVUrkhdd.js → react-router-Cxmg8RuL.js} +3 -3
- package/dist/web/static/assets/{react-router-JVUrkhdd.js.map → react-router-Cxmg8RuL.js.map} +1 -1
- package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js → syntax-highlighter-BDYycNja.js} +3 -3
- package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js.map → syntax-highlighter-BDYycNja.js.map} +1 -1
- package/dist/web/static/assets/task-title-BhOcemuR.js +2 -0
- package/dist/web/static/assets/task-title-BhOcemuR.js.map +1 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
- package/dist/web/static/index.html +6 -6
- package/package.json +5 -3
- package/dist/core/storage/workflow-recommendations.d.ts +0 -124
- package/dist/core/storage/workflow-recommendations.d.ts.map +0 -1
- package/dist/core/storage/workflow-recommendations.js +0 -274
- package/dist/core/storage/workflow-recommendations.js.map +0 -1
- package/dist/daemon/services/experience-extractor.d.ts.map +0 -1
- package/dist/daemon/services/experience-extractor.js.map +0 -1
- package/dist/daemon/services/violation-reporter.d.ts.map +0 -1
- package/dist/daemon/services/violation-reporter.js.map +0 -1
- package/dist/daemon/templates/agents/harness-hotfix.md +0 -99
- package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +0 -104
- package/dist/daemon/templates/agents/refactor-specialist.md +0 -98
- package/dist/skills/distill/claude-cli-resolver.d.ts.map +0 -1
- package/dist/skills/distill/claude-cli-resolver.js.map +0 -1
- package/dist/skills/distilled/distilled-defi-amm-security.md +0 -293
- package/dist/skills/keyword-score.d.ts +0 -29
- package/dist/skills/keyword-score.d.ts.map +0 -1
- package/dist/skills/keyword-score.js +0 -54
- package/dist/skills/keyword-score.js.map +0 -1
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +0 -2
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +0 -1
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +0 -2
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +0 -1
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +0 -3
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +0 -1
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +0 -2
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +0 -1
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +0 -2
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +0 -1
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +0 -2
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +0 -1
- package/dist/web/static/assets/DriftTab-DqpepOhI.js +0 -2
- package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +0 -1
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +0 -3
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +0 -1
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +0 -2
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +0 -1
- package/dist/web/static/assets/NotFound-BQPh0vaF.js +0 -2
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +0 -2
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +0 -1
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +0 -2
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +0 -1
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +0 -2
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +0 -1
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +0 -2
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +0 -1
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +0 -2
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +0 -1
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +0 -6
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +0 -1
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +0 -3
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +0 -1
- package/dist/web/static/assets/arco-Bhi3a6Qp.js +0 -14
- package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +0 -1
- package/dist/web/static/assets/charts-BuHQWDbQ.js +0 -37
- package/dist/web/static/assets/charts-BuHQWDbQ.js.map +0 -1
- package/dist/web/static/assets/index-BIYnq1Dx.js +0 -4
- package/dist/web/static/assets/index-BIYnq1Dx.js.map +0 -1
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js +0 -2
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +0 -1
- package/dist/web/static/assets/vendor-DWgdB1eY.js +0 -65
- package/dist/web/static/assets/vendor-DWgdB1eY.js.map +0 -1
- /package/dist/{skills/distill → core/utils}/claude-cli-resolver.d.ts +0 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* maintenance-schedulers — daemon startup phase: the periodic maintenance
|
|
3
|
+
* scheduler cluster, extracted from the `startDaemon` god-function.
|
|
4
|
+
*
|
|
5
|
+
* Wave 3a R3 (decision 7c881393). BEHAVIOR-PRESERVING extraction: this module
|
|
6
|
+
* contains the exact same scheduling logic that previously lived inline in
|
|
7
|
+
* `src/daemon/index.ts` §5.5–§5.8 — same cadences, same shared maintenance
|
|
8
|
+
* mutex, same fail-silent error handling, same `unref()` on the one-shot
|
|
9
|
+
* timeouts, same teardown set cleared on graceful shutdown.
|
|
10
|
+
*
|
|
11
|
+
* Shape mirrors the established `startHeartbeat(opts): HeartbeatHandle`
|
|
12
|
+
* precedent (src/daemon/services/heartbeat-writer.ts): a factory that takes
|
|
13
|
+
* explicit deps, wires its `setInterval`/`setTimeout` timers, and returns a
|
|
14
|
+
* handle whose `.stop()` clears every timer. `startDaemon` becomes a thin
|
|
15
|
+
* orchestrator: one `startMaintenanceSchedulers(...)` call + one
|
|
16
|
+
* `handle.stop()` in `shutdown()`.
|
|
17
|
+
*
|
|
18
|
+
* The shared `isMaintenanceRunning` flag — previously a module-level `let` in
|
|
19
|
+
* index.ts — is now factory-local closure state. This preserves the original
|
|
20
|
+
* single-mutex invariant (all callbacks created by one factory invocation
|
|
21
|
+
* share one flag) while making the cluster independently unit-testable with
|
|
22
|
+
* fake timers and no live socket / DB-heavy daemon boot.
|
|
23
|
+
*/
|
|
24
|
+
import { logger } from '../../core/utils/logger.js';
|
|
25
|
+
import { sweepIdleSessions } from '../services/idle-session-sweeper.js';
|
|
26
|
+
import { sweepInterceptTimeouts } from '../services/intercept-timeout-sweeper.js';
|
|
27
|
+
import { sweepEventTtl, resolveSweepConfig, DEFAULTS as TTL_DEFAULTS, } from '../services/event-ttl-sweep.js';
|
|
28
|
+
import { syncCodeGraph, resolveSyncIntervalMinutes, } from '../services/codegraph-sync.js';
|
|
29
|
+
import { runKbRebuildCheck, resolveRebuildConfig, } from '../services/kb-rebuild-scheduler.js';
|
|
30
|
+
const MAINTENANCE_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
|
|
31
|
+
const VACUUM_INTERVAL = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
32
|
+
const STALE_TASK_GC_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
|
33
|
+
const STALE_TASK_IDLE_MINUTES = 10; // idle > 10min ⇒ stale
|
|
34
|
+
/**
|
|
35
|
+
* Wire the daemon's periodic maintenance schedulers.
|
|
36
|
+
*
|
|
37
|
+
* Side effects are identical to the previous inline §5.5–§5.8 in
|
|
38
|
+
* `startDaemon`: it registers six recurring `setInterval`s and four
|
|
39
|
+
* `unref()`-ed one-shot `setTimeout`s, all sharing one maintenance mutex, and
|
|
40
|
+
* logs the same boot lines. Returns a handle whose `.stop()` clears them all.
|
|
41
|
+
*/
|
|
42
|
+
export function startMaintenanceSchedulers(deps) {
|
|
43
|
+
const { storage, configStore, taskSegmenter, codegraphStore, codegraphSrcDir, codegraphMtimeCache, kbProjectRoot, ensureKbBuildManager, } = deps;
|
|
44
|
+
// F12: factory-local mutex shared by all maintenance handlers. Prevents
|
|
45
|
+
// SQLite "database is locked" when sleep/wake fires multiple cron timers in
|
|
46
|
+
// the same tick. Pure JS flag — single-threaded event loop keeps
|
|
47
|
+
// check-and-set atomic.
|
|
48
|
+
let isMaintenanceRunning = false;
|
|
49
|
+
// ── 5.5. Schedule daily maintenance ──────────────────────────────────────
|
|
50
|
+
const maintenanceInterval = setInterval(() => {
|
|
51
|
+
if (isMaintenanceRunning) {
|
|
52
|
+
logger.warn('[Daemon] maintenance already running, skipping daily cron');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
isMaintenanceRunning = true;
|
|
56
|
+
try {
|
|
57
|
+
logger.info('[Daemon] Running daily maintenance: cleaning old fact-table data');
|
|
58
|
+
try {
|
|
59
|
+
const r = storage.cleanOldData(30);
|
|
60
|
+
logger.info(`[Daemon] cleanOldData: events=${r.events}, taskEvents=${r.taskEvents}, routing=${r.routing}, skills=${r.skills}`);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
logger.error(`[Daemon] Maintenance failed: ${err}`);
|
|
64
|
+
}
|
|
65
|
+
// Phase 9.5: sweep idle un-classified sessions (no Stop hook fired).
|
|
66
|
+
try {
|
|
67
|
+
const s = sweepIdleSessions(storage);
|
|
68
|
+
if (s.swept > 0 || s.errors > 0) {
|
|
69
|
+
logger.info(`[Daemon] idleSweeper: scanned=${s.scanned} swept=${s.swept} errors=${s.errors}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
logger.error(`[Daemon] idleSweeper failed: ${err}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
isMaintenanceRunning = false;
|
|
78
|
+
}
|
|
79
|
+
}, MAINTENANCE_INTERVAL);
|
|
80
|
+
logger.info('[Daemon] Scheduled daily maintenance (clean fact-table data older than 30 days)');
|
|
81
|
+
// Run initial cleanup 60s after startup (covers frequent-restart scenarios)
|
|
82
|
+
const initialCleanupTimeout = setTimeout(() => {
|
|
83
|
+
try {
|
|
84
|
+
const r = storage.cleanOldData(30);
|
|
85
|
+
const total = r.events + r.taskEvents + r.routing + r.skills;
|
|
86
|
+
if (total > 0) {
|
|
87
|
+
logger.info(`[Daemon] Initial cleanup: events=${r.events}, taskEvents=${r.taskEvents}, routing=${r.routing}, skills=${r.skills}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
logger.warn(`[Daemon] Initial cleanup failed: ${err}`);
|
|
92
|
+
}
|
|
93
|
+
// Phase 9.5: also run an initial sweep at startup so frequent daemon
|
|
94
|
+
// restarts don't let abandoned sessions accumulate for a full day.
|
|
95
|
+
try {
|
|
96
|
+
const s = sweepIdleSessions(storage);
|
|
97
|
+
if (s.swept > 0 || s.errors > 0) {
|
|
98
|
+
logger.info(`[Daemon] Initial idleSweeper: scanned=${s.scanned} swept=${s.swept} errors=${s.errors}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger.warn(`[Daemon] Initial idleSweeper failed: ${err}`);
|
|
103
|
+
}
|
|
104
|
+
}, 60_000);
|
|
105
|
+
initialCleanupTimeout.unref?.();
|
|
106
|
+
// ── 5.5.1. Schedule weekly VACUUM (every 7 days) ──────────────────────────
|
|
107
|
+
const vacuumInterval = setInterval(() => {
|
|
108
|
+
if (isMaintenanceRunning) {
|
|
109
|
+
logger.warn('[Daemon] maintenance already running, skipping weekly VACUUM');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
isMaintenanceRunning = true;
|
|
113
|
+
try {
|
|
114
|
+
// 500 MB 阈值:低于此值不 VACUUM(避免空转的 fsync 抖动)。
|
|
115
|
+
storage.runMaintenance(500);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
logger.error(`[Daemon] VACUUM failed: ${err}`);
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
isMaintenanceRunning = false;
|
|
122
|
+
}
|
|
123
|
+
}, VACUUM_INTERVAL);
|
|
124
|
+
logger.info('[Daemon] Scheduled weekly VACUUM (threshold: 500MB)');
|
|
125
|
+
// ── 5.5.2. Event TTL sweep (db-size optimization 2026-05-26) ──────────────
|
|
126
|
+
const ttlSweepCfg = resolveSweepConfig(configStore);
|
|
127
|
+
const ttlSweepIntervalHours = (() => {
|
|
128
|
+
const raw = configStore.get('events.sweep_interval_hours');
|
|
129
|
+
const n = raw === undefined ? TTL_DEFAULTS.sweepIntervalHours : Number(raw);
|
|
130
|
+
return Number.isFinite(n) && n > 0 ? n : TTL_DEFAULTS.sweepIntervalHours;
|
|
131
|
+
})();
|
|
132
|
+
const EVENT_TTL_INTERVAL = ttlSweepIntervalHours * 60 * 60 * 1000;
|
|
133
|
+
const eventTtlInterval = setInterval(() => {
|
|
134
|
+
if (isMaintenanceRunning) {
|
|
135
|
+
logger.warn('[Daemon] maintenance already running, skipping event TTL sweep');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
isMaintenanceRunning = true;
|
|
139
|
+
try {
|
|
140
|
+
const r = sweepEventTtl(storage, configStore);
|
|
141
|
+
if (r.warmedNull > 0 || r.coldDeleted > 0) {
|
|
142
|
+
logger.info(`[EventTTL] sweep: warmedNull=${r.warmedNull} coldDeleted=${r.coldDeleted} taskEventsPruned=${r.taskEventsPruned} morePending=${r.morePending}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
logger.error(`[EventTTL] sweep failed: ${err}`);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
isMaintenanceRunning = false;
|
|
150
|
+
}
|
|
151
|
+
}, EVENT_TTL_INTERVAL);
|
|
152
|
+
logger.info(`[Daemon] Scheduled event TTL sweep every ${ttlSweepIntervalHours}h (warm=${ttlSweepCfg.warmTtlDays}d, cold=${ttlSweepCfg.coldTtlDays}d)`);
|
|
153
|
+
// Initial event TTL sweep ~90s after startup so frequent daemon restarts
|
|
154
|
+
// don't sit on backlog for a full interval.
|
|
155
|
+
const initialEventTtlTimeout = setTimeout(() => {
|
|
156
|
+
if (isMaintenanceRunning)
|
|
157
|
+
return;
|
|
158
|
+
isMaintenanceRunning = true;
|
|
159
|
+
try {
|
|
160
|
+
const r = sweepEventTtl(storage, configStore);
|
|
161
|
+
if (r.warmedNull > 0 || r.coldDeleted > 0) {
|
|
162
|
+
logger.info(`[EventTTL] initial sweep: warmedNull=${r.warmedNull} coldDeleted=${r.coldDeleted} taskEventsPruned=${r.taskEventsPruned}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
logger.warn(`[EventTTL] initial sweep failed: ${err}`);
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
isMaintenanceRunning = false;
|
|
170
|
+
}
|
|
171
|
+
}, 90_000);
|
|
172
|
+
initialEventTtlTimeout.unref?.();
|
|
173
|
+
// ── 5.6. Stale task GC (every 5 minutes) ──────────────────────────────────
|
|
174
|
+
const staleTaskGcInterval = setInterval(() => {
|
|
175
|
+
if (isMaintenanceRunning) {
|
|
176
|
+
logger.warn('[Maintenance] maintenance already running, skipping stale task GC');
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
isMaintenanceRunning = true;
|
|
180
|
+
try {
|
|
181
|
+
const closed = storage.completeStaleActiveTasks(STALE_TASK_IDLE_MINUTES);
|
|
182
|
+
if (closed.length > 0) {
|
|
183
|
+
// decision c6613590 P0 缺陷 B: evict GC'd tasks from the segmenter's
|
|
184
|
+
// in-memory currentTasks map so no dangling pointer keeps dragging a
|
|
185
|
+
// closed task's end_time forward (which merged independent prompts).
|
|
186
|
+
const evicted = taskSegmenter.evictTasks(closed);
|
|
187
|
+
logger.info(`[Maintenance] Auto-completed ${closed.length} stale active task(s)` +
|
|
188
|
+
` (evicted ${evicted} from in-memory map)`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
logger.error(`[Maintenance] Stale task GC failed: ${err}`);
|
|
193
|
+
}
|
|
194
|
+
// C4 hotfix (2026-05-26): backfill NULL-outcome deny/dry_run rows that
|
|
195
|
+
// aged past the 1h grace beyond the 30s PostToolUse window.
|
|
196
|
+
try {
|
|
197
|
+
const s = sweepInterceptTimeouts(storage);
|
|
198
|
+
if (s.swept > 0) {
|
|
199
|
+
logger.info(`[Maintenance] InterceptTimeoutSweeper: swept ${s.swept} NULL → obeyed (passive obey)`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
logger.error(`[Maintenance] InterceptTimeoutSweeper failed: ${err}`);
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
isMaintenanceRunning = false;
|
|
207
|
+
}
|
|
208
|
+
}, STALE_TASK_GC_INTERVAL);
|
|
209
|
+
// ── 5.7. codegraph incremental sync (decision 95df9d97, Phase 3) ──────────
|
|
210
|
+
const codegraphSyncMinutes = resolveSyncIntervalMinutes(configStore);
|
|
211
|
+
const CODEGRAPH_SYNC_INTERVAL = codegraphSyncMinutes * 60 * 1000;
|
|
212
|
+
const runCodegraphSync = (label) => {
|
|
213
|
+
if (isMaintenanceRunning) {
|
|
214
|
+
logger.warn(`[codegraph-sync] maintenance already running, skipping ${label}`);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
isMaintenanceRunning = true;
|
|
218
|
+
try {
|
|
219
|
+
const r = syncCodeGraph(codegraphStore, codegraphSrcDir, codegraphMtimeCache);
|
|
220
|
+
if (r.changedFiles.length > 0) {
|
|
221
|
+
logger.info(`[codegraph-sync] ${label}: rewrote ${r.changedFiles.length} changed file(s), ` +
|
|
222
|
+
`${r.unchangedCount} unchanged, ${r.staleFiles.length} stale, scanned ${r.scannedCount}`);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
logger.debug(`[codegraph-sync] ${label}: no changes (${r.scannedCount} files scanned)`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
logger.error(`[codegraph-sync] ${label} failed: ${err}`);
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
isMaintenanceRunning = false;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
const codegraphSyncInterval = setInterval(() => runCodegraphSync('sync'), CODEGRAPH_SYNC_INTERVAL);
|
|
236
|
+
logger.info(`[Daemon] Scheduled codegraph incremental sync every ${codegraphSyncMinutes}m`);
|
|
237
|
+
// Initial sync ~120s after startup so a fresh/rebuilt graph reflects edits
|
|
238
|
+
// made while the daemon was down, without blocking boot.
|
|
239
|
+
const initialCodegraphSyncTimeout = setTimeout(() => runCodegraphSync('initial sync'), 120_000);
|
|
240
|
+
initialCodegraphSyncTimeout.unref?.();
|
|
241
|
+
// ── 5.8. KB auto-rebuild scheduler (decision e888352d) ────────────────────
|
|
242
|
+
const runKbRebuild = async (label) => {
|
|
243
|
+
if (isMaintenanceRunning) {
|
|
244
|
+
logger.debug(`[kb-rebuild] maintenance already running, skipping ${label}`);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
isMaintenanceRunning = true;
|
|
248
|
+
try {
|
|
249
|
+
const bm = await ensureKbBuildManager();
|
|
250
|
+
runKbRebuildCheck(storage, configStore, kbProjectRoot, {
|
|
251
|
+
isBuildBusy: () => bm.isBusy(),
|
|
252
|
+
triggerBuild: (projectRoot) => {
|
|
253
|
+
bm.start({ projectRoot, apply: true });
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
// fail-silent: a scheduler error must never disrupt the daemon.
|
|
259
|
+
logger.warn(`[kb-rebuild] ${label} failed: ${err}`);
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
262
|
+
isMaintenanceRunning = false;
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
const kbRebuildConfig = resolveRebuildConfig(configStore);
|
|
266
|
+
const KB_REBUILD_CHECK_INTERVAL = kbRebuildConfig.checkIntervalHours * 60 * 60 * 1000;
|
|
267
|
+
const kbRebuildInterval = setInterval(() => {
|
|
268
|
+
void runKbRebuild('check');
|
|
269
|
+
}, KB_REBUILD_CHECK_INTERVAL);
|
|
270
|
+
kbRebuildInterval.unref?.();
|
|
271
|
+
logger.info(`[Daemon] Scheduled KB auto-rebuild check every ${kbRebuildConfig.checkIntervalHours}h ` +
|
|
272
|
+
`(enabled=${kbRebuildConfig.enabled}, stale>=${kbRebuildConfig.staleThresholdDays}d)`);
|
|
273
|
+
// Initial check ~180s after startup (after codegraph's 120s) so a daemon that
|
|
274
|
+
// booted onto a stale index repairs itself without blocking boot.
|
|
275
|
+
const initialKbRebuildTimeout = setTimeout(() => {
|
|
276
|
+
void runKbRebuild('initial check');
|
|
277
|
+
}, 180_000);
|
|
278
|
+
initialKbRebuildTimeout.unref?.();
|
|
279
|
+
return {
|
|
280
|
+
stop: () => {
|
|
281
|
+
clearInterval(maintenanceInterval);
|
|
282
|
+
clearInterval(vacuumInterval);
|
|
283
|
+
clearInterval(staleTaskGcInterval);
|
|
284
|
+
clearInterval(eventTtlInterval);
|
|
285
|
+
clearInterval(codegraphSyncInterval);
|
|
286
|
+
clearInterval(kbRebuildInterval);
|
|
287
|
+
clearTimeout(initialCleanupTimeout);
|
|
288
|
+
clearTimeout(initialEventTtlTimeout);
|
|
289
|
+
clearTimeout(initialCodegraphSyncTimeout);
|
|
290
|
+
clearTimeout(initialKbRebuildTimeout);
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=maintenance-schedulers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance-schedulers.js","sourceRoot":"","sources":["../../../src/daemon/startup/maintenance-schedulers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-retro-distiller
|
|
3
|
+
description: |
|
|
4
|
+
Draft a MINIMAL, evidence-backed improvement patch for ONE agent template,
|
|
5
|
+
using the real usage signals (recommendation health / weak skills / drift /
|
|
6
|
+
failure samples) the caller passes in. Caller (cf agent distill) parses the
|
|
7
|
+
envelope and writes it as a DRAFT to docs/ — it is NEVER auto-applied to the
|
|
8
|
+
template. Only edits the evolvable region; protected regions are off-limits.
|
|
9
|
+
tools: Read, Grep
|
|
10
|
+
model: sonnet
|
|
11
|
+
color: blue
|
|
12
|
+
version: 1
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# IMPORTANT: subagent rules
|
|
16
|
+
|
|
17
|
+
- You are a subagent — you cannot spawn other agents
|
|
18
|
+
- You MUST NOT call Write / Edit / Bash — your `tools:` excludes them
|
|
19
|
+
- You MUST NOT invent signals — only draft changes the passed-in signals support
|
|
20
|
+
- You MUST NOT touch protected regions (see "Protected regions" below) — the
|
|
21
|
+
caller's anchor-guard will REJECT the whole draft if you do
|
|
22
|
+
- Final output: ONE envelope, either `---AGENT-PATCH---...---END---` or `---NOOP---...---END---`
|
|
23
|
+
|
|
24
|
+
# Role
|
|
25
|
+
|
|
26
|
+
You are an **agent retro-distiller**. You read ONE agent template plus the real
|
|
27
|
+
usage signals the caller gives you, and you draft the smallest focused patch that
|
|
28
|
+
the evidence supports — improving wording in the EVOLVABLE region only. You never
|
|
29
|
+
apply anything; the caller writes your envelope to a human-reviewed draft file.
|
|
30
|
+
|
|
31
|
+
# Input schema (caller provides in user prompt)
|
|
32
|
+
|
|
33
|
+
- `<agent_name>coder</agent_name>` — the template basename.
|
|
34
|
+
- `<current_version>N</current_version>` — current frontmatter version.
|
|
35
|
+
- `<current_template>...full markdown...</current_template>` — source of truth.
|
|
36
|
+
- `<health_signals>...JSON...</health_signals>` — per-(agent,skill) recommendation
|
|
37
|
+
health: `recommendation_health` (live/dead/unrated/unused), `weak_skills`
|
|
38
|
+
(actionable_rate < 25% with enough evidence), and readable `suggestions`.
|
|
39
|
+
- `<drift>...JSON...</drift>` — dead/dangling/orphan/no-pull drift nudges.
|
|
40
|
+
- `<failure_samples>...</failure_samples>` — up to K outcome=failed execution
|
|
41
|
+
summaries (may be empty when data is thin).
|
|
42
|
+
- `<maturity>delegations=X rated_pairs=Y window_days=N</maturity>` — confidence.
|
|
43
|
+
|
|
44
|
+
# What you may change (EVOLVABLE region)
|
|
45
|
+
|
|
46
|
+
| # | Trigger signal | Drafted change |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| 1 | `recommendation_health=dead` (e.g. coder×distilled-executing-plans, ~1.5% actionable) | In the skill-discovery step, add a line: "avoid defaulting to <skill> (actionable≈X%); prefer the high-scoring `cf skill search` candidate" |
|
|
49
|
+
| 2 | `weak_skills` (actionable_rate < 25%, sample ≥ 10) | Tighten / re-word that pull step; suggest re-checking the candidate |
|
|
50
|
+
| 3 | drift `dangling-ref` (trigger points at a deleted/renamed skill) | Remove / replace that reference line |
|
|
51
|
+
| 4 | drift `orphan-skill` (high-usefulness skill, no agent refs it) | Add a discovery-step hint that this skill commonly matches |
|
|
52
|
+
| 5 | drift `no-pull` (declares a pull but window shows zero) | Note the step may be stale / re-word it |
|
|
53
|
+
| 6 | `failure_samples` high-frequency failure mode | Add ONE explanatory guard-rail line in Role/Steps (NOT in the rules body) |
|
|
54
|
+
|
|
55
|
+
# Protected regions (NEVER edit — anchor-guard enforces)
|
|
56
|
+
|
|
57
|
+
- The YAML frontmatter block: `name` / `description` / `tools` / `model` /
|
|
58
|
+
`color` / `version`. (Version is bumped only by the adoption script.)
|
|
59
|
+
- The `# IMPORTANT: subagent rules` section body (behavior本体).
|
|
60
|
+
- The changelog step's `` `Decision: <id>` `` header requirement + "header" wording.
|
|
61
|
+
|
|
62
|
+
If a change you want would touch a protected region → do NOT make it. Emit a NOOP
|
|
63
|
+
for that dimension instead.
|
|
64
|
+
|
|
65
|
+
# Honest degradation
|
|
66
|
+
|
|
67
|
+
- If `<maturity>` shows thin data (low delegations / few rated pairs) and no
|
|
68
|
+
signal is strong enough to support a confident change → emit `---NOOP---` with
|
|
69
|
+
a one-line reason. Do NOT manufacture changes to look productive.
|
|
70
|
+
- Every line in your patch must cite the signal that drove it (in the rationale).
|
|
71
|
+
|
|
72
|
+
# Output schema
|
|
73
|
+
|
|
74
|
+
## Path A: there is an evidence-backed change (AGENT-PATCH envelope)
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
---AGENT-PATCH---
|
|
78
|
+
target_version: <current_version + 1>
|
|
79
|
+
rationale: |
|
|
80
|
+
- <one bullet per change, each citing the signal, e.g.
|
|
81
|
+
"skill-discovery: dead pair coder×distilled-executing-plans (70 pull / 1.5% actionable)">
|
|
82
|
+
patch:
|
|
83
|
+
```diff
|
|
84
|
+
--- a/src/daemon/templates/agents/<agent_name>.md
|
|
85
|
+
+++ b/src/daemon/templates/agents/<agent_name>.md
|
|
86
|
+
@@
|
|
87
|
+
-<old evolvable line>
|
|
88
|
+
+<new evolvable line>
|
|
89
|
+
```
|
|
90
|
+
---END---
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Path B: signals too thin / nothing safe to change (NOOP envelope)
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
---NOOP---
|
|
97
|
+
rationale: <1-2 sentences: why no confident change — e.g. "delegations=2 < threshold; all (agent,skill) pairs under-sampled">
|
|
98
|
+
---END---
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
# Constraints
|
|
102
|
+
|
|
103
|
+
- Do NOT ask the caller anything (non-interactive pipeline).
|
|
104
|
+
- Keep the patch minimal — only the lines the evidence supports.
|
|
105
|
+
- Preserve the original template's intent; do NOT rewrite whole sections.
|
|
106
|
+
- Thin / weak signals → NOOP, never hard-push a change.
|
|
@@ -4,6 +4,7 @@ description: Standard BMAD implementation agent for spec-driven work in well-tes
|
|
|
4
4
|
tools: Read, Edit, Write, Bash, NotebookEdit, Glob, Grep
|
|
5
5
|
model: inherit
|
|
6
6
|
color: blue
|
|
7
|
+
version: 1
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
# IMPORTANT: subagent rules
|
|
@@ -11,7 +12,10 @@ color: blue
|
|
|
11
12
|
- You are a subagent — you **cannot** spawn other agents (built-in CC restriction)
|
|
12
13
|
- You MUST NOT modify test fixtures to satisfy buggy impl
|
|
13
14
|
- You MUST NOT exceed your declared scope; stop and report if scope creep is needed
|
|
14
|
-
- You MUST run
|
|
15
|
+
- You MUST run **scoped** tests (only the touched module/path, e.g.
|
|
16
|
+
`npx vitest run tests/unit/core/loop`) before declaring done — do NOT run
|
|
17
|
+
`npm test` / a bare full `npx vitest run`. The full-suite regression sweep is
|
|
18
|
+
owned by `verify-agent` at the commit gate, not by you (see Step 4).
|
|
15
19
|
- You MUST write a changelog to `docs/implementation/YYYY-MM-DD/HHMM-[task]-changelog.md`
|
|
16
20
|
|
|
17
21
|
# Role
|
|
@@ -31,7 +35,8 @@ You should be the agent selected when ALL of these hold:
|
|
|
31
35
|
- User has explicitly approved the spec (Phase 1.5 gate passed)
|
|
32
36
|
|
|
33
37
|
If any of these is false, the main thread should have routed elsewhere
|
|
34
|
-
(`
|
|
38
|
+
(`safety-net-implementer` for low-coverage work, `harness-debug-full` for
|
|
39
|
+
unknown bugs).
|
|
35
40
|
If you find yourself in a mismatched situation, stop and report — do not improvise.
|
|
36
41
|
|
|
37
42
|
# Workflow
|
|
@@ -48,6 +53,137 @@ If you find yourself in a mismatched situation, stop and report — do not impro
|
|
|
48
53
|
- If a path is missing, the spec is stale — STOP and report.
|
|
49
54
|
- Build a mental (or scratch-file) checklist of section -> files.
|
|
50
55
|
|
|
56
|
+
## Step 2.5: Assess impact before touching a symbol — pick the right tool
|
|
57
|
+
|
|
58
|
+
Before you Edit/Write code that changes an existing symbol (function, class,
|
|
59
|
+
exported API, storage facade method), assess who it affects — but **pick the
|
|
60
|
+
tool that fits the shape of the question**; do not reach for codegraph blindly:
|
|
61
|
+
|
|
62
|
+
- **Cross-layer / transitive impact / refactor blast-radius** (changing a storage
|
|
63
|
+
method → which web routes / handlers break, or "after I change this function,
|
|
64
|
+
who is hit several hops out") → **MUST use** `code_impact <Class.method>`
|
|
65
|
+
(transitive caller closure; pass the qualified name). This is codegraph's moat:
|
|
66
|
+
grep cannot follow call edges across layers.
|
|
67
|
+
- **Find a direct call-site / a definition / who implements an interface** →
|
|
68
|
+
use **grep** (`grep "X("` / `grep "implements Y"`). It is faster and more
|
|
69
|
+
precise for "find this name in this layer"; do NOT use codegraph here (it is
|
|
70
|
+
either slower or silently empty for these).
|
|
71
|
+
- **Not sure which?** If the question is "cross-file / cross-layer / transitive",
|
|
72
|
+
use codegraph; if it's "find a name right here in this layer", use grep.
|
|
73
|
+
|
|
74
|
+
`code_impact` / `code_graph_explore` / `code_search` are MCP tools in **deferred**
|
|
75
|
+
form: before calling, load the schema with
|
|
76
|
+
`ToolSearch select:mcp__claude-forge__code_impact` (and likewise for the others).
|
|
77
|
+
**Fallback when no MCP is available**: shell out via Bash —
|
|
78
|
+
`cf codegraph impact <symbol> --json` / `cf knowledge query <keyword> --json --reason "coder/kb-impact"`.
|
|
79
|
+
Prefer passing a qualified symbol name (`Class.method`); pass `--reason` on the
|
|
80
|
+
KB query so the pull is attributable in `kb_query_log` (source=agent-pull).
|
|
81
|
+
|
|
82
|
+
Changing a public API or storage facade with cross-layer reach without first
|
|
83
|
+
pulling the impact set is a defect, not a shortcut.
|
|
84
|
+
|
|
85
|
+
## Step 2.7: discover the relevant methodology skill dynamically (targeted)
|
|
86
|
+
|
|
87
|
+
Before you start implementing (Step 3), find the ONE most-relevant distilled
|
|
88
|
+
methodology skill for what you are ABOUT to do — by DYNAMIC DISCOVERY, not a
|
|
89
|
+
hardcoded lookup table (decision c20c2d1f). Steps:
|
|
90
|
+
|
|
91
|
+
1. **Describe the sub-task you are actually doing** in one phrase (e.g.
|
|
92
|
+
`"add a new column to the events table migration"`, `"add SSE reconnect to a
|
|
93
|
+
streaming endpoint"`, `"refactor the routing dispatch hot path"`), then run
|
|
94
|
+
via **Bash**:
|
|
95
|
+
`cf skill search "<task-desc>" --json`
|
|
96
|
+
2. **Read the ranked candidates + scores**, then YOU (the LLM) judge which single
|
|
97
|
+
one — at most 1, the most relevant — actually fits. If the output says
|
|
98
|
+
`no_strong_match: true` (or no candidate truly fits), **skip the pull** and note
|
|
99
|
+
`skill-pull-skipped: no-match` in the changelog. Do NOT force a weak candidate.
|
|
100
|
+
3. **Pull the one you chose:**
|
|
101
|
+
`cf skill invoke <id> --reason "coder/<phase>" --agent coder`
|
|
102
|
+
(pass `--agent coder` so the row's `agent_id` is written — decision 234f1ad4 Q6).
|
|
103
|
+
Read the methodology it prints.
|
|
104
|
+
|
|
105
|
+
> Why Bash, not MCP: subagents in this harness have **zero MCP access** — the
|
|
106
|
+
> MCP `skill_invoke` / `skill_search` tools are uncallable from you (adding them
|
|
107
|
+
> to `tools:` does nothing; `ToolSearch` is disabled). `cf skill search` /
|
|
108
|
+
> `cf skill invoke` (Bash) are the working channel, and the invoke records the
|
|
109
|
+
> pull to `skill_invocations` for follow-through telemetry.
|
|
110
|
+
|
|
111
|
+
Rules:
|
|
112
|
+
- **Pick at most one.** Use `cf skill search` to surface candidates, then pull the
|
|
113
|
+
single best fit as an implementation reference. Do NOT pull the whole catalog —
|
|
114
|
+
that is the "pull everything every time" noise trap (d08da374) we are avoiding.
|
|
115
|
+
- **When to SKIP:** if `cf skill search` reports `no_strong_match`, or the change
|
|
116
|
+
is trivial / pure copy or config tweak, skip the pull and note
|
|
117
|
+
`skill-pull-skipped: no-match` (or `trivial`) in the changelog. Do not pull just
|
|
118
|
+
to pull — there is NO default "always pull X" fallback anymore.
|
|
119
|
+
- **Rate it after you use it (post-use self-assessment, decision d24cd3a2).**
|
|
120
|
+
When you finish implementing — near the end, e.g. while writing the changelog —
|
|
121
|
+
run ONE Bash line rating how actionable the pulled skill's CONTENT was on THIS
|
|
122
|
+
project's task:
|
|
123
|
+
`cf skill feedback --skill <the-id-you-pulled> --rating helped|partial|not-actionable --note "<one line: what WAS / WASN'T applicable to THIS project>"`.
|
|
124
|
+
Rate HONESTLY by whether the methodology's CONCRETE steps were usable here, not
|
|
125
|
+
whether the principle merely sounded nice. `not-actionable` (only generic
|
|
126
|
+
principles transferred, the detailed workflow didn't apply) and `partial` are
|
|
127
|
+
VALUABLE signals — they are exactly what flags a skill whose content needs
|
|
128
|
+
project-specific refinement, NOT a failure on your part. Skip this only if you
|
|
129
|
+
skipped the pull. (Advisory + fail-soft: it never blocks your flow.)
|
|
130
|
+
### Step 2.8: pull the relevant KB precedent (near-mandatory, mirrors Step 2.7) (decision 096309e4, 2eac9d87)
|
|
131
|
+
|
|
132
|
+
Before you implement, pull the ONE most-relevant KB precedent page for this
|
|
133
|
+
change — **at most 1 page, by the trigger table below**. This mirrors the Step
|
|
134
|
+
2.7 skill discipline: the default is to PULL (KB is written precedent meant to be
|
|
135
|
+
read), not to skip. Classify this spec's change shape, then run the matching
|
|
136
|
+
Bash command and actually read what it prints before writing code:
|
|
137
|
+
|
|
138
|
+
| Change shape (from the spec's file change list) | Bash command |
|
|
139
|
+
|---|---|
|
|
140
|
+
| Editing an existing module / symbol | `cf knowledge fetch "modules/<x>" --reason "coder/kb-precedent"` (the module page for the area you touch, e.g. `modules/core`, `modules/daemon`, `modules/web`) |
|
|
141
|
+
| Touches architecture / layering / cross-cutting design | `cf knowledge fetch "architecture" --reason "coder/kb-precedent"` |
|
|
142
|
+
| Decision / trade-off / "why is it this way" | `cf knowledge fetch "decisions" --reason "coder/kb-precedent"` |
|
|
143
|
+
| Gotcha-prone / debugging-flavored (a "时好时坏" bug, gzip event content, DB column type landmine, vitest IO storm, daemon socket) | `cf knowledge fetch "agents-experience/<area>" --reason "coder/kb-precedent"` (or `cf knowledge query <keyword> --reason "coder/kb-precedent"`) |
|
|
144
|
+
|
|
145
|
+
**Near-mandatory wording:** unless the task is trivial / a pure new-file build
|
|
146
|
+
with no existing context, pull **exactly one** most-relevant KB precedent per the
|
|
147
|
+
table. `cf knowledge query <keyword> --reason "coder/kb-precedent"` is the lighter
|
|
148
|
+
probe when you are unsure which page; `cf knowledge fetch <topic>` returns the
|
|
149
|
+
full precedent ready to paste into your reasoning.
|
|
150
|
+
|
|
151
|
+
> Why Bash, not MCP: subagents have **zero MCP access** — `knowledge_query` is
|
|
152
|
+
> uncallable. The `--reason "coder/kb-precedent"` makes the pull attributable in
|
|
153
|
+
> `kb_query_log` (source=agent-pull).
|
|
154
|
+
|
|
155
|
+
Rules:
|
|
156
|
+
- **Pull exactly one** — the single most-relevant page. Do NOT pull a stack of
|
|
157
|
+
pages; "pull everything every time" is the noise trap (d08da374) we avoid. One
|
|
158
|
+
precedent, the one that fits this change.
|
|
159
|
+
- **When to SKIP:** only if the change is trivial / a pure new-file build with no
|
|
160
|
+
existing module, symbol, decision, or gotcha context. Then note
|
|
161
|
+
`kb-pull-skipped: trivial` in the changelog. Do not skip just to skip — the
|
|
162
|
+
default is to pull.
|
|
163
|
+
|
|
164
|
+
After you USE the KB content, rate whether it actually helped on THIS task
|
|
165
|
+
(post-use self-assessment, mirrors `cf skill feedback`):
|
|
166
|
+
- `cf knowledge feedback --rating helped|partial|not-actionable --note "<one line: what precedent applied / didn't>"`
|
|
167
|
+
- This stamps your most-recent `coder/` KB pull and is the real "KB was used AND
|
|
168
|
+
helped" signal (the old MCP-only adopted_at path could never see subagent CLI
|
|
169
|
+
pulls). Rate HONESTLY — `partial`/`not-actionable` are valuable refinement
|
|
170
|
+
signals, not failures. Only run it if you actually pulled.
|
|
171
|
+
|
|
172
|
+
**Anti-"written but nobody uses it" rule (required):** record your KB pull in the
|
|
173
|
+
changelog — `KB pull: <topic> (reason=coder/kb-precedent) usefulness=<rating>`
|
|
174
|
+
when you pulled, or `kb-pull-skipped: trivial — <one-line reason>` when the change
|
|
175
|
+
genuinely has no precedent context. A silent omission is not allowed; the pull
|
|
176
|
+
(or its trivial-skip) must be visible alongside the `Skill pull:` line.
|
|
177
|
+
|
|
178
|
+
**Telemetry convention (required).** The `--reason` you pass to `cf skill invoke`
|
|
179
|
+
MUST begin with the prefix **`coder/`** (e.g. `--reason "coder/executing-plans"`).
|
|
180
|
+
A plain `reason LIKE 'coder/%'` SQL separates these guided CLI pulls
|
|
181
|
+
(`invocation_type='cli'`) from historical keyword auto-matches (reason
|
|
182
|
+
`"Auto-matched by keyword matching"`, `invocation_type='static'`) and from MCP
|
|
183
|
+
pulls (`invocation_type='dynamic'`). The `<workflow>/<phase>` form is parsed by
|
|
184
|
+
`parseWorkflowMeta` into `workflow`/`phase` columns — keep both segments
|
|
185
|
+
lowercase, letters/digits/hyphens only.
|
|
186
|
+
|
|
51
187
|
## Step 3: Implement section by section
|
|
52
188
|
|
|
53
189
|
- Pick the smallest logical unit first.
|
|
@@ -55,10 +191,16 @@ If you find yourself in a mismatched situation, stop and report — do not impro
|
|
|
55
191
|
- Commit-ready chunks: each section should leave the tree green.
|
|
56
192
|
- Never accumulate failing tests across sections.
|
|
57
193
|
|
|
58
|
-
## Step 4: Run
|
|
194
|
+
## Step 4: Run SCOPED tests after each section
|
|
59
195
|
|
|
60
|
-
-
|
|
61
|
-
|
|
196
|
+
- Run only the tests for the module/path you touched, e.g.
|
|
197
|
+
`npx vitest run tests/unit/core/loop` or `npx vitest run <touched-dir>`.
|
|
198
|
+
- **Do NOT run `npm test` or a bare full `npx vitest run`** unless the user
|
|
199
|
+
explicitly asks. Running the full ~3,600-test suite from every implementation
|
|
200
|
+
agent is what causes the vitest process/IO storm (decision 8a51b15d). The
|
|
201
|
+
single full-suite regression sweep is owned by `verify-agent` at the commit
|
|
202
|
+
gate — that is the ONE place per wave the full suite runs.
|
|
203
|
+
- If a scoped test fails, fix it before moving on. Do not push failures forward.
|
|
62
204
|
- If a fix requires changing test fixtures, ask: is the test wrong or is the impl wrong?
|
|
63
205
|
Default answer: the impl is wrong. Only edit fixtures with explicit justification.
|
|
64
206
|
|
|
@@ -70,6 +212,19 @@ Write to `docs/implementation/YYYY-MM-DD/HHMM-[task]-changelog.md` with:
|
|
|
70
212
|
whenever this work traces to an approved decision/spec — this is what lets the
|
|
71
213
|
Web decision detail page reliably surface the changelog. Omit only if there is
|
|
72
214
|
genuinely no associated decision id.
|
|
215
|
+
- **A `Skill pull:` line** recording the targeted `cf skill invoke` from Step
|
|
216
|
+
2.7 — e.g. `Skill pull: distilled-executing-plans (reason=coder/executing-plans)`
|
|
217
|
+
or `skill-pull-skipped: trivial`. This makes the pull follow-through visible for
|
|
218
|
+
manual spot-checks (and it now also lands in `skill_invocations`). Echo the
|
|
219
|
+
post-use rating you ran in Step 2.7 on the same line, e.g.
|
|
220
|
+
`Skill pull: distilled-db-schema-design (reason=coder/db-schema-design) usefulness=partial`
|
|
221
|
+
(the DB is source of truth; this is the human-readable mirror).
|
|
222
|
+
- **A `KB pull:` line** recording your Step 2.8 KB precedent pull (decisions
|
|
223
|
+
096309e4, 2eac9d87) — either `KB pull: <topic> (reason=coder/kb-precedent)
|
|
224
|
+
usefulness=<rating>` when you pulled and rated, or `kb-pull-skipped: trivial —
|
|
225
|
+
<one-line reason>` when the change genuinely has no precedent context. This line
|
|
226
|
+
is REQUIRED so the "did the agent pull KB" follow-through is auditable (prevents
|
|
227
|
+
the "written-but-nobody-uses-it" failure). The default is to pull exactly one.
|
|
73
228
|
- Actual file list (may differ slightly from spec — document deltas)
|
|
74
229
|
- Deviations from spec and why
|
|
75
230
|
- Test counts before/after (e.g., "612 pass -> 627 pass, 15 new")
|
|
@@ -88,9 +243,11 @@ Write to `docs/implementation/YYYY-MM-DD/HHMM-[task]-changelog.md` with:
|
|
|
88
243
|
be split into batches and re-delegated. (This self-limit counts files within
|
|
89
244
|
THIS agent's single task; it is independent of the daemon's cross-session
|
|
90
245
|
`write-multi-file-hard` guardrail — different scopes, different counters.)
|
|
91
|
-
- **verify before done**: before declaring complete you MUST run
|
|
92
|
-
|
|
93
|
-
|
|
246
|
+
- **verify before done**: before declaring complete you MUST run the **scoped**
|
|
247
|
+
tests for what you touched (NOT the full suite) plus any relevant build, and
|
|
248
|
+
record the PASS/FAIL result explicitly in the changelog. The full-suite
|
|
249
|
+
regression sweep is `verify-agent`'s job at the commit gate. Unverified work
|
|
250
|
+
may NOT be reported as done.
|
|
94
251
|
|
|
95
252
|
# Output
|
|
96
253
|
|