@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,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: official-performance-optimization
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "性能优化工作流:先度量再优化,数据驱动"
|
|
5
|
+
tags: [performance, optimization, profiling]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 性能优化
|
|
9
|
+
|
|
10
|
+
## 黄金法则
|
|
11
|
+
**永远先度量,再优化。** 没有数据的优化是猜测。
|
|
12
|
+
|
|
13
|
+
## 步骤
|
|
14
|
+
|
|
15
|
+
1. **建立基线** — 用真实数据测量当前性能
|
|
16
|
+
- 定义指标:延迟(P50/P95/P99)、吞吐量、内存
|
|
17
|
+
|
|
18
|
+
2. **找瓶颈** — Profile,不要猜
|
|
19
|
+
- CPU:火焰图;内存:heap 分析;I/O:慢查询日志
|
|
20
|
+
|
|
21
|
+
3. **优化** — 从收益最大的瓶颈开始
|
|
22
|
+
- 算法复杂度 > 减少 I/O > 缓存 > 并发
|
|
23
|
+
|
|
24
|
+
4. **验证** — 对比基线,功能测试全部通过
|
|
25
|
+
|
|
26
|
+
## 常见优化方向(按收益排序)
|
|
27
|
+
- 数据库:索引、消除 N+1、连接池
|
|
28
|
+
- 缓存:热点数据、计算结果
|
|
29
|
+
- 异步化:I/O 密集型操作
|
|
30
|
+
- 批处理:替代逐条处理
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: official-pr-review
|
|
3
|
+
version: 1.2.0
|
|
4
|
+
description: "结构化 PR 审查:覆盖正确性、安全性和可维护性"
|
|
5
|
+
tags: [review, pr, quality]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Pull Request 审查
|
|
9
|
+
|
|
10
|
+
## 审查顺序(重要性从高到低)
|
|
11
|
+
|
|
12
|
+
### 1. 正确性
|
|
13
|
+
- [ ] 逻辑在所有边界条件下正确
|
|
14
|
+
- [ ] 错误处理恰当,异常不被静默吞掉
|
|
15
|
+
- [ ] 无竞态条件或并发问题
|
|
16
|
+
|
|
17
|
+
### 2. 安全性
|
|
18
|
+
- [ ] 无注入漏洞(SQL、命令、XSS、SSRF)
|
|
19
|
+
- [ ] 敏感数据未被日志记录或暴露
|
|
20
|
+
- [ ] 权限检查在正确的层级
|
|
21
|
+
|
|
22
|
+
### 3. 性能
|
|
23
|
+
- [ ] 无 N+1 查询
|
|
24
|
+
- [ ] 大数据量场景有分页或流式处理
|
|
25
|
+
|
|
26
|
+
### 4. 可维护性
|
|
27
|
+
- [ ] 代码可读,命名自文档化
|
|
28
|
+
- [ ] 单一职责,函数不超过 40 行
|
|
29
|
+
|
|
30
|
+
### 5. 测试
|
|
31
|
+
- [ ] 新功能有对应测试
|
|
32
|
+
- [ ] 边界条件有测试覆盖
|
|
33
|
+
|
|
34
|
+
## 输出格式
|
|
35
|
+
**[BLOCKER|MAJOR|MINOR]** `
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: official-release-checklist
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "发布上线清单:从代码冻结到生产验证的完整流程"
|
|
5
|
+
tags: [release, deploy, checklist, devops]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 发布上线清单
|
|
9
|
+
|
|
10
|
+
## 发布前
|
|
11
|
+
- [ ] 所有测试通过(单元、集成、E2E)
|
|
12
|
+
- [ ] 代码已 review 并合并到主干
|
|
13
|
+
- [ ] 数据库迁移脚本已准备,可回滚
|
|
14
|
+
- [ ] 配置变更已确认(环境变量、feature flag)
|
|
15
|
+
- [ ] 监控告警已配置
|
|
16
|
+
- [ ] 回滚方案已明确
|
|
17
|
+
|
|
18
|
+
## 发布中
|
|
19
|
+
- [ ] 灰度/金丝雀发布(先放 5% 流量)
|
|
20
|
+
- [ ] 观察关键指标 5 分钟:错误率、P99 延迟
|
|
21
|
+
|
|
22
|
+
## 发布后
|
|
23
|
+
- [ ] 生产环境冒烟测试
|
|
24
|
+
- [ ] 监控观察 30 分钟
|
|
25
|
+
- [ ] 通知相关方
|
|
26
|
+
|
|
27
|
+
## 回滚触发条件
|
|
28
|
+
- 错误率上升 > 1%
|
|
29
|
+
- P99 延迟上升 > 50%
|
|
30
|
+
- 出现 CRITICAL 级别日志
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: official-security-hardening
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "安全加固清单:覆盖 OWASP Top 10 和常见安全实践"
|
|
5
|
+
tags: [security, owasp, hardening]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 安全加固
|
|
9
|
+
|
|
10
|
+
## 输入验证
|
|
11
|
+
- 所有外部输入在边界处验证(类型、长度、格式)
|
|
12
|
+
- 参数化查询,禁止字符串拼接 SQL
|
|
13
|
+
- 文件上传:验证类型、大小、存储路径隔离
|
|
14
|
+
|
|
15
|
+
## 认证与授权
|
|
16
|
+
- 密码:bcrypt/argon2 哈希,禁止 MD5/SHA1
|
|
17
|
+
- Token:短有效期 + refresh token 机制
|
|
18
|
+
- 每个接口显式检查权限,不依赖前端隐藏
|
|
19
|
+
|
|
20
|
+
## 数据保护
|
|
21
|
+
- 敏感字段(密码、密钥、PII)不写日志
|
|
22
|
+
- HTTPS only,HSTS header
|
|
23
|
+
- 密钥走环境变量,不进代码库
|
|
24
|
+
|
|
25
|
+
## 依赖安全
|
|
26
|
+
- 定期运行 `
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: official-spec-driven-design
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "SDD:先写规格文档再写代码,需求驱动实现"
|
|
5
|
+
tags: [sdd, spec, design, requirements]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Spec-Driven Design(规格驱动开发)
|
|
9
|
+
|
|
10
|
+
在写任何代码之前,先把规格写清楚。规格是代码的合同。
|
|
11
|
+
|
|
12
|
+
## 步骤
|
|
13
|
+
|
|
14
|
+
1. **写 SPEC.md**,包含:
|
|
15
|
+
- 功能目标(一句话)
|
|
16
|
+
- 输入/输出定义(含类型和边界)
|
|
17
|
+
- 不做什么(明确排除项)
|
|
18
|
+
- 验收标准(可测试的条件列表)
|
|
19
|
+
|
|
20
|
+
2. **评审规格** — 在写代码前确认规格无歧义
|
|
21
|
+
- 每条验收标准都能写成测试吗?
|
|
22
|
+
- 边界条件是否覆盖?
|
|
23
|
+
|
|
24
|
+
3. **按规格实现** — 代码只做规格里写的事
|
|
25
|
+
- 遇到规格未覆盖的情况,先更新规格再写代码
|
|
26
|
+
|
|
27
|
+
4. **验收** — 逐条对照验收标准,全部通过才算完成
|
|
28
|
+
|
|
29
|
+
## 规则
|
|
30
|
+
- 规格变更必须先于代码变更
|
|
31
|
+
- 实现不得超出规格范围(避免过度设计)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: planning-with-files
|
|
3
|
+
description: Implements Manus-style file-based planning to organize and track progress on complex tasks. Creates task_plan.md, findings.md, and progress.md. Use when asked to plan out, break down, or organize a multi-step project, research task, or any work requiring 5+ tool calls. Supports automatic session recovery after /clear.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
allowed-tools: "Read Write Edit Bash Glob Grep"
|
|
6
|
+
hooks:
|
|
7
|
+
UserPromptSubmit:
|
|
8
|
+
- hooks:
|
|
9
|
+
- type: command
|
|
10
|
+
command: "if [ -f task_plan.md ]; then echo '[planning-with-files] ACTIVE PLAN — current state:'; head -50 task_plan.md; echo ''; echo '=== recent progress ==='; tail -20 progress.md 2>/dev/null; echo ''; echo '[planning-with-files] Read findings.md for research context. Continue from the current phase.'; fi"
|
|
11
|
+
PreToolUse:
|
|
12
|
+
- matcher: "Write|Edit|Bash|Read|Glob|Grep"
|
|
13
|
+
hooks:
|
|
14
|
+
- type: command
|
|
15
|
+
command: "cat task_plan.md 2>/dev/null | head -30 || true"
|
|
16
|
+
PostToolUse:
|
|
17
|
+
- matcher: "Write|Edit"
|
|
18
|
+
hooks:
|
|
19
|
+
- type: command
|
|
20
|
+
command: "if [ -f task_plan.md ]; then echo '[planning-with-files] Update progress.md with what you just did. If a phase is now complete, update task_plan.md status.'; fi"
|
|
21
|
+
Stop:
|
|
22
|
+
- hooks:
|
|
23
|
+
- type: command
|
|
24
|
+
command: "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command \\\"& (Get-ChildItem -Path (Join-Path ~ '.claude/plugins/cache') -Filter check-complete.ps1 -Recurse -EA 0 | Select-Object -First 1).FullName\\\" 2>/dev/null || sh \\\"$(ls $HOME/.claude/plugins/cache/*/*/*/scripts/check-complete.sh 2>/dev/null | head -1)\\\" 2>/dev/null || true"
|
|
25
|
+
metadata:
|
|
26
|
+
version: "2.35.0"
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Planning with Files
|
|
30
|
+
|
|
31
|
+
Work like Manus: Use persistent markdown files as your "working memory on disk."
|
|
32
|
+
|
|
33
|
+
## FIRST: Restore Context (v2.2.0)
|
|
34
|
+
|
|
35
|
+
**Before doing anything else**, check if planning files exist and read them:
|
|
36
|
+
|
|
37
|
+
1. If `
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-ux-pro-max
|
|
3
|
+
version: 2.5.0
|
|
4
|
+
description: "AI 驱动的设计智能工具:67 种 UI 风格、161 种配色、57 种字体搭配、99 条 UX 准则"
|
|
5
|
+
tags: [ui, ux, design, color, typography, accessibility]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# CLAUDE.md
|
|
9
|
+
|
|
10
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
11
|
+
|
|
12
|
+
## Project Overview
|
|
13
|
+
|
|
14
|
+
Antigravity Kit is an AI-powered design intelligence toolkit providing searchable databases of UI styles, color palettes, font pairings, chart types, and UX guidelines. It works as a skill/workflow for AI coding assistants (Claude Code, Windsurf, Cursor, etc.).
|
|
15
|
+
|
|
16
|
+
## Search Command
|
|
17
|
+
|
|
18
|
+
`
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: webapp-testing
|
|
3
|
+
description: Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
|
|
4
|
+
license: Complete terms in LICENSE.txt
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Web Application Testing
|
|
8
|
+
|
|
9
|
+
To test local web applications, write native Python Playwright scripts.
|
|
10
|
+
|
|
11
|
+
**Helper Scripts Available**:
|
|
12
|
+
- `
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Official built-in skills for claude-forge
|
|
3
|
+
* Skill content is stored in src/skills/official/*.md files.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import matter from 'gray-matter';
|
|
9
|
+
|
|
10
|
+
export interface OfficialSkill {
|
|
11
|
+
name: string;
|
|
12
|
+
version: string;
|
|
13
|
+
description: string;
|
|
14
|
+
keywords: string[];
|
|
15
|
+
content: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Official skill keyword mappings
|
|
20
|
+
* Used for skill matching and orchestration
|
|
21
|
+
*/
|
|
22
|
+
export const OFFICIAL_SKILL_KEYWORDS: Record<string, string[]> = {
|
|
23
|
+
'official-tdd': ['tdd', 'test-driven', '测试驱动'],
|
|
24
|
+
'official-debug': ['debug', '调试', 'bug', '修复', 'fix', 'hotfix', '报错', '异常', 'error', '不工作', '失败', 'failed', 'crash', '问题'],
|
|
25
|
+
'official-refactor': ['refactor', '重构', 'cleanup', 'reorganize', 'restructure'],
|
|
26
|
+
'official-pr-review': ['review', '审查', 'pr review', 'code review', '检查', '看看代码', '帮我看', '评审'],
|
|
27
|
+
'official-harness-engineering': ['harness', 'legacy', '遗留代码', '特征测试', 'characterization', '重构', 'refactor', '改造', '老代码'],
|
|
28
|
+
'official-bmad': ['bmad', 'agile', 'four-role', '敏捷', '四角色', 'story', 'user story', 'sprint', '迭代'],
|
|
29
|
+
'official-spec-driven-design': ['spec', 'sdd', 'spec-driven', '规格', '需求文档', 'requirements'],
|
|
30
|
+
'official-architecture-decision': ['adr', 'architecture decision', '架构决策', '技术选型'],
|
|
31
|
+
'official-api-design': ['api design', 'api 设计', 'restful', 'openapi', '接口设计'],
|
|
32
|
+
'official-db-schema-design': ['schema', 'database', '数据库设计', 'migration', '迁移', 'sql'],
|
|
33
|
+
'official-performance-optimization': ['performance', '性能', 'optimize', '优化', 'profiling', '瓶颈', '慢', 'slow', 'timeout', '超时', '卡顿', 'latency'],
|
|
34
|
+
'official-security-hardening': ['security', '安全', 'owasp', 'hardening', '加固', 'vulnerability', '漏洞', '注入', 'injection', 'xss', 'csrf', '权限', 'auth'],
|
|
35
|
+
'official-release-checklist': ['release', 'deploy', '发布', '上线', 'checklist', '部署'],
|
|
36
|
+
'official-doc-driven': ['doc-driven', 'documentation', '文档驱动', '写文档', 'readme'],
|
|
37
|
+
'planning-with-files': ['plan', 'planning', '规划', 'task plan', 'organize', '组织任务', '怎么做', '方案', '步骤', '计划'],
|
|
38
|
+
'code-simplifier': ['simplify', 'refine', '简化', 'cleanup', 'code quality'],
|
|
39
|
+
'find-skills': ['find skill', 'search skill', '查找技能', 'discover', 'install skill'],
|
|
40
|
+
'webapp-testing': ['test webapp', 'playwright', 'browser test', 'e2e', 'frontend test'],
|
|
41
|
+
'ui-ux-pro-max': ['ui', 'ux', 'design', 'color', 'typography', 'palette', '设计'],
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Load official skills from a directory of .md files.
|
|
46
|
+
* Each .md file should have frontmatter with at minimum a `name` field.
|
|
47
|
+
* The `keywords` or `tags` field in frontmatter provides keyword matching hints.
|
|
48
|
+
*
|
|
49
|
+
* @param builtinDir - Path to the directory containing official skill .md files
|
|
50
|
+
* @returns Array of OfficialSkill objects
|
|
51
|
+
*/
|
|
52
|
+
export function loadOfficialSkills(builtinDir: string): OfficialSkill[] {
|
|
53
|
+
if (!fs.existsSync(builtinDir)) {
|
|
54
|
+
throw new Error(`Official skills directory not found: ${builtinDir}`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const entries = fs.readdirSync(builtinDir);
|
|
58
|
+
const skills: OfficialSkill[] = [];
|
|
59
|
+
|
|
60
|
+
for (const filename of entries) {
|
|
61
|
+
if (!filename.endsWith('.md')) continue;
|
|
62
|
+
|
|
63
|
+
const filePath = path.join(builtinDir, filename);
|
|
64
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
65
|
+
const parsed = matter(raw);
|
|
66
|
+
const { data, content: body } = parsed;
|
|
67
|
+
|
|
68
|
+
const id = path.basename(filename, '.md');
|
|
69
|
+
const name = typeof data.name === 'string' ? data.name : id;
|
|
70
|
+
const version = typeof data.version === 'string' ? data.version : '1.0.0';
|
|
71
|
+
const description = typeof data.description === 'string' ? data.description : '';
|
|
72
|
+
|
|
73
|
+
// Support both `keywords` (claude-forge standard) and `tags` (Claude Code official skill convention)
|
|
74
|
+
const rawKeywords: unknown = data.keywords ?? data.tags;
|
|
75
|
+
const keywords: string[] = Array.isArray(rawKeywords)
|
|
76
|
+
? rawKeywords.filter((k): k is string => typeof k === 'string')
|
|
77
|
+
: [];
|
|
78
|
+
|
|
79
|
+
skills.push({
|
|
80
|
+
name,
|
|
81
|
+
version,
|
|
82
|
+
description,
|
|
83
|
+
keywords,
|
|
84
|
+
content: raw, // full file content including frontmatter
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return skills;
|
|
89
|
+
}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import matter from 'gray-matter';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { logger } from '../core/utils/logger.js';
|
|
7
|
+
import { loadOfficialSkills, OFFICIAL_SKILL_KEYWORDS } from './official-skills.js';
|
|
8
|
+
import { SemanticSkillMatcher } from './semantic-matcher.js';
|
|
9
|
+
|
|
10
|
+
const SKILLS_DIR = path.join(homedir(), '.claude', 'skills');
|
|
11
|
+
|
|
12
|
+
export interface Skill {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
keywords: string[];
|
|
16
|
+
content: string;
|
|
17
|
+
path: string;
|
|
18
|
+
isOfficial?: boolean; // Mark official built-in skills
|
|
19
|
+
description?: string; // Optional description from frontmatter (used by agent-skills format)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Simple skill registry that scans ~/.claude/skills/*.md
|
|
24
|
+
* and matches by keywords in frontmatter
|
|
25
|
+
*/
|
|
26
|
+
export class SkillRegistry {
|
|
27
|
+
private skills: Map<string, Skill> = new Map();
|
|
28
|
+
private semanticMatcher: SemanticSkillMatcher | null = null;
|
|
29
|
+
|
|
30
|
+
constructor(apiKey?: string) {
|
|
31
|
+
this.scan();
|
|
32
|
+
|
|
33
|
+
// Initialize semantic matcher if API key is provided
|
|
34
|
+
if (apiKey) {
|
|
35
|
+
this.semanticMatcher = new SemanticSkillMatcher(apiKey);
|
|
36
|
+
logger.info('[SkillRegistry] Semantic matching enabled');
|
|
37
|
+
} else {
|
|
38
|
+
logger.debug('[SkillRegistry] Semantic matching disabled (no API key)');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Resolve the directory containing official built-in skill .md files.
|
|
44
|
+
* Uses import.meta.url for ESM compatibility (works in both dev and npm-installed environments).
|
|
45
|
+
*/
|
|
46
|
+
private resolveBuiltinDir(): string {
|
|
47
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
48
|
+
return path.join(path.dirname(thisFile), 'official');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Scan ~/.claude/skills/ for markdown files with frontmatter
|
|
53
|
+
* Official skills are loaded first, then user skills (which can override)
|
|
54
|
+
*
|
|
55
|
+
* Supports two formats:
|
|
56
|
+
* 1. Flat format: ~/.claude/skills/skill-name.md
|
|
57
|
+
* 2. Directory format: ~/.claude/skills/skill-name/SKILL.md (agent-skills format)
|
|
58
|
+
*/
|
|
59
|
+
private scan(): void {
|
|
60
|
+
// 1. Load official built-in skills from src/skills/official/*.md
|
|
61
|
+
let officialCount = 0;
|
|
62
|
+
try {
|
|
63
|
+
const officialSkills = loadOfficialSkills(this.resolveBuiltinDir());
|
|
64
|
+
for (const officialSkill of officialSkills) {
|
|
65
|
+
// Merge extended keywords from OFFICIAL_SKILL_KEYWORDS if available
|
|
66
|
+
const extendedKeywords = OFFICIAL_SKILL_KEYWORDS[officialSkill.name] || officialSkill.keywords;
|
|
67
|
+
this.skills.set(officialSkill.name, {
|
|
68
|
+
id: officialSkill.name,
|
|
69
|
+
name: officialSkill.name,
|
|
70
|
+
keywords: extendedKeywords,
|
|
71
|
+
content: officialSkill.content,
|
|
72
|
+
path: this.resolveBuiltinDir() + '/' + officialSkill.name + '.md',
|
|
73
|
+
isOfficial: true,
|
|
74
|
+
description: officialSkill.description,
|
|
75
|
+
});
|
|
76
|
+
officialCount++;
|
|
77
|
+
}
|
|
78
|
+
} catch (err) {
|
|
79
|
+
logger.warn(`[SkillRegistry] Failed to load official skills: ${err}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
logger.info(`Loaded ${officialCount} official skill(s)`);
|
|
83
|
+
|
|
84
|
+
// 2. Load user skills from ~/.claude/skills/ (can override official skills)
|
|
85
|
+
if (!fs.existsSync(SKILLS_DIR)) {
|
|
86
|
+
logger.debug(`Skills directory not found: ${SKILLS_DIR}`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const entries = fs.readdirSync(SKILLS_DIR, { withFileTypes: true });
|
|
91
|
+
let userCount = 0;
|
|
92
|
+
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
try {
|
|
95
|
+
let filePath: string;
|
|
96
|
+
let id: string;
|
|
97
|
+
|
|
98
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
99
|
+
// Format 1: Flat .md file
|
|
100
|
+
filePath = path.join(SKILLS_DIR, entry.name);
|
|
101
|
+
id = path.basename(entry.name, '.md');
|
|
102
|
+
} else if (entry.isDirectory()) {
|
|
103
|
+
// Format 2: Directory with SKILL.md
|
|
104
|
+
const skillMdPath = path.join(SKILLS_DIR, entry.name, 'SKILL.md');
|
|
105
|
+
if (!fs.existsSync(skillMdPath)) {
|
|
106
|
+
continue; // Skip directories without SKILL.md
|
|
107
|
+
}
|
|
108
|
+
filePath = skillMdPath;
|
|
109
|
+
id = entry.name;
|
|
110
|
+
} else {
|
|
111
|
+
continue; // Skip other file types
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
115
|
+
const parsed = matter(content);
|
|
116
|
+
const { data, content: body } = parsed;
|
|
117
|
+
|
|
118
|
+
const name = typeof data.name === 'string' ? data.name : id;
|
|
119
|
+
// 兼容两种字段名:keywords(claude-forge 标准)和 tags(Claude Code 官方 skill 约定)
|
|
120
|
+
const rawKeywords: unknown = data.keywords ?? data.tags;
|
|
121
|
+
const keywords: string[] = Array.isArray(rawKeywords)
|
|
122
|
+
? rawKeywords.filter((k): k is string => typeof k === 'string')
|
|
123
|
+
: [];
|
|
124
|
+
const description = typeof data.description === 'string' ? data.description : undefined;
|
|
125
|
+
|
|
126
|
+
// User skills override official skills, but merge keywords from OFFICIAL_SKILL_KEYWORDS
|
|
127
|
+
const extendedKeywords = OFFICIAL_SKILL_KEYWORDS[id];
|
|
128
|
+
const mergedKeywords = extendedKeywords
|
|
129
|
+
? [...new Set([...keywords, ...extendedKeywords])]
|
|
130
|
+
: keywords;
|
|
131
|
+
|
|
132
|
+
this.skills.set(id, {
|
|
133
|
+
id,
|
|
134
|
+
name,
|
|
135
|
+
keywords: mergedKeywords,
|
|
136
|
+
content: body.trim(),
|
|
137
|
+
path: filePath,
|
|
138
|
+
isOfficial: false,
|
|
139
|
+
description,
|
|
140
|
+
});
|
|
141
|
+
userCount++;
|
|
142
|
+
} catch (err) {
|
|
143
|
+
logger.warn(`Failed to parse skill ${entry.name}: ${err}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (userCount > 0) {
|
|
148
|
+
logger.info(`Loaded ${userCount} user skill(s) from ${SKILLS_DIR}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Match a prompt against skill keywords with hybrid approach:
|
|
154
|
+
* 1. Try semantic matching (AI-powered) if available
|
|
155
|
+
* 2. Fall back to keyword matching if semantic fails or not configured
|
|
156
|
+
*/
|
|
157
|
+
async match(prompt: string, keywords: string[] = [], context?: { recentFiles?: string[] }): Promise<Skill | null> {
|
|
158
|
+
const result = await this.matchWithConfidence(prompt, keywords, context);
|
|
159
|
+
return result?.skill ?? null;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Like match(), but also returns the confidence score (0-100) so callers
|
|
164
|
+
* can compare across alternatives (e.g. agent vs skill routing).
|
|
165
|
+
*/
|
|
166
|
+
async matchWithConfidence(
|
|
167
|
+
prompt: string,
|
|
168
|
+
keywords: string[] = [],
|
|
169
|
+
context?: { recentFiles?: string[] },
|
|
170
|
+
): Promise<{ skill: Skill; confidence: number; source: 'semantic' | 'keyword' } | null> {
|
|
171
|
+
// Try semantic matching first
|
|
172
|
+
if (this.semanticMatcher) {
|
|
173
|
+
try {
|
|
174
|
+
const semanticResult = await this.semanticMatcher.match(
|
|
175
|
+
Array.from(this.skills.values()),
|
|
176
|
+
{
|
|
177
|
+
prompt,
|
|
178
|
+
intentKeywords: keywords,
|
|
179
|
+
recentFiles: context?.recentFiles,
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
if (semanticResult) {
|
|
184
|
+
logger.info(`[SkillRegistry] Semantic match: ${semanticResult.skill.id} (${semanticResult.confidence}%)`);
|
|
185
|
+
return { skill: semanticResult.skill, confidence: semanticResult.confidence, source: 'semantic' };
|
|
186
|
+
}
|
|
187
|
+
} catch (err) {
|
|
188
|
+
logger.warn(`[SkillRegistry] Semantic matching failed, falling back to keyword matching: ${err}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Fall back to keyword matching
|
|
193
|
+
const kwSkill = await this.matchKeywords(prompt, keywords, context);
|
|
194
|
+
if (kwSkill) {
|
|
195
|
+
// Keyword matching has no real confidence; assign a conservative 60%
|
|
196
|
+
return { skill: kwSkill, confidence: 60, source: 'keyword' };
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Keyword-based matching (fallback method)
|
|
203
|
+
* Supports fallback to description-based substring matching when keywords are empty
|
|
204
|
+
*/
|
|
205
|
+
private async matchKeywords(
|
|
206
|
+
prompt: string,
|
|
207
|
+
keywords: string[] = [],
|
|
208
|
+
context?: { recentFiles?: string[] }
|
|
209
|
+
): Promise<Skill | null> {
|
|
210
|
+
const promptLower = prompt.toLowerCase();
|
|
211
|
+
const extraLower = keywords.map(k => k.toLowerCase());
|
|
212
|
+
|
|
213
|
+
let bestSkill: Skill | null = null;
|
|
214
|
+
let bestScore = 0;
|
|
215
|
+
let bestCandidate: Skill | null = null;
|
|
216
|
+
let bestCandidateScore = 0;
|
|
217
|
+
|
|
218
|
+
for (const skill of this.skills.values()) {
|
|
219
|
+
let score = 0;
|
|
220
|
+
|
|
221
|
+
// If skill has keywords, use keyword matching
|
|
222
|
+
if (skill.keywords.length > 0) {
|
|
223
|
+
for (const kw of skill.keywords) {
|
|
224
|
+
const kwLower = kw.toLowerCase();
|
|
225
|
+
|
|
226
|
+
// Check if keyword appears in prompt or intent keywords
|
|
227
|
+
if (this.matchKeywordFlexible(promptLower, kwLower)) {
|
|
228
|
+
score += 1;
|
|
229
|
+
}
|
|
230
|
+
if (extraLower.some(ek => this.matchKeywordFlexible(ek, kwLower))) {
|
|
231
|
+
score += 1;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
} else if (skill.description) {
|
|
235
|
+
// Fallback path 1: Use description substring matching when keywords are empty
|
|
236
|
+
const descLower = skill.description.toLowerCase();
|
|
237
|
+
if (descLower.includes(promptLower) || promptLower.includes(descLower)) {
|
|
238
|
+
score = 1; // Give a base score for description match
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Fallback path 2: If no keywords and no description, score remains 0
|
|
242
|
+
// This allows SemanticSkillMatcher to take over
|
|
243
|
+
|
|
244
|
+
// Track best candidate regardless of threshold
|
|
245
|
+
if (score > bestCandidateScore) {
|
|
246
|
+
bestCandidateScore = score;
|
|
247
|
+
bestCandidate = skill;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Official skills get priority: require 1+ match, user skills require 2+ matches
|
|
251
|
+
const threshold = skill.isOfficial ? 1 : 2;
|
|
252
|
+
|
|
253
|
+
if (score >= threshold && score > bestScore) {
|
|
254
|
+
bestScore = score;
|
|
255
|
+
bestSkill = skill;
|
|
256
|
+
} else if (
|
|
257
|
+
score === bestScore &&
|
|
258
|
+
score >= threshold &&
|
|
259
|
+
skill.isOfficial &&
|
|
260
|
+
!bestSkill?.isOfficial
|
|
261
|
+
) {
|
|
262
|
+
// Tie-break: prefer official skill when both meet threshold
|
|
263
|
+
bestSkill = skill;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (bestSkill) {
|
|
268
|
+
logger.info(`[SkillRegistry] Keyword match: ${bestSkill.id} (score: ${bestScore})`);
|
|
269
|
+
} else {
|
|
270
|
+
logger.debug(`[SkillRegistry] Best keyword candidate: ${bestCandidate?.id ?? 'none'} (score: ${bestCandidateScore})`);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return bestSkill;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Flexible keyword matching with word boundary for English, substring for Chinese
|
|
278
|
+
*/
|
|
279
|
+
private matchKeywordFlexible(text: string, keyword: string): boolean {
|
|
280
|
+
// For Chinese or multi-word keywords, use simple includes
|
|
281
|
+
if (/[一-龥]/.test(keyword) || keyword.includes(' ')) {
|
|
282
|
+
return text.includes(keyword);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// For single English words, require word boundaries to avoid false positives
|
|
286
|
+
// e.g., "test" won't match "latest"
|
|
287
|
+
const regex = new RegExp(`\\b${keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`);
|
|
288
|
+
return regex.test(text);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Match with full result details (for debugging/logging)
|
|
293
|
+
*/
|
|
294
|
+
async matchWithDetails(prompt: string, keywords: string[] = [], context?: { recentFiles?: string[] }) {
|
|
295
|
+
const promptLower = prompt.toLowerCase();
|
|
296
|
+
const extraLower = keywords.map(k => k.toLowerCase());
|
|
297
|
+
|
|
298
|
+
const results = [];
|
|
299
|
+
for (const skill of this.skills.values()) {
|
|
300
|
+
let score = 0;
|
|
301
|
+
const matchedKeywords: string[] = [];
|
|
302
|
+
|
|
303
|
+
for (const kw of skill.keywords) {
|
|
304
|
+
const kwLower = kw.toLowerCase();
|
|
305
|
+
|
|
306
|
+
if (this.matchKeywordFlexible(promptLower, kwLower)) {
|
|
307
|
+
score += 1;
|
|
308
|
+
matchedKeywords.push(kw);
|
|
309
|
+
}
|
|
310
|
+
if (extraLower.some(ek => this.matchKeywordFlexible(ek, kwLower))) {
|
|
311
|
+
score += 1;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (score >= 1) {
|
|
316
|
+
results.push({
|
|
317
|
+
skill,
|
|
318
|
+
confidence: Math.min(100, score * 20), // Simple scoring: 1 match = 20%, 5 matches = 100%
|
|
319
|
+
matchedKeywords,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
results.sort((a, b) => b.confidence - a.confidence);
|
|
325
|
+
return results;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/** Return all loaded skills */
|
|
329
|
+
getAll(): Skill[] {
|
|
330
|
+
return Array.from(this.skills.values());
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/** Get a skill by ID */
|
|
334
|
+
get(id: string): Skill | undefined {
|
|
335
|
+
return this.skills.get(id);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Get skill manifest (id + description + keywords) for Agent pre-declaration
|
|
340
|
+
*/
|
|
341
|
+
getManifest(): Array<{ id: string; name: string; description: string; keywords: string[] }> {
|
|
342
|
+
return this.getAll().map(skill => ({
|
|
343
|
+
id: skill.id,
|
|
344
|
+
name: skill.name,
|
|
345
|
+
description: skill.description || '',
|
|
346
|
+
keywords: skill.keywords,
|
|
347
|
+
}));
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/** Re-scan the skills directory */
|
|
351
|
+
reload(): void {
|
|
352
|
+
this.skills.clear();
|
|
353
|
+
this.scan();
|
|
354
|
+
}
|
|
355
|
+
}
|