@winspan/claude-forge 8.53.2 → 8.54.4

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