@winspan/claude-forge 8.53.2 → 8.54.3

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 (390) hide show
  1. package/DEVELOPMENT.md +290 -221
  2. package/README.md +50 -8
  3. package/dist/cli/commands/skills.d.ts.map +1 -1
  4. package/dist/cli/commands/skills.js +7 -3
  5. package/dist/cli/commands/skills.js.map +1 -1
  6. package/dist/cli/init/hook-manager.d.ts +1 -1
  7. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  8. package/dist/cli/init/hook-manager.js +1 -0
  9. package/dist/cli/init/hook-manager.js.map +1 -1
  10. package/dist/core/storage/events.d.ts.map +1 -1
  11. package/dist/core/storage/events.js +0 -1
  12. package/dist/core/storage/events.js.map +1 -1
  13. package/dist/core/storage/maintenance.d.ts +25 -3
  14. package/dist/core/storage/maintenance.d.ts.map +1 -1
  15. package/dist/core/storage/maintenance.js +33 -4
  16. package/dist/core/storage/maintenance.js.map +1 -1
  17. package/dist/core/storage/routing.d.ts +4 -0
  18. package/dist/core/storage/routing.d.ts.map +1 -1
  19. package/dist/core/storage/routing.js +10 -4
  20. package/dist/core/storage/routing.js.map +1 -1
  21. package/dist/core/storage/sessions.d.ts +17 -0
  22. package/dist/core/storage/sessions.d.ts.map +1 -1
  23. package/dist/core/storage/sessions.js +64 -0
  24. package/dist/core/storage/sessions.js.map +1 -1
  25. package/dist/core/storage/skills.d.ts +4 -0
  26. package/dist/core/storage/skills.d.ts.map +1 -1
  27. package/dist/core/storage/skills.js +10 -2
  28. package/dist/core/storage/skills.js.map +1 -1
  29. package/dist/core/storage/sqlite.d.ts +5 -0
  30. package/dist/core/storage/sqlite.d.ts.map +1 -1
  31. package/dist/core/storage/sqlite.js +6 -0
  32. package/dist/core/storage/sqlite.js.map +1 -1
  33. package/dist/core/storage/tasks.d.ts.map +1 -1
  34. package/dist/core/storage/tasks.js +2 -0
  35. package/dist/core/storage/tasks.js.map +1 -1
  36. package/dist/core/types.d.ts +7 -0
  37. package/dist/core/types.d.ts.map +1 -1
  38. package/dist/daemon/index.d.ts.map +1 -1
  39. package/dist/daemon/index.js +19 -4
  40. package/dist/daemon/index.js.map +1 -1
  41. package/dist/skills/registry.d.ts.map +1 -1
  42. package/dist/skills/registry.js +13 -2
  43. package/dist/skills/registry.js.map +1 -1
  44. package/dist/skills/semantic-matcher.d.ts +2 -2
  45. package/dist/skills/semantic-matcher.d.ts.map +1 -1
  46. package/dist/skills/semantic-matcher.js +14 -19
  47. package/dist/skills/semantic-matcher.js.map +1 -1
  48. package/dist/skills/upgrade-engine.d.ts +3 -1
  49. package/dist/skills/upgrade-engine.d.ts.map +1 -1
  50. package/dist/skills/upgrade-engine.js +25 -14
  51. package/dist/skills/upgrade-engine.js.map +1 -1
  52. package/dist/web/analytics/weekly-report.d.ts.map +1 -1
  53. package/dist/web/analytics/weekly-report.js +21 -29
  54. package/dist/web/analytics/weekly-report.js.map +1 -1
  55. package/dist/web/routes/patch.d.ts.map +1 -1
  56. package/dist/web/routes/patch.js +32 -2
  57. package/dist/web/routes/patch.js.map +1 -1
  58. package/dist/web/routes/sessions.d.ts.map +1 -1
  59. package/dist/web/routes/sessions.js +9 -7
  60. package/dist/web/routes/sessions.js.map +1 -1
  61. package/dist/web/routes/trace.d.ts.map +1 -1
  62. package/dist/web/routes/trace.js +2 -3
  63. package/dist/web/routes/trace.js.map +1 -1
  64. package/dist/web/server.d.ts.map +1 -1
  65. package/dist/web/server.js +3 -2
  66. package/dist/web/server.js.map +1 -1
  67. package/package.json +12 -2
  68. package/scripts/postinstall.cjs +21 -0
  69. package/.claude/CLAUDE.md +0 -17
  70. package/.eslintrc.js +0 -23
  71. package/.prettierrc +0 -8
  72. package/ARCHITECTURE_ISSUES.md +0 -249
  73. package/CLAUDE.md +0 -265
  74. package/CLAUDE.md.backup +0 -488
  75. package/docs/concurrent-agents.md +0 -129
  76. package/docs/design/architecture-review-20260516.md +0 -232
  77. package/docs/design/fix-skills-data-and-set-leak-spec-20260516-1300.md +0 -219
  78. package/docs/design/h1-storage-aggregation-spec-20260518-1121.md +0 -299
  79. package/docs/design/h2-getdatabase-encapsulation-spec-20260518-1450.md +0 -191
  80. package/docs/design/h3-fallback-removal-spec-20260518-1245.md +0 -76
  81. package/docs/design/h4-index-dedup-spec-20260518-1230.md +0 -109
  82. package/docs/design/h6-services-migration-spec-20260518-1355.md +0 -82
  83. package/docs/design/hook-failure-queue-spec-20260516-1530.md +0 -204
  84. package/docs/design/l1-swarm-protocol-extract-spec-20260518-1605.md +0 -106
  85. package/docs/design/m10-forge-paths-spec-20260518-1320.md +0 -121
  86. package/docs/design/m2-m3-tool-input-spec-20260518-1425.md +0 -131
  87. package/docs/design/m7-routing-event-association-spec-20260518-1545.md +0 -103
  88. package/docs/design/project-path-gitroot-spec-20260518-1715.md +0 -134
  89. package/docs/design/refactor-phase1-spec-20260515-1600.md +0 -543
  90. package/docs/design/refactor-phase2-spec-20260515-1700.md +0 -424
  91. package/docs/design/skill-ai-upgrade-spec-20260518-1930.md +0 -297
  92. package/docs/design/task-active-gc-spec-20260518-1745.md +0 -146
  93. package/docs/design/tasks-list-filter-pagination-spec-20260518-0930.md +0 -208
  94. package/docs/implementation/daemon-skill-sync-changelog-20260518-2000.md +0 -22
  95. package/docs/implementation/fix-skills-data-and-set-leak-changelog-20260516-1300.md +0 -104
  96. package/docs/implementation/h1-storage-aggregation-changelog-20260518-1121.md +0 -82
  97. package/docs/implementation/h2-final-changelog-20260518-1530.md +0 -61
  98. package/docs/implementation/h2-phase1-safety-net-changelog-20260518-1450.md +0 -70
  99. package/docs/implementation/h2-phase2-operations-changelog-20260518-1450.md +0 -120
  100. package/docs/implementation/h2-phase3-callsites-changelog-20260518-1450.md +0 -71
  101. package/docs/implementation/h3-fallback-removal-changelog-20260518-1245.md +0 -71
  102. package/docs/implementation/h4-index-dedup-changelog-20260518-1230.md +0 -60
  103. package/docs/implementation/h6-services-migration-changelog-20260518-1355.md +0 -46
  104. package/docs/implementation/h7-m9-defaults-changelog-20260518-1300.md +0 -46
  105. package/docs/implementation/hook-failure-queue-changelog-20260516-1530.md +0 -196
  106. package/docs/implementation/hotfix-daemon-event-reject-20260516-1430.md +0 -56
  107. package/docs/implementation/l1-swarm-protocol-extract-changelog-20260518-1605.md +0 -45
  108. package/docs/implementation/l3-l4-daemon-perf-changelog-20260518-1410.md +0 -63
  109. package/docs/implementation/l6-l8-final-cleanup-changelog-20260518-1640.md +0 -38
  110. package/docs/implementation/m1-m4-m5-l7-cleanup-changelog-20260518-1310.md +0 -58
  111. package/docs/implementation/m10-forge-paths-changelog-20260518-1320.md +0 -60
  112. package/docs/implementation/m2-m3-tool-input-changelog-20260518-1425.md +0 -43
  113. package/docs/implementation/m6-m8-naming-shutdown-changelog-20260518-1340.md +0 -56
  114. package/docs/implementation/m7-routing-association-changelog-20260518-1545.md +0 -69
  115. package/docs/implementation/project-path-gitroot-changelog-20260518-1715.md +0 -63
  116. package/docs/implementation/refactor-phase1-changelog-20260515-1630.md +0 -354
  117. package/docs/implementation/refactor-phase2-changelog-20260515-1705.md +0 -421
  118. package/docs/implementation/skill-ai-upgrade-changelog-20260518-1930.md +0 -49
  119. package/docs/implementation/task-active-gc-changelog-20260518-1745.md +0 -35
  120. package/docs/implementation/task-title-summary-changelog-20260518-1130.md +0 -39
  121. package/docs/implementation/tasks-detail-back-loses-filters-changelog-20260518-1100.md +0 -22
  122. package/docs/implementation/tasks-list-filter-pagination-changelog-20260518-0930.md +0 -72
  123. package/docs/implementation/tasks-page-white-screen-hotfix-changelog-20260518-1015.md +0 -56
  124. package/docs/reviews/claudemd-template-sync.md +0 -54
  125. package/docs/reviews/task-title-summary.md +0 -92
  126. package/docs/reviews/tasks-detail-back-loses-filters.md +0 -58
  127. package/docs/reviews/tasks-filter-pagination.md +0 -80
  128. package/docs/reviews/tasks-page-white-screen-hotfix.md +0 -126
  129. package/docs/ruflo-learning-strategy.md +0 -322
  130. package/docs/skills-deduplication-analysis.md +0 -83
  131. package/docs/skills-multiformat-support.md +0 -177
  132. package/docs/skills-third-party.md +0 -183
  133. package/docs/testing/tasks-filter-pagination-test-report.md +0 -86
  134. package/forge +0 -321
  135. package/playwright.config.ts +0 -40
  136. package/scripts/demo-v2.ts +0 -91
  137. package/scripts/dev-daemon.sh +0 -232
  138. package/scripts/dev-web.ts +0 -109
  139. package/scripts/e2e-mcp-link.ts +0 -423
  140. package/scripts/e2e-methodology-quality.ts +0 -253
  141. package/scripts/e2e-routing.ts +0 -456
  142. package/scripts/e2e-user-methodology.ts +0 -326
  143. package/scripts/e2e-web-workflows.ts +0 -299
  144. package/scripts/migrate-legacy-to-dynamic.sql +0 -108
  145. package/scripts/regenerate-execution-docs.ts +0 -116
  146. package/scripts/sync-agent-skills.ts +0 -193
  147. package/scripts/test-hook.sh +0 -71
  148. package/scripts/verify-skill-loading.ts +0 -62
  149. package/src/claudemd/claudemd-generator.ts +0 -568
  150. package/src/claudemd/convention-extractor.ts +0 -69
  151. package/src/claudemd/index.ts +0 -35
  152. package/src/claudemd/persona-manager.ts +0 -88
  153. package/src/claudemd/resume-manager.ts +0 -236
  154. package/src/claudemd/tech-detector.ts +0 -220
  155. package/src/claudemd/templates/swarm-protocol.md +0 -222
  156. package/src/cli/commands/claudemd.ts +0 -84
  157. package/src/cli/commands/config.ts +0 -46
  158. package/src/cli/commands/daemon.ts +0 -310
  159. package/src/cli/commands/executions.ts +0 -115
  160. package/src/cli/commands/init.ts +0 -204
  161. package/src/cli/commands/logs.ts +0 -181
  162. package/src/cli/commands/mcp.ts +0 -242
  163. package/src/cli/commands/menu.ts +0 -357
  164. package/src/cli/commands/skills.ts +0 -328
  165. package/src/cli/commands/stats.ts +0 -73
  166. package/src/cli/commands/status.ts +0 -69
  167. package/src/cli/commands/template.ts +0 -77
  168. package/src/cli/commands/trace.ts +0 -148
  169. package/src/cli/index.ts +0 -42
  170. package/src/cli/init/hook-manager.ts +0 -132
  171. package/src/core/ai/provider.ts +0 -308
  172. package/src/core/ai/types.ts +0 -51
  173. package/src/core/config.ts +0 -124
  174. package/src/core/constants.ts +0 -67
  175. package/src/core/event-fields.ts +0 -32
  176. package/src/core/queue/index.ts +0 -192
  177. package/src/core/storage/base.ts +0 -302
  178. package/src/core/storage/events.ts +0 -434
  179. package/src/core/storage/injections.ts +0 -78
  180. package/src/core/storage/maintenance.ts +0 -59
  181. package/src/core/storage/migrations/002_add_skill_tracking.sql +0 -6
  182. package/src/core/storage/migrations/003_add_skill_invocations.sql +0 -23
  183. package/src/core/storage/performance-indexes.sql +0 -23
  184. package/src/core/storage/routing.ts +0 -322
  185. package/src/core/storage/rows.ts +0 -112
  186. package/src/core/storage/schema.sql +0 -224
  187. package/src/core/storage/sessions.ts +0 -168
  188. package/src/core/storage/skills.ts +0 -233
  189. package/src/core/storage/sqlite.ts +0 -293
  190. package/src/core/storage/tasks.ts +0 -318
  191. package/src/core/storage/token-usage.ts +0 -93
  192. package/src/core/types.ts +0 -181
  193. package/src/core/utils/error-handler.ts +0 -257
  194. package/src/core/utils/forge-resume-block.ts +0 -74
  195. package/src/core/utils/format.ts +0 -69
  196. package/src/core/utils/git.ts +0 -23
  197. package/src/core/utils/logger.ts +0 -134
  198. package/src/core/utils/lru-cache.ts +0 -54
  199. package/src/core/utils/path.ts +0 -19
  200. package/src/core/utils/session.ts +0 -26
  201. package/src/core/utils/time.ts +0 -37
  202. package/src/core/utils/token-tracker.ts +0 -97
  203. package/src/daemon/event-parser.ts +0 -36
  204. package/src/daemon/handlers/history-exporter.ts +0 -117
  205. package/src/daemon/handlers/post-tool-use.ts +0 -54
  206. package/src/daemon/handlers/stop.ts +0 -208
  207. package/src/daemon/handlers/user-prompt.ts +0 -178
  208. package/src/daemon/hook-sync.ts +0 -91
  209. package/src/daemon/index.ts +0 -312
  210. package/src/daemon/launchd/com.claude-forge.daemon.plist.template +0 -47
  211. package/src/daemon/launchd-installer.ts +0 -260
  212. package/src/daemon/lifecycle.ts +0 -128
  213. package/src/daemon/router.ts +0 -40
  214. package/src/daemon/server.ts +0 -196
  215. package/src/daemon/services/task-segmenter.ts +0 -112
  216. package/src/daemon/skill-sync.ts +0 -88
  217. package/src/hooks/hook-lib.sh +0 -118
  218. package/src/hooks/notification.sh +0 -35
  219. package/src/hooks/post-tool-use.sh +0 -61
  220. package/src/hooks/pre-tool-use.sh +0 -63
  221. package/src/hooks/stop.sh +0 -43
  222. package/src/hooks/user-prompt-submit.sh +0 -69
  223. package/src/mcp/server.ts +0 -322
  224. package/src/skills/index.ts +0 -2
  225. package/src/skills/invocation-guard.ts +0 -177
  226. package/src/skills/matcher.ts +0 -148
  227. package/src/skills/official/code-simplifier.md +0 -52
  228. package/src/skills/official/find-skills.md +0 -142
  229. package/src/skills/official/official-api-design.md +0 -30
  230. package/src/skills/official/official-architecture-decision.md +0 -41
  231. package/src/skills/official/official-bmad.md +0 -118
  232. package/src/skills/official/official-db-schema-design.md +0 -34
  233. package/src/skills/official/official-debug.md +0 -25
  234. package/src/skills/official/official-doc-driven.md +0 -31
  235. package/src/skills/official/official-harness-engineering.md +0 -108
  236. package/src/skills/official/official-performance-optimization.md +0 -30
  237. package/src/skills/official/official-pr-review.md +0 -35
  238. package/src/skills/official/official-release-checklist.md +0 -30
  239. package/src/skills/official/official-security-hardening.md +0 -32
  240. package/src/skills/official/official-spec-driven-design.md +0 -31
  241. package/src/skills/official/planning-with-files.md +0 -241
  242. package/src/skills/official/ui-ux-pro-max.md +0 -105
  243. package/src/skills/official/webapp-testing.md +0 -96
  244. package/src/skills/official-skills.ts +0 -89
  245. package/src/skills/registry.ts +0 -355
  246. package/src/skills/semantic-matcher.ts +0 -234
  247. package/src/skills/tools/pipeline-suggest.ts +0 -226
  248. package/src/skills/tools/skill-invoke.ts +0 -168
  249. package/src/skills/tools/skill-list.ts +0 -59
  250. package/src/skills/upgrade-engine.ts +0 -541
  251. package/src/skills/upgrade-prompt.ts +0 -84
  252. package/src/templates/go.yaml +0 -53
  253. package/src/templates/python.yaml +0 -59
  254. package/src/templates/react.yaml +0 -55
  255. package/src/templates/template-manager.ts +0 -170
  256. package/src/web/analytics/anti-pattern-detector.ts +0 -367
  257. package/src/web/analytics/drift-detector.ts +0 -219
  258. package/src/web/analytics/weekly-report.ts +0 -431
  259. package/src/web/auth-middleware.ts +0 -54
  260. package/src/web/routes/_helpers.ts +0 -34
  261. package/src/web/routes/ai.ts +0 -204
  262. package/src/web/routes/auth.ts +0 -22
  263. package/src/web/routes/drift.ts +0 -25
  264. package/src/web/routes/error-handler.ts +0 -120
  265. package/src/web/routes/events.ts +0 -47
  266. package/src/web/routes/insights.ts +0 -43
  267. package/src/web/routes/patch.ts +0 -117
  268. package/src/web/routes/reports.ts +0 -34
  269. package/src/web/routes/rules.ts +0 -76
  270. package/src/web/routes/sessions.ts +0 -250
  271. package/src/web/routes/skill-stats.ts +0 -92
  272. package/src/web/routes/skills.ts +0 -350
  273. package/src/web/routes/static.ts +0 -67
  274. package/src/web/routes/stats.ts +0 -50
  275. package/src/web/routes/status.ts +0 -30
  276. package/src/web/routes/tasks.ts +0 -193
  277. package/src/web/routes/token-usage.ts +0 -20
  278. package/src/web/routes/trace.ts +0 -126
  279. package/src/web/routes/types.ts +0 -57
  280. package/src/web/server.ts +0 -134
  281. package/src/web/ssrf-guard.ts +0 -112
  282. package/src/web/static/index.html +0 -3251
  283. package/src/web/static/vendor/chart.umd.min.js +0 -20
  284. package/tests/e2e/dashboard.spec.ts +0 -205
  285. package/tests/e2e/routing-skill-e2e.test.ts +0 -39
  286. package/tests/helpers/mock-ai.ts +0 -92
  287. package/tests/helpers/mock-storage.ts +0 -159
  288. package/tests/integration/claudemd-generator.test.ts +0 -90
  289. package/tests/integration/queue-replay.integration.test.ts +0 -193
  290. package/tests/integration/tasks-filter.integration.test.ts +0 -154
  291. package/tests/integration/web-analytics.integration.test.ts +0 -133
  292. package/tests/integration/web-stats.integration.test.ts +0 -135
  293. package/tests/integration/web-trace.integration.test.ts +0 -175
  294. package/tests/performance/database.benchmark.ts +0 -161
  295. package/tests/semantic-matcher.test.ts +0 -99
  296. package/tests/skill-matcher.test.ts +0 -110
  297. package/tests/unit/ai-provider-retry.test.ts +0 -194
  298. package/tests/unit/ai-provider-vision.test.ts +0 -224
  299. package/tests/unit/claudemd-generator.test.ts +0 -68
  300. package/tests/unit/cli-mcp.test.ts +0 -141
  301. package/tests/unit/core/forge-paths.test.ts +0 -99
  302. package/tests/unit/daemon/hook-sync.test.ts +0 -71
  303. package/tests/unit/daemon/post-tool-use.test.ts +0 -121
  304. package/tests/unit/daemon/skill-sync.test.ts +0 -75
  305. package/tests/unit/daemon/stop-handler-behavior-summary.test.ts +0 -202
  306. package/tests/unit/daemon/task-segmenter-recover.test.ts +0 -84
  307. package/tests/unit/event-fields.test.ts +0 -88
  308. package/tests/unit/event-parser.test.ts +0 -55
  309. package/tests/unit/handlers.test.ts +0 -171
  310. package/tests/unit/hooks/resolve-project-path.test.ts +0 -122
  311. package/tests/unit/invocation-guard.test.ts +0 -125
  312. package/tests/unit/queue.test.ts +0 -272
  313. package/tests/unit/router.test.ts +0 -138
  314. package/tests/unit/security.test.ts +0 -128
  315. package/tests/unit/skill-invocations-workflow.test.ts +0 -495
  316. package/tests/unit/skill-registry.test.ts +0 -94
  317. package/tests/unit/skills/invocation-guard-ttl.test.ts +0 -211
  318. package/tests/unit/skills/official-skills-loader.test.ts +0 -126
  319. package/tests/unit/skills/registry-multiformat.test.ts +0 -92
  320. package/tests/unit/skills/upgrade-engine-parse.test.ts +0 -138
  321. package/tests/unit/skills/upgrade-engine.test.ts +0 -401
  322. package/tests/unit/skills/upgrade-prompt.test.ts +0 -89
  323. package/tests/unit/socket-server.test.ts +0 -183
  324. package/tests/unit/storage/event-operations-aggregates.test.ts +0 -342
  325. package/tests/unit/storage/migration-idempotent.test.ts +0 -304
  326. package/tests/unit/storage/routing-aggregates.test.ts +0 -276
  327. package/tests/unit/storage/routing.test.ts +0 -117
  328. package/tests/unit/storage/schema-missing.test.ts +0 -81
  329. package/tests/unit/storage/session-operations-aggregates.test.ts +0 -120
  330. package/tests/unit/storage/sessions-aggregate.test.ts +0 -435
  331. package/tests/unit/storage/skill-operations-counts.test.ts +0 -106
  332. package/tests/unit/storage/skills-aggregates.test.ts +0 -104
  333. package/tests/unit/storage/sqlite-refactor-harness.test.ts +0 -314
  334. package/tests/unit/storage/task-operations-counts.test.ts +0 -46
  335. package/tests/unit/storage/tasks-getById.test.ts +0 -343
  336. package/tests/unit/storage/tasks-stale-gc.test.ts +0 -86
  337. package/tests/unit/storage.test.ts +0 -172
  338. package/tests/unit/token-usage.test.ts +0 -144
  339. package/tests/unit/type-guards.test.ts +0 -201
  340. package/tests/unit/utils/format.test.ts +0 -189
  341. package/tests/unit/utils/session.test.ts +0 -89
  342. package/tests/unit/utils/time.test.ts +0 -112
  343. package/tests/unit/web/navigation-back-contract.test.ts +0 -134
  344. package/tests/unit/web/routes-auth.test.ts +0 -93
  345. package/tests/unit/web/routes-events.test.ts +0 -101
  346. package/tests/unit/web/routes-rules.test.ts +0 -182
  347. package/tests/unit/web/routes-sessions.test.ts +0 -181
  348. package/tests/unit/web/routes-skill-stats.test.ts +0 -179
  349. package/tests/unit/web/routes-stats.test.ts +0 -92
  350. package/tests/unit/web/routes-tasks.test.ts +0 -385
  351. package/tests/unit/web/task-title-contract.test.ts +0 -210
  352. package/tests/unit/web/tasks-component-contract.test.ts +0 -179
  353. package/tsconfig.json +0 -22
  354. package/vitest.config.ts +0 -21
  355. package/vitest.integration.config.ts +0 -16
  356. package/web/CLAUDE.md +0 -20
  357. package/web/index.html +0 -13
  358. package/web/package-lock.json +0 -4854
  359. package/web/package.json +0 -35
  360. package/web/postcss.config.js +0 -6
  361. package/web/src/App.tsx +0 -110
  362. package/web/src/components/CodeBlock.tsx +0 -31
  363. package/web/src/components/Confirm.tsx +0 -96
  364. package/web/src/components/Drawer.tsx +0 -60
  365. package/web/src/components/Layout.tsx +0 -145
  366. package/web/src/components/MarkdownRenderer.tsx +0 -77
  367. package/web/src/components/SearchInput.tsx +0 -31
  368. package/web/src/components/SessionDetailContent.tsx +0 -157
  369. package/web/src/components/Toast.tsx +0 -92
  370. package/web/src/index.css +0 -19
  371. package/web/src/main.tsx +0 -31
  372. package/web/src/pages/AIConfig.tsx +0 -233
  373. package/web/src/pages/Dashboard.tsx +0 -572
  374. package/web/src/pages/Events.tsx +0 -271
  375. package/web/src/pages/Reports.tsx +0 -428
  376. package/web/src/pages/SessionDetail.tsx +0 -162
  377. package/web/src/pages/Sessions.tsx +0 -205
  378. package/web/src/pages/Skills.tsx +0 -180
  379. package/web/src/pages/TaskDetail.tsx +0 -515
  380. package/web/src/pages/Tasks.tsx +0 -415
  381. package/web/src/utils/auth.ts +0 -59
  382. package/web/src/utils/export.ts +0 -54
  383. package/web/src/utils/navigation.ts +0 -25
  384. package/web/src/utils/task-title.ts +0 -49
  385. package/web/src/utils/time.ts +0 -13
  386. package/web/tailwind.config.js +0 -11
  387. package/web/tsconfig.json +0 -21
  388. package/web/tsconfig.node.json +0 -10
  389. package/web/vite.config.ts +0 -76
  390. package/winspan-claude-forge-8.43.0.tgz +0 -0
@@ -1,232 +0,0 @@
1
- # claude-forge 架构评审报告
2
-
3
- 生成时间:2026-05-16
4
-
5
- ## 一、当前架构概览
6
-
7
- ### 1.1 分层架构
8
-
9
- ```
10
- claude-forge/
11
- ├── src/
12
- │ ├── cli/ # CLI 命令层(用户交互入口)
13
- │ ├── daemon/ # 守护进程层(事件处理、生命周期管理)
14
- │ ├── web/ # Web API 层(Express + React Dashboard)
15
- │ ├── mcp/ # MCP 协议层(Model Context Protocol)
16
- │ ├── core/ # 核心共享层(storage、config、types、ai)
17
- │ ├── skills/ # Skill 匹配与注入层
18
- │ ├── claudemd/ # CLAUDE.md 生成器
19
- │ └── templates/ # 模板管理
20
- ├── tests/
21
- │ └── integration/ # 集成测试(28 个测试文件)
22
- └── web/ # React 前端源码
23
- ```
24
-
25
- ### 1.2 核心依赖关系
26
-
27
- ```
28
- ┌─────────────────────────────────────┐
29
- │ CLI (用户入口) │
30
- └──────────────┬──────────────────────┘
31
-
32
- ┌───────┴────────┐
33
- ▼ ▼
34
- ┌──────────────┐ ┌──────────────┐
35
- │ Daemon │ │ Web │
36
- │ (事件处理) │ │ (API/UI) │
37
- └──────┬───────┘ └──────┬───────┘
38
- │ │
39
- └────────┬────────┘
40
-
41
- ┌───────────────┐
42
- │ Core │
43
- │ (storage/ai) │
44
- └───────┬───────┘
45
-
46
- ┌───────┴────────┐
47
- ▼ ▼
48
- ┌──────────┐ ┌──────────┐
49
- │ Skills │ │ CLAUDEmd │
50
- │ (匹配器) │ │ (生成器) │
51
- └──────────┘ └──────────┘
52
- ```
53
-
54
- ### 1.3 数据流
55
-
56
- ```
57
- Claude Code Hook
58
- ↓ (Unix Socket)
59
- Daemon Server (router.ts)
60
-
61
- Event Handlers (user-prompt.ts / post-tool-use.ts / stop.ts)
62
-
63
- Storage (SQLite) + Services (TaskSegmenter / ResumeManager / SkillRegistry)
64
-
65
- Injection (systemMessage / additionalContext)
66
-
67
- Claude Code (返回给 AI)
68
- ```
69
-
70
- ## 二、发现的问题
71
-
72
- ### 2.1 严重问题(P0)
73
-
74
- **无严重架构问题**
75
-
76
- 当前架构清晰,分层合理,依赖方向正确(单向依赖 core)。
77
-
78
- ### 2.2 中等问题(P1)
79
-
80
- #### 问题 1:单元测试缺失
81
-
82
- - **现状**:`src/` 目录下 0 个单元测试,仅 `tests/integration/` 有 28 个集成测试
83
- - **影响**:重构风险高,无法快速验证单个模块的正确性
84
- - **位置**:所有 `src/**/*.ts` 文件
85
- - **建议**:为 core 层(storage/utils/types)补充单元测试
86
-
87
- #### 问题 2:Web 层路由文件过多
88
-
89
- - **现状**:`src/web/routes/` 下有 15+ 个路由文件
90
- - **影响**:维护成本高,每个功能一个文件略显碎片化
91
- - **位置**:`src/web/routes/`
92
- - **建议**:考虑按功能域合并(如 stats + skill-stats + reports + insights 合并为 analytics 路由)
93
-
94
- ### 2.3 轻微问题(P2)
95
-
96
- #### 问题 3:Daemon 主文件职责过多
97
-
98
- - **现状**:`src/daemon/index.ts` 包含初始化、生命周期、事件处理、维护任务等多个职责
99
- - **影响**:文件较长(250 行),职责边界不够清晰
100
- - **位置**:`src/daemon/index.ts`
101
- - **建议**:将维护任务(maintenance interval)抽取为独立模块
102
-
103
- #### 问题 4:Storage 层已重构但缺乏文档
104
-
105
- - **现状**:`sqlite.ts` 已从 1000+ 行单文件拆分为 9 个 Operations 类,但重构文档缺失
106
- - **影响**:新开发者可能不清楚如何添加新的存储操作
107
- - **位置**:`src/core/storage/`
108
- - **建议**:添加 `README.md` 说明存储层架构和扩展方式
109
-
110
- #### 问题 5:类型系统可以更严格
111
-
112
- - **现状**:`ForgeEvent` 使用可选字段(`tool_name?`),需要运行时检查
113
- - **影响**:类型安全性略低,需要 type guard 保护
114
- - **位置**:`src/core/types.ts`
115
- - **建议**:当前已通过 `ForgeEventNarrow` 联合类型解决,无需进一步优化
116
-
117
- ## 三、重构必要性评估
118
-
119
- ### 评估结论:**建议优化,无需大规模重构**
120
-
121
- ### 理由
122
-
123
- 1. **架构健康度高**
124
- - 分层清晰(CLI / Daemon / Web / Core)
125
- - 依赖方向正确(单向依赖 core)
126
- - 模块边界明确(storage / skills / claudemd)
127
-
128
- 2. **已有重构基础良好**
129
- - Storage 层已完成职责拆分(9 个 Operations 类)
130
- - 类型系统已优化(ForgeEvent → ForgeEventNarrow)
131
- - 命名规范已统一(kebab-case 文件名)
132
-
133
- 3. **主要问题是测试覆盖不足**
134
- - 缺少单元测试是新功能的最大风险
135
- - 但不需要架构重构,只需补充测试
136
-
137
- ### 如果要重构,优先级排序
138
-
139
- 1. **P1:补充单元测试**(提升重构信心)
140
- - 范围:core/storage, core/utils, daemon/handlers
141
- - 工作量:中等(约 2-3 周)
142
- - 风险:低(不改变现有代码)
143
-
144
- 2. **P2:合并 Web 路由**(降低维护成本)
145
- - 范围:stats + skill-stats + reports + insights → analytics
146
- - 工作量:小(约 2-3 天)
147
- - 风险:低(仅文件合并)
148
-
149
- 3. **P3:抽取 Daemon 维护任务**(职责分离)
150
- - 范围:daemon/index.ts 中的 maintenance interval
151
- - 工作量:极小(约 1 天)
152
- - 风险:极低(纯重构)
153
-
154
- ## 四、升维优化方向(如果决定重构)
155
-
156
- ### 方向 1:事件驱动架构升级
157
-
158
- **目标**:将当前同步事件处理改为异步消息队列
159
-
160
- **收益**:
161
- - 提升吞吐量(高并发场景)
162
- - 支持事件重放和恢复
163
- - 解耦事件生产者和消费者
164
-
165
- **代价**:
166
- - 引入消息队列(如 BullMQ)
167
- - 架构复杂度上升
168
- - 需要处理消息幂等性
169
-
170
- **适用场景**:单机事件量 > 10万/天
171
-
172
- ### 方向 2:插件化架构
173
-
174
- **目标**:将 Skills、CLAUDE.md、Handlers 都设计为可插拔插件
175
-
176
- **收益**:
177
- - 用户可自定义扩展(如自定义 Handler)
178
- - 核心代码更稳定
179
- - 便于社区贡献
180
-
181
- **代价**:
182
- - 需要设计插件 API
183
- - 插件版本管理复杂
184
- - 文档负担增加
185
-
186
- **适用场景**:用户有自定义扩展需求
187
-
188
- ### 方向 3:多租户隔离
189
-
190
- **目标**:支持多项目隔离存储和配置
191
-
192
- **收益**:
193
- - 支持团队协作场景
194
- - 数据隔离更安全
195
- - 可支持 SaaS 模式
196
-
197
- **代价**:
198
- - 数据库 schema 需要调整
199
- - 权限控制复杂度上升
200
- - 需要租户管理功能
201
-
202
- **适用场景**:企业级团队使用
203
-
204
- ## 五、建议
205
-
206
- ### 短期建议(1-2 个月)
207
-
208
- 1. **补充单元测试**:优先为 core/storage 和 daemon/handlers 添加测试
209
- 2. **添加存储层文档**:在 `src/core/storage/README.md` 说明架构
210
- 3. **合并 Web 路由**:将相关路由文件合并(analytics 相关)
211
-
212
- ### 中期建议(3-6 个月)
213
-
214
- 1. **评估事件驱动升级**:如果事件量增长,考虑引入消息队列
215
- 2. **插件化设计调研**:如果用户有自定义需求,启动插件 API 设计
216
-
217
- ### 长期建议(6-12 个月)
218
-
219
- 1. **多租户支持**:如果转向企业级产品,启动多租户架构设计
220
-
221
- ## 六、总结
222
-
223
- **当前架构评级:B+(良好)**
224
-
225
- - ✅ 分层清晰,依赖方向正确
226
- - ✅ 已完成部分重构(Storage 层拆分)
227
- - ⚠️ 单元测试缺失,重构风险较高
228
- - ⚠️ Web 路由略碎片化
229
-
230
- **核心建议:补充测试 > 小范围优化 > 大规模重构**
231
-
232
- 当前架构足够支撑业务发展,优先补充测试覆盖,无需立即进行大规模重构。
@@ -1,219 +0,0 @@
1
- # Fix Spec: Official Skills 数据分离 + UserPromptHandler Set 内存泄漏
2
-
3
- **日期**: 2026-05-16
4
- **状态**: Draft(待用户 review)
5
-
6
- ---
7
-
8
- ## 一、目标
9
-
10
- | # | 修复点 | 成功标准 |
11
- |---|--------|---------|
12
- | 1 | Official Skills 数据/代码分离 | `official-skills.ts` 不再包含任何 skill 内容字符串;新增 `.md` 文件可被 `tsc` + `npm pack` 正确带入 `dist/` |
13
- | 2 | UserPromptHandler 无界 Set 内存泄漏 | `resumeInjected` / `conventionInjected` Set 在 session 结束后被清理,或存在 LRU 上限,daemon 长期运行不会无限增长 |
14
-
15
- ---
16
-
17
- ## 二、调研结论摘要
18
-
19
- ### 修复点 1 — 现状数据结构
20
-
21
- `OfficialSkill` 接口(`src/skills/official-skills.ts:6-12`)有 5 个字段:
22
-
23
- | 字段 | 类型 | 说明 |
24
- |------|------|------|
25
- | `name` | `string` | skill id,如 `official-tdd` |
26
- | `version` | `string` | 版本号,如 `1.2.0` |
27
- | `description` | `string` | 一句话描述 |
28
- | `keywords` | `string[]` | 关键词(部分 skill 有扩展 keywords 在 `OFFICIAL_SKILL_KEYWORDS` 里) |
29
- | `content` | `string` | 完整 `.md` 文本,包含 frontmatter |
30
-
31
- 共 19 个 skill(OFFICIAL_SKILLS 数组) + 1 个关键词映射表 `OFFICIAL_SKILL_KEYWORDS`(19 条)。
32
- `content` 字段本身已是 frontmatter+body 的完整 markdown,说明 skill 文件可直接拆分为独立 `.md`。
33
-
34
- ### 修复点 1 — npm 发布打包现状
35
-
36
- `package.json` 无 `files` 字段,默认发布全部未被 `.gitignore` 的文件。
37
- `build` 脚本(`package.json:13`)仅用 `tsc` 编译 `src/**/*.ts` 到 `dist/`,静态文件靠 `cp` 显式拷贝(`schema.sql`、`hooks/*.sh`、`launchd/*.template`)。
38
- **关键结论**:`.md` 数据文件不在 `tsc` 编译范围内,**需要在 build 脚本中加 `cp` 命令**,否则 `dist/` 运行时找不到文件。
39
-
40
- ### 修复点 1 — registry 加载逻辑
41
-
42
- `SkillRegistry.scan()`(`src/skills/registry.ts:49-133`)分两段:
43
- 1. 先循环 `OFFICIAL_SKILLS` 数组,直接写入 Map(无文件读取)
44
- 2. 再扫 `~/.claude/skills/*.md`,用 `gray-matter` 解析
45
-
46
- 改造后只需把第 1 段改为扫内置目录的 `.md`,解析逻辑与第 2 段完全一致。
47
-
48
- ### 修复点 2 — Set 的语义
49
-
50
- 两个 Set 均以 `${session_id}:${project_path}` 为 key,目的是**每个 session 只注入一次 resume/convention**。
51
-
52
- `InvocationGuard` 的参考方案(`src/skills/invocation-guard.ts`):
53
- - 用 `Map<sessionId, SessionInvocations>` 存状态
54
- - 有 TTL(30 min)+ 5 min 定时清理
55
- - StopHandler 显式调用 `guard.clear(sessionId)`(`src/daemon/handlers/stop.ts:61-65`)
56
-
57
- 两种修复方案对比:
58
-
59
- | | 方案 A:StopHandler 清理 | 方案 B:TTL + 定时清理 |
60
- |-|---|---|
61
- | 原理 | Stop 事件时从 Set 删除对应 key | 用 `Map<key, {timestamp}>` 替换 Set,定期扫描过期 |
62
- | 实现复杂度 | 低(3-5 行)| 中(需改 Set 为 Map + 定时器)|
63
- | 覆盖范围 | 正常关闭的 session | 还能覆盖 crash/无 Stop 事件的情况 |
64
- | 与现有代码一致性 | 与 InvocationGuard.clear() 模式完全一致 | 需引入新依赖模式 |
65
- | 内存界限保证 | 依赖 Stop 事件的完整性 | 绝对有界 |
66
-
67
- **结论**:采用 **方案 A(StopHandler 清理)为主 + 方案 B LRU 上限 1000 为兜底**,两者互补。
68
-
69
- ---
70
-
71
- ## 三、改动文件清单
72
-
73
- ### 修复点 1
74
-
75
- | 文件路径 | 改动类型 | 改动概述 |
76
- |----------|----------|---------|
77
- | `src/skills/official/*.md` | **新建 19 个文件** | 每个 skill 对应一个 `.md`,内容为现有 `content` 字段(已含 frontmatter);skill `name` 和 `version` 在 frontmatter 中保留 |
78
- | `src/skills/official-skills.ts` | **大幅削减** | 删除 `OFFICIAL_SKILLS` 数组全部 skill 字面量;保留 `OFFICIAL_SKILL_KEYWORDS` 常量和 `OfficialSkill` 接口(供类型引用);新增导出函数 `loadOfficialSkills(builtinDir: string): OfficialSkill[]` |
79
- | `src/skills/registry.ts` | **修改** | `scan()` 第 1 段改为调用 `loadOfficialSkills(resolveBuiltinDir())`;新增私有方法 `resolveBuiltinDir()` 解析 `import.meta.url` 相对路径(兼容 npm 安装和开发环境)|
80
- | `package.json` | **修改** | `build` 脚本末尾追加 `mkdir -p dist/skills/official && cp src/skills/official/*.md dist/skills/official/` |
81
- | `tests/unit/skill-registry.test.ts` | **修改** | 调整 skill 数量断言(现在硬编码 `>= 16`,改为 `>= 19` 或使用动态读取数量)|
82
-
83
- ### 修复点 2
84
-
85
- | 文件路径 | 改动类型 | 改动概述 |
86
- |----------|----------|---------|
87
- | `src/daemon/handlers/user-prompt.ts` | **修改** | 将两个 `Set<string>` 改为 `Map<string, number>`(值存写入时间戳);新增 `clearSession(sessionKey: string)` 公共方法;新增静态常量 `MAX_INJECTION_KEYS = 1000` 作为 LRU 上限兜底 |
88
- | `src/daemon/handlers/stop.ts` | **修改** | 在 Step 4(InvocationGuard 清理)之后,增加 Step 5:调用 `userPromptHandler.clearSession(sessionKey)` |
89
- | `src/daemon/index.ts` 或 handler 初始化处 | **修改**(视注入方式) | 确保 `StopHandler` 持有 `UserPromptHandler` 的引用,或通过事件总线传递 |
90
- | `tests/unit/handlers.test.ts` | **修改** | 新增 case:同一 session 两次调用只注入一次;stop 后再次调用会重新注入 |
91
-
92
- ---
93
-
94
- ## 四、关键设计决策
95
-
96
- ### 修复点 1
97
-
98
- **决策 1-A:每个 skill 一个 `.md` 文件,不拆 json+md**
99
-
100
- 理由:`content` 字段本身已是 frontmatter+markdown 格式,直接拆分零转换成本。独立文件对 diff 友好,增删 skill 只需增删一个文件。避免引入额外的索引文件维护负担。
101
-
102
- **决策 1-B:文件放在 `src/skills/official/` 而非 `data/official-skills/`**
103
-
104
- 理由:与其他 skill 相关代码同目录,减少跨目录路径解析复杂度。`tsc` 的 `rootDir` 是 `src/`,`outDir` 是 `dist/`,拷贝路径天然对应 `dist/skills/official/`,逻辑清晰。
105
-
106
- **决策 1-C:`loadOfficialSkills` 接收 `builtinDir` 参数而非硬编码 `__dirname`**
107
-
108
- 理由:便于单元测试(可传入临时目录)。`registry.ts` 中统一用 `resolveBuiltinDir()` 计算路径,该函数用 `import.meta.url` 解析(ESM 环境),兼容 npm 全局安装后路径变更的场景(参考 `feedback_npm_path.md` 记录的教训)。
109
-
110
- ### 修复点 2
111
-
112
- **决策 2-A:采用方案 A(Stop 清理)+ 方案 B(LRU 上限 1000)双保险**
113
-
114
- 理由:方案 A 是精确清理,与 InvocationGuard 模式一致,代码可读性强;方案 B 兜底 crash/无 Stop 场景。上限 1000 entry 约占内存 < 100KB(每个 key 约 80 bytes),完全可接受。
115
-
116
- **决策 2-B:将 Set 改为 `Map<string, number>`(保存 timestamp),不引入 TTL 定时器**
117
-
118
- 理由:timestamp 用于 LRU 淘汰,在 `add` 时若超过 1000 条则删最旧的一条。不需要独立定时器(依赖 Stop 清理 + 容量上限已足够),避免增加守护进程复杂度。
119
-
120
- **决策 2-C:新增 `clearSession(sessionKey)` 为 public 方法,不通过构造函数注入 StopHandler**
121
-
122
- 理由:`UserPromptHandler` 不应依赖 `StopHandler`,应由 `StopHandler` 持有 `UserPromptHandler` 的引用(单向依赖)。在 daemon 初始化时将 `UserPromptHandler` 实例传入 `StopHandler` 构造函数(或 setter)。
123
-
124
- ---
125
-
126
- ## 五、风险点
127
-
128
- | 风险 | 影响 | 缓解措施 |
129
- |------|------|---------|
130
- | **npm 发布后找不到 `.md` 文件** | 运行时加载 0 个 official skill,功能退化 | build 脚本加 `cp`;发布前验证 `dist/skills/official/` 目录存在(可加 `prebuild` 检查) |
131
- | **`import.meta.url` 路径解析在 CJS 降级时失效** | N/A(项目是纯 ESM,`"type": "module"`)| 无需处理 |
132
- | **`StopHandler` 持有 `UserPromptHandler` 引用导致循环依赖** | 编译报错 | 检查依赖链:`user-prompt.ts` 不 import `stop.ts`,反向持有安全 |
133
- | **同 `session_id` 不同 `project_path` 切换**(同一 session key 不同 project)| 理论上 session_id 全局唯一,不会出现此情况 | 无需处理 |
134
- | **官方 skill 版本管理** | 拆成独立文件后版本号散落各 `.md` frontmatter,不易整体更新 | 可在 `OFFICIAL_SKILL_KEYWORDS` 常量旁维护一个 `OFFICIAL_SKILL_VERSIONS` 对象供版本检查(可选,Phase 2 再做)|
135
- | **测试中 skill 数量硬编码** | 修复点 1 后 skill 数量变为 19,现有断言 `>= 16` 可能需要调整 | 改动时同步更新 `tests/unit/skill-registry.test.ts` 断言 |
136
-
137
- ---
138
-
139
- ## 六、测试策略
140
-
141
- ### 修复点 1
142
-
143
- | 测试文件 | 测试内容 |
144
- |----------|---------|
145
- | `tests/unit/skill-registry.test.ts` | 修改:`skills.length >= 19`;新增:`official-tdd` 等具体 skill 可被加载;`path !== '<built-in>'`(改为真实文件路径) |
146
- | 新建 `tests/unit/skills/official-skills-loader.test.ts` | 验证 `loadOfficialSkills(tempDir)` 从指定目录读取所有 `.md`;验证 frontmatter 解析正确(name、version、description、keywords);验证目录不存在时抛出有意义的错误 |
147
- | `tests/unit/skills/registry-multiformat.test.ts` | 现有测试保持不变(测试 gray-matter 解析逻辑,与文件位置无关)|
148
-
149
- ### 修复点 2
150
-
151
- | 测试文件 | 测试内容 |
152
- |----------|---------|
153
- | `tests/unit/handlers.test.ts` | 新增:同一 session 第二次调用 `handle()` 不重复注入 resume/convention;新增:`clearSession()` 后再次调用会重新注入;新增:超过 1000 个不同 sessionKey 后不崩溃(LRU 上限生效) |
154
- | `tests/unit/invocation-guard.test.ts` | 参考现有结构确认模式一致性,无需改动 |
155
-
156
- ---
157
-
158
- ## 七、执行步骤(自底向上)
159
-
160
- ```
161
- 修复点 1:官方 Skills 数据分离
162
- ──────────────────────────────
163
- Step 1 从 official-skills.ts 提取每个 skill 的 content 字段,
164
- 在 src/skills/official/ 下创建对应 .md 文件(19 个)
165
- 文件名 = skill.name + '.md'(如 official-tdd.md)
166
- 内容 = content 字段原文(已含 frontmatter)
167
-
168
- Step 2 在 src/skills/official-skills.ts 中:
169
- - 删除 OFFICIAL_SKILLS 数组(整个 export const OFFICIAL_SKILLS)
170
- - 保留 OfficialSkill interface
171
- - 保留 OFFICIAL_SKILL_KEYWORDS 常量
172
- - 新增 loadOfficialSkills(builtinDir: string): OfficialSkill[] 函数
173
- (用 fs.readdirSync + gray-matter 解析,与 registry 现有 user skill 逻辑对齐)
174
-
175
- Step 3 修改 src/skills/registry.ts:
176
- - 新增私有方法 resolveBuiltinDir(): string
177
- 使用 new URL('./official', import.meta.url).pathname
178
- - scan() 第 1 段改为调用 loadOfficialSkills(this.resolveBuiltinDir())
179
- - 其余逻辑不变
180
-
181
- Step 4 修改 package.json build 脚本:
182
- 末尾追加 && mkdir -p dist/skills/official && cp src/skills/official/*.md dist/skills/official/
183
-
184
- Step 5 修改 tests/unit/skill-registry.test.ts 断言数量
185
-
186
- Step 6 新建 tests/unit/skills/official-skills-loader.test.ts
187
-
188
- Step 7 运行测试验证:
189
- npx vitest run tests/unit/skill-registry.test.ts --reporter=verbose
190
- npx vitest run tests/unit/skills/ --reporter=verbose
191
- npx tsc --noEmit
192
-
193
- 修复点 2:UserPromptHandler Set 内存泄漏
194
- ─────────────────────────────────────────
195
- Step 8 修改 src/daemon/handlers/user-prompt.ts:
196
- - 将 resumeInjected: Set<string> 改为 Map<string, number>
197
- - 将 conventionInjected: Set<string> 改为 Map<string, number>
198
- - 新增常量 MAX_INJECTION_KEYS = 1000
199
- - 封装私有方法 hasInjected(map, key): boolean
200
- - 封装私有方法 markInjected(map, key): void
201
- (在 map.size >= MAX_INJECTION_KEYS 时删除最旧的一条)
202
- - 新增 public clearSession(sessionKey: string): void
203
- (同时从两个 Map 删除该 key)
204
-
205
- Step 9 修改 src/daemon/handlers/stop.ts:
206
- - 构造函数新增可选参数 userPromptHandler?: UserPromptHandler
207
- - Step 4 的 InvocationGuard.clear() 之后,调用
208
- userPromptHandler?.clearSession(`${event.session_id}:${event.project_path}`)
209
-
210
- Step 10 修改 daemon 初始化处(src/daemon/index.ts 或类似文件),
211
- 在构造 StopHandler 时传入 userPromptHandler 实例
212
-
213
- Step 11 修改 tests/unit/handlers.test.ts,新增 3 个 case(见测试策略)
214
-
215
- Step 12 运行测试验证:
216
- npx vitest run tests/unit/handlers.test.ts --reporter=verbose
217
- npx tsc --noEmit
218
- npm test -- --reporter=dot
219
- ```