@winspan/claude-forge 8.53.2 → 8.54.4

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.
Files changed (394) hide show
  1. package/DEVELOPMENT.md +290 -221
  2. package/README.md +50 -8
  3. package/dist/cli/commands/skills.d.ts.map +1 -1
  4. package/dist/cli/commands/skills.js +7 -3
  5. package/dist/cli/commands/skills.js.map +1 -1
  6. package/dist/cli/init/hook-manager.d.ts +1 -1
  7. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  8. package/dist/cli/init/hook-manager.js +1 -0
  9. package/dist/cli/init/hook-manager.js.map +1 -1
  10. package/dist/core/storage/events.d.ts.map +1 -1
  11. package/dist/core/storage/events.js +0 -1
  12. package/dist/core/storage/events.js.map +1 -1
  13. package/dist/core/storage/maintenance.d.ts +25 -3
  14. package/dist/core/storage/maintenance.d.ts.map +1 -1
  15. package/dist/core/storage/maintenance.js +33 -4
  16. package/dist/core/storage/maintenance.js.map +1 -1
  17. package/dist/core/storage/routing.d.ts +4 -0
  18. package/dist/core/storage/routing.d.ts.map +1 -1
  19. package/dist/core/storage/routing.js +10 -4
  20. package/dist/core/storage/routing.js.map +1 -1
  21. package/dist/core/storage/sessions.d.ts +17 -0
  22. package/dist/core/storage/sessions.d.ts.map +1 -1
  23. package/dist/core/storage/sessions.js +64 -0
  24. package/dist/core/storage/sessions.js.map +1 -1
  25. package/dist/core/storage/skills.d.ts +4 -0
  26. package/dist/core/storage/skills.d.ts.map +1 -1
  27. package/dist/core/storage/skills.js +10 -2
  28. package/dist/core/storage/skills.js.map +1 -1
  29. package/dist/core/storage/sqlite.d.ts +5 -0
  30. package/dist/core/storage/sqlite.d.ts.map +1 -1
  31. package/dist/core/storage/sqlite.js +6 -0
  32. package/dist/core/storage/sqlite.js.map +1 -1
  33. package/dist/core/storage/tasks.d.ts.map +1 -1
  34. package/dist/core/storage/tasks.js +2 -0
  35. package/dist/core/storage/tasks.js.map +1 -1
  36. package/dist/core/types.d.ts +7 -0
  37. package/dist/core/types.d.ts.map +1 -1
  38. package/dist/daemon/index.d.ts.map +1 -1
  39. package/dist/daemon/index.js +19 -4
  40. package/dist/daemon/index.js.map +1 -1
  41. package/dist/skills/official/official-openspec.md +89 -0
  42. package/dist/skills/official-skills.d.ts.map +1 -1
  43. package/dist/skills/official-skills.js +1 -0
  44. package/dist/skills/official-skills.js.map +1 -1
  45. package/dist/skills/registry.d.ts.map +1 -1
  46. package/dist/skills/registry.js +13 -2
  47. package/dist/skills/registry.js.map +1 -1
  48. package/dist/skills/semantic-matcher.d.ts +2 -2
  49. package/dist/skills/semantic-matcher.d.ts.map +1 -1
  50. package/dist/skills/semantic-matcher.js +14 -19
  51. package/dist/skills/semantic-matcher.js.map +1 -1
  52. package/dist/skills/upgrade-engine.d.ts +3 -1
  53. package/dist/skills/upgrade-engine.d.ts.map +1 -1
  54. package/dist/skills/upgrade-engine.js +25 -14
  55. package/dist/skills/upgrade-engine.js.map +1 -1
  56. package/dist/web/analytics/weekly-report.d.ts.map +1 -1
  57. package/dist/web/analytics/weekly-report.js +21 -29
  58. package/dist/web/analytics/weekly-report.js.map +1 -1
  59. package/dist/web/routes/patch.d.ts.map +1 -1
  60. package/dist/web/routes/patch.js +32 -2
  61. package/dist/web/routes/patch.js.map +1 -1
  62. package/dist/web/routes/sessions.d.ts.map +1 -1
  63. package/dist/web/routes/sessions.js +9 -7
  64. package/dist/web/routes/sessions.js.map +1 -1
  65. package/dist/web/routes/trace.d.ts.map +1 -1
  66. package/dist/web/routes/trace.js +2 -3
  67. package/dist/web/routes/trace.js.map +1 -1
  68. package/dist/web/server.d.ts.map +1 -1
  69. package/dist/web/server.js +3 -2
  70. package/dist/web/server.js.map +1 -1
  71. package/package.json +12 -2
  72. package/scripts/postinstall.cjs +21 -0
  73. package/.claude/CLAUDE.md +0 -17
  74. package/.eslintrc.js +0 -23
  75. package/.prettierrc +0 -8
  76. package/ARCHITECTURE_ISSUES.md +0 -249
  77. package/CLAUDE.md +0 -265
  78. package/CLAUDE.md.backup +0 -488
  79. package/docs/concurrent-agents.md +0 -129
  80. package/docs/design/architecture-review-20260516.md +0 -232
  81. package/docs/design/fix-skills-data-and-set-leak-spec-20260516-1300.md +0 -219
  82. package/docs/design/h1-storage-aggregation-spec-20260518-1121.md +0 -299
  83. package/docs/design/h2-getdatabase-encapsulation-spec-20260518-1450.md +0 -191
  84. package/docs/design/h3-fallback-removal-spec-20260518-1245.md +0 -76
  85. package/docs/design/h4-index-dedup-spec-20260518-1230.md +0 -109
  86. package/docs/design/h6-services-migration-spec-20260518-1355.md +0 -82
  87. package/docs/design/hook-failure-queue-spec-20260516-1530.md +0 -204
  88. package/docs/design/l1-swarm-protocol-extract-spec-20260518-1605.md +0 -106
  89. package/docs/design/m10-forge-paths-spec-20260518-1320.md +0 -121
  90. package/docs/design/m2-m3-tool-input-spec-20260518-1425.md +0 -131
  91. package/docs/design/m7-routing-event-association-spec-20260518-1545.md +0 -103
  92. package/docs/design/project-path-gitroot-spec-20260518-1715.md +0 -134
  93. package/docs/design/refactor-phase1-spec-20260515-1600.md +0 -543
  94. package/docs/design/refactor-phase2-spec-20260515-1700.md +0 -424
  95. package/docs/design/skill-ai-upgrade-spec-20260518-1930.md +0 -297
  96. package/docs/design/task-active-gc-spec-20260518-1745.md +0 -146
  97. package/docs/design/tasks-list-filter-pagination-spec-20260518-0930.md +0 -208
  98. package/docs/implementation/daemon-skill-sync-changelog-20260518-2000.md +0 -22
  99. package/docs/implementation/fix-skills-data-and-set-leak-changelog-20260516-1300.md +0 -104
  100. package/docs/implementation/h1-storage-aggregation-changelog-20260518-1121.md +0 -82
  101. package/docs/implementation/h2-final-changelog-20260518-1530.md +0 -61
  102. package/docs/implementation/h2-phase1-safety-net-changelog-20260518-1450.md +0 -70
  103. package/docs/implementation/h2-phase2-operations-changelog-20260518-1450.md +0 -120
  104. package/docs/implementation/h2-phase3-callsites-changelog-20260518-1450.md +0 -71
  105. package/docs/implementation/h3-fallback-removal-changelog-20260518-1245.md +0 -71
  106. package/docs/implementation/h4-index-dedup-changelog-20260518-1230.md +0 -60
  107. package/docs/implementation/h6-services-migration-changelog-20260518-1355.md +0 -46
  108. package/docs/implementation/h7-m9-defaults-changelog-20260518-1300.md +0 -46
  109. package/docs/implementation/hook-failure-queue-changelog-20260516-1530.md +0 -196
  110. package/docs/implementation/hotfix-daemon-event-reject-20260516-1430.md +0 -56
  111. package/docs/implementation/l1-swarm-protocol-extract-changelog-20260518-1605.md +0 -45
  112. package/docs/implementation/l3-l4-daemon-perf-changelog-20260518-1410.md +0 -63
  113. package/docs/implementation/l6-l8-final-cleanup-changelog-20260518-1640.md +0 -38
  114. package/docs/implementation/m1-m4-m5-l7-cleanup-changelog-20260518-1310.md +0 -58
  115. package/docs/implementation/m10-forge-paths-changelog-20260518-1320.md +0 -60
  116. package/docs/implementation/m2-m3-tool-input-changelog-20260518-1425.md +0 -43
  117. package/docs/implementation/m6-m8-naming-shutdown-changelog-20260518-1340.md +0 -56
  118. package/docs/implementation/m7-routing-association-changelog-20260518-1545.md +0 -69
  119. package/docs/implementation/project-path-gitroot-changelog-20260518-1715.md +0 -63
  120. package/docs/implementation/refactor-phase1-changelog-20260515-1630.md +0 -354
  121. package/docs/implementation/refactor-phase2-changelog-20260515-1705.md +0 -421
  122. package/docs/implementation/skill-ai-upgrade-changelog-20260518-1930.md +0 -49
  123. package/docs/implementation/task-active-gc-changelog-20260518-1745.md +0 -35
  124. package/docs/implementation/task-title-summary-changelog-20260518-1130.md +0 -39
  125. package/docs/implementation/tasks-detail-back-loses-filters-changelog-20260518-1100.md +0 -22
  126. package/docs/implementation/tasks-list-filter-pagination-changelog-20260518-0930.md +0 -72
  127. package/docs/implementation/tasks-page-white-screen-hotfix-changelog-20260518-1015.md +0 -56
  128. package/docs/reviews/claudemd-template-sync.md +0 -54
  129. package/docs/reviews/task-title-summary.md +0 -92
  130. package/docs/reviews/tasks-detail-back-loses-filters.md +0 -58
  131. package/docs/reviews/tasks-filter-pagination.md +0 -80
  132. package/docs/reviews/tasks-page-white-screen-hotfix.md +0 -126
  133. package/docs/ruflo-learning-strategy.md +0 -322
  134. package/docs/skills-deduplication-analysis.md +0 -83
  135. package/docs/skills-multiformat-support.md +0 -177
  136. package/docs/skills-third-party.md +0 -183
  137. package/docs/testing/tasks-filter-pagination-test-report.md +0 -86
  138. package/forge +0 -321
  139. package/playwright.config.ts +0 -40
  140. package/scripts/demo-v2.ts +0 -91
  141. package/scripts/dev-daemon.sh +0 -232
  142. package/scripts/dev-web.ts +0 -109
  143. package/scripts/e2e-mcp-link.ts +0 -423
  144. package/scripts/e2e-methodology-quality.ts +0 -253
  145. package/scripts/e2e-routing.ts +0 -456
  146. package/scripts/e2e-user-methodology.ts +0 -326
  147. package/scripts/e2e-web-workflows.ts +0 -299
  148. package/scripts/migrate-legacy-to-dynamic.sql +0 -108
  149. package/scripts/regenerate-execution-docs.ts +0 -116
  150. package/scripts/sync-agent-skills.ts +0 -193
  151. package/scripts/test-hook.sh +0 -71
  152. package/scripts/verify-skill-loading.ts +0 -62
  153. package/src/claudemd/claudemd-generator.ts +0 -568
  154. package/src/claudemd/convention-extractor.ts +0 -69
  155. package/src/claudemd/index.ts +0 -35
  156. package/src/claudemd/persona-manager.ts +0 -88
  157. package/src/claudemd/resume-manager.ts +0 -236
  158. package/src/claudemd/tech-detector.ts +0 -220
  159. package/src/claudemd/templates/swarm-protocol.md +0 -222
  160. package/src/cli/commands/claudemd.ts +0 -84
  161. package/src/cli/commands/config.ts +0 -46
  162. package/src/cli/commands/daemon.ts +0 -310
  163. package/src/cli/commands/executions.ts +0 -115
  164. package/src/cli/commands/init.ts +0 -204
  165. package/src/cli/commands/logs.ts +0 -181
  166. package/src/cli/commands/mcp.ts +0 -242
  167. package/src/cli/commands/menu.ts +0 -357
  168. package/src/cli/commands/skills.ts +0 -328
  169. package/src/cli/commands/stats.ts +0 -73
  170. package/src/cli/commands/status.ts +0 -69
  171. package/src/cli/commands/template.ts +0 -77
  172. package/src/cli/commands/trace.ts +0 -148
  173. package/src/cli/index.ts +0 -42
  174. package/src/cli/init/hook-manager.ts +0 -132
  175. package/src/core/ai/provider.ts +0 -308
  176. package/src/core/ai/types.ts +0 -51
  177. package/src/core/config.ts +0 -124
  178. package/src/core/constants.ts +0 -67
  179. package/src/core/event-fields.ts +0 -32
  180. package/src/core/queue/index.ts +0 -192
  181. package/src/core/storage/base.ts +0 -302
  182. package/src/core/storage/events.ts +0 -434
  183. package/src/core/storage/injections.ts +0 -78
  184. package/src/core/storage/maintenance.ts +0 -59
  185. package/src/core/storage/migrations/002_add_skill_tracking.sql +0 -6
  186. package/src/core/storage/migrations/003_add_skill_invocations.sql +0 -23
  187. package/src/core/storage/performance-indexes.sql +0 -23
  188. package/src/core/storage/routing.ts +0 -322
  189. package/src/core/storage/rows.ts +0 -112
  190. package/src/core/storage/schema.sql +0 -224
  191. package/src/core/storage/sessions.ts +0 -168
  192. package/src/core/storage/skills.ts +0 -233
  193. package/src/core/storage/sqlite.ts +0 -293
  194. package/src/core/storage/tasks.ts +0 -318
  195. package/src/core/storage/token-usage.ts +0 -93
  196. package/src/core/types.ts +0 -181
  197. package/src/core/utils/error-handler.ts +0 -257
  198. package/src/core/utils/forge-resume-block.ts +0 -74
  199. package/src/core/utils/format.ts +0 -69
  200. package/src/core/utils/git.ts +0 -23
  201. package/src/core/utils/logger.ts +0 -134
  202. package/src/core/utils/lru-cache.ts +0 -54
  203. package/src/core/utils/path.ts +0 -19
  204. package/src/core/utils/session.ts +0 -26
  205. package/src/core/utils/time.ts +0 -37
  206. package/src/core/utils/token-tracker.ts +0 -97
  207. package/src/daemon/event-parser.ts +0 -36
  208. package/src/daemon/handlers/history-exporter.ts +0 -117
  209. package/src/daemon/handlers/post-tool-use.ts +0 -54
  210. package/src/daemon/handlers/stop.ts +0 -208
  211. package/src/daemon/handlers/user-prompt.ts +0 -178
  212. package/src/daemon/hook-sync.ts +0 -91
  213. package/src/daemon/index.ts +0 -312
  214. package/src/daemon/launchd/com.claude-forge.daemon.plist.template +0 -47
  215. package/src/daemon/launchd-installer.ts +0 -260
  216. package/src/daemon/lifecycle.ts +0 -128
  217. package/src/daemon/router.ts +0 -40
  218. package/src/daemon/server.ts +0 -196
  219. package/src/daemon/services/task-segmenter.ts +0 -112
  220. package/src/daemon/skill-sync.ts +0 -88
  221. package/src/hooks/hook-lib.sh +0 -118
  222. package/src/hooks/notification.sh +0 -35
  223. package/src/hooks/post-tool-use.sh +0 -61
  224. package/src/hooks/pre-tool-use.sh +0 -63
  225. package/src/hooks/stop.sh +0 -43
  226. package/src/hooks/user-prompt-submit.sh +0 -69
  227. package/src/mcp/server.ts +0 -322
  228. package/src/skills/index.ts +0 -2
  229. package/src/skills/invocation-guard.ts +0 -177
  230. package/src/skills/matcher.ts +0 -148
  231. package/src/skills/official/code-simplifier.md +0 -52
  232. package/src/skills/official/find-skills.md +0 -142
  233. package/src/skills/official/official-api-design.md +0 -30
  234. package/src/skills/official/official-architecture-decision.md +0 -41
  235. package/src/skills/official/official-bmad.md +0 -118
  236. package/src/skills/official/official-db-schema-design.md +0 -34
  237. package/src/skills/official/official-debug.md +0 -25
  238. package/src/skills/official/official-doc-driven.md +0 -31
  239. package/src/skills/official/official-harness-engineering.md +0 -108
  240. package/src/skills/official/official-performance-optimization.md +0 -30
  241. package/src/skills/official/official-pr-review.md +0 -35
  242. package/src/skills/official/official-release-checklist.md +0 -30
  243. package/src/skills/official/official-security-hardening.md +0 -32
  244. package/src/skills/official/official-spec-driven-design.md +0 -31
  245. package/src/skills/official/planning-with-files.md +0 -241
  246. package/src/skills/official/ui-ux-pro-max.md +0 -105
  247. package/src/skills/official/webapp-testing.md +0 -96
  248. package/src/skills/official-skills.ts +0 -89
  249. package/src/skills/registry.ts +0 -355
  250. package/src/skills/semantic-matcher.ts +0 -234
  251. package/src/skills/tools/pipeline-suggest.ts +0 -226
  252. package/src/skills/tools/skill-invoke.ts +0 -168
  253. package/src/skills/tools/skill-list.ts +0 -59
  254. package/src/skills/upgrade-engine.ts +0 -541
  255. package/src/skills/upgrade-prompt.ts +0 -84
  256. package/src/templates/go.yaml +0 -53
  257. package/src/templates/python.yaml +0 -59
  258. package/src/templates/react.yaml +0 -55
  259. package/src/templates/template-manager.ts +0 -170
  260. package/src/web/analytics/anti-pattern-detector.ts +0 -367
  261. package/src/web/analytics/drift-detector.ts +0 -219
  262. package/src/web/analytics/weekly-report.ts +0 -431
  263. package/src/web/auth-middleware.ts +0 -54
  264. package/src/web/routes/_helpers.ts +0 -34
  265. package/src/web/routes/ai.ts +0 -204
  266. package/src/web/routes/auth.ts +0 -22
  267. package/src/web/routes/drift.ts +0 -25
  268. package/src/web/routes/error-handler.ts +0 -120
  269. package/src/web/routes/events.ts +0 -47
  270. package/src/web/routes/insights.ts +0 -43
  271. package/src/web/routes/patch.ts +0 -117
  272. package/src/web/routes/reports.ts +0 -34
  273. package/src/web/routes/rules.ts +0 -76
  274. package/src/web/routes/sessions.ts +0 -250
  275. package/src/web/routes/skill-stats.ts +0 -92
  276. package/src/web/routes/skills.ts +0 -350
  277. package/src/web/routes/static.ts +0 -67
  278. package/src/web/routes/stats.ts +0 -50
  279. package/src/web/routes/status.ts +0 -30
  280. package/src/web/routes/tasks.ts +0 -193
  281. package/src/web/routes/token-usage.ts +0 -20
  282. package/src/web/routes/trace.ts +0 -126
  283. package/src/web/routes/types.ts +0 -57
  284. package/src/web/server.ts +0 -134
  285. package/src/web/ssrf-guard.ts +0 -112
  286. package/src/web/static/index.html +0 -3251
  287. package/src/web/static/vendor/chart.umd.min.js +0 -20
  288. package/tests/e2e/dashboard.spec.ts +0 -205
  289. package/tests/e2e/routing-skill-e2e.test.ts +0 -39
  290. package/tests/helpers/mock-ai.ts +0 -92
  291. package/tests/helpers/mock-storage.ts +0 -159
  292. package/tests/integration/claudemd-generator.test.ts +0 -90
  293. package/tests/integration/queue-replay.integration.test.ts +0 -193
  294. package/tests/integration/tasks-filter.integration.test.ts +0 -154
  295. package/tests/integration/web-analytics.integration.test.ts +0 -133
  296. package/tests/integration/web-stats.integration.test.ts +0 -135
  297. package/tests/integration/web-trace.integration.test.ts +0 -175
  298. package/tests/performance/database.benchmark.ts +0 -161
  299. package/tests/semantic-matcher.test.ts +0 -99
  300. package/tests/skill-matcher.test.ts +0 -110
  301. package/tests/unit/ai-provider-retry.test.ts +0 -194
  302. package/tests/unit/ai-provider-vision.test.ts +0 -224
  303. package/tests/unit/claudemd-generator.test.ts +0 -68
  304. package/tests/unit/cli-mcp.test.ts +0 -141
  305. package/tests/unit/core/forge-paths.test.ts +0 -99
  306. package/tests/unit/daemon/hook-sync.test.ts +0 -71
  307. package/tests/unit/daemon/post-tool-use.test.ts +0 -121
  308. package/tests/unit/daemon/skill-sync.test.ts +0 -75
  309. package/tests/unit/daemon/stop-handler-behavior-summary.test.ts +0 -202
  310. package/tests/unit/daemon/task-segmenter-recover.test.ts +0 -84
  311. package/tests/unit/event-fields.test.ts +0 -88
  312. package/tests/unit/event-parser.test.ts +0 -55
  313. package/tests/unit/handlers.test.ts +0 -171
  314. package/tests/unit/hooks/resolve-project-path.test.ts +0 -122
  315. package/tests/unit/invocation-guard.test.ts +0 -125
  316. package/tests/unit/queue.test.ts +0 -272
  317. package/tests/unit/router.test.ts +0 -138
  318. package/tests/unit/security.test.ts +0 -128
  319. package/tests/unit/skill-invocations-workflow.test.ts +0 -495
  320. package/tests/unit/skill-registry.test.ts +0 -94
  321. package/tests/unit/skills/invocation-guard-ttl.test.ts +0 -211
  322. package/tests/unit/skills/official-skills-loader.test.ts +0 -126
  323. package/tests/unit/skills/registry-multiformat.test.ts +0 -92
  324. package/tests/unit/skills/upgrade-engine-parse.test.ts +0 -138
  325. package/tests/unit/skills/upgrade-engine.test.ts +0 -401
  326. package/tests/unit/skills/upgrade-prompt.test.ts +0 -89
  327. package/tests/unit/socket-server.test.ts +0 -183
  328. package/tests/unit/storage/event-operations-aggregates.test.ts +0 -342
  329. package/tests/unit/storage/migration-idempotent.test.ts +0 -304
  330. package/tests/unit/storage/routing-aggregates.test.ts +0 -276
  331. package/tests/unit/storage/routing.test.ts +0 -117
  332. package/tests/unit/storage/schema-missing.test.ts +0 -81
  333. package/tests/unit/storage/session-operations-aggregates.test.ts +0 -120
  334. package/tests/unit/storage/sessions-aggregate.test.ts +0 -435
  335. package/tests/unit/storage/skill-operations-counts.test.ts +0 -106
  336. package/tests/unit/storage/skills-aggregates.test.ts +0 -104
  337. package/tests/unit/storage/sqlite-refactor-harness.test.ts +0 -314
  338. package/tests/unit/storage/task-operations-counts.test.ts +0 -46
  339. package/tests/unit/storage/tasks-getById.test.ts +0 -343
  340. package/tests/unit/storage/tasks-stale-gc.test.ts +0 -86
  341. package/tests/unit/storage.test.ts +0 -172
  342. package/tests/unit/token-usage.test.ts +0 -144
  343. package/tests/unit/type-guards.test.ts +0 -201
  344. package/tests/unit/utils/format.test.ts +0 -189
  345. package/tests/unit/utils/session.test.ts +0 -89
  346. package/tests/unit/utils/time.test.ts +0 -112
  347. package/tests/unit/web/navigation-back-contract.test.ts +0 -134
  348. package/tests/unit/web/routes-auth.test.ts +0 -93
  349. package/tests/unit/web/routes-events.test.ts +0 -101
  350. package/tests/unit/web/routes-rules.test.ts +0 -182
  351. package/tests/unit/web/routes-sessions.test.ts +0 -181
  352. package/tests/unit/web/routes-skill-stats.test.ts +0 -179
  353. package/tests/unit/web/routes-stats.test.ts +0 -92
  354. package/tests/unit/web/routes-tasks.test.ts +0 -385
  355. package/tests/unit/web/task-title-contract.test.ts +0 -210
  356. package/tests/unit/web/tasks-component-contract.test.ts +0 -179
  357. package/tsconfig.json +0 -22
  358. package/vitest.config.ts +0 -21
  359. package/vitest.integration.config.ts +0 -16
  360. package/web/CLAUDE.md +0 -20
  361. package/web/index.html +0 -13
  362. package/web/package-lock.json +0 -4854
  363. package/web/package.json +0 -35
  364. package/web/postcss.config.js +0 -6
  365. package/web/src/App.tsx +0 -110
  366. package/web/src/components/CodeBlock.tsx +0 -31
  367. package/web/src/components/Confirm.tsx +0 -96
  368. package/web/src/components/Drawer.tsx +0 -60
  369. package/web/src/components/Layout.tsx +0 -145
  370. package/web/src/components/MarkdownRenderer.tsx +0 -77
  371. package/web/src/components/SearchInput.tsx +0 -31
  372. package/web/src/components/SessionDetailContent.tsx +0 -157
  373. package/web/src/components/Toast.tsx +0 -92
  374. package/web/src/index.css +0 -19
  375. package/web/src/main.tsx +0 -31
  376. package/web/src/pages/AIConfig.tsx +0 -233
  377. package/web/src/pages/Dashboard.tsx +0 -572
  378. package/web/src/pages/Events.tsx +0 -271
  379. package/web/src/pages/Reports.tsx +0 -428
  380. package/web/src/pages/SessionDetail.tsx +0 -162
  381. package/web/src/pages/Sessions.tsx +0 -205
  382. package/web/src/pages/Skills.tsx +0 -180
  383. package/web/src/pages/TaskDetail.tsx +0 -515
  384. package/web/src/pages/Tasks.tsx +0 -415
  385. package/web/src/utils/auth.ts +0 -59
  386. package/web/src/utils/export.ts +0 -54
  387. package/web/src/utils/navigation.ts +0 -25
  388. package/web/src/utils/task-title.ts +0 -49
  389. package/web/src/utils/time.ts +0 -13
  390. package/web/tailwind.config.js +0 -11
  391. package/web/tsconfig.json +0 -21
  392. package/web/tsconfig.node.json +0 -10
  393. package/web/vite.config.ts +0 -76
  394. package/winspan-claude-forge-8.43.0.tgz +0 -0
@@ -1,226 +0,0 @@
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
- }
@@ -1,168 +0,0 @@
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
- }
@@ -1,59 +0,0 @@
1
- /**
2
- * SkillList — 列出所有可用的 Skill
3
- *
4
- * Agent 可以通过此工具查询可用的 Skill,支持关键词过滤。
5
- *
6
- * 示例:
7
- * SkillList({ keywords: ["test", "tdd"] })
8
- * → 返回包含 "test" 或 "tdd" 关键词的 Skill 列表
9
- */
10
-
11
- import type { SkillRegistry } from '../registry.js';
12
- import { logger } from '../../core/utils/logger.js';
13
-
14
- export interface SkillListParams {
15
- keywords?: string[]; // 可选的关键词过滤
16
- }
17
-
18
- export interface SkillListResult {
19
- skills: Array<{
20
- id: string;
21
- name: string;
22
- description: string;
23
- keywords: string[];
24
- }>;
25
- total: number;
26
- }
27
-
28
- export async function skillList(
29
- params: SkillListParams,
30
- context: { skillRegistry: SkillRegistry },
31
- ): Promise<SkillListResult> {
32
- const { keywords } = params;
33
-
34
- logger.info(`[SkillList] Agent requested skill list${keywords ? ` (keywords: ${keywords.join(', ')})` : ''}`);
35
-
36
- const allSkills = Array.from(context.skillRegistry.getAll());
37
-
38
- // Filter by keywords if provided
39
- let filteredSkills = allSkills;
40
- if (keywords && keywords.length > 0) {
41
- const keywordsLower = keywords.map(k => k.toLowerCase());
42
- filteredSkills = allSkills.filter(skill => {
43
- const skillKeywords = skill.keywords.map(k => k.toLowerCase());
44
- return keywordsLower.some(kw => skillKeywords.some(sk => sk.includes(kw)));
45
- });
46
- }
47
-
48
- const result = filteredSkills.map(skill => ({
49
- id: skill.id,
50
- name: skill.name,
51
- description: skill.description || '',
52
- keywords: skill.keywords,
53
- }));
54
-
55
- return {
56
- skills: result,
57
- total: result.length,
58
- };
59
- }