@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.
Files changed (804) hide show
  1. package/.claude/CLAUDE.md +17 -0
  2. package/.eslintrc.js +23 -0
  3. package/.prettierrc +8 -0
  4. package/ARCHITECTURE_ISSUES.md +249 -0
  5. package/CLAUDE.md +265 -0
  6. package/CLAUDE.md.backup +488 -0
  7. package/DEVELOPMENT.md +310 -0
  8. package/dist/claudemd/claudemd-generator.d.ts +38 -3
  9. package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
  10. package/dist/claudemd/claudemd-generator.js +629 -11
  11. package/dist/claudemd/claudemd-generator.js.map +1 -1
  12. package/dist/claudemd/index.d.ts +2 -2
  13. package/dist/claudemd/index.d.ts.map +1 -1
  14. package/dist/claudemd/index.js.map +1 -1
  15. package/dist/claudemd/resume-manager.d.ts.map +1 -1
  16. package/dist/claudemd/resume-manager.js +5 -2
  17. package/dist/claudemd/resume-manager.js.map +1 -1
  18. package/dist/claudemd/tech-detector.d.ts +1 -0
  19. package/dist/claudemd/tech-detector.d.ts.map +1 -1
  20. package/dist/claudemd/tech-detector.js +53 -0
  21. package/dist/claudemd/tech-detector.js.map +1 -1
  22. package/dist/cli/commands/claudemd.js +2 -2
  23. package/dist/cli/commands/claudemd.js.map +1 -1
  24. package/dist/cli/commands/daemon.d.ts +28 -0
  25. package/dist/cli/commands/daemon.d.ts.map +1 -1
  26. package/dist/cli/commands/daemon.js +200 -8
  27. package/dist/cli/commands/daemon.js.map +1 -1
  28. package/dist/cli/commands/init.d.ts.map +1 -1
  29. package/dist/cli/commands/init.js +3 -35
  30. package/dist/cli/commands/init.js.map +1 -1
  31. package/dist/cli/commands/menu.js +10 -10
  32. package/dist/cli/commands/menu.js.map +1 -1
  33. package/dist/cli/commands/skills.d.ts.map +1 -1
  34. package/dist/cli/commands/skills.js +8 -2
  35. package/dist/cli/commands/skills.js.map +1 -1
  36. package/dist/cli/commands/stats.d.ts.map +1 -1
  37. package/dist/cli/commands/stats.js +0 -17
  38. package/dist/cli/commands/stats.js.map +1 -1
  39. package/dist/cli/commands/trace.d.ts +9 -0
  40. package/dist/cli/commands/trace.d.ts.map +1 -0
  41. package/dist/cli/commands/trace.js +137 -0
  42. package/dist/cli/commands/trace.js.map +1 -0
  43. package/dist/cli/index.js +2 -4
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/core/ai/provider.d.ts +10 -2
  46. package/dist/core/ai/provider.d.ts.map +1 -1
  47. package/dist/core/ai/provider.js.map +1 -1
  48. package/dist/core/ai/types.d.ts +1 -19
  49. package/dist/core/ai/types.d.ts.map +1 -1
  50. package/dist/core/ai/types.js +1 -1
  51. package/dist/core/config.d.ts +2 -1
  52. package/dist/core/config.d.ts.map +1 -1
  53. package/dist/core/config.js +23 -6
  54. package/dist/core/config.js.map +1 -1
  55. package/dist/core/constants.d.ts +2 -2
  56. package/dist/core/constants.js +2 -2
  57. package/dist/core/constants.js.map +1 -1
  58. package/dist/core/queue/index.d.ts +52 -0
  59. package/dist/core/queue/index.d.ts.map +1 -0
  60. package/dist/core/queue/index.js +176 -0
  61. package/dist/core/queue/index.js.map +1 -0
  62. package/dist/core/storage/base.d.ts +33 -0
  63. package/dist/core/storage/base.d.ts.map +1 -0
  64. package/dist/core/storage/base.js +211 -0
  65. package/dist/core/storage/base.js.map +1 -0
  66. package/dist/core/storage/events.d.ts +52 -0
  67. package/dist/core/storage/events.d.ts.map +1 -0
  68. package/dist/core/storage/events.js +201 -0
  69. package/dist/core/storage/events.js.map +1 -0
  70. package/dist/core/storage/injections.d.ts +27 -0
  71. package/dist/core/storage/injections.d.ts.map +1 -0
  72. package/dist/core/storage/injections.js +51 -0
  73. package/dist/core/storage/injections.js.map +1 -0
  74. package/dist/core/storage/maintenance.d.ts +21 -0
  75. package/dist/core/storage/maintenance.d.ts.map +1 -0
  76. package/dist/core/storage/maintenance.js +52 -0
  77. package/dist/core/storage/maintenance.js.map +1 -0
  78. package/dist/core/storage/routing.d.ts +71 -0
  79. package/dist/core/storage/routing.d.ts.map +1 -0
  80. package/dist/core/storage/routing.js +141 -0
  81. package/dist/core/storage/routing.js.map +1 -0
  82. package/dist/core/storage/rows.d.ts +0 -47
  83. package/dist/core/storage/rows.d.ts.map +1 -1
  84. package/dist/core/storage/schema.sql +74 -136
  85. package/dist/core/storage/sessions.d.ts +34 -0
  86. package/dist/core/storage/sessions.d.ts.map +1 -0
  87. package/dist/core/storage/sessions.js +78 -0
  88. package/dist/core/storage/sessions.js.map +1 -0
  89. package/dist/core/storage/skills.d.ts +40 -0
  90. package/dist/core/storage/skills.d.ts.map +1 -0
  91. package/dist/core/storage/skills.js +107 -0
  92. package/dist/core/storage/skills.js.map +1 -0
  93. package/dist/core/storage/sqlite.d.ts +63 -265
  94. package/dist/core/storage/sqlite.d.ts.map +1 -1
  95. package/dist/core/storage/sqlite.js +102 -759
  96. package/dist/core/storage/sqlite.js.map +1 -1
  97. package/dist/core/storage/tasks.d.ts +64 -0
  98. package/dist/core/storage/tasks.d.ts.map +1 -0
  99. package/dist/core/storage/tasks.js +134 -0
  100. package/dist/core/storage/tasks.js.map +1 -0
  101. package/dist/core/storage/token-usage.d.ts +36 -0
  102. package/dist/core/storage/token-usage.d.ts.map +1 -0
  103. package/dist/core/storage/token-usage.js +59 -0
  104. package/dist/core/storage/token-usage.js.map +1 -0
  105. package/dist/core/types.d.ts +60 -4
  106. package/dist/core/types.d.ts.map +1 -1
  107. package/dist/core/types.js +24 -1
  108. package/dist/core/types.js.map +1 -1
  109. package/dist/core/utils/format.d.ts +28 -0
  110. package/dist/core/utils/format.d.ts.map +1 -0
  111. package/dist/core/utils/format.js +68 -0
  112. package/dist/core/utils/format.js.map +1 -0
  113. package/dist/core/utils/logger.d.ts +6 -1
  114. package/dist/core/utils/logger.d.ts.map +1 -1
  115. package/dist/core/utils/logger.js +72 -2
  116. package/dist/core/utils/logger.js.map +1 -1
  117. package/dist/core/utils/session.d.ts +16 -0
  118. package/dist/core/utils/session.d.ts.map +1 -0
  119. package/dist/core/utils/session.js +25 -0
  120. package/dist/core/utils/session.js.map +1 -0
  121. package/dist/core/utils/time.d.ts +22 -0
  122. package/dist/core/utils/time.d.ts.map +1 -0
  123. package/dist/core/utils/time.js +38 -0
  124. package/dist/core/utils/time.js.map +1 -0
  125. package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
  126. package/dist/daemon/handlers/history-exporter.js +6 -4
  127. package/dist/daemon/handlers/history-exporter.js.map +1 -1
  128. package/dist/daemon/handlers/post-tool-use.d.ts +5 -12
  129. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  130. package/dist/daemon/handlers/post-tool-use.js +21 -79
  131. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  132. package/dist/daemon/handlers/stop.d.ts +24 -12
  133. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  134. package/dist/daemon/handlers/stop.js +141 -42
  135. package/dist/daemon/handlers/stop.js.map +1 -1
  136. package/dist/daemon/handlers/user-prompt.d.ts +18 -19
  137. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  138. package/dist/daemon/handlers/user-prompt.js +103 -227
  139. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  140. package/dist/daemon/index.d.ts +6 -2
  141. package/dist/daemon/index.d.ts.map +1 -1
  142. package/dist/daemon/index.js +76 -120
  143. package/dist/daemon/index.js.map +1 -1
  144. package/dist/daemon/launchd/com.claude-forge.daemon.plist.template +47 -0
  145. package/dist/daemon/launchd-installer.d.ts +61 -0
  146. package/dist/daemon/launchd-installer.d.ts.map +1 -0
  147. package/dist/daemon/launchd-installer.js +182 -0
  148. package/dist/daemon/launchd-installer.js.map +1 -0
  149. package/dist/daemon/lifecycle.d.ts +11 -0
  150. package/dist/daemon/lifecycle.d.ts.map +1 -1
  151. package/dist/daemon/lifecycle.js +44 -0
  152. package/dist/daemon/lifecycle.js.map +1 -1
  153. package/dist/daemon/router.d.ts +9 -2
  154. package/dist/daemon/router.d.ts.map +1 -1
  155. package/dist/daemon/router.js +27 -3
  156. package/dist/daemon/router.js.map +1 -1
  157. package/dist/daemon/server.d.ts.map +1 -1
  158. package/dist/daemon/server.js +6 -5
  159. package/dist/daemon/server.js.map +1 -1
  160. package/dist/daemon/services/anti-pattern-detector.d.ts +50 -0
  161. package/dist/daemon/services/anti-pattern-detector.d.ts.map +1 -0
  162. package/dist/daemon/services/anti-pattern-detector.js +357 -0
  163. package/dist/daemon/services/anti-pattern-detector.js.map +1 -0
  164. package/dist/daemon/services/drift-detector.d.ts +64 -0
  165. package/dist/daemon/services/drift-detector.d.ts.map +1 -0
  166. package/dist/daemon/services/drift-detector.js +201 -0
  167. package/dist/daemon/services/drift-detector.js.map +1 -0
  168. package/dist/{intelligence → daemon/services}/task-segmenter.d.ts +7 -1
  169. package/dist/daemon/services/task-segmenter.d.ts.map +1 -0
  170. package/dist/{intelligence → daemon/services}/task-segmenter.js +29 -6
  171. package/dist/daemon/services/task-segmenter.js.map +1 -0
  172. package/dist/daemon/services/weekly-report.d.ts +91 -0
  173. package/dist/daemon/services/weekly-report.d.ts.map +1 -0
  174. package/dist/daemon/services/weekly-report.js +327 -0
  175. package/dist/daemon/services/weekly-report.js.map +1 -0
  176. package/dist/hooks/hook-lib.sh +81 -0
  177. package/dist/hooks/notification.sh +7 -3
  178. package/dist/hooks/post-tool-use.sh +8 -4
  179. package/dist/hooks/pre-tool-use.sh +7 -4
  180. package/dist/hooks/stop.sh +1 -1
  181. package/dist/hooks/user-prompt-submit.sh +8 -9
  182. package/dist/mcp/server.d.ts +2 -2
  183. package/dist/mcp/server.d.ts.map +1 -1
  184. package/dist/mcp/server.js +71 -11
  185. package/dist/mcp/server.js.map +1 -1
  186. package/dist/skills/invocation-guard.d.ts +20 -0
  187. package/dist/skills/invocation-guard.d.ts.map +1 -1
  188. package/dist/skills/invocation-guard.js +63 -0
  189. package/dist/skills/invocation-guard.js.map +1 -1
  190. package/dist/skills/matcher.d.ts.map +1 -1
  191. package/dist/skills/matcher.js +12 -3
  192. package/dist/skills/matcher.js.map +1 -1
  193. package/dist/skills/official/code-simplifier.md +16 -0
  194. package/dist/skills/official/find-skills.md +23 -0
  195. package/dist/skills/official/official-api-design.md +17 -0
  196. package/dist/skills/official/official-architecture-decision.md +20 -0
  197. package/dist/skills/official/official-bmad.md +118 -0
  198. package/dist/skills/official/official-db-schema-design.md +16 -0
  199. package/dist/skills/official/official-debug.md +17 -0
  200. package/dist/skills/official/official-doc-driven.md +31 -0
  201. package/dist/skills/official/official-harness-engineering.md +108 -0
  202. package/dist/skills/official/official-performance-optimization.md +30 -0
  203. package/dist/skills/official/official-pr-review.md +35 -0
  204. package/dist/skills/official/official-release-checklist.md +30 -0
  205. package/dist/skills/official/official-security-hardening.md +26 -0
  206. package/dist/skills/official/official-spec-driven-design.md +31 -0
  207. package/dist/skills/official/planning-with-files.md +37 -0
  208. package/dist/skills/official/ui-ux-pro-max.md +18 -0
  209. package/dist/skills/official/webapp-testing.md +12 -0
  210. package/dist/skills/official-skills.d.ts +8 -4
  211. package/dist/skills/official-skills.d.ts.map +1 -1
  212. package/dist/skills/official-skills.js +48 -704
  213. package/dist/skills/official-skills.js.map +1 -1
  214. package/dist/skills/registry.d.ts +5 -0
  215. package/dist/skills/registry.d.ts.map +1 -1
  216. package/dist/skills/registry.js +48 -15
  217. package/dist/skills/registry.js.map +1 -1
  218. package/dist/skills/tools/pipeline-suggest.d.ts +30 -0
  219. package/dist/skills/tools/pipeline-suggest.d.ts.map +1 -0
  220. package/dist/skills/tools/pipeline-suggest.js +178 -0
  221. package/dist/skills/tools/pipeline-suggest.js.map +1 -0
  222. package/dist/web/routes/ai.d.ts.map +1 -1
  223. package/dist/web/routes/ai.js +16 -22
  224. package/dist/web/routes/ai.js.map +1 -1
  225. package/dist/web/routes/drift.d.ts +10 -0
  226. package/dist/web/routes/drift.d.ts.map +1 -0
  227. package/dist/web/routes/drift.js +21 -0
  228. package/dist/web/routes/drift.js.map +1 -0
  229. package/dist/web/routes/error-handler.d.ts +43 -0
  230. package/dist/web/routes/error-handler.d.ts.map +1 -0
  231. package/dist/web/routes/error-handler.js +99 -0
  232. package/dist/web/routes/error-handler.js.map +1 -0
  233. package/dist/web/routes/insights.d.ts +9 -0
  234. package/dist/web/routes/insights.d.ts.map +1 -0
  235. package/dist/web/routes/insights.js +34 -0
  236. package/dist/web/routes/insights.js.map +1 -0
  237. package/dist/web/routes/patch.js +2 -2
  238. package/dist/web/routes/patch.js.map +1 -1
  239. package/dist/web/routes/reports.d.ts +10 -0
  240. package/dist/web/routes/reports.d.ts.map +1 -0
  241. package/dist/web/routes/reports.js +27 -0
  242. package/dist/web/routes/reports.js.map +1 -0
  243. package/dist/web/routes/rules.d.ts +10 -3
  244. package/dist/web/routes/rules.d.ts.map +1 -1
  245. package/dist/web/routes/rules.js +80 -95
  246. package/dist/web/routes/rules.js.map +1 -1
  247. package/dist/web/routes/sessions.d.ts +1 -2
  248. package/dist/web/routes/sessions.d.ts.map +1 -1
  249. package/dist/web/routes/sessions.js +27 -39
  250. package/dist/web/routes/sessions.js.map +1 -1
  251. package/dist/web/routes/skill-stats.d.ts.map +1 -1
  252. package/dist/web/routes/skill-stats.js +38 -0
  253. package/dist/web/routes/skill-stats.js.map +1 -1
  254. package/dist/web/routes/skills.d.ts.map +1 -1
  255. package/dist/web/routes/skills.js +34 -0
  256. package/dist/web/routes/skills.js.map +1 -1
  257. package/dist/web/routes/stats.d.ts +7 -0
  258. package/dist/web/routes/stats.d.ts.map +1 -0
  259. package/dist/web/routes/stats.js +44 -0
  260. package/dist/web/routes/stats.js.map +1 -0
  261. package/dist/web/routes/status.js +1 -1
  262. package/dist/web/routes/status.js.map +1 -1
  263. package/dist/web/routes/tasks.d.ts +4 -0
  264. package/dist/web/routes/tasks.d.ts.map +1 -0
  265. package/dist/web/routes/tasks.js +181 -0
  266. package/dist/web/routes/tasks.js.map +1 -0
  267. package/dist/web/routes/trace.d.ts +10 -0
  268. package/dist/web/routes/trace.d.ts.map +1 -0
  269. package/dist/web/routes/trace.js +123 -0
  270. package/dist/web/routes/trace.js.map +1 -0
  271. package/dist/web/routes/types.d.ts +1 -14
  272. package/dist/web/routes/types.d.ts.map +1 -1
  273. package/dist/web/routes/types.js +8 -17
  274. package/dist/web/routes/types.js.map +1 -1
  275. package/dist/web/server.d.ts +1 -9
  276. package/dist/web/server.d.ts.map +1 -1
  277. package/dist/web/server.js +28 -28
  278. package/dist/web/server.js.map +1 -1
  279. package/dist/web/static/assets/AIConfig-BQCAQE9D.js +2 -0
  280. package/dist/web/static/assets/AIConfig-BQCAQE9D.js.map +1 -0
  281. package/dist/web/static/assets/Dashboard-D7Bo6Kan.js +2 -0
  282. package/dist/web/static/assets/Dashboard-D7Bo6Kan.js.map +1 -0
  283. package/dist/web/static/assets/{Drawer-DcU3ln98.js → Drawer-BeHRQxUS.js} +2 -2
  284. package/dist/web/static/assets/{Drawer-DcU3ln98.js.map → Drawer-BeHRQxUS.js.map} +1 -1
  285. package/dist/web/static/assets/Events-K_tCY2ti.js +2 -0
  286. package/dist/web/static/assets/Events-K_tCY2ti.js.map +1 -0
  287. package/dist/web/static/assets/Reports-BJCmBnc_.js +2 -0
  288. package/dist/web/static/assets/Reports-BJCmBnc_.js.map +1 -0
  289. package/dist/web/static/assets/SearchInput-BX2KhMkw.js +2 -0
  290. package/dist/web/static/assets/SearchInput-BX2KhMkw.js.map +1 -0
  291. package/dist/web/static/assets/SessionDetail-Bkr-kC7V.js +2 -0
  292. package/dist/web/static/assets/SessionDetail-Bkr-kC7V.js.map +1 -0
  293. package/dist/web/static/assets/Sessions-Chx9OCLH.js +2 -0
  294. package/dist/web/static/assets/Sessions-Chx9OCLH.js.map +1 -0
  295. package/dist/web/static/assets/Skills-O0GT1i7m.js +2 -0
  296. package/dist/web/static/assets/Skills-O0GT1i7m.js.map +1 -0
  297. package/dist/web/static/assets/TaskDetail-5SR8zGzv.js +2 -0
  298. package/dist/web/static/assets/TaskDetail-5SR8zGzv.js.map +1 -0
  299. package/dist/web/static/assets/Tasks-DCgDqvOZ.js +2 -0
  300. package/dist/web/static/assets/Tasks-DCgDqvOZ.js.map +1 -0
  301. package/dist/web/static/assets/export-L_VBD2p1.js +4 -0
  302. package/dist/web/static/assets/export-L_VBD2p1.js.map +1 -0
  303. package/dist/web/static/assets/index-D8AKj26b.css +1 -0
  304. package/dist/web/static/assets/index-DxIbmNmr.js +3 -0
  305. package/dist/web/static/assets/index-DxIbmNmr.js.map +1 -0
  306. package/dist/web/static/assets/{lucide-53bR2rki.js → lucide-fJlPI3H7.js} +68 -38
  307. package/dist/web/static/assets/lucide-fJlPI3H7.js.map +1 -0
  308. package/dist/web/static/assets/time-Bxuk0M-C.js +2 -0
  309. package/dist/web/static/assets/time-Bxuk0M-C.js.map +1 -0
  310. package/dist/web/static/index.html +3 -3
  311. package/docs/concurrent-agents.md +129 -0
  312. package/docs/design/architecture-review-20260516.md +232 -0
  313. package/docs/design/fix-skills-data-and-set-leak-spec-20260516-1300.md +219 -0
  314. package/docs/design/hook-failure-queue-spec-20260516-1530.md +204 -0
  315. package/docs/design/refactor-phase1-spec-20260515-1600.md +543 -0
  316. package/docs/design/refactor-phase2-spec-20260515-1700.md +424 -0
  317. package/docs/design/tasks-list-filter-pagination-spec-20260518-0930.md +208 -0
  318. package/docs/implementation/fix-skills-data-and-set-leak-changelog-20260516-1300.md +104 -0
  319. package/docs/implementation/hook-failure-queue-changelog-20260516-1530.md +196 -0
  320. package/docs/implementation/hotfix-daemon-event-reject-20260516-1430.md +56 -0
  321. package/docs/implementation/refactor-phase1-changelog-20260515-1630.md +354 -0
  322. package/docs/implementation/refactor-phase2-changelog-20260515-1705.md +421 -0
  323. package/docs/implementation/tasks-list-filter-pagination-changelog-20260518-0930.md +72 -0
  324. package/docs/reviews/claudemd-template-sync.md +54 -0
  325. package/docs/reviews/tasks-filter-pagination.md +80 -0
  326. package/docs/ruflo-learning-strategy.md +322 -0
  327. package/docs/skills-deduplication-analysis.md +83 -0
  328. package/docs/skills-multiformat-support.md +177 -0
  329. package/docs/skills-third-party.md +183 -0
  330. package/docs/testing/tasks-filter-pagination-test-report.md +86 -0
  331. package/forge +321 -0
  332. package/package.json +28 -62
  333. package/playwright.config.ts +40 -0
  334. package/scripts/demo-v2.ts +91 -0
  335. package/scripts/dev-daemon.sh +232 -0
  336. package/scripts/dev-web.ts +109 -0
  337. package/scripts/e2e-mcp-link.ts +423 -0
  338. package/scripts/e2e-methodology-quality.ts +253 -0
  339. package/scripts/e2e-routing.ts +456 -0
  340. package/scripts/e2e-user-methodology.ts +326 -0
  341. package/scripts/e2e-web-workflows.ts +299 -0
  342. package/scripts/migrate-legacy-to-dynamic.sql +108 -0
  343. package/scripts/regenerate-execution-docs.ts +116 -0
  344. package/scripts/sync-agent-skills.ts +193 -0
  345. package/scripts/test-hook.sh +71 -0
  346. package/scripts/verify-skill-loading.ts +62 -0
  347. package/src/claudemd/claudemd-generator.ts +777 -0
  348. package/src/claudemd/convention-extractor.ts +69 -0
  349. package/src/claudemd/index.ts +35 -0
  350. package/src/claudemd/persona-manager.ts +88 -0
  351. package/src/claudemd/resume-manager.ts +236 -0
  352. package/src/claudemd/tech-detector.ts +220 -0
  353. package/src/cli/commands/claudemd.ts +84 -0
  354. package/src/cli/commands/config.ts +46 -0
  355. package/src/cli/commands/daemon.ts +310 -0
  356. package/src/cli/commands/executions.ts +114 -0
  357. package/src/cli/commands/init.ts +204 -0
  358. package/src/cli/commands/logs.ts +181 -0
  359. package/src/cli/commands/mcp.ts +244 -0
  360. package/src/cli/commands/menu.ts +356 -0
  361. package/src/cli/commands/skills.ts +185 -0
  362. package/src/cli/commands/stats.ts +74 -0
  363. package/src/cli/commands/status.ts +69 -0
  364. package/src/cli/commands/template.ts +77 -0
  365. package/src/cli/commands/trace.ts +164 -0
  366. package/src/cli/index.ts +42 -0
  367. package/src/cli/init/hook-manager.ts +132 -0
  368. package/src/core/ai/provider.ts +308 -0
  369. package/src/core/ai/types.ts +51 -0
  370. package/src/core/config.ts +124 -0
  371. package/src/core/constants.ts +45 -0
  372. package/src/core/queue/index.ts +193 -0
  373. package/src/core/storage/base.ts +226 -0
  374. package/src/core/storage/events.ts +255 -0
  375. package/src/core/storage/injections.ts +78 -0
  376. package/src/core/storage/maintenance.ts +59 -0
  377. package/src/core/storage/migrations/002_add_skill_tracking.sql +6 -0
  378. package/src/core/storage/migrations/003_add_skill_invocations.sql +23 -0
  379. package/src/core/storage/performance-indexes.sql +23 -0
  380. package/src/core/storage/routing.ts +194 -0
  381. package/src/core/storage/rows.ts +112 -0
  382. package/src/core/storage/schema.sql +214 -0
  383. package/src/core/storage/sessions.ts +104 -0
  384. package/src/core/storage/skills.ts +164 -0
  385. package/src/core/storage/sqlite.ts +194 -0
  386. package/src/core/storage/tasks.ts +170 -0
  387. package/src/core/storage/token-usage.ts +93 -0
  388. package/src/core/types.ts +154 -0
  389. package/src/core/utils/error-handler.ts +256 -0
  390. package/src/core/utils/forge-resume-block.ts +74 -0
  391. package/src/core/utils/format.ts +69 -0
  392. package/src/core/utils/logger.ts +119 -0
  393. package/src/core/utils/lru-cache.ts +50 -0
  394. package/src/core/utils/path.ts +19 -0
  395. package/src/core/utils/session.ts +26 -0
  396. package/src/core/utils/time.ts +37 -0
  397. package/src/core/utils/token-tracker.ts +97 -0
  398. package/src/daemon/event-parser.ts +35 -0
  399. package/src/daemon/handlers/history-exporter.ts +117 -0
  400. package/src/daemon/handlers/post-tool-use.ts +50 -0
  401. package/src/daemon/handlers/stop.ts +215 -0
  402. package/src/daemon/handlers/user-prompt.ts +188 -0
  403. package/src/daemon/index.ts +278 -0
  404. package/src/daemon/launchd/com.claude-forge.daemon.plist.template +47 -0
  405. package/src/daemon/launchd-installer.ts +260 -0
  406. package/src/daemon/lifecycle.ts +128 -0
  407. package/src/daemon/router.ts +40 -0
  408. package/src/daemon/server.ts +209 -0
  409. package/src/daemon/services/anti-pattern-detector.ts +412 -0
  410. package/src/daemon/services/drift-detector.ts +232 -0
  411. package/src/daemon/services/task-segmenter.ts +112 -0
  412. package/src/daemon/services/weekly-report.ts +454 -0
  413. package/src/hooks/hook-lib.sh +81 -0
  414. package/src/hooks/notification.sh +35 -0
  415. package/src/hooks/post-tool-use.sh +61 -0
  416. package/src/hooks/pre-tool-use.sh +63 -0
  417. package/src/hooks/stop.sh +40 -0
  418. package/src/hooks/user-prompt-submit.sh +69 -0
  419. package/src/mcp/server.ts +322 -0
  420. package/src/skills/index.ts +2 -0
  421. package/src/skills/invocation-guard.ts +177 -0
  422. package/src/skills/matcher.ts +148 -0
  423. package/src/skills/official/code-simplifier.md +16 -0
  424. package/src/skills/official/find-skills.md +23 -0
  425. package/src/skills/official/official-api-design.md +17 -0
  426. package/src/skills/official/official-architecture-decision.md +20 -0
  427. package/src/skills/official/official-bmad.md +118 -0
  428. package/src/skills/official/official-db-schema-design.md +16 -0
  429. package/src/skills/official/official-debug.md +17 -0
  430. package/src/skills/official/official-doc-driven.md +31 -0
  431. package/src/skills/official/official-harness-engineering.md +108 -0
  432. package/src/skills/official/official-performance-optimization.md +30 -0
  433. package/src/skills/official/official-pr-review.md +35 -0
  434. package/src/skills/official/official-release-checklist.md +30 -0
  435. package/src/skills/official/official-security-hardening.md +26 -0
  436. package/src/skills/official/official-spec-driven-design.md +31 -0
  437. package/src/skills/official/planning-with-files.md +37 -0
  438. package/src/skills/official/ui-ux-pro-max.md +18 -0
  439. package/src/skills/official/webapp-testing.md +12 -0
  440. package/src/skills/official-skills.ts +89 -0
  441. package/src/skills/registry.ts +355 -0
  442. package/src/skills/semantic-matcher.ts +231 -0
  443. package/src/skills/tools/pipeline-suggest.ts +226 -0
  444. package/src/skills/tools/skill-invoke.ts +168 -0
  445. package/src/skills/tools/skill-list.ts +59 -0
  446. package/src/templates/go.yaml +53 -0
  447. package/src/templates/python.yaml +59 -0
  448. package/src/templates/react.yaml +55 -0
  449. package/src/templates/template-manager.ts +170 -0
  450. package/src/web/auth-middleware.ts +55 -0
  451. package/src/web/routes/ai.ts +204 -0
  452. package/src/web/routes/auth.ts +22 -0
  453. package/src/web/routes/drift.ts +25 -0
  454. package/src/web/routes/error-handler.ts +120 -0
  455. package/src/web/routes/events.ts +47 -0
  456. package/src/web/routes/insights.ts +43 -0
  457. package/src/web/routes/patch.ts +117 -0
  458. package/src/web/routes/reports.ts +34 -0
  459. package/src/web/routes/rules.ts +101 -0
  460. package/src/web/routes/sessions.ts +262 -0
  461. package/src/web/routes/skill-stats.ts +132 -0
  462. package/src/web/routes/skills.ts +349 -0
  463. package/src/web/routes/static.ts +67 -0
  464. package/src/web/routes/stats.ts +60 -0
  465. package/src/web/routes/status.ts +30 -0
  466. package/src/web/routes/tasks.ts +218 -0
  467. package/src/web/routes/token-usage.ts +20 -0
  468. package/src/web/routes/trace.ts +138 -0
  469. package/src/web/routes/types.ts +56 -0
  470. package/src/web/server.ts +134 -0
  471. package/src/web/ssrf-guard.ts +112 -0
  472. package/src/web/static/index.html +3251 -0
  473. package/src/web/static/vendor/chart.umd.min.js +20 -0
  474. package/tests/e2e/dashboard.spec.ts +205 -0
  475. package/tests/e2e/routing-skill-e2e.test.ts +39 -0
  476. package/tests/helpers/mock-ai.ts +92 -0
  477. package/tests/helpers/mock-storage.ts +159 -0
  478. package/tests/integration/queue-replay.integration.test.ts +193 -0
  479. package/tests/integration/tasks-filter.integration.test.ts +154 -0
  480. package/tests/performance/database.benchmark.ts +161 -0
  481. package/tests/semantic-matcher.test.ts +99 -0
  482. package/tests/skill-matcher.test.ts +110 -0
  483. package/tests/unit/ai-provider-retry.test.ts +194 -0
  484. package/tests/unit/ai-provider-vision.test.ts +224 -0
  485. package/tests/unit/claudemd-generator.test.ts +68 -0
  486. package/tests/unit/cli-mcp.test.ts +141 -0
  487. package/tests/unit/handlers.test.ts +171 -0
  488. package/tests/unit/invocation-guard.test.ts +125 -0
  489. package/tests/unit/queue.test.ts +272 -0
  490. package/tests/unit/router.test.ts +138 -0
  491. package/tests/unit/security.test.ts +128 -0
  492. package/tests/unit/skill-invocations-workflow.test.ts +495 -0
  493. package/tests/unit/skill-registry.test.ts +94 -0
  494. package/tests/unit/skills/invocation-guard-ttl.test.ts +211 -0
  495. package/tests/unit/skills/official-skills-loader.test.ts +126 -0
  496. package/tests/unit/skills/registry-multiformat.test.ts +92 -0
  497. package/tests/unit/storage/sessions-aggregate.test.ts +435 -0
  498. package/tests/unit/storage/sqlite-refactor-harness.test.ts +314 -0
  499. package/tests/unit/storage.test.ts +172 -0
  500. package/tests/unit/token-usage.test.ts +144 -0
  501. package/tests/unit/type-guards.test.ts +201 -0
  502. package/tests/unit/utils/format.test.ts +189 -0
  503. package/tests/unit/utils/session.test.ts +89 -0
  504. package/tests/unit/utils/time.test.ts +112 -0
  505. package/tests/unit/web/routes-auth.test.ts +93 -0
  506. package/tests/unit/web/routes-events.test.ts +101 -0
  507. package/tests/unit/web/routes-sessions.test.ts +181 -0
  508. package/tests/unit/web/routes-skill-stats.test.ts +179 -0
  509. package/tests/unit/web/routes-stats.test.ts +92 -0
  510. package/tests/unit/web/routes-tasks.test.ts +351 -0
  511. package/tsconfig.json +22 -0
  512. package/vitest.config.ts +21 -0
  513. package/vitest.integration.config.ts +16 -0
  514. package/web/CLAUDE.md +20 -0
  515. package/web/index.html +13 -0
  516. package/web/package-lock.json +4854 -0
  517. package/web/package.json +35 -0
  518. package/web/postcss.config.js +6 -0
  519. package/web/src/App.tsx +110 -0
  520. package/web/src/components/CodeBlock.tsx +31 -0
  521. package/web/src/components/Confirm.tsx +96 -0
  522. package/web/src/components/Drawer.tsx +60 -0
  523. package/web/src/components/Layout.tsx +145 -0
  524. package/web/src/components/MarkdownRenderer.tsx +77 -0
  525. package/web/src/components/SearchInput.tsx +31 -0
  526. package/web/src/components/SessionDetailContent.tsx +157 -0
  527. package/web/src/components/Toast.tsx +92 -0
  528. package/web/src/index.css +19 -0
  529. package/web/src/main.tsx +31 -0
  530. package/web/src/pages/AIConfig.tsx +233 -0
  531. package/web/src/pages/Dashboard.tsx +572 -0
  532. package/web/src/pages/Events.tsx +271 -0
  533. package/web/src/pages/Reports.tsx +428 -0
  534. package/web/src/pages/SessionDetail.tsx +162 -0
  535. package/web/src/pages/Sessions.tsx +205 -0
  536. package/web/src/pages/Skills.tsx +180 -0
  537. package/web/src/pages/TaskDetail.tsx +511 -0
  538. package/web/src/pages/Tasks.tsx +150 -0
  539. package/web/src/utils/auth.ts +59 -0
  540. package/web/src/utils/export.ts +54 -0
  541. package/web/src/utils/time.ts +13 -0
  542. package/web/tailwind.config.js +11 -0
  543. package/web/tsconfig.json +21 -0
  544. package/web/tsconfig.node.json +10 -0
  545. package/web/vite.config.ts +76 -0
  546. package/winspan-claude-forge-8.43.0.tgz +0 -0
  547. package/dist/agents/definition.d.ts +0 -62
  548. package/dist/agents/definition.d.ts.map +0 -1
  549. package/dist/agents/definition.js +0 -27
  550. package/dist/agents/definition.js.map +0 -1
  551. package/dist/agents/distributor.d.ts +0 -23
  552. package/dist/agents/distributor.d.ts.map +0 -1
  553. package/dist/agents/distributor.js +0 -85
  554. package/dist/agents/distributor.js.map +0 -1
  555. package/dist/agents/index.d.ts +0 -5
  556. package/dist/agents/index.d.ts.map +0 -1
  557. package/dist/agents/index.js +0 -5
  558. package/dist/agents/index.js.map +0 -1
  559. package/dist/agents/methodologies/agent-builder.d.ts +0 -21
  560. package/dist/agents/methodologies/agent-builder.d.ts.map +0 -1
  561. package/dist/agents/methodologies/agent-builder.js +0 -149
  562. package/dist/agents/methodologies/agent-builder.js.map +0 -1
  563. package/dist/agents/methodologies/phases/bmad/analyze.d.ts +0 -3
  564. package/dist/agents/methodologies/phases/bmad/analyze.d.ts.map +0 -1
  565. package/dist/agents/methodologies/phases/bmad/analyze.js +0 -19
  566. package/dist/agents/methodologies/phases/bmad/analyze.js.map +0 -1
  567. package/dist/agents/methodologies/phases/bmad/design.d.ts +0 -3
  568. package/dist/agents/methodologies/phases/bmad/design.d.ts.map +0 -1
  569. package/dist/agents/methodologies/phases/bmad/design.js +0 -18
  570. package/dist/agents/methodologies/phases/bmad/design.js.map +0 -1
  571. package/dist/agents/methodologies/phases/bmad/implement.d.ts +0 -3
  572. package/dist/agents/methodologies/phases/bmad/implement.d.ts.map +0 -1
  573. package/dist/agents/methodologies/phases/bmad/implement.js +0 -17
  574. package/dist/agents/methodologies/phases/bmad/implement.js.map +0 -1
  575. package/dist/agents/methodologies/phases/bmad/index.d.ts +0 -6
  576. package/dist/agents/methodologies/phases/bmad/index.d.ts.map +0 -1
  577. package/dist/agents/methodologies/phases/bmad/index.js +0 -6
  578. package/dist/agents/methodologies/phases/bmad/index.js.map +0 -1
  579. package/dist/agents/methodologies/phases/bmad/review.d.ts +0 -3
  580. package/dist/agents/methodologies/phases/bmad/review.d.ts.map +0 -1
  581. package/dist/agents/methodologies/phases/bmad/review.js +0 -17
  582. package/dist/agents/methodologies/phases/bmad/review.js.map +0 -1
  583. package/dist/agents/methodologies/phases/bmad/test.d.ts +0 -3
  584. package/dist/agents/methodologies/phases/bmad/test.d.ts.map +0 -1
  585. package/dist/agents/methodologies/phases/bmad/test.js +0 -21
  586. package/dist/agents/methodologies/phases/bmad/test.js.map +0 -1
  587. package/dist/agents/methodologies/phases/harness/fix.d.ts +0 -3
  588. package/dist/agents/methodologies/phases/harness/fix.d.ts.map +0 -1
  589. package/dist/agents/methodologies/phases/harness/fix.js +0 -17
  590. package/dist/agents/methodologies/phases/harness/fix.js.map +0 -1
  591. package/dist/agents/methodologies/phases/harness/index.d.ts +0 -6
  592. package/dist/agents/methodologies/phases/harness/index.d.ts.map +0 -1
  593. package/dist/agents/methodologies/phases/harness/index.js +0 -6
  594. package/dist/agents/methodologies/phases/harness/index.js.map +0 -1
  595. package/dist/agents/methodologies/phases/harness/reproduce.d.ts +0 -3
  596. package/dist/agents/methodologies/phases/harness/reproduce.d.ts.map +0 -1
  597. package/dist/agents/methodologies/phases/harness/reproduce.js +0 -20
  598. package/dist/agents/methodologies/phases/harness/reproduce.js.map +0 -1
  599. package/dist/agents/methodologies/phases/harness/root-cause.d.ts +0 -3
  600. package/dist/agents/methodologies/phases/harness/root-cause.d.ts.map +0 -1
  601. package/dist/agents/methodologies/phases/harness/root-cause.js +0 -21
  602. package/dist/agents/methodologies/phases/harness/root-cause.js.map +0 -1
  603. package/dist/agents/methodologies/phases/harness/safety-net.d.ts +0 -3
  604. package/dist/agents/methodologies/phases/harness/safety-net.d.ts.map +0 -1
  605. package/dist/agents/methodologies/phases/harness/safety-net.js +0 -17
  606. package/dist/agents/methodologies/phases/harness/safety-net.js.map +0 -1
  607. package/dist/agents/methodologies/phases/harness/verify.d.ts +0 -3
  608. package/dist/agents/methodologies/phases/harness/verify.d.ts.map +0 -1
  609. package/dist/agents/methodologies/phases/harness/verify.js +0 -22
  610. package/dist/agents/methodologies/phases/harness/verify.js.map +0 -1
  611. package/dist/agents/methodologies/presets.d.ts +0 -10
  612. package/dist/agents/methodologies/presets.d.ts.map +0 -1
  613. package/dist/agents/methodologies/presets.js +0 -79
  614. package/dist/agents/methodologies/presets.js.map +0 -1
  615. package/dist/agents/methodologies/types.d.ts +0 -45
  616. package/dist/agents/methodologies/types.d.ts.map +0 -1
  617. package/dist/agents/methodologies/types.js +0 -10
  618. package/dist/agents/methodologies/types.js.map +0 -1
  619. package/dist/agents/methodologies/user-config-loader.d.ts +0 -30
  620. package/dist/agents/methodologies/user-config-loader.d.ts.map +0 -1
  621. package/dist/agents/methodologies/user-config-loader.js +0 -159
  622. package/dist/agents/methodologies/user-config-loader.js.map +0 -1
  623. package/dist/agents/official-agents.d.ts +0 -4
  624. package/dist/agents/official-agents.d.ts.map +0 -1
  625. package/dist/agents/official-agents.js +0 -559
  626. package/dist/agents/official-agents.js.map +0 -1
  627. package/dist/agents/registry.d.ts +0 -57
  628. package/dist/agents/registry.d.ts.map +0 -1
  629. package/dist/agents/registry.js +0 -271
  630. package/dist/agents/registry.js.map +0 -1
  631. package/dist/capability/index.d.ts +0 -10
  632. package/dist/capability/index.d.ts.map +0 -1
  633. package/dist/capability/index.js +0 -10
  634. package/dist/capability/index.js.map +0 -1
  635. package/dist/capability/types.d.ts +0 -10
  636. package/dist/capability/types.d.ts.map +0 -1
  637. package/dist/capability/types.js +0 -10
  638. package/dist/capability/types.js.map +0 -1
  639. package/dist/cli/commands/agents.d.ts +0 -3
  640. package/dist/cli/commands/agents.d.ts.map +0 -1
  641. package/dist/cli/commands/agents.js +0 -62
  642. package/dist/cli/commands/agents.js.map +0 -1
  643. package/dist/cli/commands/rules.d.ts +0 -8
  644. package/dist/cli/commands/rules.d.ts.map +0 -1
  645. package/dist/cli/commands/rules.js +0 -89
  646. package/dist/cli/commands/rules.js.map +0 -1
  647. package/dist/daemon/auto-disable-scheduler.d.ts +0 -53
  648. package/dist/daemon/auto-disable-scheduler.d.ts.map +0 -1
  649. package/dist/daemon/auto-disable-scheduler.js +0 -114
  650. package/dist/daemon/auto-disable-scheduler.js.map +0 -1
  651. package/dist/daemon/handlers/pre-tool-use.d.ts +0 -39
  652. package/dist/daemon/handlers/pre-tool-use.d.ts.map +0 -1
  653. package/dist/daemon/handlers/pre-tool-use.js +0 -166
  654. package/dist/daemon/handlers/pre-tool-use.js.map +0 -1
  655. package/dist/daemon/routing-observer.d.ts +0 -42
  656. package/dist/daemon/routing-observer.d.ts.map +0 -1
  657. package/dist/daemon/routing-observer.js +0 -264
  658. package/dist/daemon/routing-observer.js.map +0 -1
  659. package/dist/daemon/routing-state.d.ts +0 -64
  660. package/dist/daemon/routing-state.d.ts.map +0 -1
  661. package/dist/daemon/routing-state.js +0 -240
  662. package/dist/daemon/routing-state.js.map +0 -1
  663. package/dist/engine/agent-router.d.ts +0 -142
  664. package/dist/engine/agent-router.d.ts.map +0 -1
  665. package/dist/engine/agent-router.js +0 -276
  666. package/dist/engine/agent-router.js.map +0 -1
  667. package/dist/engine/context-builder.d.ts +0 -23
  668. package/dist/engine/context-builder.d.ts.map +0 -1
  669. package/dist/engine/context-builder.js +0 -63
  670. package/dist/engine/context-builder.js.map +0 -1
  671. package/dist/engine/conventions/basic-security.yaml +0 -109
  672. package/dist/engine/conventions/code-quality.yaml +0 -123
  673. package/dist/engine/conventions/database-safety.yaml +0 -74
  674. package/dist/engine/conventions/dependency-safety.yaml +0 -132
  675. package/dist/engine/conventions/docker-safety.yaml +0 -69
  676. package/dist/engine/conventions/git-safety.yaml +0 -118
  677. package/dist/engine/conventions/go-best-practices.yaml +0 -84
  678. package/dist/engine/conventions/python-best-practices.yaml +0 -96
  679. package/dist/engine/conventions/react-best-practices.yaml +0 -96
  680. package/dist/engine/conventions/routing.yaml +0 -378
  681. package/dist/engine/conventions/strict-security.yaml +0 -30
  682. package/dist/engine/conventions/ts-quality.yaml +0 -49
  683. package/dist/engine/dsl/compiler.d.ts +0 -34
  684. package/dist/engine/dsl/compiler.d.ts.map +0 -1
  685. package/dist/engine/dsl/compiler.js +0 -702
  686. package/dist/engine/dsl/compiler.js.map +0 -1
  687. package/dist/engine/dsl/parser.d.ts +0 -25
  688. package/dist/engine/dsl/parser.d.ts.map +0 -1
  689. package/dist/engine/dsl/parser.js +0 -208
  690. package/dist/engine/dsl/parser.js.map +0 -1
  691. package/dist/engine/dsl/runtime.d.ts +0 -46
  692. package/dist/engine/dsl/runtime.d.ts.map +0 -1
  693. package/dist/engine/dsl/runtime.js +0 -173
  694. package/dist/engine/dsl/runtime.js.map +0 -1
  695. package/dist/engine/dsl/types.d.ts +0 -139
  696. package/dist/engine/dsl/types.d.ts.map +0 -1
  697. package/dist/engine/dsl/types.js +0 -11
  698. package/dist/engine/dsl/types.js.map +0 -1
  699. package/dist/engine/evidence-store.d.ts +0 -44
  700. package/dist/engine/evidence-store.d.ts.map +0 -1
  701. package/dist/engine/evidence-store.js +0 -109
  702. package/dist/engine/evidence-store.js.map +0 -1
  703. package/dist/engine/experiment-router.d.ts +0 -102
  704. package/dist/engine/experiment-router.d.ts.map +0 -1
  705. package/dist/engine/experiment-router.js +0 -289
  706. package/dist/engine/experiment-router.js.map +0 -1
  707. package/dist/engine/recommender.d.ts +0 -52
  708. package/dist/engine/recommender.d.ts.map +0 -1
  709. package/dist/engine/recommender.js +0 -162
  710. package/dist/engine/recommender.js.map +0 -1
  711. package/dist/engine/rule-engine.d.ts +0 -33
  712. package/dist/engine/rule-engine.d.ts.map +0 -1
  713. package/dist/engine/rule-engine.js +0 -250
  714. package/dist/engine/rule-engine.js.map +0 -1
  715. package/dist/engine/security-gates.d.ts +0 -42
  716. package/dist/engine/security-gates.d.ts.map +0 -1
  717. package/dist/engine/security-gates.js +0 -210
  718. package/dist/engine/security-gates.js.map +0 -1
  719. package/dist/intelligence/classifier.d.ts +0 -75
  720. package/dist/intelligence/classifier.d.ts.map +0 -1
  721. package/dist/intelligence/classifier.js +0 -352
  722. package/dist/intelligence/classifier.js.map +0 -1
  723. package/dist/intelligence/context-gatherer.d.ts +0 -101
  724. package/dist/intelligence/context-gatherer.d.ts.map +0 -1
  725. package/dist/intelligence/context-gatherer.js +0 -417
  726. package/dist/intelligence/context-gatherer.js.map +0 -1
  727. package/dist/intelligence/cot-classifier.d.ts +0 -95
  728. package/dist/intelligence/cot-classifier.d.ts.map +0 -1
  729. package/dist/intelligence/cot-classifier.js +0 -391
  730. package/dist/intelligence/cot-classifier.js.map +0 -1
  731. package/dist/intelligence/distiller.d.ts +0 -22
  732. package/dist/intelligence/distiller.d.ts.map +0 -1
  733. package/dist/intelligence/distiller.js +0 -108
  734. package/dist/intelligence/distiller.js.map +0 -1
  735. package/dist/intelligence/execution-doc-builder.d.ts +0 -151
  736. package/dist/intelligence/execution-doc-builder.d.ts.map +0 -1
  737. package/dist/intelligence/execution-doc-builder.js +0 -1018
  738. package/dist/intelligence/execution-doc-builder.js.map +0 -1
  739. package/dist/intelligence/intent-types.d.ts +0 -13
  740. package/dist/intelligence/intent-types.d.ts.map +0 -1
  741. package/dist/intelligence/intent-types.js +0 -19
  742. package/dist/intelligence/intent-types.js.map +0 -1
  743. package/dist/intelligence/multimodal-parser.d.ts +0 -105
  744. package/dist/intelligence/multimodal-parser.d.ts.map +0 -1
  745. package/dist/intelligence/multimodal-parser.js +0 -425
  746. package/dist/intelligence/multimodal-parser.js.map +0 -1
  747. package/dist/intelligence/quality-gate.d.ts +0 -45
  748. package/dist/intelligence/quality-gate.d.ts.map +0 -1
  749. package/dist/intelligence/quality-gate.js +0 -193
  750. package/dist/intelligence/quality-gate.js.map +0 -1
  751. package/dist/intelligence/task-segmenter.d.ts.map +0 -1
  752. package/dist/intelligence/task-segmenter.js.map +0 -1
  753. package/dist/web/routes/agents.d.ts +0 -7
  754. package/dist/web/routes/agents.d.ts.map +0 -1
  755. package/dist/web/routes/agents.js +0 -209
  756. package/dist/web/routes/agents.js.map +0 -1
  757. package/dist/web/routes/execution-trace.d.ts +0 -21
  758. package/dist/web/routes/execution-trace.d.ts.map +0 -1
  759. package/dist/web/routes/execution-trace.js +0 -353
  760. package/dist/web/routes/execution-trace.js.map +0 -1
  761. package/dist/web/routes/experiments.d.ts +0 -15
  762. package/dist/web/routes/experiments.d.ts.map +0 -1
  763. package/dist/web/routes/experiments.js +0 -187
  764. package/dist/web/routes/experiments.js.map +0 -1
  765. package/dist/web/routes/routing.d.ts +0 -17
  766. package/dist/web/routes/routing.d.ts.map +0 -1
  767. package/dist/web/routes/routing.js +0 -592
  768. package/dist/web/routes/routing.js.map +0 -1
  769. package/dist/web/routes/workflows.d.ts +0 -19
  770. package/dist/web/routes/workflows.d.ts.map +0 -1
  771. package/dist/web/routes/workflows.js +0 -86
  772. package/dist/web/routes/workflows.js.map +0 -1
  773. package/dist/web/static/assets/AIConfig-R5wZ3ZKT.js +0 -2
  774. package/dist/web/static/assets/AIConfig-R5wZ3ZKT.js.map +0 -1
  775. package/dist/web/static/assets/Agents-Beg34V1g.js +0 -2
  776. package/dist/web/static/assets/Agents-Beg34V1g.js.map +0 -1
  777. package/dist/web/static/assets/CodeBlock--H53gk46.js +0 -2
  778. package/dist/web/static/assets/CodeBlock--H53gk46.js.map +0 -1
  779. package/dist/web/static/assets/Dashboard-Cy1xsj1J.js +0 -2
  780. package/dist/web/static/assets/Dashboard-Cy1xsj1J.js.map +0 -1
  781. package/dist/web/static/assets/Events-mFhXl4zI.js +0 -2
  782. package/dist/web/static/assets/Events-mFhXl4zI.js.map +0 -1
  783. package/dist/web/static/assets/ExecutionTrace-DG901hLR.js +0 -3
  784. package/dist/web/static/assets/ExecutionTrace-DG901hLR.js.map +0 -1
  785. package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js +0 -2
  786. package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js.map +0 -1
  787. package/dist/web/static/assets/Routing-B7BFLfjh.js +0 -2
  788. package/dist/web/static/assets/Routing-B7BFLfjh.js.map +0 -1
  789. package/dist/web/static/assets/SessionDetail-BT0l4RrK.js +0 -2
  790. package/dist/web/static/assets/SessionDetail-BT0l4RrK.js.map +0 -1
  791. package/dist/web/static/assets/Sessions-C6J_HQ_u.js +0 -2
  792. package/dist/web/static/assets/Sessions-C6J_HQ_u.js.map +0 -1
  793. package/dist/web/static/assets/Skills-4DQWLaTv.js +0 -2
  794. package/dist/web/static/assets/Skills-4DQWLaTv.js.map +0 -1
  795. package/dist/web/static/assets/WorkflowDetail-zhNqUkBE.js +0 -2
  796. package/dist/web/static/assets/WorkflowDetail-zhNqUkBE.js.map +0 -1
  797. package/dist/web/static/assets/Workflows-Btvi-lGw.js +0 -2
  798. package/dist/web/static/assets/Workflows-Btvi-lGw.js.map +0 -1
  799. package/dist/web/static/assets/export-BQQZLaHV.js +0 -4
  800. package/dist/web/static/assets/export-BQQZLaHV.js.map +0 -1
  801. package/dist/web/static/assets/index-Cgr9qMtq.js +0 -3
  802. package/dist/web/static/assets/index-Cgr9qMtq.js.map +0 -1
  803. package/dist/web/static/assets/index-CngWb5gC.css +0 -1
  804. 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
+ }