@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
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * CLAUDE.md Generator — AI 驱动的 CLAUDE.md 生成与管理
3
3
  */
4
- import { readFileSync, writeFileSync, existsSync } from 'node:fs';
4
+ import { readFileSync, writeFileSync, existsSync, readdirSync, statSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
6
  import { TechDetector } from './tech-detector.js';
7
7
  const AUTO_START = '<!-- forge:claudemd-auto -->';
@@ -14,16 +14,378 @@ export class ClaudeMdGenerator {
14
14
  this.detector = detector ?? new TechDetector();
15
15
  }
16
16
  /**
17
- * 检测技术栈 + 调 AI 生成 CLAUDE.md
17
+ * 检测技术栈 + 生成 CLAUDE.md
18
+ *
19
+ * 策略:Swarm 协议是固定内容(不依赖 AI),项目信息尝试用 AI 生成,
20
+ * 失败时回退到基于技术栈检测的模板。
18
21
  */
19
22
  async generate(projectPath, userContent) {
20
23
  const stack = this.detector.detect(projectPath);
21
- const prompt = this.buildPrompt(stack, projectPath);
22
- const generated = await this.ai.complete(prompt, {
23
- system: 'You are a senior developer writing CLAUDE.md project instructions.',
24
- maxTokens: 4096,
25
- });
26
- return this.merge(generated, userContent);
24
+ // 1. 尝试 AI 生成项目特定内容
25
+ let projectContent = '';
26
+ try {
27
+ const prompt = this.buildPrompt(stack, projectPath);
28
+ const aiResult = await this.ai.complete(prompt, {
29
+ system: 'You are a technical writer. Output ONLY markdown content for a CLAUDE.md file. Do NOT ask questions or explain what you will do. Start directly with ## headers.',
30
+ maxTokens: 4096,
31
+ // 4096-token 生成在转发网关(如 one.iflytek 等)下容易超过默认 30s;
32
+ // 给 CLAUDE.md 生成单独拉长超时,失败再回退到本地模板。
33
+ timeoutMs: 120_000,
34
+ });
35
+ // 验证 AI 输出是否有效(至少包含一个 ## 标题)
36
+ if (aiResult && aiResult.includes('##')) {
37
+ // AI 经常在"目录结构"章节退化成 project-root/com/example/project 模板,
38
+ // 不可信任;强制替换为真实扫描结果。
39
+ projectContent = this.overrideDirectoryStructure(aiResult, stack, projectPath);
40
+ }
41
+ }
42
+ catch {
43
+ // AI 失败,使用模板回退
44
+ }
45
+ // 2. 如果 AI 失败或返回无效内容,使用模板
46
+ if (!projectContent) {
47
+ projectContent = this.buildFallbackContent(stack, projectPath);
48
+ }
49
+ // 3. Swarm 协议 + 项目内容
50
+ const full = SWARM_PROTOCOL + '\n\n' + projectContent;
51
+ return this.merge(full, userContent);
52
+ }
53
+ /**
54
+ * 基于技术栈检测的回退模板(不依赖 AI)
55
+ *
56
+ * 即使 AI 调用失败,也要生成足够丰富的项目指引,让 Claude Code 拿到:
57
+ * - 技术栈概览(含版本、包管理器、测试 / Linter)
58
+ * - 构建 / 测试 / 运行命令(按包管理器分发)
59
+ * - 目录结构(扫描项目根目录真实结构)
60
+ * - 代码规范(命名、提交信息、PR 流程)
61
+ * - 常见陷阱(按技术栈定制)
62
+ * - 贡献指南
63
+ */
64
+ buildFallbackContent(stack, projectPath) {
65
+ const sections = [];
66
+ sections.push(this.sectionOverview(stack));
67
+ sections.push(this.sectionTechStack(stack));
68
+ sections.push(this.sectionBuildCommands(stack));
69
+ sections.push(this.sectionDirectoryStructure(stack, projectPath));
70
+ sections.push(this.sectionCodingStandards(stack));
71
+ sections.push(this.sectionCommonPitfalls(stack));
72
+ sections.push(this.sectionContributionGuide(stack));
73
+ return sections.filter(Boolean).join('\n\n');
74
+ }
75
+ sectionOverview(stack) {
76
+ const lang = stack.language[0] || '未识别';
77
+ const framework = stack.framework.length > 0 ? ` + ${stack.framework.join(' / ')}` : '';
78
+ return [
79
+ '## 项目概述',
80
+ '',
81
+ `本项目基于 ${lang}${framework} 构建。请根据实际业务补充项目目标、核心模块职责与上下游依赖。`,
82
+ ].join('\n');
83
+ }
84
+ sectionTechStack(stack) {
85
+ const lines = ['## 技术栈', ''];
86
+ if (stack.language.length > 0) {
87
+ lines.push(`- **语言**: ${stack.language.join(', ')}`);
88
+ }
89
+ if (stack.framework.length > 0) {
90
+ const descs = stack.framework.map(fw => `${fw}${this.frameworkHint(fw)}`);
91
+ lines.push(`- **框架**: ${descs.join(', ')}`);
92
+ }
93
+ lines.push(`- **包管理器**: ${stack.packageManager}`);
94
+ if (stack.testFramework) {
95
+ lines.push(`- **测试框架**: ${stack.testFramework}`);
96
+ }
97
+ if (stack.linter) {
98
+ lines.push(`- **代码检查**: ${stack.linter}`);
99
+ }
100
+ const ecosystem = this.ecosystemNotes(stack);
101
+ if (ecosystem) {
102
+ lines.push('', ecosystem);
103
+ }
104
+ return lines.join('\n');
105
+ }
106
+ frameworkHint(fw) {
107
+ const hints = {
108
+ 'Spring Boot': '(IoC 容器 + 自动配置,所有组件通过注解注入)',
109
+ MyBatis: '(SQL 映射,Mapper 接口 + XML)',
110
+ Dubbo: '(RPC 框架,服务注册与发现)',
111
+ React: '(组件化 UI,单向数据流)',
112
+ 'Next.js': '(React 全栈框架,支持 SSR / SSG)',
113
+ Vue: '(渐进式 UI 框架)',
114
+ Express: '(Node.js Web 框架,中间件模型)',
115
+ Fastify: '(高性能 Node.js Web 框架)',
116
+ NestJS: '(Node.js 企业级框架,装饰器 + DI)',
117
+ };
118
+ return hints[fw] || '';
119
+ }
120
+ ecosystemNotes(stack) {
121
+ if (stack.language.some(l => l.startsWith('Java'))) {
122
+ return '> Java 生态约定:包名全小写,类名 PascalCase,方法 camelCase;Maven / Gradle 依赖统一在顶层 pom.xml / build.gradle 管理,子模块只声明坐标不重复版本。';
123
+ }
124
+ if (stack.language.includes('TypeScript')) {
125
+ return '> TypeScript 生态约定:开启 strict 模式,模块边界用 interface,内部用 type;async/await 优先,禁止混用 Promise 链。';
126
+ }
127
+ if (stack.language.some(l => l.startsWith('Go'))) {
128
+ return '> Go 生态约定:使用 gofmt 自动格式化;错误值必须显式处理,不得丢弃;包名全小写且与目录名一致。';
129
+ }
130
+ if (stack.language.includes('Rust')) {
131
+ return '> Rust 生态约定:`cargo fmt` + `cargo clippy` 双重检查;尽量使用 Result / Option,避免 panic;mod.rs 或 `<name>.rs` 二选一。';
132
+ }
133
+ if (stack.language.includes('Python')) {
134
+ return '> Python 生态约定:遵循 PEP8;建议启用 mypy / ruff;虚拟环境隔离依赖。';
135
+ }
136
+ return '';
137
+ }
138
+ sectionBuildCommands(stack) {
139
+ const lines = ['## 构建与测试', '', '```bash'];
140
+ const pm = stack.packageManager;
141
+ if (pm === 'npm') {
142
+ lines.push('# 安装依赖', 'npm install', '', '# 开发模式(如适用)', 'npm run dev', '', '# 构建产物', 'npm run build', '', '# 运行测试', 'npm test', '', '# 类型检查(TypeScript)', 'npx tsc --noEmit');
143
+ }
144
+ else if (pm === 'pnpm') {
145
+ lines.push('pnpm install', 'pnpm dev', 'pnpm build', 'pnpm test');
146
+ }
147
+ else if (pm === 'yarn') {
148
+ lines.push('yarn', 'yarn dev', 'yarn build', 'yarn test');
149
+ }
150
+ else if (pm === 'bun') {
151
+ lines.push('bun install', 'bun run dev', 'bun run build', 'bun test');
152
+ }
153
+ else if (pm === 'maven') {
154
+ lines.push('# 清理并编译', 'mvn clean compile', '', '# 运行测试', 'mvn test', '', '# 打包(跳过测试加 -DskipTests)', 'mvn clean package', '', '# 本地安装到 ~/.m2', 'mvn clean install', '', '# 启动 Spring Boot(若适用)', 'mvn spring-boot:run');
155
+ }
156
+ else if (pm === 'gradle') {
157
+ lines.push('# 构建', './gradlew build', '', '# 运行测试', './gradlew test', '', '# 清理', './gradlew clean', '', '# 启动 Spring Boot(若适用)', './gradlew bootRun');
158
+ }
159
+ else if (pm === 'go mod') {
160
+ lines.push('go mod tidy', 'go build ./...', 'go test ./...', 'go vet ./...');
161
+ }
162
+ else if (pm === 'cargo') {
163
+ lines.push('cargo build', 'cargo test', 'cargo clippy -- -D warnings', 'cargo fmt --check');
164
+ }
165
+ else if (pm === 'pip' || pm === 'poetry' || pm === 'pipenv') {
166
+ const prefix = pm === 'poetry' ? 'poetry run ' : pm === 'pipenv' ? 'pipenv run ' : '';
167
+ lines.push(`${prefix}pytest`, `${prefix}python -m build`);
168
+ }
169
+ else {
170
+ lines.push('# 请补充构建与测试命令');
171
+ }
172
+ lines.push('```');
173
+ return lines.join('\n');
174
+ }
175
+ sectionDirectoryStructure(stack, projectPath) {
176
+ // Java 项目需要更深的层级才能看到包结构
177
+ const isJava = stack.language.some(l => l.startsWith('Java'));
178
+ const maxDepth = isJava ? 4 : 2;
179
+ const tree = this.scanDirectoryTree(projectPath, maxDepth, isJava);
180
+ if (!tree)
181
+ return '';
182
+ return ['## 目录结构', '', '```', tree, '```'].join('\n');
183
+ }
184
+ /**
185
+ * 扫描项目根目录,生成树形结构(过滤噪声目录)
186
+ */
187
+ scanDirectoryTree(projectPath, maxDepth, addComments = false) {
188
+ const IGNORE = new Set([
189
+ 'node_modules', '.git', '.idea', '.vscode', '.DS_Store',
190
+ 'dist', 'build', 'target', 'out', '.next', '.nuxt',
191
+ '__pycache__', '.pytest_cache', '.mypy_cache',
192
+ 'vendor', 'coverage', '.nyc_output', 'tmp', 'temp',
193
+ ]);
194
+ // 深目录噪声:这些目录即使不在 IGNORE 里,也不递归进去(避免爆炸)
195
+ const SHALLOW_ONLY = new Set([
196
+ 'executions', 'by-route', 'history', 'logs', 'cache',
197
+ ]);
198
+ // Java 项目目录注释映射
199
+ const JAVA_COMMENTS = {
200
+ 'controller': '# 控制器层',
201
+ 'service': '# 服务层',
202
+ 'impl': '# 服务实现类',
203
+ 'mapper': '# MyBatis Mapper 接口',
204
+ 'entity': '# 实体类',
205
+ 'dto': '# 数据传输对象',
206
+ 'vo': '# 视图对象',
207
+ 'config': '# 配置类',
208
+ 'util': '# 工具类',
209
+ 'utils': '# 工具类',
210
+ 'common': '# 公共模块',
211
+ 'exception': '# 异常类',
212
+ 'interceptor': '# 拦截器',
213
+ 'filter': '# 过滤器',
214
+ 'aspect': '# 切面',
215
+ 'resources': '# 配置文件、静态资源',
216
+ 'application.yml': '# 应用配置文件',
217
+ 'application.yaml': '# 应用配置文件',
218
+ 'pom.xml': '# Maven 配置文件',
219
+ 'build.gradle': '# Gradle 配置文件',
220
+ 'README.md': '# 项目说明文档',
221
+ };
222
+ const lines = [];
223
+ const walk = (dir, prefix, depth) => {
224
+ if (depth > maxDepth)
225
+ return;
226
+ let entries = [];
227
+ try {
228
+ entries = readdirSync(dir).filter(e => !IGNORE.has(e));
229
+ }
230
+ catch {
231
+ return;
232
+ }
233
+ // 文件在前,目录在后
234
+ const stats = entries.map(e => {
235
+ try {
236
+ return { name: e, isDir: statSync(join(dir, e)).isDirectory() };
237
+ }
238
+ catch {
239
+ return { name: e, isDir: false };
240
+ }
241
+ });
242
+ const files = stats.filter(s => !s.isDir).map(s => s.name);
243
+ const dirs = stats.filter(s => s.isDir).map(s => s.name);
244
+ const sorted = [...dirs.sort(), ...files.sort()];
245
+ sorted.forEach((name, idx) => {
246
+ const isLast = idx === sorted.length - 1;
247
+ const connector = isLast ? '└── ' : '├── ';
248
+ const childPrefix = isLast ? ' ' : '│ ';
249
+ const fullPath = join(dir, name);
250
+ let isDir = false;
251
+ try {
252
+ isDir = statSync(fullPath).isDirectory();
253
+ }
254
+ catch {
255
+ // ignore
256
+ }
257
+ // 构建行:名称 + 可选注释
258
+ let line = prefix + connector + name + (isDir ? '/' : '');
259
+ if (addComments) {
260
+ const comment = JAVA_COMMENTS[name] || JAVA_COMMENTS[name.toLowerCase()];
261
+ if (comment) {
262
+ // 对齐注释(假设最长路径 60 字符)
263
+ const padding = Math.max(1, 60 - line.length);
264
+ line += ' '.repeat(padding) + comment;
265
+ }
266
+ }
267
+ lines.push(line);
268
+ // 递归条件:是目录 + 未达深度上限 + 不在浅层名单里
269
+ if (isDir && depth < maxDepth && !SHALLOW_ONLY.has(name)) {
270
+ walk(fullPath, prefix + childPrefix, depth + 1);
271
+ }
272
+ });
273
+ };
274
+ // 根目录名:从路径提取真实项目名
275
+ const rootName = projectPath.split('/').filter(Boolean).pop() || 'project';
276
+ lines.push(rootName + '/');
277
+ walk(projectPath, '', 1);
278
+ return lines.join('\n');
279
+ }
280
+ sectionCodingStandards(stack) {
281
+ const isJava = stack.language.some(l => l.startsWith('Java'));
282
+ const isTs = stack.language.includes('TypeScript');
283
+ const lines = ['## 代码规范', ''];
284
+ lines.push('### 命名约定', '');
285
+ if (isJava) {
286
+ lines.push('- 包名:全小写,使用反向域名(`com.company.project.module`)');
287
+ lines.push('- 类名:PascalCase(`UserService`、`OrderController`)');
288
+ lines.push('- 方法名 / 变量名:camelCase(`getUserById`、`orderList`)');
289
+ lines.push('- 常量:UPPER_SNAKE_CASE(`MAX_RETRY_COUNT`)');
290
+ lines.push('- DTO 后缀:`*Request` / `*Response` / `*DTO` / `*VO` 根据团队约定');
291
+ }
292
+ else if (isTs) {
293
+ lines.push('- 文件名:kebab-case(`user-service.ts`)或 camelCase(视团队约定)');
294
+ lines.push('- 类型 / 接口:PascalCase(`interface User`、`type OrderStatus`)');
295
+ lines.push('- 函数 / 变量:camelCase');
296
+ lines.push('- 常量:UPPER_SNAKE_CASE 或 camelCase(不可变配置)');
297
+ }
298
+ else {
299
+ lines.push('- 遵循所在语言生态的官方风格指南');
300
+ }
301
+ lines.push('', '### 代码组织', '');
302
+ lines.push('- 单文件职责单一,超过 300 行考虑拆分');
303
+ lines.push('- 避免循环依赖;模块边界清晰');
304
+ lines.push('- 公共工具函数沉淀到 `utils` / `common`,不重复造轮子');
305
+ lines.push('- **先读再改**:修改已有文件前必须先 Read,理解上下文再编辑');
306
+ lines.push('', '### 注释', '');
307
+ lines.push('- 默认不写注释;仅在"为什么这么做"不明显时补充');
308
+ lines.push('- 不要写"这个函数做什么"(代码本身应该自解释)');
309
+ lines.push('- 禁止遗留 `// TODO` 不跟单号、`// 临时` 不标日期');
310
+ lines.push('', '### 错误处理', '');
311
+ if (isJava) {
312
+ lines.push('- 优先抛出明确的业务异常,不吞异常');
313
+ lines.push('- Controller 层统一异常处理器(`@ControllerAdvice`)');
314
+ lines.push('- 事务边界清晰:`@Transactional` 只标注 Service 层');
315
+ }
316
+ else if (isTs) {
317
+ lines.push('- async/await 配合 try/catch,不要混用 Promise 链');
318
+ lines.push('- 错误类型显式声明,不要 throw 裸字符串');
319
+ lines.push('- 边界层(HTTP handler、消息消费者)必须有统一错误出口');
320
+ }
321
+ else {
322
+ lines.push('- 显式处理每一个错误返回值,不静默吞异常');
323
+ }
324
+ return lines.join('\n');
325
+ }
326
+ sectionCommonPitfalls(stack) {
327
+ const pitfalls = [];
328
+ if (stack.framework.includes('Spring Boot')) {
329
+ pitfalls.push('- **循环依赖**:优先重构为单向依赖,不要用 `@Lazy` 掩盖');
330
+ pitfalls.push('- **配置覆盖**:`application-{profile}.yml` 会覆盖 `application.yml`,排查配置问题时两边都要看');
331
+ pitfalls.push('- **事务失效**:`@Transactional` 同类内部方法调用不生效,需要通过 Spring 代理调用');
332
+ }
333
+ if (stack.framework.includes('MyBatis')) {
334
+ pitfalls.push('- **Mapper XML `#{}` vs `${}`**:`${}` 会导致 SQL 注入,只用于表名 / 列名等元数据');
335
+ pitfalls.push('- **N+1 查询**:使用 `<resultMap>` + `<collection>` 一次 JOIN 获取,避免循环查询');
336
+ }
337
+ if (stack.language.includes('TypeScript')) {
338
+ pitfalls.push('- **类型断言滥用**:`as unknown as T` 通常是设计问题的信号,优先修正类型定义');
339
+ pitfalls.push('- **Promise 未 await**:async 函数返回 Promise,调用方忘记 await 会导致错误被吞');
340
+ }
341
+ if (stack.framework.includes('React')) {
342
+ pitfalls.push('- **useEffect 依赖**:依赖数组遗漏变量会导致闭包陷阱;使用 ESLint `exhaustive-deps` 规则');
343
+ pitfalls.push('- **列表 key**:不要用 index 作为 key,列表重排时会错乱');
344
+ }
345
+ if (stack.language.some(l => l.startsWith('Go'))) {
346
+ pitfalls.push('- **goroutine 泄漏**:启动 goroutine 必须有退出路径(context.Done / channel close)');
347
+ pitfalls.push('- **for 循环变量捕获**:Go 1.21 之前循环变量在 goroutine 里共享,需要局部变量拷贝');
348
+ }
349
+ if (pitfalls.length === 0) {
350
+ pitfalls.push('- 依赖升级前先运行全量测试');
351
+ pitfalls.push('- 修改公共接口前先 grep 所有调用方,评估影响面');
352
+ pitfalls.push('- 禁止在 main 分支直接提交,所有改动走 PR / MR 流程');
353
+ }
354
+ return ['## 常见陷阱', '', ...pitfalls].join('\n');
355
+ }
356
+ sectionContributionGuide(stack) {
357
+ const isJava = stack.language.some(l => l.startsWith('Java'));
358
+ const lines = ['## 贡献指南', ''];
359
+ lines.push('### 分支策略', '');
360
+ lines.push('- `main` / `master`:受保护分支,只接受 PR 合并');
361
+ lines.push('- `feature/<ticket>-<slug>`:新功能开发');
362
+ lines.push('- `fix/<ticket>-<slug>`:Bug 修复');
363
+ lines.push('- `refactor/<scope>`:重构');
364
+ lines.push('', '### 提交信息(Conventional Commits)', '');
365
+ lines.push('```');
366
+ lines.push('<type>(<scope>): <subject>');
367
+ lines.push('');
368
+ lines.push('类型(type):feat / fix / refactor / perf / test / docs / chore / style');
369
+ lines.push('范围(scope):模块或目录名,例如 auth / api / ui');
370
+ lines.push('主题(subject):50 字以内,祈使句,不加句号');
371
+ lines.push('```');
372
+ lines.push('');
373
+ lines.push('示例:`feat(auth): 新增 OAuth2 Google 登录`');
374
+ lines.push('', '### PR / MR 检查清单', '');
375
+ lines.push('- [ ] 通过所有自动化测试');
376
+ if (isJava) {
377
+ lines.push('- [ ] 通过 `mvn verify` / `./gradlew check`');
378
+ }
379
+ else if (stack.language.includes('TypeScript')) {
380
+ lines.push('- [ ] 通过 `npx tsc --noEmit`(类型检查)');
381
+ if (stack.linter)
382
+ lines.push(`- [ ] 通过 ${stack.linter} 检查`);
383
+ }
384
+ lines.push('- [ ] 新增代码有对应测试(除纯文档 / 配置外)');
385
+ lines.push('- [ ] 公共接口变更已更新文档');
386
+ lines.push('- [ ] 无敏感信息(密钥、token、内网地址)');
387
+ lines.push('- [ ] 经过至少一位 reviewer 审核');
388
+ return lines.join('\n');
27
389
  }
28
390
  /**
29
391
  * 写入 CLAUDE.md,保留用户手动编辑的内容
@@ -61,14 +423,17 @@ export class ClaudeMdGenerator {
61
423
  }
62
424
  // ── Private Methods ────────────────────────────────────────────────────
63
425
  buildPrompt(stack, projectPath) {
426
+ const projectName = projectPath.split('/').filter(Boolean).pop() || 'project';
427
+ const isJava = stack.language.some(l => l.startsWith('Java'));
428
+ const realTree = this.scanDirectoryTree(projectPath, isJava ? 4 : 2, isJava);
64
429
  const sections = [
65
- '请为以下项目生成 CLAUDE.md 文件内容,包含以下章节:',
430
+ `请为项目 "${projectName}" 生成 CLAUDE.md 文件内容,包含以下章节:`,
66
431
  '',
67
432
  '1. 项目概述',
68
433
  '2. 技术栈',
69
434
  '3. 开发规范',
70
435
  '4. 构建与测试命令',
71
- '5. 目录结构',
436
+ '5. 目录结构(**必须**直接使用下方给出的真实目录树,不得编造或改名)',
72
437
  '6. 代码风格',
73
438
  '7. 常见陷阱',
74
439
  '8. 贡献指南',
@@ -85,13 +450,266 @@ export class ClaudeMdGenerator {
85
450
  if (stack.linter) {
86
451
  sections.push(`- Linter: ${stack.linter}`);
87
452
  }
88
- sections.push('', '请直接输出 Markdown 内容,不要包含代码块包裹。', '使用中文撰写。每个章节保持简洁,总长度控制在 200 行以内。');
453
+ sections.push('', '## 项目真实目录结构(必须原样使用)', '', '```', realTree, '```', '', '⚠️ 生成"目录结构"章节时,**必须**用上面这个真实目录树,禁止使用 `project-root/`、`com/example/project/` 等占位符。', '', '请直接输出 Markdown 内容,不要包含代码块包裹。', '使用中文撰写。每个章节保持简洁,总长度控制在 200 行以内。');
89
454
  return sections.join('\n');
90
455
  }
456
+ /**
457
+ * 强制替换 AI 输出中的"目录结构"章节为真实扫描结果。
458
+ *
459
+ * AI 经常即使拿到真实目录也会退化成模板(project-root/com/example/project)。
460
+ * 做字符串替换是最稳妥的兜底。
461
+ */
462
+ overrideDirectoryStructure(content, stack, projectPath) {
463
+ const isJava = stack.language.some(l => l.startsWith('Java'));
464
+ const realTree = this.scanDirectoryTree(projectPath, isJava ? 4 : 2, isJava);
465
+ const realSection = ['## 目录结构', '', '```', realTree, '```'].join('\n');
466
+ // 匹配 "## 目录结构" 到下一个 "##" 之前的所有内容
467
+ const pattern = /^##\s+目录结构[\s\S]*?(?=^##\s|\Z)/m;
468
+ if (pattern.test(content)) {
469
+ return content.replace(pattern, realSection + '\n\n');
470
+ }
471
+ // 如果 AI 没生成目录结构章节,追加到末尾
472
+ return content.trimEnd() + '\n\n' + realSection + '\n';
473
+ }
91
474
  merge(generated, userContent) {
92
475
  if (!userContent)
93
476
  return generated;
94
477
  return [generated.trim(), '', '---', '', userContent.trim()].join('\n');
95
478
  }
96
479
  }
480
+ /**
481
+ * Ruflo-style Swarm Protocol — injected into every project's CLAUDE.md
482
+ * so Claude autonomously invokes multi-agent pipelines for complex tasks.
483
+ */
484
+ /**
485
+ * Core behavioral rules — injected into every project's CLAUDE.md.
486
+ * Simplified to ~140 lines for clarity and reduced instruction drift.
487
+ */
488
+ /**
489
+ * Core behavioral rules — injected into every project's CLAUDE.md.
490
+ * Simplified to ~140 lines for clarity and reduced instruction drift.
491
+ */
492
+ const SWARM_PROTOCOL = `# claude-forge 工作区规范
493
+
494
+ ## 自检(每次响应前必读)
495
+
496
+ **在开始任何操作前,先问自己**:
497
+
498
+ 1. 我是否要修改 ≥2 个文件?
499
+ 2. 我是否要修改 ≥10 行代码?
500
+ 3. 这是否是新功能/重构/Bug 修复?
501
+ 4. 我修改的代码所在模块**测试覆盖率 < 50%** 吗?
502
+
503
+ **如果 1-3 任一答案是"是",且我没有 spawn Agent**:
504
+ - ❌ 停下来 → 重新评估例外 → 否则立即 spawn Agent
505
+
506
+ **如果 4 答案是"是"**(改老代码 + 测试薄弱):
507
+ - ❌ 不要 spawn 普通 \`coder\` / \`planner\`
508
+ - ✅ 必须走 **Harness 或 Hybrid 工作流**(详见下方「工作流升级判定」)
509
+
510
+ **违规示例**:
511
+ - "修复 daemon handler bug(改老代码 + 0 测试)" → 应走 \`harness-hotfix\`,不是 \`coder\`
512
+ - "重构 738 行字面量为 .md 文件" → 应走 \`refactor-safe\`,不是 \`coder\`
513
+ - "新功能加在 hook 脚本" → 应走 \`hybrid-feature-with-safety\`,不是 \`planner+coder\`
514
+
515
+ ---
516
+
517
+ ## 核心行为规则
518
+
519
+ - Do what has been asked; nothing more, nothing less
520
+ - NEVER create files unless absolutely necessary
521
+ - ALWAYS prefer editing existing files to creating new ones
522
+ - ALWAYS read a file before editing it
523
+ - Never continuously check status after spawning agents — wait for results
524
+
525
+ ---
526
+
527
+ ## Two-Phase Workflow (BMAD 默认路径)
528
+
529
+ **适用范围**:≥3 文件改动 / 新功能 / 重构 / 架构调整
530
+ **前提**:通过「工作流升级判定」确认为 BMAD 路径(测试覆盖充分 / 全新模块)
531
+ **如果改老代码 + 测试薄弱** → 改走 Harness/Hybrid 三阶段(见下方)
532
+
533
+ ### Phase 1: Generate Spec
534
+
535
+ 1. Spawn planner/researcher agent with \`run_in_background: true\`
536
+ 2. Agent 输出 \`docs/design/[task]-spec-YYYYMMDD-HHMM.md\`,包含:
537
+ - 目标、改动文件清单、关键设计决策、风险点、测试策略
538
+ - **禁止写任何代码**
539
+ 3. 主线程告诉用户"已 spawn planner,等待 spec 生成",**然后结束响应**
540
+
541
+ ### Phase 1.5: User Review (Critical Gate)
542
+
543
+ Agent 完成后,**主线程必须停止并等待用户确认**:
544
+
545
+ \`\`\`
546
+ 设计方案已生成:docs/design/xxx-spec.md
547
+
548
+ 请 review 后回复:
549
+ - "批准" / "approve" → 我会 spawn coder 实现
550
+ - "修改 [意见]" → 我会调整 spec
551
+ - "取消" → 停止任务
552
+ \`\`\`
553
+
554
+ **绝对禁止**:
555
+ - ❌ 主线程自行判断 spec 质量并进入 Phase 2
556
+ - ❌ 主线程直接 spawn coder 而不等用户确认
557
+
558
+ ### Phase 2: Implement per Spec
559
+
560
+ 收到用户"批准"后:
561
+ 1. Spawn coder agent with \`run_in_background: true\`
562
+ 2. 严格按 spec 执行,完成后写 \`docs/implementation/[task]-changelog-YYYYMMDD-HHMM.md\`
563
+
564
+ ### 例外
565
+
566
+ 可跳过两阶段:
567
+ - 单文件 1-2 行修改
568
+ - 用户明确说"不需要 spec"
569
+ - 纯查询/调研任务
570
+
571
+ ---
572
+
573
+ ## Agent 委托规则
574
+
575
+ ### 默认行为:spawn Agent
576
+
577
+ 接到任务时,**第一反应是 spawn Agent**。主线程只做协调。
578
+
579
+ ### 不 spawn 的例外(仅 4 条)
580
+
581
+ 1. **单行 typo**:1 文件 1 行拼写错误
582
+ 2. **协调与汇总**:整合 Agent 结果
583
+ 3. **元任务(极小改动)**:git commit/push、daemon 启停、单行规则调整
584
+ 4. **即时问答**:不涉及代码/文件的纯对话
585
+
586
+ **注意**:
587
+ - 例外 #3 不包括"重构 CLAUDE.md"、"修改多个配置文件"等大改动
588
+ - 如果改动 ≥2 文件或 ≥10 行,必须 spawn Agent
589
+
590
+ ### 强制 spawn 的场景
591
+
592
+ 以下必须 spawn Agent:
593
+ - 查/找/看/列出 → Explore agent
594
+ - 函数分析/代码阅读 → doc-reviewer
595
+ - 单文件 2+ 行修改 → coder
596
+ - 实现/修复/重构/优化 → 对应 agent
597
+
598
+ ### 强制理由声明
599
+
600
+ 每次不 spawn 时,必须在响应开头说明:
601
+
602
+ > 不 spawn 理由:例外 #N [具体原因]
603
+
604
+ ---
605
+
606
+ ## 工作流升级判定(spawn agent 前必查)
607
+
608
+ **默认是 BMAD(planner+coder)**,但满足下表条件**必须升级到 Harness/Hybrid**。
609
+
610
+ ### 判定表
611
+
612
+ | 任务特征 | 推荐 agent | 工作流序列 |
613
+ |---------|-----------|----------|
614
+ | **改老代码 + 模块测试覆盖 < 50%** | \`refactor-safe\` | safety-net → design → implement → test → review |
615
+ | **已知原因的 Bug 修复**(紧急/明确)| \`harness-hotfix\` | safety-net → fix → verify |
616
+ | **未知/偶发 Bug**(需先定位)| \`harness-debug-full\` | reproduce → safety-net → root-cause → fix → verify |
617
+ | **新功能改老代码 + 测试薄弱** | \`hybrid-feature-with-safety\` | safety-net → analyze → design → implement → test → review |
618
+ | **先修 bug 再加功能** | \`hybrid-fix-then-feature\` | reproduce → fix → verify → design → implement → review |
619
+ | **全新模块 / 测试充分**(覆盖 ≥50%)| \`planner\` + \`coder\` | BMAD analyze → design → implement |
620
+ | **纯调研 / 单行 typo / 元任务** | 不 spawn 或 \`Explore\` | — |
621
+
622
+ ### 测试覆盖快速判定
623
+
624
+ 修改 \`src/<module>/\` 前必查:
625
+
626
+ \`\`\`bash
627
+ SRC=$(find src/<module> -name "*.ts" -not -name "*.test.ts" 2>/dev/null | wc -l)
628
+ TST=$(find tests/unit/<module> src/tests -name "*.test.ts" 2>/dev/null | wc -l)
629
+ echo "ratio: $TST / $SRC"
630
+ \`\`\`
631
+
632
+ \`TST/SRC < 50%\` → **触发 Harness safety-net 阶段**(不要直接改代码)
633
+
634
+ ### 项目模块覆盖现状(提醒)
635
+
636
+ | 模块 | 覆盖判定 | 默认走 |
637
+ |------|---------|--------|
638
+ | \`src/daemon/handlers/\` | 部分(≥50%)| BMAD,但 hotfix 类 bug 走 \`harness-hotfix\` |
639
+ | \`src/daemon/services/\` | **零测试** | **Harness/Hybrid 强制** |
640
+ | \`src/core/storage/\` | 高(≥80%)| BMAD |
641
+ | \`src/core/queue/\` | 高(新写时已加)| BMAD |
642
+ | \`src/skills/\` | 中(~40%)| 大改走 \`refactor-safe\` |
643
+ | \`src/web/routes/\` | 中 | BMAD |
644
+ | \`src/hooks/*.sh\` | 0(无 sh 测试)| 改 hook 必走 Hybrid |
645
+ | \`src/claudemd/\` | 低 | \`refactor-safe\` |
646
+
647
+ ### 违规自查
648
+
649
+ 过去 5 次任务全踩坑,请引以为戒:
650
+
651
+ - ❌ "修复 daemon schema 收紧拒收 bug"(改 events.ts + 5 个 hook)→ 走了 \`coder\`,应走 \`harness-hotfix\`
652
+ - ❌ "Official Skills 数据分离"(重构 738 行老代码)→ 走了 \`planner+coder\`,应走 \`refactor-safe\`
653
+ - ❌ "Hook 失败缓冲队列"(新功能 + 改 4 个老 hook)→ 走了 \`planner+coder\`,应走 \`hybrid-feature-with-safety\`
654
+
655
+ **判定时机**:在「自检」之后、「Two-Phase Workflow」之前。判定结果若是 Harness/Hybrid,跳过 Two-Phase,直接 spawn 对应 agent。
656
+
657
+ ---
658
+
659
+ ## 并发规则
660
+
661
+ - All operations MUST be concurrent/parallel in ONE message
662
+ - ALWAYS batch ALL agents in ONE message with \`run_in_background: true\`
663
+ - ALWAYS batch ALL file reads/writes/edits in ONE message
664
+ - ALWAYS batch ALL terminal operations in ONE Bash message
665
+
666
+ ---
667
+
668
+ ## 项目特定信息
669
+
670
+ ### 技术栈
671
+
672
+ - **语言**: TypeScript (Node.js 24+)
673
+ - **数据库**: SQLite (better-sqlite3)
674
+ - **前端**: 原生 HTML + Vanilla JS(单文件 SPA),无打包
675
+ - **测试**: Vitest
676
+
677
+ ### 架构要点
678
+
679
+ **分层**:
680
+ - \`src/cli/\` — CLI 命令
681
+ - \`src/daemon/\` — 后台守护进程(事件处理)
682
+ - \`src/web/\` — Web 仪表盘
683
+ - \`src/core/\` — 共享核心(storage/config/types)
684
+ - \`src/claudemd/\` — CLAUDE.md 生成器
685
+ - \`src/skills/\` — Skill 匹配与注入
686
+
687
+ **存储**:
688
+ - 主库:\`~/.claude-forge/data.db\`
689
+ - 表:sessions, events, tasks, routing_events, skill_invocations, token_usage
690
+
691
+ ### 开发规范
692
+
693
+ **构建与测试**:
694
+ \`\`\`bash
695
+ npm run build # 构建前后端
696
+ npm test # 运行测试
697
+ ./scripts/dev-daemon.sh restart # 重启 daemon
698
+ \`\`\`
699
+
700
+ **守护进程事件推送**:
701
+ - PreToolUse / PostToolUse / UserPromptSubmit / Stop / Notification
702
+ - 通过 Unix socket 推送到 daemon
703
+
704
+ **注意**:
705
+ - daemon 和 CLI 都用系统 node(v26)
706
+ - better-sqlite3 12.10.0 支持 v26
707
+ - 修改 schema 需要手动迁移(无自动 migration)
708
+
709
+ ---
710
+
711
+ ## 上次工作续接
712
+
713
+ (由 daemon 自动更新,记录最近任务上下文)
714
+ `;
97
715
  //# sourceMappingURL=claudemd-generator.js.map