@winspan/claude-forge 8.41.0 → 8.50.6
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/.claude/CLAUDE.md +17 -0
- package/.eslintrc.js +23 -0
- package/.prettierrc +8 -0
- package/ARCHITECTURE_ISSUES.md +249 -0
- package/CLAUDE.md +265 -0
- package/CLAUDE.md.backup +488 -0
- package/DEVELOPMENT.md +310 -0
- package/dist/claudemd/claudemd-generator.d.ts +38 -3
- package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
- package/dist/claudemd/claudemd-generator.js +629 -11
- package/dist/claudemd/claudemd-generator.js.map +1 -1
- package/dist/claudemd/index.d.ts +2 -2
- package/dist/claudemd/index.d.ts.map +1 -1
- package/dist/claudemd/index.js.map +1 -1
- package/dist/claudemd/resume-manager.d.ts.map +1 -1
- package/dist/claudemd/resume-manager.js +5 -2
- package/dist/claudemd/resume-manager.js.map +1 -1
- package/dist/claudemd/tech-detector.d.ts +1 -0
- package/dist/claudemd/tech-detector.d.ts.map +1 -1
- package/dist/claudemd/tech-detector.js +53 -0
- package/dist/claudemd/tech-detector.js.map +1 -1
- package/dist/cli/commands/claudemd.js +2 -2
- package/dist/cli/commands/claudemd.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts +28 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +200 -8
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +3 -35
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/menu.js +10 -10
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +8 -2
- 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 +0 -17
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/trace.d.ts +9 -0
- package/dist/cli/commands/trace.d.ts.map +1 -0
- package/dist/cli/commands/trace.js +137 -0
- package/dist/cli/commands/trace.js.map +1 -0
- package/dist/cli/index.js +2 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/core/ai/provider.d.ts +10 -2
- package/dist/core/ai/provider.d.ts.map +1 -1
- package/dist/core/ai/provider.js.map +1 -1
- package/dist/core/ai/types.d.ts +1 -19
- package/dist/core/ai/types.d.ts.map +1 -1
- package/dist/core/ai/types.js +1 -1
- package/dist/core/config.d.ts +2 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +23 -6
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +2 -2
- package/dist/core/constants.js +2 -2
- package/dist/core/constants.js.map +1 -1
- package/dist/core/queue/index.d.ts +52 -0
- package/dist/core/queue/index.d.ts.map +1 -0
- package/dist/core/queue/index.js +176 -0
- package/dist/core/queue/index.js.map +1 -0
- package/dist/core/storage/base.d.ts +33 -0
- package/dist/core/storage/base.d.ts.map +1 -0
- package/dist/core/storage/base.js +211 -0
- package/dist/core/storage/base.js.map +1 -0
- package/dist/core/storage/events.d.ts +52 -0
- package/dist/core/storage/events.d.ts.map +1 -0
- package/dist/core/storage/events.js +201 -0
- package/dist/core/storage/events.js.map +1 -0
- package/dist/core/storage/injections.d.ts +27 -0
- package/dist/core/storage/injections.d.ts.map +1 -0
- package/dist/core/storage/injections.js +51 -0
- package/dist/core/storage/injections.js.map +1 -0
- package/dist/core/storage/maintenance.d.ts +21 -0
- package/dist/core/storage/maintenance.d.ts.map +1 -0
- package/dist/core/storage/maintenance.js +52 -0
- package/dist/core/storage/maintenance.js.map +1 -0
- package/dist/core/storage/routing.d.ts +71 -0
- package/dist/core/storage/routing.d.ts.map +1 -0
- package/dist/core/storage/routing.js +141 -0
- package/dist/core/storage/routing.js.map +1 -0
- package/dist/core/storage/rows.d.ts +0 -47
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +74 -136
- package/dist/core/storage/sessions.d.ts +34 -0
- package/dist/core/storage/sessions.d.ts.map +1 -0
- package/dist/core/storage/sessions.js +78 -0
- package/dist/core/storage/sessions.js.map +1 -0
- package/dist/core/storage/skills.d.ts +40 -0
- package/dist/core/storage/skills.d.ts.map +1 -0
- package/dist/core/storage/skills.js +107 -0
- package/dist/core/storage/skills.js.map +1 -0
- package/dist/core/storage/sqlite.d.ts +63 -265
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +102 -759
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +64 -0
- package/dist/core/storage/tasks.d.ts.map +1 -0
- package/dist/core/storage/tasks.js +134 -0
- package/dist/core/storage/tasks.js.map +1 -0
- package/dist/core/storage/token-usage.d.ts +36 -0
- package/dist/core/storage/token-usage.d.ts.map +1 -0
- package/dist/core/storage/token-usage.js +59 -0
- package/dist/core/storage/token-usage.js.map +1 -0
- package/dist/core/types.d.ts +60 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +24 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/format.d.ts +28 -0
- package/dist/core/utils/format.d.ts.map +1 -0
- package/dist/core/utils/format.js +68 -0
- package/dist/core/utils/format.js.map +1 -0
- package/dist/core/utils/logger.d.ts +6 -1
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +72 -2
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/core/utils/session.d.ts +16 -0
- package/dist/core/utils/session.d.ts.map +1 -0
- package/dist/core/utils/session.js +25 -0
- package/dist/core/utils/session.js.map +1 -0
- package/dist/core/utils/time.d.ts +22 -0
- package/dist/core/utils/time.d.ts.map +1 -0
- package/dist/core/utils/time.js +38 -0
- package/dist/core/utils/time.js.map +1 -0
- package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
- package/dist/daemon/handlers/history-exporter.js +6 -4
- package/dist/daemon/handlers/history-exporter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +5 -12
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +21 -79
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +24 -12
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +141 -42
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +18 -19
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +103 -227
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/index.d.ts +6 -2
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +76 -120
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/launchd/com.claude-forge.daemon.plist.template +47 -0
- package/dist/daemon/launchd-installer.d.ts +61 -0
- package/dist/daemon/launchd-installer.d.ts.map +1 -0
- package/dist/daemon/launchd-installer.js +182 -0
- package/dist/daemon/launchd-installer.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +11 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +44 -0
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/router.d.ts +9 -2
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +27 -3
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +6 -5
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/anti-pattern-detector.d.ts +50 -0
- package/dist/daemon/services/anti-pattern-detector.d.ts.map +1 -0
- package/dist/daemon/services/anti-pattern-detector.js +357 -0
- package/dist/daemon/services/anti-pattern-detector.js.map +1 -0
- package/dist/daemon/services/drift-detector.d.ts +64 -0
- package/dist/daemon/services/drift-detector.d.ts.map +1 -0
- package/dist/daemon/services/drift-detector.js +201 -0
- package/dist/daemon/services/drift-detector.js.map +1 -0
- package/dist/{intelligence → daemon/services}/task-segmenter.d.ts +7 -1
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -0
- package/dist/{intelligence → daemon/services}/task-segmenter.js +29 -6
- package/dist/daemon/services/task-segmenter.js.map +1 -0
- package/dist/daemon/services/weekly-report.d.ts +91 -0
- package/dist/daemon/services/weekly-report.d.ts.map +1 -0
- package/dist/daemon/services/weekly-report.js +327 -0
- package/dist/daemon/services/weekly-report.js.map +1 -0
- package/dist/hooks/hook-lib.sh +81 -0
- package/dist/hooks/notification.sh +7 -3
- package/dist/hooks/post-tool-use.sh +8 -4
- package/dist/hooks/pre-tool-use.sh +7 -4
- package/dist/hooks/stop.sh +1 -1
- package/dist/hooks/user-prompt-submit.sh +8 -9
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +71 -11
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/invocation-guard.d.ts +20 -0
- package/dist/skills/invocation-guard.d.ts.map +1 -1
- package/dist/skills/invocation-guard.js +63 -0
- package/dist/skills/invocation-guard.js.map +1 -1
- package/dist/skills/matcher.d.ts.map +1 -1
- package/dist/skills/matcher.js +12 -3
- package/dist/skills/matcher.js.map +1 -1
- package/dist/skills/official/code-simplifier.md +16 -0
- package/dist/skills/official/find-skills.md +23 -0
- package/dist/skills/official/official-api-design.md +17 -0
- package/dist/skills/official/official-architecture-decision.md +20 -0
- package/dist/skills/official/official-bmad.md +118 -0
- package/dist/skills/official/official-db-schema-design.md +16 -0
- package/dist/skills/official/official-debug.md +17 -0
- package/dist/skills/official/official-doc-driven.md +31 -0
- package/dist/skills/official/official-harness-engineering.md +108 -0
- package/dist/skills/official/official-performance-optimization.md +30 -0
- package/dist/skills/official/official-pr-review.md +35 -0
- package/dist/skills/official/official-release-checklist.md +30 -0
- package/dist/skills/official/official-security-hardening.md +26 -0
- package/dist/skills/official/official-spec-driven-design.md +31 -0
- package/dist/skills/official/planning-with-files.md +37 -0
- package/dist/skills/official/ui-ux-pro-max.md +18 -0
- package/dist/skills/official/webapp-testing.md +12 -0
- package/dist/skills/official-skills.d.ts +8 -4
- package/dist/skills/official-skills.d.ts.map +1 -1
- package/dist/skills/official-skills.js +48 -704
- package/dist/skills/official-skills.js.map +1 -1
- package/dist/skills/registry.d.ts +5 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +48 -15
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.d.ts +30 -0
- package/dist/skills/tools/pipeline-suggest.d.ts.map +1 -0
- package/dist/skills/tools/pipeline-suggest.js +178 -0
- package/dist/skills/tools/pipeline-suggest.js.map +1 -0
- package/dist/web/routes/ai.d.ts.map +1 -1
- package/dist/web/routes/ai.js +16 -22
- package/dist/web/routes/ai.js.map +1 -1
- package/dist/web/routes/drift.d.ts +10 -0
- package/dist/web/routes/drift.d.ts.map +1 -0
- package/dist/web/routes/drift.js +21 -0
- package/dist/web/routes/drift.js.map +1 -0
- package/dist/web/routes/error-handler.d.ts +43 -0
- package/dist/web/routes/error-handler.d.ts.map +1 -0
- package/dist/web/routes/error-handler.js +99 -0
- package/dist/web/routes/error-handler.js.map +1 -0
- package/dist/web/routes/insights.d.ts +9 -0
- package/dist/web/routes/insights.d.ts.map +1 -0
- package/dist/web/routes/insights.js +34 -0
- package/dist/web/routes/insights.js.map +1 -0
- package/dist/web/routes/patch.js +2 -2
- package/dist/web/routes/patch.js.map +1 -1
- package/dist/web/routes/reports.d.ts +10 -0
- package/dist/web/routes/reports.d.ts.map +1 -0
- package/dist/web/routes/reports.js +27 -0
- package/dist/web/routes/reports.js.map +1 -0
- package/dist/web/routes/rules.d.ts +10 -3
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +80 -95
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts +1 -2
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +27 -39
- 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 +38 -0
- package/dist/web/routes/skill-stats.js.map +1 -1
- package/dist/web/routes/skills.d.ts.map +1 -1
- package/dist/web/routes/skills.js +34 -0
- package/dist/web/routes/skills.js.map +1 -1
- package/dist/web/routes/stats.d.ts +7 -0
- package/dist/web/routes/stats.d.ts.map +1 -0
- package/dist/web/routes/stats.js +44 -0
- package/dist/web/routes/stats.js.map +1 -0
- package/dist/web/routes/status.js +1 -1
- package/dist/web/routes/status.js.map +1 -1
- package/dist/web/routes/tasks.d.ts +4 -0
- package/dist/web/routes/tasks.d.ts.map +1 -0
- package/dist/web/routes/tasks.js +181 -0
- package/dist/web/routes/tasks.js.map +1 -0
- package/dist/web/routes/trace.d.ts +10 -0
- package/dist/web/routes/trace.d.ts.map +1 -0
- package/dist/web/routes/trace.js +123 -0
- package/dist/web/routes/trace.js.map +1 -0
- package/dist/web/routes/types.d.ts +1 -14
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js +8 -17
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/server.d.ts +1 -9
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +28 -28
- package/dist/web/server.js.map +1 -1
- package/dist/web/static/assets/AIConfig-BQCAQE9D.js +2 -0
- package/dist/web/static/assets/AIConfig-BQCAQE9D.js.map +1 -0
- package/dist/web/static/assets/Dashboard-D7Bo6Kan.js +2 -0
- package/dist/web/static/assets/Dashboard-D7Bo6Kan.js.map +1 -0
- package/dist/web/static/assets/{Drawer-DcU3ln98.js → Drawer-BeHRQxUS.js} +2 -2
- package/dist/web/static/assets/{Drawer-DcU3ln98.js.map → Drawer-BeHRQxUS.js.map} +1 -1
- package/dist/web/static/assets/Events-K_tCY2ti.js +2 -0
- package/dist/web/static/assets/Events-K_tCY2ti.js.map +1 -0
- package/dist/web/static/assets/Reports-BJCmBnc_.js +2 -0
- package/dist/web/static/assets/Reports-BJCmBnc_.js.map +1 -0
- package/dist/web/static/assets/SearchInput-BX2KhMkw.js +2 -0
- package/dist/web/static/assets/SearchInput-BX2KhMkw.js.map +1 -0
- package/dist/web/static/assets/SessionDetail-Bkr-kC7V.js +2 -0
- package/dist/web/static/assets/SessionDetail-Bkr-kC7V.js.map +1 -0
- package/dist/web/static/assets/Sessions-Chx9OCLH.js +2 -0
- package/dist/web/static/assets/Sessions-Chx9OCLH.js.map +1 -0
- package/dist/web/static/assets/Skills-O0GT1i7m.js +2 -0
- package/dist/web/static/assets/Skills-O0GT1i7m.js.map +1 -0
- package/dist/web/static/assets/TaskDetail-5SR8zGzv.js +2 -0
- package/dist/web/static/assets/TaskDetail-5SR8zGzv.js.map +1 -0
- package/dist/web/static/assets/Tasks-DCgDqvOZ.js +2 -0
- package/dist/web/static/assets/Tasks-DCgDqvOZ.js.map +1 -0
- package/dist/web/static/assets/export-L_VBD2p1.js +4 -0
- package/dist/web/static/assets/export-L_VBD2p1.js.map +1 -0
- package/dist/web/static/assets/index-D8AKj26b.css +1 -0
- package/dist/web/static/assets/index-DxIbmNmr.js +3 -0
- package/dist/web/static/assets/index-DxIbmNmr.js.map +1 -0
- package/dist/web/static/assets/{lucide-53bR2rki.js → lucide-fJlPI3H7.js} +68 -38
- package/dist/web/static/assets/lucide-fJlPI3H7.js.map +1 -0
- package/dist/web/static/assets/time-Bxuk0M-C.js +2 -0
- package/dist/web/static/assets/time-Bxuk0M-C.js.map +1 -0
- package/dist/web/static/index.html +3 -3
- package/docs/concurrent-agents.md +129 -0
- package/docs/design/architecture-review-20260516.md +232 -0
- package/docs/design/fix-skills-data-and-set-leak-spec-20260516-1300.md +219 -0
- package/docs/design/hook-failure-queue-spec-20260516-1530.md +204 -0
- package/docs/design/refactor-phase1-spec-20260515-1600.md +543 -0
- package/docs/design/refactor-phase2-spec-20260515-1700.md +424 -0
- package/docs/design/tasks-list-filter-pagination-spec-20260518-0930.md +208 -0
- package/docs/implementation/fix-skills-data-and-set-leak-changelog-20260516-1300.md +104 -0
- package/docs/implementation/hook-failure-queue-changelog-20260516-1530.md +196 -0
- package/docs/implementation/hotfix-daemon-event-reject-20260516-1430.md +56 -0
- package/docs/implementation/refactor-phase1-changelog-20260515-1630.md +354 -0
- package/docs/implementation/refactor-phase2-changelog-20260515-1705.md +421 -0
- package/docs/implementation/tasks-list-filter-pagination-changelog-20260518-0930.md +72 -0
- package/docs/reviews/claudemd-template-sync.md +54 -0
- package/docs/reviews/tasks-filter-pagination.md +80 -0
- package/docs/ruflo-learning-strategy.md +322 -0
- package/docs/skills-deduplication-analysis.md +83 -0
- package/docs/skills-multiformat-support.md +177 -0
- package/docs/skills-third-party.md +183 -0
- package/docs/testing/tasks-filter-pagination-test-report.md +86 -0
- package/forge +321 -0
- package/package.json +28 -62
- package/playwright.config.ts +40 -0
- package/scripts/demo-v2.ts +91 -0
- package/scripts/dev-daemon.sh +232 -0
- package/scripts/dev-web.ts +109 -0
- package/scripts/e2e-mcp-link.ts +423 -0
- package/scripts/e2e-methodology-quality.ts +253 -0
- package/scripts/e2e-routing.ts +456 -0
- package/scripts/e2e-user-methodology.ts +326 -0
- package/scripts/e2e-web-workflows.ts +299 -0
- package/scripts/migrate-legacy-to-dynamic.sql +108 -0
- package/scripts/regenerate-execution-docs.ts +116 -0
- package/scripts/sync-agent-skills.ts +193 -0
- package/scripts/test-hook.sh +71 -0
- package/scripts/verify-skill-loading.ts +62 -0
- package/src/claudemd/claudemd-generator.ts +777 -0
- package/src/claudemd/convention-extractor.ts +69 -0
- package/src/claudemd/index.ts +35 -0
- package/src/claudemd/persona-manager.ts +88 -0
- package/src/claudemd/resume-manager.ts +236 -0
- package/src/claudemd/tech-detector.ts +220 -0
- package/src/cli/commands/claudemd.ts +84 -0
- package/src/cli/commands/config.ts +46 -0
- package/src/cli/commands/daemon.ts +310 -0
- package/src/cli/commands/executions.ts +114 -0
- package/src/cli/commands/init.ts +204 -0
- package/src/cli/commands/logs.ts +181 -0
- package/src/cli/commands/mcp.ts +244 -0
- package/src/cli/commands/menu.ts +356 -0
- package/src/cli/commands/skills.ts +185 -0
- package/src/cli/commands/stats.ts +74 -0
- package/src/cli/commands/status.ts +69 -0
- package/src/cli/commands/template.ts +77 -0
- package/src/cli/commands/trace.ts +164 -0
- package/src/cli/index.ts +42 -0
- package/src/cli/init/hook-manager.ts +132 -0
- package/src/core/ai/provider.ts +308 -0
- package/src/core/ai/types.ts +51 -0
- package/src/core/config.ts +124 -0
- package/src/core/constants.ts +45 -0
- package/src/core/queue/index.ts +193 -0
- package/src/core/storage/base.ts +226 -0
- package/src/core/storage/events.ts +255 -0
- package/src/core/storage/injections.ts +78 -0
- package/src/core/storage/maintenance.ts +59 -0
- package/src/core/storage/migrations/002_add_skill_tracking.sql +6 -0
- package/src/core/storage/migrations/003_add_skill_invocations.sql +23 -0
- package/src/core/storage/performance-indexes.sql +23 -0
- package/src/core/storage/routing.ts +194 -0
- package/src/core/storage/rows.ts +112 -0
- package/src/core/storage/schema.sql +214 -0
- package/src/core/storage/sessions.ts +104 -0
- package/src/core/storage/skills.ts +164 -0
- package/src/core/storage/sqlite.ts +194 -0
- package/src/core/storage/tasks.ts +170 -0
- package/src/core/storage/token-usage.ts +93 -0
- package/src/core/types.ts +154 -0
- package/src/core/utils/error-handler.ts +256 -0
- package/src/core/utils/forge-resume-block.ts +74 -0
- package/src/core/utils/format.ts +69 -0
- package/src/core/utils/logger.ts +119 -0
- package/src/core/utils/lru-cache.ts +50 -0
- package/src/core/utils/path.ts +19 -0
- package/src/core/utils/session.ts +26 -0
- package/src/core/utils/time.ts +37 -0
- package/src/core/utils/token-tracker.ts +97 -0
- package/src/daemon/event-parser.ts +35 -0
- package/src/daemon/handlers/history-exporter.ts +117 -0
- package/src/daemon/handlers/post-tool-use.ts +50 -0
- package/src/daemon/handlers/stop.ts +215 -0
- package/src/daemon/handlers/user-prompt.ts +188 -0
- package/src/daemon/index.ts +278 -0
- package/src/daemon/launchd/com.claude-forge.daemon.plist.template +47 -0
- package/src/daemon/launchd-installer.ts +260 -0
- package/src/daemon/lifecycle.ts +128 -0
- package/src/daemon/router.ts +40 -0
- package/src/daemon/server.ts +209 -0
- package/src/daemon/services/anti-pattern-detector.ts +412 -0
- package/src/daemon/services/drift-detector.ts +232 -0
- package/src/daemon/services/task-segmenter.ts +112 -0
- package/src/daemon/services/weekly-report.ts +454 -0
- package/src/hooks/hook-lib.sh +81 -0
- package/src/hooks/notification.sh +35 -0
- package/src/hooks/post-tool-use.sh +61 -0
- package/src/hooks/pre-tool-use.sh +63 -0
- package/src/hooks/stop.sh +40 -0
- package/src/hooks/user-prompt-submit.sh +69 -0
- package/src/mcp/server.ts +322 -0
- package/src/skills/index.ts +2 -0
- package/src/skills/invocation-guard.ts +177 -0
- package/src/skills/matcher.ts +148 -0
- package/src/skills/official/code-simplifier.md +16 -0
- package/src/skills/official/find-skills.md +23 -0
- package/src/skills/official/official-api-design.md +17 -0
- package/src/skills/official/official-architecture-decision.md +20 -0
- package/src/skills/official/official-bmad.md +118 -0
- package/src/skills/official/official-db-schema-design.md +16 -0
- package/src/skills/official/official-debug.md +17 -0
- package/src/skills/official/official-doc-driven.md +31 -0
- package/src/skills/official/official-harness-engineering.md +108 -0
- package/src/skills/official/official-performance-optimization.md +30 -0
- package/src/skills/official/official-pr-review.md +35 -0
- package/src/skills/official/official-release-checklist.md +30 -0
- package/src/skills/official/official-security-hardening.md +26 -0
- package/src/skills/official/official-spec-driven-design.md +31 -0
- package/src/skills/official/planning-with-files.md +37 -0
- package/src/skills/official/ui-ux-pro-max.md +18 -0
- package/src/skills/official/webapp-testing.md +12 -0
- package/src/skills/official-skills.ts +89 -0
- package/src/skills/registry.ts +355 -0
- package/src/skills/semantic-matcher.ts +231 -0
- package/src/skills/tools/pipeline-suggest.ts +226 -0
- package/src/skills/tools/skill-invoke.ts +168 -0
- package/src/skills/tools/skill-list.ts +59 -0
- package/src/templates/go.yaml +53 -0
- package/src/templates/python.yaml +59 -0
- package/src/templates/react.yaml +55 -0
- package/src/templates/template-manager.ts +170 -0
- package/src/web/auth-middleware.ts +55 -0
- package/src/web/routes/ai.ts +204 -0
- package/src/web/routes/auth.ts +22 -0
- package/src/web/routes/drift.ts +25 -0
- package/src/web/routes/error-handler.ts +120 -0
- package/src/web/routes/events.ts +47 -0
- package/src/web/routes/insights.ts +43 -0
- package/src/web/routes/patch.ts +117 -0
- package/src/web/routes/reports.ts +34 -0
- package/src/web/routes/rules.ts +101 -0
- package/src/web/routes/sessions.ts +262 -0
- package/src/web/routes/skill-stats.ts +132 -0
- package/src/web/routes/skills.ts +349 -0
- package/src/web/routes/static.ts +67 -0
- package/src/web/routes/stats.ts +60 -0
- package/src/web/routes/status.ts +30 -0
- package/src/web/routes/tasks.ts +218 -0
- package/src/web/routes/token-usage.ts +20 -0
- package/src/web/routes/trace.ts +138 -0
- package/src/web/routes/types.ts +56 -0
- package/src/web/server.ts +134 -0
- package/src/web/ssrf-guard.ts +112 -0
- package/src/web/static/index.html +3251 -0
- package/src/web/static/vendor/chart.umd.min.js +20 -0
- package/tests/e2e/dashboard.spec.ts +205 -0
- package/tests/e2e/routing-skill-e2e.test.ts +39 -0
- package/tests/helpers/mock-ai.ts +92 -0
- package/tests/helpers/mock-storage.ts +159 -0
- package/tests/integration/queue-replay.integration.test.ts +193 -0
- package/tests/integration/tasks-filter.integration.test.ts +154 -0
- package/tests/performance/database.benchmark.ts +161 -0
- package/tests/semantic-matcher.test.ts +99 -0
- package/tests/skill-matcher.test.ts +110 -0
- package/tests/unit/ai-provider-retry.test.ts +194 -0
- package/tests/unit/ai-provider-vision.test.ts +224 -0
- package/tests/unit/claudemd-generator.test.ts +68 -0
- package/tests/unit/cli-mcp.test.ts +141 -0
- package/tests/unit/handlers.test.ts +171 -0
- package/tests/unit/invocation-guard.test.ts +125 -0
- package/tests/unit/queue.test.ts +272 -0
- package/tests/unit/router.test.ts +138 -0
- package/tests/unit/security.test.ts +128 -0
- package/tests/unit/skill-invocations-workflow.test.ts +495 -0
- package/tests/unit/skill-registry.test.ts +94 -0
- package/tests/unit/skills/invocation-guard-ttl.test.ts +211 -0
- package/tests/unit/skills/official-skills-loader.test.ts +126 -0
- package/tests/unit/skills/registry-multiformat.test.ts +92 -0
- package/tests/unit/storage/sessions-aggregate.test.ts +435 -0
- package/tests/unit/storage/sqlite-refactor-harness.test.ts +314 -0
- package/tests/unit/storage.test.ts +172 -0
- package/tests/unit/token-usage.test.ts +144 -0
- package/tests/unit/type-guards.test.ts +201 -0
- package/tests/unit/utils/format.test.ts +189 -0
- package/tests/unit/utils/session.test.ts +89 -0
- package/tests/unit/utils/time.test.ts +112 -0
- package/tests/unit/web/routes-auth.test.ts +93 -0
- package/tests/unit/web/routes-events.test.ts +101 -0
- package/tests/unit/web/routes-sessions.test.ts +181 -0
- package/tests/unit/web/routes-skill-stats.test.ts +179 -0
- package/tests/unit/web/routes-stats.test.ts +92 -0
- package/tests/unit/web/routes-tasks.test.ts +351 -0
- package/tsconfig.json +22 -0
- package/vitest.config.ts +21 -0
- package/vitest.integration.config.ts +16 -0
- package/web/CLAUDE.md +20 -0
- package/web/index.html +13 -0
- package/web/package-lock.json +4854 -0
- package/web/package.json +35 -0
- package/web/postcss.config.js +6 -0
- package/web/src/App.tsx +110 -0
- package/web/src/components/CodeBlock.tsx +31 -0
- package/web/src/components/Confirm.tsx +96 -0
- package/web/src/components/Drawer.tsx +60 -0
- package/web/src/components/Layout.tsx +145 -0
- package/web/src/components/MarkdownRenderer.tsx +77 -0
- package/web/src/components/SearchInput.tsx +31 -0
- package/web/src/components/SessionDetailContent.tsx +157 -0
- package/web/src/components/Toast.tsx +92 -0
- package/web/src/index.css +19 -0
- package/web/src/main.tsx +31 -0
- package/web/src/pages/AIConfig.tsx +233 -0
- package/web/src/pages/Dashboard.tsx +572 -0
- package/web/src/pages/Events.tsx +271 -0
- package/web/src/pages/Reports.tsx +428 -0
- package/web/src/pages/SessionDetail.tsx +162 -0
- package/web/src/pages/Sessions.tsx +205 -0
- package/web/src/pages/Skills.tsx +180 -0
- package/web/src/pages/TaskDetail.tsx +511 -0
- package/web/src/pages/Tasks.tsx +150 -0
- package/web/src/utils/auth.ts +59 -0
- package/web/src/utils/export.ts +54 -0
- package/web/src/utils/time.ts +13 -0
- package/web/tailwind.config.js +11 -0
- package/web/tsconfig.json +21 -0
- package/web/tsconfig.node.json +10 -0
- package/web/vite.config.ts +76 -0
- package/winspan-claude-forge-8.43.0.tgz +0 -0
- package/dist/agents/definition.d.ts +0 -62
- package/dist/agents/definition.d.ts.map +0 -1
- package/dist/agents/definition.js +0 -27
- package/dist/agents/definition.js.map +0 -1
- package/dist/agents/distributor.d.ts +0 -23
- package/dist/agents/distributor.d.ts.map +0 -1
- package/dist/agents/distributor.js +0 -85
- package/dist/agents/distributor.js.map +0 -1
- package/dist/agents/index.d.ts +0 -5
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/index.js +0 -5
- package/dist/agents/index.js.map +0 -1
- package/dist/agents/methodologies/agent-builder.d.ts +0 -21
- package/dist/agents/methodologies/agent-builder.d.ts.map +0 -1
- package/dist/agents/methodologies/agent-builder.js +0 -149
- package/dist/agents/methodologies/agent-builder.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/analyze.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/analyze.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/analyze.js +0 -19
- package/dist/agents/methodologies/phases/bmad/analyze.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/design.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/design.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/design.js +0 -18
- package/dist/agents/methodologies/phases/bmad/design.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/implement.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/implement.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/implement.js +0 -17
- package/dist/agents/methodologies/phases/bmad/implement.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/index.d.ts +0 -6
- package/dist/agents/methodologies/phases/bmad/index.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/index.js +0 -6
- package/dist/agents/methodologies/phases/bmad/index.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/review.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/review.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/review.js +0 -17
- package/dist/agents/methodologies/phases/bmad/review.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/test.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/test.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/test.js +0 -21
- package/dist/agents/methodologies/phases/bmad/test.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/fix.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/fix.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/fix.js +0 -17
- package/dist/agents/methodologies/phases/harness/fix.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/index.d.ts +0 -6
- package/dist/agents/methodologies/phases/harness/index.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/index.js +0 -6
- package/dist/agents/methodologies/phases/harness/index.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/reproduce.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/reproduce.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/reproduce.js +0 -20
- package/dist/agents/methodologies/phases/harness/reproduce.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/root-cause.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/root-cause.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/root-cause.js +0 -21
- package/dist/agents/methodologies/phases/harness/root-cause.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/safety-net.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/safety-net.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/safety-net.js +0 -17
- package/dist/agents/methodologies/phases/harness/safety-net.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/verify.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/verify.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/verify.js +0 -22
- package/dist/agents/methodologies/phases/harness/verify.js.map +0 -1
- package/dist/agents/methodologies/presets.d.ts +0 -10
- package/dist/agents/methodologies/presets.d.ts.map +0 -1
- package/dist/agents/methodologies/presets.js +0 -79
- package/dist/agents/methodologies/presets.js.map +0 -1
- package/dist/agents/methodologies/types.d.ts +0 -45
- package/dist/agents/methodologies/types.d.ts.map +0 -1
- package/dist/agents/methodologies/types.js +0 -10
- package/dist/agents/methodologies/types.js.map +0 -1
- package/dist/agents/methodologies/user-config-loader.d.ts +0 -30
- package/dist/agents/methodologies/user-config-loader.d.ts.map +0 -1
- package/dist/agents/methodologies/user-config-loader.js +0 -159
- package/dist/agents/methodologies/user-config-loader.js.map +0 -1
- package/dist/agents/official-agents.d.ts +0 -4
- package/dist/agents/official-agents.d.ts.map +0 -1
- package/dist/agents/official-agents.js +0 -559
- package/dist/agents/official-agents.js.map +0 -1
- package/dist/agents/registry.d.ts +0 -57
- package/dist/agents/registry.d.ts.map +0 -1
- package/dist/agents/registry.js +0 -271
- package/dist/agents/registry.js.map +0 -1
- package/dist/capability/index.d.ts +0 -10
- package/dist/capability/index.d.ts.map +0 -1
- package/dist/capability/index.js +0 -10
- package/dist/capability/index.js.map +0 -1
- package/dist/capability/types.d.ts +0 -10
- package/dist/capability/types.d.ts.map +0 -1
- package/dist/capability/types.js +0 -10
- package/dist/capability/types.js.map +0 -1
- package/dist/cli/commands/agents.d.ts +0 -3
- package/dist/cli/commands/agents.d.ts.map +0 -1
- package/dist/cli/commands/agents.js +0 -62
- package/dist/cli/commands/agents.js.map +0 -1
- package/dist/cli/commands/rules.d.ts +0 -8
- package/dist/cli/commands/rules.d.ts.map +0 -1
- package/dist/cli/commands/rules.js +0 -89
- package/dist/cli/commands/rules.js.map +0 -1
- package/dist/daemon/auto-disable-scheduler.d.ts +0 -53
- package/dist/daemon/auto-disable-scheduler.d.ts.map +0 -1
- package/dist/daemon/auto-disable-scheduler.js +0 -114
- package/dist/daemon/auto-disable-scheduler.js.map +0 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +0 -39
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +0 -1
- package/dist/daemon/handlers/pre-tool-use.js +0 -166
- package/dist/daemon/handlers/pre-tool-use.js.map +0 -1
- package/dist/daemon/routing-observer.d.ts +0 -42
- package/dist/daemon/routing-observer.d.ts.map +0 -1
- package/dist/daemon/routing-observer.js +0 -264
- package/dist/daemon/routing-observer.js.map +0 -1
- package/dist/daemon/routing-state.d.ts +0 -64
- package/dist/daemon/routing-state.d.ts.map +0 -1
- package/dist/daemon/routing-state.js +0 -240
- package/dist/daemon/routing-state.js.map +0 -1
- package/dist/engine/agent-router.d.ts +0 -142
- package/dist/engine/agent-router.d.ts.map +0 -1
- package/dist/engine/agent-router.js +0 -276
- package/dist/engine/agent-router.js.map +0 -1
- package/dist/engine/context-builder.d.ts +0 -23
- package/dist/engine/context-builder.d.ts.map +0 -1
- package/dist/engine/context-builder.js +0 -63
- package/dist/engine/context-builder.js.map +0 -1
- package/dist/engine/conventions/basic-security.yaml +0 -109
- package/dist/engine/conventions/code-quality.yaml +0 -123
- package/dist/engine/conventions/database-safety.yaml +0 -74
- package/dist/engine/conventions/dependency-safety.yaml +0 -132
- package/dist/engine/conventions/docker-safety.yaml +0 -69
- package/dist/engine/conventions/git-safety.yaml +0 -118
- package/dist/engine/conventions/go-best-practices.yaml +0 -84
- package/dist/engine/conventions/python-best-practices.yaml +0 -96
- package/dist/engine/conventions/react-best-practices.yaml +0 -96
- package/dist/engine/conventions/routing.yaml +0 -378
- package/dist/engine/conventions/strict-security.yaml +0 -30
- package/dist/engine/conventions/ts-quality.yaml +0 -49
- package/dist/engine/dsl/compiler.d.ts +0 -34
- package/dist/engine/dsl/compiler.d.ts.map +0 -1
- package/dist/engine/dsl/compiler.js +0 -702
- package/dist/engine/dsl/compiler.js.map +0 -1
- package/dist/engine/dsl/parser.d.ts +0 -25
- package/dist/engine/dsl/parser.d.ts.map +0 -1
- package/dist/engine/dsl/parser.js +0 -208
- package/dist/engine/dsl/parser.js.map +0 -1
- package/dist/engine/dsl/runtime.d.ts +0 -46
- package/dist/engine/dsl/runtime.d.ts.map +0 -1
- package/dist/engine/dsl/runtime.js +0 -173
- package/dist/engine/dsl/runtime.js.map +0 -1
- package/dist/engine/dsl/types.d.ts +0 -139
- package/dist/engine/dsl/types.d.ts.map +0 -1
- package/dist/engine/dsl/types.js +0 -11
- package/dist/engine/dsl/types.js.map +0 -1
- package/dist/engine/evidence-store.d.ts +0 -44
- package/dist/engine/evidence-store.d.ts.map +0 -1
- package/dist/engine/evidence-store.js +0 -109
- package/dist/engine/evidence-store.js.map +0 -1
- package/dist/engine/experiment-router.d.ts +0 -102
- package/dist/engine/experiment-router.d.ts.map +0 -1
- package/dist/engine/experiment-router.js +0 -289
- package/dist/engine/experiment-router.js.map +0 -1
- package/dist/engine/recommender.d.ts +0 -52
- package/dist/engine/recommender.d.ts.map +0 -1
- package/dist/engine/recommender.js +0 -162
- package/dist/engine/recommender.js.map +0 -1
- package/dist/engine/rule-engine.d.ts +0 -33
- package/dist/engine/rule-engine.d.ts.map +0 -1
- package/dist/engine/rule-engine.js +0 -250
- package/dist/engine/rule-engine.js.map +0 -1
- package/dist/engine/security-gates.d.ts +0 -42
- package/dist/engine/security-gates.d.ts.map +0 -1
- package/dist/engine/security-gates.js +0 -210
- package/dist/engine/security-gates.js.map +0 -1
- package/dist/intelligence/classifier.d.ts +0 -75
- package/dist/intelligence/classifier.d.ts.map +0 -1
- package/dist/intelligence/classifier.js +0 -352
- package/dist/intelligence/classifier.js.map +0 -1
- package/dist/intelligence/context-gatherer.d.ts +0 -101
- package/dist/intelligence/context-gatherer.d.ts.map +0 -1
- package/dist/intelligence/context-gatherer.js +0 -417
- package/dist/intelligence/context-gatherer.js.map +0 -1
- package/dist/intelligence/cot-classifier.d.ts +0 -95
- package/dist/intelligence/cot-classifier.d.ts.map +0 -1
- package/dist/intelligence/cot-classifier.js +0 -391
- package/dist/intelligence/cot-classifier.js.map +0 -1
- package/dist/intelligence/distiller.d.ts +0 -22
- package/dist/intelligence/distiller.d.ts.map +0 -1
- package/dist/intelligence/distiller.js +0 -108
- package/dist/intelligence/distiller.js.map +0 -1
- package/dist/intelligence/execution-doc-builder.d.ts +0 -151
- package/dist/intelligence/execution-doc-builder.d.ts.map +0 -1
- package/dist/intelligence/execution-doc-builder.js +0 -1018
- package/dist/intelligence/execution-doc-builder.js.map +0 -1
- package/dist/intelligence/intent-types.d.ts +0 -13
- package/dist/intelligence/intent-types.d.ts.map +0 -1
- package/dist/intelligence/intent-types.js +0 -19
- package/dist/intelligence/intent-types.js.map +0 -1
- package/dist/intelligence/multimodal-parser.d.ts +0 -105
- package/dist/intelligence/multimodal-parser.d.ts.map +0 -1
- package/dist/intelligence/multimodal-parser.js +0 -425
- package/dist/intelligence/multimodal-parser.js.map +0 -1
- package/dist/intelligence/quality-gate.d.ts +0 -45
- package/dist/intelligence/quality-gate.d.ts.map +0 -1
- package/dist/intelligence/quality-gate.js +0 -193
- package/dist/intelligence/quality-gate.js.map +0 -1
- package/dist/intelligence/task-segmenter.d.ts.map +0 -1
- package/dist/intelligence/task-segmenter.js.map +0 -1
- package/dist/web/routes/agents.d.ts +0 -7
- package/dist/web/routes/agents.d.ts.map +0 -1
- package/dist/web/routes/agents.js +0 -209
- package/dist/web/routes/agents.js.map +0 -1
- package/dist/web/routes/execution-trace.d.ts +0 -21
- package/dist/web/routes/execution-trace.d.ts.map +0 -1
- package/dist/web/routes/execution-trace.js +0 -353
- package/dist/web/routes/execution-trace.js.map +0 -1
- package/dist/web/routes/experiments.d.ts +0 -15
- package/dist/web/routes/experiments.d.ts.map +0 -1
- package/dist/web/routes/experiments.js +0 -187
- package/dist/web/routes/experiments.js.map +0 -1
- package/dist/web/routes/routing.d.ts +0 -17
- package/dist/web/routes/routing.d.ts.map +0 -1
- package/dist/web/routes/routing.js +0 -592
- package/dist/web/routes/routing.js.map +0 -1
- package/dist/web/routes/workflows.d.ts +0 -19
- package/dist/web/routes/workflows.d.ts.map +0 -1
- package/dist/web/routes/workflows.js +0 -86
- package/dist/web/routes/workflows.js.map +0 -1
- package/dist/web/static/assets/AIConfig-R5wZ3ZKT.js +0 -2
- package/dist/web/static/assets/AIConfig-R5wZ3ZKT.js.map +0 -1
- package/dist/web/static/assets/Agents-Beg34V1g.js +0 -2
- package/dist/web/static/assets/Agents-Beg34V1g.js.map +0 -1
- package/dist/web/static/assets/CodeBlock--H53gk46.js +0 -2
- package/dist/web/static/assets/CodeBlock--H53gk46.js.map +0 -1
- package/dist/web/static/assets/Dashboard-Cy1xsj1J.js +0 -2
- package/dist/web/static/assets/Dashboard-Cy1xsj1J.js.map +0 -1
- package/dist/web/static/assets/Events-mFhXl4zI.js +0 -2
- package/dist/web/static/assets/Events-mFhXl4zI.js.map +0 -1
- package/dist/web/static/assets/ExecutionTrace-DG901hLR.js +0 -3
- package/dist/web/static/assets/ExecutionTrace-DG901hLR.js.map +0 -1
- package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js +0 -2
- package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js.map +0 -1
- package/dist/web/static/assets/Routing-B7BFLfjh.js +0 -2
- package/dist/web/static/assets/Routing-B7BFLfjh.js.map +0 -1
- package/dist/web/static/assets/SessionDetail-BT0l4RrK.js +0 -2
- package/dist/web/static/assets/SessionDetail-BT0l4RrK.js.map +0 -1
- package/dist/web/static/assets/Sessions-C6J_HQ_u.js +0 -2
- package/dist/web/static/assets/Sessions-C6J_HQ_u.js.map +0 -1
- package/dist/web/static/assets/Skills-4DQWLaTv.js +0 -2
- package/dist/web/static/assets/Skills-4DQWLaTv.js.map +0 -1
- package/dist/web/static/assets/WorkflowDetail-zhNqUkBE.js +0 -2
- package/dist/web/static/assets/WorkflowDetail-zhNqUkBE.js.map +0 -1
- package/dist/web/static/assets/Workflows-Btvi-lGw.js +0 -2
- package/dist/web/static/assets/Workflows-Btvi-lGw.js.map +0 -1
- package/dist/web/static/assets/export-BQQZLaHV.js +0 -4
- package/dist/web/static/assets/export-BQQZLaHV.js.map +0 -1
- package/dist/web/static/assets/index-Cgr9qMtq.js +0 -3
- package/dist/web/static/assets/index-Cgr9qMtq.js.map +0 -1
- package/dist/web/static/assets/index-CngWb5gC.css +0 -1
- package/dist/web/static/assets/lucide-53bR2rki.js.map +0 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-powered semantic skill matcher using Claude API
|
|
3
|
+
* Provides more accurate skill recommendations by understanding user intent
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
7
|
+
import type { Skill } from './registry.js';
|
|
8
|
+
import { logger } from '../core/utils/logger.js';
|
|
9
|
+
|
|
10
|
+
export interface SemanticMatchResult {
|
|
11
|
+
skill: Skill;
|
|
12
|
+
confidence: number; // 0-100
|
|
13
|
+
reasoning: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface SemanticMatchContext {
|
|
17
|
+
prompt: string;
|
|
18
|
+
intentKeywords?: string[];
|
|
19
|
+
recentFiles?: string[];
|
|
20
|
+
projectPath?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Semantic matcher using Claude API for intent understanding
|
|
25
|
+
*/
|
|
26
|
+
export class SemanticSkillMatcher {
|
|
27
|
+
private client: Anthropic | null = null;
|
|
28
|
+
private cache: Map<string, SemanticMatchResult | null> = new Map();
|
|
29
|
+
private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
30
|
+
private cacheTimestamps: Map<string, number> = new Map();
|
|
31
|
+
|
|
32
|
+
constructor(apiKey?: string) {
|
|
33
|
+
if (apiKey) {
|
|
34
|
+
this.client = new Anthropic({ apiKey });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Match skills using semantic understanding
|
|
40
|
+
* Falls back to keyword matching if API is not configured
|
|
41
|
+
*/
|
|
42
|
+
async match(skills: Skill[], context: SemanticMatchContext): Promise<SemanticMatchResult | null> {
|
|
43
|
+
// Check cache first
|
|
44
|
+
const cacheKey = this.getCacheKey(context.prompt);
|
|
45
|
+
const cached = this.getFromCache(cacheKey);
|
|
46
|
+
if (cached !== undefined) {
|
|
47
|
+
return cached;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// If no API key, return null (caller will fall back to keyword matching)
|
|
51
|
+
if (!this.client) {
|
|
52
|
+
logger.debug('[SemanticMatcher] No API key configured, skipping semantic matching');
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const result = await this.matchWithAI(skills, context);
|
|
58
|
+
this.setCache(cacheKey, result);
|
|
59
|
+
return result;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
logger.warn(`[SemanticMatcher] AI matching failed: ${err}`);
|
|
62
|
+
return null; // Fall back to keyword matching
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Use Claude API to understand intent and match skills
|
|
68
|
+
*/
|
|
69
|
+
private async matchWithAI(
|
|
70
|
+
skills: Skill[],
|
|
71
|
+
context: SemanticMatchContext
|
|
72
|
+
): Promise<SemanticMatchResult | null> {
|
|
73
|
+
if (!this.client) return null;
|
|
74
|
+
|
|
75
|
+
// Build skill descriptions for the prompt
|
|
76
|
+
const skillDescriptions = skills
|
|
77
|
+
.filter(s => s.isOfficial) // Only consider official skills for AI matching
|
|
78
|
+
.map((s, idx) => `${idx + 1}. **${s.id}**: ${s.name} - ${this.extractDescription(s)}`)
|
|
79
|
+
.join('\n');
|
|
80
|
+
|
|
81
|
+
const prompt = this.buildMatchingPrompt(context, skillDescriptions);
|
|
82
|
+
|
|
83
|
+
const response = await this.client.messages.create({
|
|
84
|
+
model: 'claude-3-5-haiku-20241022',
|
|
85
|
+
max_tokens: 500,
|
|
86
|
+
temperature: 0,
|
|
87
|
+
messages: [
|
|
88
|
+
{
|
|
89
|
+
role: 'user',
|
|
90
|
+
content: prompt,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const content = response.content[0];
|
|
96
|
+
if (content.type !== 'text') {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return this.parseAIResponse(content.text, skills);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Build the matching prompt for Claude API
|
|
105
|
+
*/
|
|
106
|
+
private buildMatchingPrompt(context: SemanticMatchContext, skillDescriptions: string): string {
|
|
107
|
+
return `You are a skill recommendation system. Analyze the user's request and recommend the most relevant skill.
|
|
108
|
+
|
|
109
|
+
User Request: "${context.prompt}"
|
|
110
|
+
|
|
111
|
+
${context.intentKeywords && context.intentKeywords.length > 0 ? `Intent Keywords: ${context.intentKeywords.join(', ')}` : ''}
|
|
112
|
+
|
|
113
|
+
Available Skills:
|
|
114
|
+
${skillDescriptions}
|
|
115
|
+
|
|
116
|
+
Instructions:
|
|
117
|
+
1. Understand the user's intent and task type
|
|
118
|
+
2. Match to the MOST relevant skill (only ONE skill)
|
|
119
|
+
3. If no skill is clearly relevant (confidence < 60%), respond with "NONE"
|
|
120
|
+
4. Respond in this exact format:
|
|
121
|
+
|
|
122
|
+
SKILL_ID: <skill-id or NONE>
|
|
123
|
+
CONFIDENCE: <0-100>
|
|
124
|
+
REASONING: <one sentence explaining why this skill matches or why no skill matches>
|
|
125
|
+
|
|
126
|
+
Example responses:
|
|
127
|
+
- SKILL_ID: official-tdd
|
|
128
|
+
CONFIDENCE: 85
|
|
129
|
+
REASONING: User wants to write tests before implementation, which is the core of TDD.
|
|
130
|
+
|
|
131
|
+
- SKILL_ID: NONE
|
|
132
|
+
CONFIDENCE: 30
|
|
133
|
+
REASONING: Request is about simple documentation update, no specialized skill needed.`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Parse AI response into match result
|
|
138
|
+
*/
|
|
139
|
+
private parseAIResponse(response: string, skills: Skill[]): SemanticMatchResult | null {
|
|
140
|
+
const lines = response.trim().split('\n');
|
|
141
|
+
let skillId: string | null = null;
|
|
142
|
+
let confidence = 0;
|
|
143
|
+
let reasoning = '';
|
|
144
|
+
|
|
145
|
+
for (const line of lines) {
|
|
146
|
+
const trimmed = line.trim();
|
|
147
|
+
if (trimmed.startsWith('SKILL_ID:')) {
|
|
148
|
+
skillId = trimmed.substring('SKILL_ID:'.length).trim();
|
|
149
|
+
} else if (trimmed.startsWith('CONFIDENCE:')) {
|
|
150
|
+
confidence = parseInt(trimmed.substring('CONFIDENCE:'.length).trim(), 10);
|
|
151
|
+
} else if (trimmed.startsWith('REASONING:')) {
|
|
152
|
+
reasoning = trimmed.substring('REASONING:'.length).trim();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// If AI says NONE or confidence too low, return null
|
|
157
|
+
if (!skillId || skillId === 'NONE' || confidence < 60) {
|
|
158
|
+
logger.debug(`[SemanticMatcher] No match: ${reasoning}`);
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Find the matched skill
|
|
163
|
+
const skill = skills.find(s => s.id === skillId);
|
|
164
|
+
if (!skill) {
|
|
165
|
+
logger.warn(`[SemanticMatcher] AI returned unknown skill: ${skillId}`);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
logger.info(`[SemanticMatcher] Matched ${skillId} with ${confidence}% confidence`);
|
|
170
|
+
return { skill, confidence, reasoning };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Extract description from skill content
|
|
175
|
+
* Prioritizes frontmatter description over content extraction
|
|
176
|
+
*/
|
|
177
|
+
private extractDescription(skill: Skill): string {
|
|
178
|
+
// Prefer frontmatter description if available (agent-skills format)
|
|
179
|
+
if (skill.description) {
|
|
180
|
+
return skill.description;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Fallback: Try to extract first line of description from content
|
|
184
|
+
const lines = skill.content.split('\n');
|
|
185
|
+
for (const line of lines) {
|
|
186
|
+
const trimmed = line.trim();
|
|
187
|
+
if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('---')) {
|
|
188
|
+
return trimmed.substring(0, 100);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return skill.keywords.join(', ');
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Cache management
|
|
196
|
+
*/
|
|
197
|
+
private getCacheKey(prompt: string): string {
|
|
198
|
+
return prompt.toLowerCase().substring(0, 200);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
private getFromCache(key: string): SemanticMatchResult | null | undefined {
|
|
202
|
+
const timestamp = this.cacheTimestamps.get(key);
|
|
203
|
+
if (!timestamp || Date.now() - timestamp > this.CACHE_TTL) {
|
|
204
|
+
this.cache.delete(key);
|
|
205
|
+
this.cacheTimestamps.delete(key);
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
return this.cache.get(key);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
private setCache(key: string, result: SemanticMatchResult | null): void {
|
|
212
|
+
this.cache.set(key, result);
|
|
213
|
+
this.cacheTimestamps.set(key, Date.now());
|
|
214
|
+
|
|
215
|
+
// Limit cache size to 100 entries
|
|
216
|
+
if (this.cache.size > 100) {
|
|
217
|
+
const oldestKey = Array.from(this.cacheTimestamps.entries())
|
|
218
|
+
.sort((a, b) => a[1] - b[1])[0][0];
|
|
219
|
+
this.cache.delete(oldestKey);
|
|
220
|
+
this.cacheTimestamps.delete(oldestKey);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Clear cache
|
|
226
|
+
*/
|
|
227
|
+
clearCache(): void {
|
|
228
|
+
this.cache.clear();
|
|
229
|
+
this.cacheTimestamps.clear();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PipelineSuggest — 帮助 Claude 决策是否调用 Swarm Pipeline
|
|
3
|
+
*
|
|
4
|
+
* 根据任务特征(文件数量、任务类型等)判断是否需要启动多 Agent 协作的 Pipeline,
|
|
5
|
+
* 并生成可直接使用的 Task({...}) 调用代码。
|
|
6
|
+
*
|
|
7
|
+
* 内置 10 种模板,覆盖:
|
|
8
|
+
* - 基础:bug_fix / feature / refactor / investigation / performance
|
|
9
|
+
* - BMAD 风格:bmad_feature(完整产品开发流程)
|
|
10
|
+
* - Harness 风格:harness_safe_refactor(安全重构)/ harness_debug(深度调试)
|
|
11
|
+
* - 扩展:migration(技术迁移)/ security_audit(安全审计)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { logger } from '../../core/utils/logger.js';
|
|
15
|
+
|
|
16
|
+
export interface PipelineSuggestParams {
|
|
17
|
+
task_description: string;
|
|
18
|
+
file_count?: number;
|
|
19
|
+
is_new_feature?: boolean;
|
|
20
|
+
is_refactor?: boolean;
|
|
21
|
+
is_bug_fix?: boolean;
|
|
22
|
+
is_performance?: boolean;
|
|
23
|
+
is_migration?: boolean;
|
|
24
|
+
is_security?: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface PipelineSuggestResult {
|
|
28
|
+
should_invoke: boolean;
|
|
29
|
+
pipeline_type: string | null;
|
|
30
|
+
reason: string;
|
|
31
|
+
task_calls: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Pipeline 模板定义
|
|
35
|
+
*
|
|
36
|
+
* 每个 Agent 的 prompt 都强制要求在 docs/<phase>/ 下输出对应阶段文档。
|
|
37
|
+
* 文件名采用 kebab-case + 时间戳前缀(由 agent 自行生成 yyyymmdd-hhmm 格式)。
|
|
38
|
+
*
|
|
39
|
+
* 文档目录结构约定:
|
|
40
|
+
* docs/
|
|
41
|
+
* ├── requirements/ # 需求分析、问题发现、范围定义
|
|
42
|
+
* ├── design/ # 架构设计、详细设计、ADR
|
|
43
|
+
* ├── implementation/ # 改造点分析、详细执行计划
|
|
44
|
+
* ├── testing/ # 测试报告、回归记录
|
|
45
|
+
* ├── review/ # 审查报告、安全审计、性能报告
|
|
46
|
+
* └── operations/ # 迁移手册、回滚预案
|
|
47
|
+
*/
|
|
48
|
+
const PIPELINE_TEMPLATES = {
|
|
49
|
+
// ── 基础模板 ──────────────────────────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
bug_fix: (desc: string) => `Task({ subagent_type: "researcher", name: "investigator", prompt: "${desc}: Investigate root cause. Read error logs, trace call stack, identify the exact failure point. **Write findings to docs/requirements/bug-investigation-<yyyymmdd-hhmm>.md** (问题现象/复现步骤/影响范围/根因假设). SendMessage findings + doc path to 'fixer'.", run_in_background: true })
|
|
52
|
+
Task({ subagent_type: "coder", name: "fixer", prompt: "${desc}: Wait for 'investigator'. Implement minimal, targeted fix. Do NOT refactor surrounding code. **Write change log to docs/implementation/bugfix-changes-<yyyymmdd-hhmm>.md** (改动文件清单/改动原因/兼容性影响). SendMessage changed files + doc path to 'verifier'.", run_in_background: true })
|
|
53
|
+
Task({ subagent_type: "tester", name: "verifier", prompt: "${desc}: Wait for 'fixer'. Write regression test, run full test suite, verify no side effects. **Write test report to docs/testing/bugfix-test-report-<yyyymmdd-hhmm>.md** (新增测试用例/通过情况/回归覆盖范围).", run_in_background: true })`,
|
|
54
|
+
|
|
55
|
+
feature: (desc: string) => `Task({ subagent_type: "researcher", name: "analyst", prompt: "${desc}: Analyze requirements, identify affected modules, check existing patterns. **Write requirements doc to docs/requirements/feature-requirements-<yyyymmdd-hhmm>.md** (用户故事/验收标准/范围边界/依赖模块/风险). SendMessage doc path to 'designer'.", run_in_background: true })
|
|
56
|
+
Task({ subagent_type: "planner", name: "designer", prompt: "${desc}: Wait for 'analyst'. Design implementation approach: API contracts, data flow, component boundaries. **Write architecture doc to docs/design/feature-architecture-<yyyymmdd-hhmm>.md** (架构图/组件职责/接口契约/数据模型/错误处理). SendMessage doc path to 'developer'.", run_in_background: true })
|
|
57
|
+
Task({ subagent_type: "feature-developer", name: "developer", prompt: "${desc}: Wait for 'designer'. Read the architecture doc. **First write execution plan to docs/implementation/feature-plan-<yyyymmdd-hhmm>.md** (改造点列表/文件级任务拆解/实施顺序). Then implement following the plan. SendMessage to 'tester'.", run_in_background: true })
|
|
58
|
+
Task({ subagent_type: "tester", name: "tester", prompt: "${desc}: Wait for 'developer'. Write unit + integration tests covering all acceptance criteria. **Write test report to docs/testing/feature-test-report-<yyyymmdd-hhmm>.md** (用例清单/覆盖率/边界场景). SendMessage to 'reviewer'.", run_in_background: true })
|
|
59
|
+
Task({ subagent_type: "reviewer", name: "reviewer", prompt: "${desc}: Wait for 'tester'. Review code quality, security, performance. **Write review report to docs/review/feature-review-<yyyymmdd-hhmm>.md** (代码质量评分/安全/性能/可维护性/改进建议).", run_in_background: true })`,
|
|
60
|
+
|
|
61
|
+
refactor: (desc: string) => `Task({ subagent_type: "tester", name: "safety-net", prompt: "${desc}: Write characterization tests capturing current behavior. **Write safety-net report to docs/testing/refactor-safety-net-<yyyymmdd-hhmm>.md** (现有行为清单/测试用例/覆盖范围). SendMessage test paths + doc path to 'planner'.", run_in_background: true })
|
|
62
|
+
Task({ subagent_type: "planner", name: "planner", prompt: "${desc}: Wait for 'safety-net'. Design refactoring strategy. **Write refactor plan to docs/design/refactor-plan-<yyyymmdd-hhmm>.md** (目标态/分步迁移路径/依赖变更/回滚预案). SendMessage doc path to 'refactorer'.", run_in_background: true })
|
|
63
|
+
Task({ subagent_type: "refactor-specialist", name: "refactorer", prompt: "${desc}: Wait for 'planner'. Read the plan. **Write change log to docs/implementation/refactor-changes-<yyyymmdd-hhmm>.md** while executing (每步改动/影响文件/验证点). Execute step by step. SendMessage to 'verifier'.", run_in_background: true })
|
|
64
|
+
Task({ subagent_type: "tester", name: "verifier", prompt: "${desc}: Wait for 'refactorer'. Run ALL tests, verify zero regressions. **Write verification report to docs/testing/refactor-verification-<yyyymmdd-hhmm>.md** (测试通过/失败列表/性能对比).", run_in_background: true })`,
|
|
65
|
+
|
|
66
|
+
investigation: (desc: string) => `Task({ subagent_type: "tester", name: "reproducer", prompt: "${desc}: Reproduce the issue with a minimal test case. **Write reproduction doc to docs/requirements/issue-reproduction-<yyyymmdd-hhmm>.md** (现象/复现步骤/环境/触发条件). SendMessage doc path to 'analyst'.", run_in_background: true })
|
|
67
|
+
Task({ subagent_type: "researcher", name: "analyst", prompt: "${desc}: Wait for 'reproducer'. Deep-dive root cause: trace execution, check git blame, identify when it broke. **Write root cause analysis to docs/review/issue-root-cause-<yyyymmdd-hhmm>.md** (根因/引入时间/相关 commit/修复建议).", run_in_background: true })`,
|
|
68
|
+
|
|
69
|
+
performance: (desc: string) => `Task({ subagent_type: "tester", name: "benchmarker", prompt: "${desc}: Profile and benchmark current performance. **Write baseline report to docs/testing/perf-baseline-<yyyymmdd-hhmm>.md** (基线指标/测试场景/采样方法). SendMessage doc path to 'analyst'.", run_in_background: true })
|
|
70
|
+
Task({ subagent_type: "researcher", name: "analyst", prompt: "${desc}: Wait for 'benchmarker'. Identify top bottlenecks. **Write analysis to docs/review/perf-analysis-<yyyymmdd-hhmm>.md** (瓶颈定位/根因/优化方案排序). SendMessage doc path to 'optimizer'.", run_in_background: true })
|
|
71
|
+
Task({ subagent_type: "coder", name: "optimizer", prompt: "${desc}: Wait for 'analyst'. **Write execution plan to docs/implementation/perf-optimization-plan-<yyyymmdd-hhmm>.md** before coding (改造点/预期收益/风险). Implement the highest-impact optimizations. SendMessage to 'verifier'.", run_in_background: true })
|
|
72
|
+
Task({ subagent_type: "tester", name: "verifier", prompt: "${desc}: Wait for 'optimizer'. Re-run benchmarks, compare with baseline. **Write final report to docs/testing/perf-verification-<yyyymmdd-hhmm>.md** (优化前后对比/达成/未达成项).", run_in_background: true })`,
|
|
73
|
+
|
|
74
|
+
// ── BMAD 风格(完整产品开发流程)─────────────────────────────────────────
|
|
75
|
+
|
|
76
|
+
bmad_feature: (desc: string) => `Task({ subagent_type: "researcher", name: "product-analyst", prompt: "${desc}: Analyze user requirements, identify acceptance criteria, define scope boundaries. **Write PRD to docs/requirements/bmad-prd-<yyyymmdd-hhmm>.md** (用户故事/验收标准/in-scope/out-of-scope/优先级). SendMessage doc path to 'architect'.", run_in_background: true })
|
|
77
|
+
Task({ subagent_type: "planner", name: "architect", prompt: "${desc}: Wait for 'product-analyst'. Design technical architecture. **Write to docs/design/bmad-architecture-<yyyymmdd-hhmm>.md** (架构图/组件/接口/数据模型/错误处理) AND docs/design/bmad-detailed-design-<yyyymmdd-hhmm>.md** (类/方法/算法/状态机). SendMessage doc paths to 'developer'.", run_in_background: true })
|
|
78
|
+
Task({ subagent_type: "feature-developer", name: "developer", prompt: "${desc}: Wait for 'architect'. **Write implementation checklist to docs/implementation/bmad-impl-plan-<yyyymmdd-hhmm>.md** (任务拆解/文件清单/依赖顺序/验证点). Implement following the design. SendMessage to 'qa'.", run_in_background: true })
|
|
79
|
+
Task({ subagent_type: "tester", name: "qa", prompt: "${desc}: Wait for 'developer'. Write tests covering all acceptance criteria. **Write QA report to docs/testing/bmad-qa-report-<yyyymmdd-hhmm>.md** (用例对应验收标准/边界/错误路径/覆盖率). SendMessage to 'reviewer'.", run_in_background: true })
|
|
80
|
+
Task({ subagent_type: "reviewer", name: "reviewer", prompt: "${desc}: Wait for 'qa'. Final review: code quality, security, performance, accessibility. **Write final review to docs/review/bmad-final-review-<yyyymmdd-hhmm>.md** (验收标准达成/质量评分/遗留问题/上线建议).", run_in_background: true })`,
|
|
81
|
+
|
|
82
|
+
// ── Harness 风格(安全重构)─────────────────────────────────────────────
|
|
83
|
+
|
|
84
|
+
harness_safe_refactor: (desc: string) => `Task({ subagent_type: "tester", name: "safety-net", prompt: "${desc}: Write comprehensive characterization tests for ALL touched behavior. **Write to docs/testing/harness-safety-net-<yyyymmdd-hhmm>.md** (现有行为清单/测试矩阵/已知边界). SendMessage doc path to 'analyzer'.", run_in_background: true })
|
|
85
|
+
Task({ subagent_type: "researcher", name: "analyzer", prompt: "${desc}: Wait for 'safety-net'. Map all dependencies and side effects. **Write to docs/requirements/harness-impact-analysis-<yyyymmdd-hhmm>.md** (依赖图/调用方/隐藏耦合/风险评级). SendMessage doc path to 'planner'.", run_in_background: true })
|
|
86
|
+
Task({ subagent_type: "planner", name: "planner", prompt: "${desc}: Wait for 'analyzer'. Design step-by-step plan. **Write to docs/design/harness-refactor-plan-<yyyymmdd-hhmm>.md** (分步路径/每步独立验证点/回滚策略). SendMessage doc path to 'executor'.", run_in_background: true })
|
|
87
|
+
Task({ subagent_type: "refactor-specialist", name: "executor", prompt: "${desc}: Wait for 'planner'. Execute ONE step at a time. **Write change log to docs/implementation/harness-execution-<yyyymmdd-hhmm>.md** (每步改动/验证结果/checkpoint). SendMessage to 'validator'.", run_in_background: true })
|
|
88
|
+
Task({ subagent_type: "tester", name: "validator", prompt: "${desc}: Wait for 'executor'. Run full test suite, type checker, dead code check. **Write to docs/testing/harness-validation-<yyyymmdd-hhmm>.md** (测试通过/失败/类型错误/dead code 报告).", run_in_background: true })`,
|
|
89
|
+
|
|
90
|
+
// ── Harness 风格(深度调试)─────────────────────────────────────────────
|
|
91
|
+
|
|
92
|
+
harness_debug: (desc: string) => `Task({ subagent_type: "tester", name: "reproducer", prompt: "${desc}: Write a FAILING test reproducing the bug. **Write to docs/requirements/debug-reproduction-<yyyymmdd-hhmm>.md** (复现步骤/环境/失败测试路径/出现频率). SendMessage doc path to 'tracer'.", run_in_background: true })
|
|
93
|
+
Task({ subagent_type: "researcher", name: "tracer", prompt: "${desc}: Wait for 'reproducer'. Trace execution, log state at each step. **Write to docs/review/debug-trace-<yyyymmdd-hhmm>.md** (执行路径/期望 vs 实际/分歧点). SendMessage doc path to 'root-cause'.", run_in_background: true })
|
|
94
|
+
Task({ subagent_type: "researcher", name: "root-cause", prompt: "${desc}: Wait for 'tracer'. Determine root cause. **Write to docs/review/debug-root-cause-<yyyymmdd-hhmm>.md** (根因/git blame 引入点/regression 还是 latent bug/修复方向). SendMessage doc path to 'fixer'.", run_in_background: true })
|
|
95
|
+
Task({ subagent_type: "coder", name: "fixer", prompt: "${desc}: Wait for 'root-cause'. **Write fix plan to docs/implementation/debug-fix-plan-<yyyymmdd-hhmm>.md** (改动点/兼容性/副作用评估). Implement minimal targeted fix. SendMessage to 'verifier'.", run_in_background: true })
|
|
96
|
+
Task({ subagent_type: "tester", name: "verifier", prompt: "${desc}: Wait for 'fixer'. Verify reproducer test passes, run full suite. **Write to docs/testing/debug-verification-<yyyymmdd-hhmm>.md** (测试结果/相关 issue 排查/上线建议).", run_in_background: true })`,
|
|
97
|
+
|
|
98
|
+
// ── 技术迁移 ──────────────────────────────────────────────────────────────
|
|
99
|
+
|
|
100
|
+
migration: (desc: string) => `Task({ subagent_type: "researcher", name: "impact-analyst", prompt: "${desc}: Map affected files, APIs, dependencies, breaking changes. **Write to docs/requirements/migration-impact-<yyyymmdd-hhmm>.md** (影响清单/breaking changes/兼容性要求). SendMessage doc path to 'planner'.", run_in_background: true })
|
|
101
|
+
Task({ subagent_type: "tester", name: "safety-net", prompt: "${desc}: Write integration tests at migration boundaries. **Write to docs/testing/migration-safety-net-<yyyymmdd-hhmm>.md** (边界测试/前后必须通过的用例). SendMessage doc path to 'planner'.", run_in_background: true })
|
|
102
|
+
Task({ subagent_type: "planner", name: "planner", prompt: "${desc}: Wait for both. Design migration plan. **Write to docs/design/migration-plan-<yyyymmdd-hhmm>.md** AND docs/operations/migration-runbook-<yyyymmdd-hhmm>.md** (执行顺序/feature flags/回滚步骤/灰度策略). SendMessage doc paths to 'migrator'.", run_in_background: true })
|
|
103
|
+
Task({ subagent_type: "coder", name: "migrator", prompt: "${desc}: Wait for 'planner'. Execute migration step by step. **Write change log to docs/implementation/migration-changes-<yyyymmdd-hhmm>.md** (每步改动/兼容层/废弃标记). SendMessage to 'verifier'.", run_in_background: true })
|
|
104
|
+
Task({ subagent_type: "tester", name: "verifier", prompt: "${desc}: Wait for 'migrator'. Verify old + new paths work. **Write to docs/testing/migration-verification-<yyyymmdd-hhmm>.md** (新旧路径测试/deprecation warnings/上线 checklist).", run_in_background: true })`,
|
|
105
|
+
|
|
106
|
+
// ── 安全审计 ──────────────────────────────────────────────────────────────
|
|
107
|
+
|
|
108
|
+
security_audit: (desc: string) => `Task({ subagent_type: "researcher", name: "threat-modeler", prompt: "${desc}: Identify attack surfaces, trust boundaries, threat vectors. **Write to docs/requirements/security-threat-model-<yyyymmdd-hhmm>.md** (攻击面/信任边界/数据流/威胁向量 OWASP 对应). SendMessage doc path to 'code-auditor'.", run_in_background: true })
|
|
109
|
+
Task({ subagent_type: "researcher", name: "code-auditor", prompt: "${desc}: Wait for 'threat-modeler'. Audit code for each threat. **Write to docs/review/security-audit-<yyyymmdd-hhmm>.md** (漏洞清单/位置/严重级别/PoC/修复建议). SendMessage doc path to 'fixer'.", run_in_background: true })
|
|
110
|
+
Task({ subagent_type: "coder", name: "fixer", prompt: "${desc}: Wait for 'code-auditor'. **Write fix plan to docs/implementation/security-fix-plan-<yyyymmdd-hhmm>.md** (改动点/防护层/副作用). Fix all vulnerabilities. SendMessage to 'verifier'.", run_in_background: true })
|
|
111
|
+
Task({ subagent_type: "tester", name: "verifier", prompt: "${desc}: Wait for 'fixer'. Write security tests (injection/auth bypass/boundary). **Write to docs/testing/security-verification-<yyyymmdd-hhmm>.md** (测试场景/通过情况/残留风险).", run_in_background: true })`,
|
|
112
|
+
} as const;
|
|
113
|
+
|
|
114
|
+
type PipelineType = keyof typeof PIPELINE_TEMPLATES;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Determine the pipeline type based on task flags.
|
|
118
|
+
* Priority: security > migration > bug_fix > feature > refactor > performance > investigation.
|
|
119
|
+
*/
|
|
120
|
+
function determinePipelineType(params: PipelineSuggestParams): PipelineType | null {
|
|
121
|
+
if (params.is_security) return 'security_audit';
|
|
122
|
+
if (params.is_migration) return 'migration';
|
|
123
|
+
if (params.is_bug_fix) return 'bug_fix';
|
|
124
|
+
if (params.is_new_feature) return 'feature';
|
|
125
|
+
if (params.is_refactor) return 'refactor';
|
|
126
|
+
if (params.is_performance) return 'performance';
|
|
127
|
+
|
|
128
|
+
// file_count >= 3 without explicit type → investigation
|
|
129
|
+
if (params.file_count !== undefined && params.file_count >= 3) return 'investigation';
|
|
130
|
+
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Keyword-based auto-detection from task description.
|
|
136
|
+
* Supplements explicit flags when caller doesn't set them.
|
|
137
|
+
*/
|
|
138
|
+
function inferFromDescription(params: PipelineSuggestParams): PipelineSuggestParams {
|
|
139
|
+
const desc = params.task_description.toLowerCase();
|
|
140
|
+
const inferred = { ...params };
|
|
141
|
+
|
|
142
|
+
if (!inferred.is_bug_fix && (desc.includes('bug') || desc.includes('fix') || desc.includes('修复') || desc.includes('报错'))) {
|
|
143
|
+
inferred.is_bug_fix = true;
|
|
144
|
+
}
|
|
145
|
+
if (!inferred.is_new_feature && (desc.includes('implement') || desc.includes('add') || desc.includes('实现') || desc.includes('新增') || desc.includes('开发'))) {
|
|
146
|
+
inferred.is_new_feature = true;
|
|
147
|
+
}
|
|
148
|
+
if (!inferred.is_refactor && (desc.includes('refactor') || desc.includes('重构') || desc.includes('拆分') || desc.includes('迁移到'))) {
|
|
149
|
+
inferred.is_refactor = true;
|
|
150
|
+
}
|
|
151
|
+
if (!inferred.is_performance && (desc.includes('perf') || desc.includes('slow') || desc.includes('优化') || desc.includes('性能') || desc.includes('慢'))) {
|
|
152
|
+
inferred.is_performance = true;
|
|
153
|
+
}
|
|
154
|
+
if (!inferred.is_migration && (desc.includes('migrat') || desc.includes('upgrade') || desc.includes('升级') || desc.includes('迁移'))) {
|
|
155
|
+
inferred.is_migration = true;
|
|
156
|
+
}
|
|
157
|
+
if (!inferred.is_security && (desc.includes('security') || desc.includes('vulnerab') || desc.includes('安全') || desc.includes('漏洞') || desc.includes('注入'))) {
|
|
158
|
+
inferred.is_security = true;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return inferred;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Escape task description for safe embedding in template strings.
|
|
166
|
+
*/
|
|
167
|
+
function escapeDescription(desc: string): string {
|
|
168
|
+
return desc.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export async function pipelineSuggest(
|
|
172
|
+
params: PipelineSuggestParams,
|
|
173
|
+
): Promise<PipelineSuggestResult> {
|
|
174
|
+
const enriched = inferFromDescription(params);
|
|
175
|
+
const { task_description, file_count, is_new_feature, is_refactor, is_bug_fix, is_performance, is_migration, is_security } = enriched;
|
|
176
|
+
|
|
177
|
+
logger.info(
|
|
178
|
+
`[PipelineSuggest] task="${task_description}" file_count=${file_count ?? 'N/A'} ` +
|
|
179
|
+
`feature=${!!is_new_feature} refactor=${!!is_refactor} bug=${!!is_bug_fix} perf=${!!is_performance} ` +
|
|
180
|
+
`migration=${!!is_migration} security=${!!is_security}`,
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
// 激进策略:默认 invoke,除非明确是简单任务
|
|
184
|
+
const shouldInvoke =
|
|
185
|
+
(file_count !== undefined && file_count >= 2) ||
|
|
186
|
+
!!is_new_feature ||
|
|
187
|
+
!!is_refactor ||
|
|
188
|
+
!!is_bug_fix ||
|
|
189
|
+
!!is_performance ||
|
|
190
|
+
!!is_migration ||
|
|
191
|
+
!!is_security ||
|
|
192
|
+
task_description.length > 30; // 描述超过 30 字符 → 大概率不是简单任务
|
|
193
|
+
|
|
194
|
+
if (!shouldInvoke) {
|
|
195
|
+
return {
|
|
196
|
+
should_invoke: false,
|
|
197
|
+
pipeline_type: null,
|
|
198
|
+
reason: 'Task appears trivial (very short description, no complexity flags).',
|
|
199
|
+
task_calls: '',
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const pipelineType = determinePipelineType(enriched) || 'feature'; // 默认用 feature pipeline
|
|
204
|
+
const escapedDesc = escapeDescription(task_description);
|
|
205
|
+
const taskCalls = PIPELINE_TEMPLATES[pipelineType](escapedDesc);
|
|
206
|
+
|
|
207
|
+
const typeLabels: Record<PipelineType, string> = {
|
|
208
|
+
bug_fix: 'Bug Fix Pipeline (3 agents: investigate → fix → verify)',
|
|
209
|
+
feature: 'Feature Pipeline (5 agents: analyze → design → develop → test → review)',
|
|
210
|
+
refactor: 'Refactor Pipeline (4 agents: safety-net → plan → refactor → verify)',
|
|
211
|
+
investigation: 'Investigation Pipeline (2 agents: reproduce → analyze)',
|
|
212
|
+
performance: 'Performance Pipeline (4 agents: benchmark → analyze → optimize → verify)',
|
|
213
|
+
bmad_feature: 'BMAD Feature Pipeline (5 agents: product-analyst → architect → developer → qa → reviewer)',
|
|
214
|
+
harness_safe_refactor: 'Harness Safe Refactor (5 agents: safety-net → analyzer → planner → executor → validator)',
|
|
215
|
+
harness_debug: 'Harness Debug Pipeline (5 agents: reproducer → tracer → root-cause → fixer → verifier)',
|
|
216
|
+
migration: 'Migration Pipeline (5 agents: impact-analyst + safety-net → planner → migrator → verifier)',
|
|
217
|
+
security_audit: 'Security Audit Pipeline (4 agents: threat-modeler → code-auditor → fixer → verifier)',
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
should_invoke: true,
|
|
222
|
+
pipeline_type: pipelineType,
|
|
223
|
+
reason: typeLabels[pipelineType],
|
|
224
|
+
task_calls: taskCalls,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillInvoke — Agent 动态调用 Skill 的工具实现
|
|
3
|
+
*
|
|
4
|
+
* Agent 通过 MCP 工具 `skill_invoke`(snake_case,由 claude-forge MCP 服务器注册)
|
|
5
|
+
* 调用此函数,获取任何 Skill 的方法论内容。
|
|
6
|
+
*
|
|
7
|
+
* 示例(Agent 视角的调用,MCP 协议):
|
|
8
|
+
* skill_invoke({ skill_id: "official-tdd", reason: "需要 TDD 方法论指导" })
|
|
9
|
+
* → 返回 TDD 方法论的完整内容
|
|
10
|
+
*
|
|
11
|
+
* 调用链路追踪:当 context 里同时提供 storage 和 sessionId 时,每次调用都会
|
|
12
|
+
* 写入 skill_invocations 表,形成"一次路由 → Agent → N 次 Skill 调用"的证据链。
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { randomUUID } from 'node:crypto';
|
|
16
|
+
import type { SkillRegistry } from '../registry.js';
|
|
17
|
+
import type { InvocationGuard } from '../invocation-guard.js';
|
|
18
|
+
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
19
|
+
import { logger } from '../../core/utils/logger.js';
|
|
20
|
+
|
|
21
|
+
export interface SkillInvokeParams {
|
|
22
|
+
skill_id: string; // Skill ID,如 "official-tdd"
|
|
23
|
+
reason?: string; // 调用理由(可选,用于审计)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface SkillInvokeResult {
|
|
27
|
+
skill_id: string;
|
|
28
|
+
skill_name: string;
|
|
29
|
+
content: string;
|
|
30
|
+
keywords: string[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface SkillInvokeContext {
|
|
34
|
+
skillRegistry: SkillRegistry;
|
|
35
|
+
guard?: InvocationGuard;
|
|
36
|
+
sessionId?: string;
|
|
37
|
+
// 追踪链路所需上下文;storage + sessionId 同时存在时写入 skill_invocations。
|
|
38
|
+
storage?: SQLiteStorage;
|
|
39
|
+
routeRequestId?: string;
|
|
40
|
+
agentId?: string;
|
|
41
|
+
invocationType?: 'static' | 'dynamic' | 'slash_command';
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 从 reason 字段解析工作流元信息。
|
|
46
|
+
*
|
|
47
|
+
* 支持格式:
|
|
48
|
+
* "bmad/analyze" — workflow=bmad, phase=analyze
|
|
49
|
+
* "bmad/design:login-feature" — workflow=bmad, phase=design, feature_slug=login-feature
|
|
50
|
+
* "bmad/analyze:用户认证" — workflow=bmad, phase=analyze, feature_slug=用户认证(支持中文)
|
|
51
|
+
* "其他任意文本 / 中文 / 空" — 所有字段为 null(向后兼容)
|
|
52
|
+
*
|
|
53
|
+
* 大小写归一化:`Bmad/Analyze` → `bmad/analyze`,确保 SQL 聚合稳定。
|
|
54
|
+
* feature_slug 支持 Unicode 字符(中文、日文等),但建议使用英文以提高可读性。
|
|
55
|
+
*/
|
|
56
|
+
export function parseWorkflowMeta(reason: string | undefined | null): {
|
|
57
|
+
workflow: string | null;
|
|
58
|
+
phase: string | null;
|
|
59
|
+
feature_slug: string | null;
|
|
60
|
+
} {
|
|
61
|
+
if (!reason) return { workflow: null, phase: null, feature_slug: null };
|
|
62
|
+
|
|
63
|
+
// 匹配 "<workflow>/<phase>" 或 "<workflow>/<phase>:<feature-slug>"
|
|
64
|
+
// workflow/phase 规则:以字母开头,可含字母 / 数字 / 连字符
|
|
65
|
+
// feature_slug 规则:支持任意非空白、非冒号字符(包括 Unicode)
|
|
66
|
+
const match = reason.match(/^([a-z][a-z0-9-]*)\/([a-z][a-z0-9-]*)(?::([^\s:]+))?\s*$/iu);
|
|
67
|
+
if (!match) return { workflow: null, phase: null, feature_slug: null };
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
workflow: match[1].toLowerCase(),
|
|
71
|
+
phase: match[2].toLowerCase(),
|
|
72
|
+
feature_slug: match[3] ? match[3].toLowerCase() : null,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function skillInvoke(
|
|
77
|
+
params: SkillInvokeParams,
|
|
78
|
+
context: SkillInvokeContext,
|
|
79
|
+
): Promise<SkillInvokeResult> {
|
|
80
|
+
const { skill_id, reason } = params;
|
|
81
|
+
const {
|
|
82
|
+
guard,
|
|
83
|
+
sessionId,
|
|
84
|
+
skillRegistry,
|
|
85
|
+
storage,
|
|
86
|
+
routeRequestId,
|
|
87
|
+
agentId,
|
|
88
|
+
invocationType = 'dynamic',
|
|
89
|
+
} = context;
|
|
90
|
+
|
|
91
|
+
logger.info(
|
|
92
|
+
`[SkillInvoke] Agent requested skill: ${skill_id}${reason ? ` (reason: ${reason})` : ''}`,
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
// 记录调用链路的辅助函数:无论成功或失败都应落库(落库失败不影响主流程)。
|
|
96
|
+
const recordInvocation = (success: boolean, error: string | null, depth: number): void => {
|
|
97
|
+
if (!storage || !sessionId) return;
|
|
98
|
+
try {
|
|
99
|
+
const meta = parseWorkflowMeta(reason);
|
|
100
|
+
storage.writeSkillInvocation({
|
|
101
|
+
id: randomUUID(),
|
|
102
|
+
route_request_id: routeRequestId ?? null,
|
|
103
|
+
session_id: sessionId,
|
|
104
|
+
agent_id: agentId ?? null,
|
|
105
|
+
skill_id,
|
|
106
|
+
invocation_type: invocationType,
|
|
107
|
+
reason: reason ?? null,
|
|
108
|
+
workflow: meta.workflow,
|
|
109
|
+
phase: meta.phase,
|
|
110
|
+
feature_slug: meta.feature_slug,
|
|
111
|
+
artifact_path: null,
|
|
112
|
+
depth,
|
|
113
|
+
success: success ? 1 : 0,
|
|
114
|
+
error,
|
|
115
|
+
timestamp: Date.now(),
|
|
116
|
+
});
|
|
117
|
+
} catch (err) {
|
|
118
|
+
logger.warn(`[SkillInvoke] Failed to persist invocation record: ${err}`);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// 防护检查(仅当同时提供 guard 和 sessionId 时生效)
|
|
123
|
+
if (guard && sessionId) {
|
|
124
|
+
const check = guard.check(sessionId, skill_id);
|
|
125
|
+
if (!check.allowed) {
|
|
126
|
+
logger.warn(
|
|
127
|
+
`[SkillInvoke] Blocked skill=${skill_id} session=${sessionId}: ${check.reason}`,
|
|
128
|
+
);
|
|
129
|
+
const stats = guard.getStats(sessionId);
|
|
130
|
+
recordInvocation(false, `Blocked: ${check.reason}`, stats?.depth ?? 0);
|
|
131
|
+
throw new Error(`Skill invocation blocked: ${check.reason}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
let recorded = false;
|
|
136
|
+
try {
|
|
137
|
+
const skill = skillRegistry.get(skill_id);
|
|
138
|
+
if (!skill) {
|
|
139
|
+
const stats = guard && sessionId ? guard.getStats(sessionId) : null;
|
|
140
|
+
recordInvocation(false, `Skill not found: ${skill_id}`, stats?.depth ?? 0);
|
|
141
|
+
throw new Error(
|
|
142
|
+
`Skill not found: ${skill_id}. Use the \`skill_list\` MCP tool to see available skills.`,
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// 通过防护检查后登记调用
|
|
147
|
+
if (guard && sessionId) {
|
|
148
|
+
guard.record(sessionId, skill_id);
|
|
149
|
+
recorded = true;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// 成功调用写入追踪链路(depth 由 guard 维护,无 guard 时回落为 0)
|
|
153
|
+
const stats = guard && sessionId ? guard.getStats(sessionId) : null;
|
|
154
|
+
recordInvocation(true, null, stats?.depth ?? 0);
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
skill_id: skill.id,
|
|
158
|
+
skill_name: skill.name,
|
|
159
|
+
content: skill.content,
|
|
160
|
+
keywords: skill.keywords,
|
|
161
|
+
};
|
|
162
|
+
} finally {
|
|
163
|
+
// 仅在已登记时递减深度,避免未记录却减到负数
|
|
164
|
+
if (recorded && guard && sessionId) {
|
|
165
|
+
guard.complete(sessionId);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|