@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,46 +0,0 @@
1
- # H6 实施 Changelog
2
-
3
- **Date**: 2026-05-18 13:55
4
- **Spec**: docs/design/h6-services-migration-spec-20260518-1355.md
5
- **Status**: 完成
6
-
7
- ## 完成清单
8
- - [x] safety-net: tests/integration/web-analytics.integration.test.ts(3/3 pass,迁移前后均通过)
9
- - [x] git mv 3 文件到 src/web/analytics/(保留 git history)
10
- - [x] 改 3 处 import 路径(drift / reports / insights routes)
11
- - [x] 清理 2 处误导注释(weekly-report 的 "implemented by another agent" + anti-pattern 的 "daemon/services 既定做法")
12
- - [x] task-segmenter.ts 保留原地不动
13
- - [x] vitest.config.ts 加入 `tests/integration/**` 到 include(让 safety-net 能被 npm test 拾取)
14
-
15
- ## 关键代码定位
16
- - 新测试文件:`tests/integration/web-analytics.integration.test.ts:1-67`
17
- - 迁移后入口:`src/web/analytics/{drift-detector,weekly-report,anti-pattern-detector}.ts`
18
- - import 变更:
19
- - `src/web/routes/drift.ts:3` → `from '../analytics/drift-detector.js'`
20
- - `src/web/routes/reports.ts:10` → `from '../analytics/weekly-report.js'`
21
- - `src/web/routes/insights.ts:7` → `from '../analytics/anti-pattern-detector.js'`
22
- - 注释清理:
23
- - `src/web/analytics/weekly-report.ts:293-297`(aggregateAnomalies 内)
24
- - `src/web/analytics/anti-pattern-detector.ts:76-81`(queryEventsSince 上方 JSDoc)
25
- - vitest 配置:`vitest.config.ts:8`
26
-
27
- ## 测试结果
28
- - web-analytics 集成测试:3 passed(迁移前 baseline、迁移后回归均 3/3)
29
- - tsc --noEmit:0 errors
30
- - npm test:455 passed / 1 failed(仅 pre-existing `linkEventToTask` 失败,与本次迁移无关)
31
- - npm run build:成功(dist/web/analytics/ 产出齐全;dist/daemon/services/ 只剩 task-segmenter)
32
-
33
- ## 超出 spec 改动
34
- - **vitest.config.ts 更新 include 模式**:原配置只扫描 `tests/unit/**`,导致 `tests/integration/**` 下的测试(含已有的 `tasks-filter.integration.test.ts`)从未跑过。为让 safety-net 真正生效,新增 `tests/integration/**/*.test.ts` 到 include。
35
- - 副作用确认:把 `tasks-filter.integration.test.ts` 也拉进 CI,但它本就在主测试套件中通过(455 项 passed 含它)。
36
-
37
- ## 已知问题
38
- - `tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask` 失败(pre-existing,事件 UUID 校验问题,与 H6 迁移无关)
39
-
40
- ## 迁移内文件 import 路径核查
41
- 3 个被迁移的文件原来用 `../../core/...` 引用 core 层。从 `src/daemon/services/` 移到 `src/web/analytics/` 后,相对深度未变(仍为 2 层向上),无需调整。grep 校验通过:
42
-
43
- ```
44
- grep -rn "daemon/services/drift-detector|daemon/services/weekly-report|daemon/services/anti-pattern-detector" src/ tests/
45
- → 无任何匹配
46
- ```
@@ -1,46 +0,0 @@
1
- # H7 + M9 实施 Changelog
2
-
3
- **Date**: 2026-05-18 13:00
4
- **Status**: 完成
5
-
6
- ## 背景修正
7
-
8
- 原 review 误判:`claude-sonnet-4-6` 实际为合法 Sonnet 4.6 ID(非"非法")。
9
- 真实问题:`provider.ts` 的 `DEFAULT_MODEL` 是已过时的 `claude-sonnet-4-20250514`(Sonnet 4.0 旧 ID),应改用 constants 暴露的最新值。
10
- 端口侧的真实问题:`constants.ts` 的 `WEB_PORT: 3456` 是孤儿值(无人引用),而实际事实标准是 `3721`(7 个文件硬编码)。
11
-
12
- ## 完成清单
13
-
14
- - [x] `constants.ts` `WEB_PORT: 3456` → `3721`
15
- - [x] `provider.ts` 删除硬编码 `DEFAULT_MODEL`,改用 `DEFAULTS.AI_MODEL`
16
- - [x] `daemon/index.ts:73` 端口 fallback 用 `DEFAULTS.WEB_PORT`
17
- - [x] `cli/commands/daemon.ts:46` 同上
18
- - [x] `cli/commands/init.ts:107` 同上
19
- - [x] `core/utils/error-handler.ts:224` 同上 (`String(DEFAULTS.WEB_PORT)`)
20
- - [x] URL 字符串改 template literal(menu.ts ×3, trace.ts ×1)
21
-
22
- ## 关键文件
23
-
24
- - `src/core/constants.ts:44` — `WEB_PORT: 3721`
25
- - `src/core/ai/provider.ts:27-29` — 移除 `DEFAULT_MODEL`,新增 `import { DEFAULTS } from '../constants.js'`
26
- - `src/daemon/index.ts:73` — `?? DEFAULTS.WEB_PORT`
27
- - `src/cli/commands/daemon.ts:46` — `const DEFAULT_PORT = DEFAULTS.WEB_PORT`
28
- - `src/cli/commands/init.ts:107` — `let webPort: number = DEFAULTS.WEB_PORT`
29
- - `src/core/utils/error-handler.ts:224` — `String(DEFAULTS.WEB_PORT)`
30
- - `src/cli/commands/menu.ts:127,129,244` — template literal `http://localhost:${DEFAULTS.WEB_PORT}`
31
- - `src/cli/commands/trace.ts:154` — 同上
32
-
33
- ## 测试结果
34
-
35
- - `npx tsc --noEmit`:0 errors
36
- - `npm test`:423 passed / 1 failed(pre-existing `linkEventToTask` 与本次变更无关,位于 `tests/unit/storage/sqlite-refactor-harness.test.ts`,根因在 `EventOperations.writeEvent` 校验)
37
-
38
- ## 不改的位置(理由)
39
-
40
- 无。原计划中保守保留的 URL 字符串(menu.ts / trace.ts)由于改造极轻量(template literal),一并收敛进 `DEFAULTS.WEB_PORT`,进一步消除字面量漂移风险。
41
-
42
- ## 影响面 / 风险
43
-
44
- - 行为变更点:`constants.ts` 的 `WEB_PORT` 之前为 `3456`,但 grep 确认无实际引用,所以此值修正为 `3721` 不产生回归。
45
- - `provider.ts` 默认模型从过时的 `claude-sonnet-4-20250514` 改为合法的 `claude-sonnet-4-6`:在 `config.ai.model` 未显式设置时,AI 调用将使用 Sonnet 4.6(更新、更便宜、更强)。这是预期升级。
46
- - 所有端口硬编码已收敛到 `DEFAULTS.WEB_PORT`,后续调整只需改一处。
@@ -1,196 +0,0 @@
1
- # Hook Failure Queue + Daemon Startup Replay — Implementation Changelog
2
-
3
- **Date**: 2026-05-16 14:30 → 15:10
4
- **Spec**: `docs/design/hook-failure-queue-spec-20260516-1530.md`
5
-
6
- ---
7
-
8
- ## 实际改动文件清单
9
-
10
- | 路径 | 改动类型 | 说明 |
11
- |---|---|---|
12
- | `src/core/queue/index.ts` | 新建 | 队列核心模块(enqueueEvent / replayQueue / pruneQueue) |
13
- | `src/core/storage/events.ts` | 修改 | UNIQUE constraint 降级为 debug 日志,不再打 error |
14
- | `src/daemon/index.ts` | 修改 | 新增 `replayQueue` import + `setImmediate` 调用 |
15
- | `src/hooks/hook-lib.sh` | 新建 | 共享库:`send_event_or_enqueue` + `_enqueue_event_bg` |
16
- | `src/hooks/user-prompt-submit.sh` | 修改 | source hook-lib.sh,改用 `send_event_or_enqueue` |
17
- | `src/hooks/pre-tool-use.sh` | 修改 | 同上 |
18
- | `src/hooks/post-tool-use.sh` | 修改 | 同上 |
19
- | `src/hooks/notification.sh` | 修改 | 同上(spec 标注"低优先级可选",按主线程要求一并修改) |
20
- | `tests/unit/queue.test.ts` | 新建 | 单元测试(9 个用例) |
21
- | `tests/integration/queue-replay.integration.test.ts` | 新建 | 集成测试(3 个用例) |
22
- | `vitest.integration.config.ts` | 新建 | 临时 vitest 配置,使集成测试可独立运行 |
23
-
24
- `src/hooks/stop.sh` — 未改,与 spec 一致(Stop 事件无重放意义)。
25
-
26
- ---
27
-
28
- ## 与 Spec 偏差
29
-
30
- ### 偏差 1:hook-lib.sh 决策(主线程修正 3)
31
-
32
- **选择**:新建 `src/hooks/hook-lib.sh`,共享 `send_event_or_enqueue` 函数。
33
-
34
- **理由**:5 个 hook 脚本的 enqueue 逻辑完全相同。若各自独立维护 ~15 行,任何 bug 修复都需要改 4 处,容易遗漏。`hook-lib.sh` 约 60 行,每个 hook 只需 `source hook-lib.sh` + 一行调用,减少重复且保持一致性。
35
-
36
- ### 偏差 2:hook 失败判断(主线程修正 2)
37
-
38
- **选择**:双重检查 — 先检查 `[ -S "$SOCKET_PATH" ]`,再检查 nc 的 exit code。
39
-
40
- **macOS BSD nc 行为分析**:
41
- - macOS `nc -U -w N` 对 Unix socket:连接成功 + 连接被远端关闭 → exit 0,即使响应为空字符串
42
- - socket 文件不存在 → exit 1
43
- - 连接被拒绝 / 超时 → exit 1
44
-
45
- **关键约束满足**:daemon 正常返回空响应(无 systemMessage / additionalContext),此时 nc exit code = 0,`HOOK_RESPONSE` 为空字符串 → 不入队。这修复了 spec 原始方案用 `[ -z "$RESPONSE" ]` 造成的误判问题。
46
-
47
- ### 偏差 3:events.ts UNIQUE 约束处理
48
-
49
- Spec 要求"daemon 侧 writeEvent catch UNIQUE constraint 静默跳过"。
50
-
51
- **最终方案**:`events.ts` 对 UNIQUE constraint 降级为 debug 日志(不打 error),但**仍然 throw**。原因:`replayQueue` 依赖 throw 来区分"成功入库"(`replayed++`)和"重复"(`skipped++`)。如果 `writeEvent` 静默返回,replayQueue 无法计 skipped。
52
-
53
- Daemon 的 `handleEvent` 中单独 catch UNIQUE constraint,以防止正常 hook 流量因竞态(极低概率)收到重放的 event_id 而崩溃。
54
-
55
- ---
56
-
57
- ## 测试结果
58
-
59
- ### 单元测试(9 个,全过)
60
-
61
- ```
62
- npx vitest run tests/unit/queue.test.ts --reporter=verbose
63
-
64
- ✓ enqueueEvent 写入文件并可被 JSON.parse
65
- ✓ enqueueEvent 保留已有 event_id
66
- ✓ pruneQueue 超过 MAX_FILES 时删最旧文件
67
- ✓ pruneQueue 未到 MAX_FILES 时不删文件
68
- ✓ replayQueue 重放事件入库并删除队列文件
69
- ✓ replayQueue 对重复 event_id 静默跳过(skipped++)
70
- ✓ replayQueue 移动损坏 JSON 到 dead-letter
71
- ✓ replayQueue 移动 TTL 超期文件到 dead-letter
72
- ✓ replayQueue 队列为空时返回全零
73
-
74
- Tests: 9 passed (9)
75
- ```
76
-
77
- ### 集成测试(3 个,全过)
78
-
79
- ```
80
- npx vitest run --config vitest.integration.config.ts tests/integration/queue-replay.integration.test.ts --reporter=verbose
81
-
82
- ✓ 入队 3 个事件 → replayQueue → DB 有 3 行,队列为空
83
- ✓ 第二次 replayQueue → skipped=3(去重),DB 仍 3 行
84
- ✓ TTL 超期 + 损坏 JSON → dead-letter 2 个,重放 1 个
85
-
86
- Tests: 3 passed (3)
87
- ```
88
-
89
- ### 全量单元测试
90
-
91
- ```
92
- npx vitest run --reporter=dot
93
-
94
- Test Files: 2 failed | 25 passed (27)
95
- Tests: 3 failed | 300 passed (303)
96
- ```
97
-
98
- 3 个失败均为**预存在的 bug**(`sqlite-refactor-harness.test.ts` 和 `routes-tasks.test.ts` 使用了非 UUID 格式的 event_id,如 `event-1`,不满足 Zod UUID 验证),与本次改动无关(git stash 验证确认)。
99
-
100
- ### TypeScript 类型检查
101
-
102
- ```
103
- npx tsc --noEmit
104
- (无输出 = 通过)
105
- ```
106
-
107
- ---
108
-
109
- ## E2E 实测证据
110
-
111
- ### 操作步骤
112
-
113
- ```bash
114
- # 1. 停止 daemon
115
- npm run dev:daemon:stop
116
- # → "Daemon stopped"
117
-
118
- # 2. 确认队列为空
119
- find ~/.claude-forge/queue -name "*.json" | wc -l
120
- # → 0
121
-
122
- # 3. 调用 hook(daemon 停机中)
123
- echo '{"prompt":"队列测试 P3-B","cwd":"/tmp","session_id":"queue-test-001"}' \
124
- | node -e "const {execSync}=require('child_process');
125
- execSync('cat | src/hooks/user-prompt-submit.sh', ...)"
126
- # hook 退出码 0(入队后台子进程)
127
-
128
- # 4. 验证队列文件已写入
129
- find ~/.claude-forge/queue -name "*.json"
130
- # → /Users/admin/.claude-forge/queue/20260516T065031-AF74BF77-D0FE-4911-B6EC-22868527E3E1.json
131
-
132
- # 5. 启动 daemon
133
- npm run dev:daemon:start
134
- # → "Daemon started (PID: 5814)"
135
- sleep 2
136
-
137
- # 6. 验证队列为空(已重放)
138
- find ~/.claude-forge/queue -name "*.json" | wc -l
139
- # → 0
140
-
141
- # 7. 查询数据库
142
- sqlite3 ~/.claude-forge/data.db \
143
- "SELECT timestamp, user_prompt FROM events WHERE session_id='queue-test-001';"
144
- ```
145
-
146
- ### 实测输出
147
-
148
- ```
149
- sqlite3 query result:
150
- 2026-05-16T06:50:31.000Z|队列测试 P3-B
151
- ```
152
-
153
- ### Daemon 日志(grep Queue)
154
-
155
- ```
156
- [2026-05-16T06:50:44.444Z] [INFO] [Queue] Replaying 1 queued event(s)…
157
- [2026-05-16T06:50:44.448Z] [INFO] [Queue] Replay: 1 replayed, 0 skipped (dup), 0 dead-lettered
158
- ```
159
-
160
- **结论**:daemon 停机期间发送的事件正确入队,daemon 启动后自动重放并写入 DB,队列清空。
161
-
162
- ---
163
-
164
- ## 关键实现细节
165
-
166
- ### send_event_or_enqueue 函数(hook-lib.sh)
167
-
168
- ```bash
169
- send_event_or_enqueue() {
170
- local event_json="$1"
171
- local timeout_secs="${2:-10}"
172
- HOOK_RESPONSE=""
173
-
174
- if [ ! -S "$SOCKET_PATH" ]; then
175
- _enqueue_event_bg "$event_json"
176
- return 0
177
- fi
178
-
179
- local tmp_response
180
- tmp_response=$(echo "$event_json" | nc -U -w "$timeout_secs" "$SOCKET_PATH" 2>/dev/null)
181
- local nc_exit=$?
182
-
183
- if [ $nc_exit -ne 0 ]; then
184
- _enqueue_event_bg "$event_json"
185
- return 0
186
- fi
187
-
188
- HOOK_RESPONSE="$tmp_response"
189
- }
190
- ```
191
-
192
- 写入策略:`printf '%s' "$event_json" > "$tmp_file" && mv "$tmp_file" "$QUEUE_DIR/${filename}"` — 先写 .tmp 再 rename,保证原子性。
193
-
194
- ### replayQueue 时序
195
-
196
- daemon 启动 → `SocketServer` 构造(listen 绑定)→ `setImmediate(replayQueue)` — 利用 setImmediate 确保 listen 回调先执行,socket 文件权限设好后再重放。
@@ -1,56 +0,0 @@
1
- # Hotfix: Daemon Event Rejection — 20260516-1430
2
-
3
- ## 根因摘要
4
-
5
- Phase 1/2 重构时收紧了 `ForgeEventSchema`,将 `timestamp` 字段改为 `z.string().datetime()`(要求严格 ISO 8601 带 Z 后缀),同时 `hook_type` enum 漏加了 `Notification`。而 hook 脚本使用的是 `date -u +"%Y-%m-%dT%H:%M:%S"`(无毫秒无 Z),导致 daemon 重启后所有入站事件被 Zod 校验拦截拒收,数据库从 `2026-05-16 06:01:30` 起无新事件写入。
6
-
7
- ## 实际改动文件清单
8
-
9
- | 文件 | 改动内容 |
10
- |---|---|
11
- | `src/core/storage/events.ts` | `timestamp` 从 `z.string().datetime()` 改为 `z.string().min(1)`(向后兼容历史无 Z 的 timestamp);`hook_type` enum 加入 `'Notification'` |
12
- | `src/hooks/user-prompt-submit.sh` | `date` 格式从 `%H:%M:%S` 改为 `%H:%M:%S.000Z` |
13
- | `src/hooks/pre-tool-use.sh` | 同上 |
14
- | `src/hooks/post-tool-use.sh` | 同上 |
15
- | `src/hooks/stop.sh` | 同上 |
16
- | `src/hooks/notification.sh` | 同上 |
17
- | `tests/unit/type-guards.test.ts` | 将 `should reject event with invalid timestamp` 更新为 `should reject event with empty timestamp`,测试用例从 `'not-a-valid-timestamp'` 改为 `''`,与新宽松策略一致 |
18
-
19
- 无其他 `datetime()` 使用点(已全文搜索确认)。
20
-
21
- ## 验证方式
22
-
23
- ### TypeScript 类型检查
24
- ```bash
25
- npx tsc --noEmit
26
- # 输出:无错误
27
- ```
28
-
29
- ### 构建
30
- ```bash
31
- npm run build
32
- # 输出:正常完成,dist/ 含 hooks/*.sh
33
- ```
34
-
35
- ### 单元测试
36
- ```bash
37
- npx vitest run tests/unit/ --reporter=dot
38
- # 结果:3 failed | 291 passed(3 个失败为本次改动前已存在的预存失败,与本 hotfix 无关)
39
- ```
40
-
41
- 预存失败清单(本 hotfix 前已存在,不在本次修复范围内):
42
- - `tests/unit/web/routes-tasks.test.ts` x2(使用非 UUID 的 event_id)
43
- - `tests/unit/storage/sqlite-refactor-harness.test.ts` x1(同上)
44
-
45
- ## 部署步骤(用户需手动执行)
46
-
47
- ```bash
48
- # 复制 hooks 到运行时位置
49
- cp src/hooks/*.sh ~/.claude-forge/hooks/ && chmod +x ~/.claude-forge/hooks/*.sh
50
-
51
- # 重启 daemon
52
- ./scripts/dev-daemon.sh restart
53
-
54
- # 验证:新事件应出现在数据库
55
- sqlite3 ~/.claude-forge/data.db "SELECT timestamp, hook_type FROM events ORDER BY rowid DESC LIMIT 5;"
56
- ```
@@ -1,45 +0,0 @@
1
- # L1 实施 Changelog: SWARM_PROTOCOL 抽到 .md 文件
2
-
3
- **Date**: 2026-05-18 16:05
4
- **Spec**: docs/design/l1-swarm-protocol-extract-spec-20260518-1605.md
5
- **Status**: 完成
6
-
7
- ## 完成清单
8
-
9
- - [x] safety-net:`tests/integration/claudemd-generator.test.ts` 建立 baseline(SWARM 段 SHA256 锚定)
10
- - [x] swarm-protocol.md 抽取(223 行,5441 字符 / 7817 字节)
11
- - [x] claudemd-generator.ts:`getSwarmProtocol()` 加载器 + 模块级缓存
12
- - [x] package.json `build`:cp `.md` + fail-fast 校验
13
-
14
- ## 关键代码定位
15
-
16
- - 新文件 `src/claudemd/templates/swarm-protocol.md`(223 行)
17
- - `src/claudemd/claudemd-generator.ts:5-9` — import 增加 `dirname` + `fileURLToPath`
18
- - `src/claudemd/claudemd-generator.ts:14-38` — `getSwarmProtocol()` 加载函数 + `_swarmProtocolCache`
19
- - `src/claudemd/claudemd-generator.ts:59` — `generate()` 内 `SWARM_PROTOCOL` 引用改为 `getSwarmProtocol()`(实际行号 65)
20
- - `src/claudemd/claudemd-generator.ts:568` 之后已无字面量(删除 569-804 共 236 行)
21
- - `package.json:13` — build 中新增 `mkdir -p dist/claudemd/templates && cp src/claudemd/templates/*.md dist/claudemd/templates/`,末尾追加 `test -f dist/claudemd/templates/swarm-protocol.md` 校验
22
-
23
- ## 测试结果
24
-
25
- - **safety-net SHA256(迁移前后一致)**:`260dfe1e48fdecc324419a6330428eaa3597e3fd6e6262cf66cdcf301ca32e18`
26
- - **SWARM 段长度(迁移前后一致)**:5442 字节(含分隔符尾的一个 `\n`)
27
- - **tsc**:0 errors
28
- - **npm test**:551 / 552 通过(1 个 pre-existing `sqlite-refactor-harness.test.ts > linkEventToTask` 失败,与本次无关)
29
- - **npm run build**:成功;`dist/claudemd/templates/swarm-protocol.md` 存在(7817 字节,与 src 完全一致)
30
-
31
- ## 顺手清理
32
-
33
- - 删除 `claudemd-generator.ts` 原 547-553 两段重复的 `Core behavioral rules` 注释块(合并到新的 `getSwarmProtocol` 文档块)。
34
- - 字面量 555-777(223 行)整体下线。文件总行数 805 → 569(-236)。
35
-
36
- ## 已知问题
37
-
38
- - `tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask` — pre-existing 失败,未触碰。
39
-
40
- ## 兼容性确认
41
-
42
- - dev 路径(`tsx src/`):`fileURLToPath(import.meta.url)` 解析到 `src/claudemd/`,同级 `templates/swarm-protocol.md` 存在 → 加载成功。
43
- - npm install 路径:build 脚本 cp 到 `dist/claudemd/templates/`,末尾 `test -f` fail-fast 校验,CI 一旦缺失立刻报错。
44
- - 缓存策略:模块级 `_swarmProtocolCache: string | null = null`,首次调用读盘后缓存;进程生命周期内 0 重复 I/O。
45
- - 字节级等价:safety-net 测试通过 SHA256 哈希逐字符比对,新旧实现完全一致。
@@ -1,63 +0,0 @@
1
- # L3 + L4 实施 Changelog
2
-
3
- **Date**: 2026-05-18 14:10
4
- **Status**: 完成
5
-
6
- ## 完成清单
7
-
8
- - [x] **L4**: `stop.ts` git 调用异步化
9
- - 3 个 `execFileSync` → `promisify(execFile)`
10
- - `writeGitNote` 改为 `async`,主流程改为 **fire-and-forget**(`void this.writeGitNote(event)`)
11
- - 内部仍按依赖串行 await(rev-parse work-tree → rev-parse HEAD → notes append),但**整体不阻塞 handler 主响应**
12
- - 失败仍 catch + `logger.debug`,handler 对外契约不变(返回 `{allow: true}`)
13
-
14
- - [x] **L3**: `server.ts` 避免 N² JSON.parse —— **方案 A(换行符分隔)**
15
- - 验证 hook 端 `echo "$event_json" | nc -U`:`echo` 默认追加 `\n`,协议天然支持
16
- - `data` handler 改为:仅在 `buffer.indexOf('\n') !== -1` 时切出完整消息并解析;未见换行就累积等待
17
- - 抽取 `processMessage(socket, message)` 统一处理 auth 检查 + parser + handler response
18
- - 兜底:监听 `socket.on('end')`,若 buffer 残留无换行内容(旧客户端)做最后一次解析尝试
19
- - 删除 dead code `isCompleteJSON`(不再需要"启发式判完整",换行就是边界)
20
-
21
- ## 关键代码定位
22
-
23
- - `src/daemon/handlers/stop.ts:19-22` —— `promisify(execFile)` 导入
24
- - `src/daemon/handlers/stop.ts:84-86` —— `void this.writeGitNote(event)` 调用点
25
- - `src/daemon/handlers/stop.ts:102-135` —— async `writeGitNote` 实现
26
- - `src/daemon/server.ts:51-122` —— 新的 `handleConnection` + `processMessage`
27
- - `tests/unit/socket-server.test.ts` —— 新增 5 个测试(4 socket + 1 EventParser sanity)
28
-
29
- ## 测试结果
30
-
31
- - `npx tsc --noEmit`: **0 errors**
32
- - `npm test`: **460 passed / 1 failed**(仅 pre-existing `linkEventToTask`)
33
- - 新增 `tests/unit/socket-server.test.ts`: **5/5 passed**
34
-
35
- 新测试覆盖:
36
- 1. 单 chunk 完整消息(含换行)
37
- 2. 大消息(~50KB)分 20 个 chunk 到达 —— 断言 `JSON.parse` 调用次数 ≤ 3(远小于 chunk 数,强对比旧 N² 行为)
38
- 3. 600KB 无换行 oversized buffer 被丢弃
39
- 4. 无换行结尾消息走 `socket.on('end')` 兜底
40
- 5. EventParser sanity
41
-
42
- ## 实施决策
43
-
44
- ### L4:fire-and-forget + 内部串行
45
- - **理由**:3 个 git 调用有严格依赖(work-tree 检查 → 拿 HEAD → 写 note),不能 `Promise.all` 并发
46
- - **关键收益**:原 `execFileSync` 在 handler **主调用链路**中串行阻塞 daemon event loop(最坏 15s);改 `void` 调用后,git I/O 移到下一个 microtask,handler 立刻返回响应给 hook 客户端
47
- - **副作用控制**:git 失败仍 `logger.debug`,与原行为一致;handler 主体 try/catch 已存在,async fire-and-forget 的未捕获错误已在 `writeGitNote` 内部 catch
48
-
49
- ### L3:方案 A(换行符分隔)
50
- - **理由**:
51
- 1. 协议天然支持(验证了 `hook-lib.sh` 用 `echo`,默认带 `\n`)
52
- 2. O(1) 检查(`indexOf('\n')` 在 V8 高度优化);旧代码每 chunk 做一次完整 `JSON.parse(buffer)` 在 ~512KB buffer 上是真正的 N²
53
- 3. 单一边界标记,逻辑清晰,无需再保留 `isCompleteJSON` 启发式
54
- - **兼容性**:保留 `socket.on('end')` 兜底,覆盖未来可能出现的"不带换行的客户端"
55
- - **协议契约**:不变(hook 端 `echo` 不需要任何修改,服务器只是更聪明地等待 `\n`)
56
-
57
- ## 跳过项
58
-
59
- 无。
60
-
61
- ## 已知问题
62
-
63
- - **pre-existing**: `tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask` 失败(与本次改动无关,schema 校验 uuid 拒绝测试 fixture 中的 `event_id`)
@@ -1,38 +0,0 @@
1
- # L6 + L8 最终扫尾 Changelog
2
-
3
- **Date**: 2026-05-18 16:40
4
- **Status**: 完成
5
-
6
- ## 完成清单
7
-
8
- - [x] L6: setLogLevel env 解析移到 logger 模块加载
9
- - [x] L8: token_usage FK 注释补充
10
-
11
- ## 关键代码定位
12
-
13
- - `src/core/utils/logger.ts:5-22` — 新增 `getLogLevelFromEnv()`,模块加载时初始化 `currentLevel`
14
- - `src/daemon/index.ts:23` / `src/daemon/index.ts:60-63` — 删除手动 env 解析与 setLogLevel 调用,import 收窄为 `logger`
15
- - `src/core/storage/schema.sql:16-18` / `src/core/storage/schema.sql:20` / `src/core/storage/schema.sql:153-163` —
16
- - header 关系图增加 `token_usage` 章节
17
- - "Why no FK" 注释主语扩展为 routing_events / skill_invocations / token_usage
18
- - token_usage.session_id 字段处补充内联注释(与 routing_events / skill_invocations 同口径)
19
-
20
- ## 测试结果
21
-
22
- - tsc: 0 errors
23
- - npm test: 551 / 552 通过(1 个 pre-existing 失败:`tests/unit/storage/sqlite-refactor-harness.test.ts` 的 `writeEvent` Invalid uuid 校验失败,与本次改动无关)
24
-
25
- ## 实施决策
26
-
27
- - **L6**:采用「模块加载时一次性读取 env + `getLogLevelFromEnv()` 辅助函数」混合方案。
28
- - 顶层 `let currentLevel: LogLevel = getLogLevelFromEnv();` 在模块首次 import 时执行一次。
29
- - 由于 logger 模块当前无单元测试(`find src/tests tests/unit -name "logger.test.ts"` 为空),顶层副作用不会破坏测试 mock。
30
- - 保留 `setLogLevel()` 导出函数以便测试或运行时覆写(向后兼容)。
31
- - daemon/index.ts 不再需要重复 env 解析;其它入口(CLI、web)若 import logger 自动享受同样行为,无需改动。
32
- - **L8**:纯文档/注释级补充,零 SQL 行为变更。
33
- - 沿用 routing_events / skill_invocations 已有的 "logical ref,no FK due to write-order race" 表述。
34
- - 同时更新文件头的表关系图,保持单一信息源。
35
-
36
- ## 已知问题
37
-
38
- - `tests/unit/storage/sqlite-refactor-harness.test.ts:166` — `writeEvent Invalid uuid` 断言失败(pre-existing,与 `linkEventToTask` 重构 harness 同一组),本次未修复,按指令不扩大范围。
@@ -1,58 +0,0 @@
1
- # M1 + M4 + M5 + L7 清理 Changelog
2
-
3
- **Date**: 2026-05-18 13:10
4
- **Status**: 完成
5
-
6
- ## 完成清单
7
- - [x] M4: events.ts 删 UpsertCapableEmitter 重复声明
8
- - [x] L7: types.ts 删 ForgeEvent.pipeline_id 死字段(顺带删除 BaseEvent.pipeline_id)
9
- - [x] M1: truncateField 抽到 web/routes/_helpers.ts
10
- - [x] M5: user-prompt.ts 改用 LRUCache(保持两个独立实例)
11
-
12
- ## 关键代码定位
13
-
14
- ### M4 — UpsertCapableEmitter 去重
15
- - `src/core/storage/events.ts:19-22`(旧 L19-21 + 空行)— 删除
16
- - `src/core/storage/events.ts:57-59` — 保留(更靠近使用点 L64 constructor)
17
-
18
- ### L7 — pipeline_id 死代码清理
19
- - `src/core/types.ts:34` — 删除 `ForgeEvent.pipeline_id?`
20
- - `src/core/types.ts:43` — 删除 `BaseEvent.pipeline_id?`
21
- - 全量 grep 验证:`pipeline_id` 仅在 types.ts 中出现,无任何运行时引用,无 schema 字段、无注释、无解析逻辑。直接清理。
22
-
23
- ### M1 — truncateField 抽取
24
- - 新建 `src/web/routes/_helpers.ts` — 导出 `truncateField(obj, maxLen=300, arrayLimit=10)`
25
- - 增加 `arrayLimit` 参数以兼容两个调用点的不同行为(tasks: 10, sessions: 5)
26
- - 类型从 `any` 升为 `unknown` + `Record<string, unknown>`
27
- - `src/web/routes/tasks.ts:1-4` — 新 import `truncateField from './_helpers.js'`
28
- - `src/web/routes/tasks.ts` — 移除本地 `truncateField` 闭包定义(原 L87-99),调用点保持不变(默认参数 300/10 与原一致)
29
- - `src/web/routes/sessions.ts:1-3` — 新 import
30
- - `src/web/routes/sessions.ts` — 移除本地 `truncateField`(原 L189-201),两个调用点显式传 `(toolInput, 200, 5)` / `(toolOutput, 200, 5)` 以保留原有行为
31
-
32
- ### M5 — LRUCache 替换手写 LRU
33
- - `src/core/utils/lru-cache.ts:39-45` — 新增 `delete(key)` 方法(必须,否则 clearSession 无法实现)
34
- - `src/daemon/handlers/user-prompt.ts:10` — 新 import `LRUCache`
35
- - `src/daemon/handlers/user-prompt.ts:19-25` — 字段替换:
36
- - `resumeInjected: Map<string, number>` → `LRUCache<string, number>(1000)`
37
- - `conventionInjected: Map<string, number>` → `LRUCache<string, number>(1000)`
38
- - `src/daemon/handlers/user-prompt.ts:markInjected` — 从 17 行手写 LRU 缩减为单行 `cache.set(key, Date.now())`
39
- - `src/daemon/handlers/user-prompt.ts:hasInjected` / `clearSession` — 签名从 `Map` 改为 `LRUCache`,行为一致
40
-
41
- ### M5 设计决策:不合并键集合
42
- 两个 Map 虽然 key 类型相同(`sessionKey`),但语义独立:
43
- - `resumeInjected` 控制 resume context 注入;同时还会触发 `resume.clear()`
44
- - `conventionInjected` 控制 project guidance 注入
45
-
46
- 如果合并成单一键集合,会丧失"同一 session 各自独立标记是否注入过"的语义。保留两个独立 LRUCache 实例最安全,不扩大改动范围。
47
-
48
- ## 测试结果
49
- - `npx tsc --noEmit`: **0 errors**
50
- - `npm test`: **423 passed / 1 failed**
51
- - 失败项:`tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask associates events with tasks`
52
- - 失败原因:pre-existing UUID 校验问题,与本次清理无关
53
-
54
- ## 跳过项
55
-
56
-
57
- ## 已知问题
58
- - pre-existing `linkEventToTask` test failure(与本次清理无关)
@@ -1,60 +0,0 @@
1
- # M10 实施 Changelog
2
-
3
- **Date**: 2026-05-18 13:20
4
- **Spec**: docs/design/m10-forge-paths-spec-20260518-1320.md
5
- **Status**: 完成
6
-
7
- ## 完成清单
8
- - [x] safety-net: tests/unit/core/forge-paths.test.ts(16 个断言)
9
- - [x] FORGE_PATHS 扩展 11 方法(daemonSocket/Pid/Token/Log/Stdout/Stderr, hooks, queue, queueDead, routingYaml, backups(kind))
10
- - [x] Group A: daemon 运行时(lifecycle / cli/daemon / cli/status / cli/mcp / web/auth-middleware)
11
- - [x] Group B: queue(core/queue/index.ts)
12
- - [x] Group C: hooks(cli/init/hook-manager.ts)
13
- - [x] Group D: web patch(web/routes/types.ts + web/routes/skills.ts × 4 处)
14
- - [x] Group E: cli/stats.ts + error-handler.ts 文案 `forge.sock` → `daemon.sock`
15
-
16
- ## 关键代码定位
17
-
18
- **FORGE_PATHS 扩展**:
19
- - `src/core/constants.ts:9-31` — 新增 11 个方法
20
- - `tests/unit/core/forge-paths.test.ts` — 新增测试文件,16 个用例
21
-
22
- **Group A(daemon 运行时)**:
23
- - `src/daemon/lifecycle.ts:8-10` — TOKEN_FILE/PID_FILE 改用 FORGE_PATHS;`getSocketPath` (L51) 复用 daemonSocket
24
- - `src/cli/commands/daemon.ts:34,44-47,114` — PID_FILE/STDOUT_LOG/STDERR_LOG/logFile,并移除未用的 FORGE_HOME import
25
- - `src/cli/commands/status.ts:5-8` — PID_FILE 改 FORGE_PATHS.daemonPid();移除 FORGE_HOME import
26
- - `src/cli/commands/mcp.ts:17-22,45,86` — tokenPath / daemon.pid 路径;移除 homedir/join import
27
- - `src/web/auth-middleware.ts:13-17` — TOKEN_FILE 改 FORGE_PATHS.daemonToken();移除 path import
28
-
29
- **Group B(queue)**:
30
- - `src/core/queue/index.ts:16-27` — QUEUE_DIR/DEAD_DIR 改 FORGE_PATHS;移除 homedir import 与未用的 FORGE_DIR 常量
31
-
32
- **Group C(hooks)**:
33
- - `src/cli/init/hook-manager.ts:4,8` — HOOKS_DIR 改 FORGE_PATHS.hooks()
34
-
35
- **Group D(web patch)**:
36
- - `src/web/routes/types.ts:11,30-39` — resolvePatchTarget 中 4 处路径全部改 FORGE_PATHS
37
- - `src/web/routes/skills.ts:7,208,235,279,321` — backupDir × 4 处统一 → FORGE_PATHS.backups('skills')
38
-
39
- **Group E(其它)**:
40
- - `src/cli/commands/stats.ts:10-21` — dbPath 改 FORGE_PATHS.database();移除 path/homedir import
41
- - `src/core/utils/error-handler.ts:239` — 提示文本 `forge.sock` → `daemon.sock`
42
-
43
- ## 测试结果
44
-
45
- ```
46
- forge-paths.test.ts: 16/16 passed
47
- tests/unit/core/ + storage/ + queue: 85/86 passed(1 pre-existing linkEventToTask)
48
- npm test 全量: 439/440 passed(1 pre-existing linkEventToTask)
49
- npx tsc --noEmit: 0 errors
50
- npm run build: 成功
51
- ```
52
-
53
- ## 超出 spec 改动
54
-
55
- 无。严格按 spec 12 文件机械替换。附带顺手清理(与 spec 风险一致):
56
- - 删除替换后未引用的 import(`homedir`、`path`、`FORGE_HOME`、`FORGE_DIR` 常量)以保持文件干净,不引入新逻辑。
57
-
58
- ## 已知问题
59
-
60
- - `tests/unit/storage/sqlite-refactor-harness.test.ts` > `linkEventToTask associates events with tasks` 失败 — pre-existing UUID 校验问题,与 M10 改动无关(spec 已明示)。
@@ -1,43 +0,0 @@
1
- # M2 + M3 实施 Changelog
2
-
3
- **Date**: 2026-05-18 14:25
4
- **Spec**: docs/design/m2-m3-tool-input-spec-20260518-1425.md
5
- **Status**: 完成
6
-
7
- ## 完成清单
8
- - [x] M3: `event-parser.ts` 改为 `event_id: validated.event_id ?? randomUUID()`,schema 加 `event_id: z.string().uuid().optional()`
9
- - [x] M2: `ToolInputFields` 接口 + 4 个 getter(`getCommand` / `getFilePath` / `getUserPrompt` / `getSubagentType`)
10
- - [x] 替换所有 `(tool_input as any)` / `(tool_input as Record<string,unknown>)` 使用点(10 处源文件)
11
- - [x] 新增 `tests/unit/event-fields.test.ts`(15 cases)
12
- - [x] 新增 `tests/unit/event-parser.test.ts`(5 cases)
13
-
14
- ## 关键代码定位
15
- - `src/core/types.ts:25-61` — `ToolInputFields` 接口 + `ForgeEvent.tool_input: ToolInputFields | undefined`
16
- - `src/core/event-fields.ts:1-32` — 4 个 getter
17
- - `src/daemon/event-parser.ts:16,23,29` — M3 schema + event_id 透传 + `as ToolInputFields` cast
18
- - `src/web/routes/sessions.ts:4,82-100,158-167,222-234` — sessions 路由 getter 化(8 处)
19
- - `src/web/routes/tasks.ts:5,111-131,156-172` — tasks 路由 getter 化(5 处)
20
- - `src/web/analytics/anti-pattern-detector.ts:95,354-364` — helpers 签名调整为 `ForgeEvent['tool_input']`,line 95 显式 cast
21
- - `src/daemon/handlers/post-tool-use.ts:5,29` — `getSubagentType(event)`
22
- - `src/daemon/handlers/history-exporter.ts:102` — 去掉 `as Record<string, unknown>` cast
23
- - `src/cli/commands/logs.ts:43` — 去掉 `as Record<string, unknown>` cast
24
- - `src/claudemd/resume-manager.ts:118` — 去掉 `as string` cast,改 `typeof === 'string'` 守卫
25
- - `src/daemon/index.ts:39-40,161` — import + 改用 `getUserPrompt(event)`
26
-
27
- ## 测试结果
28
- - `tests/unit/event-fields.test.ts`: 15 / 15 passed
29
- - `tests/unit/event-parser.test.ts`: 5 / 5 passed
30
- - `npx tsc --noEmit`: 0 errors
31
- - `npm test --reporter=dot`: **480 / 481 passed**(唯一失败为 pre-existing `linkEventToTask`,spec 第 5 项明确豁免)
32
-
33
- ## 顺手发现的额外 as any(如有)
34
- 无新增。`src/web/routes/sessions.ts:188-190` 的 `tool_input as any` 同步消除;`tool_output as any` 保留 1 处(`?.error` 防御访问,超出本 spec 范围)。
35
-
36
- ## 已知问题
37
- - `tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask` 失败:pre-existing,spec 已豁免;根因是测试构造的 event_id 不是 UUID,与本次 M3 schema 收紧无关(写入端 `writeEvent` 早已校验 UUID)。
38
- - `tests/unit/web/routes-tasks.test.ts` 在全量并行跑时偶发首例 404(B 路径下 `getStorage()` 状态同步问题),单独跑 21/21 全过;非本次回归。
39
-
40
- ## 设计要点
41
- - `ToolInputFields` 加 `[key: string]: unknown` 索引签名:兼顾 forward-compat 与窄化收益(spec 风险 1 已确认接受)。
42
- - M3 让 hook 端可选自带 `event_id`:未带时 parser 兜底 `randomUUID()`,与 queue / storage 层 `event.event_id ?? randomUUID()` 形成端到端去重链路(hook 端真正生成 event_id 是后续 follow-up)。
43
- - `anti-pattern-detector.ts` 走保守路径:保留 `extractFilePath` / `extractBashCommand` 私有签名,只调整参数类型为 `ForgeEvent['tool_input']`,调用方零改动。