@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,543 +0,0 @@
1
- # claude-forge 渐进式重构 - 第 1 迭代实施方案
2
-
3
- **文档版本**: v1.0
4
- **生成时间**: 2026-05-15 16:00
5
- **迭代周期**: 2 周(2026-05-15 ~ 2026-05-29)
6
- **负责范围**: P0 安全漏洞 + 部分 P1 基础设施问题
7
-
8
- ---
9
-
10
- ## 1. 目标与范围
11
-
12
- ### 1.1 迭代目标
13
-
14
- 第 1 迭代聚焦于**安全加固**和**基础设施稳定性**,为后续重构奠定安全基础:
15
-
16
- 1. **修复 P0 级安全漏洞**(3 个)
17
- - 路径遍历漏洞(skills.ts、patch.ts)
18
- - Git 命令注入漏洞(trace.ts)
19
- - 类型安全缺失(storage/events.ts)
20
-
21
- 2. **解决 P1 级基础设施问题**(选择 4 个)
22
- - 添加缺失的数据库索引(性能优化)
23
- - 补充核心模块单元测试(覆盖率从 0% → 50%)
24
- - 统一错误处理(daemon 稳定性)
25
- - 添加请求体大小限制(DoS 防护)
26
-
27
- 3. **建立测试基础设施**
28
- - 配置测试环境(Vitest + 覆盖率报告)
29
- - 编写测试工具函数(mock storage、mock AI provider)
30
- - 建立 CI 流程(GitHub Actions)
31
-
32
- ### 1.2 不包括的内容(留到后续迭代)
33
-
34
- - ❌ 架构重构(模块拆分、依赖解耦)
35
- - ❌ 性能优化(N+1 查询、连接池)
36
- - ❌ 文档补全(API 文档、架构图)
37
- - ❌ P2 级问题(代码重复、命名规范)
38
- - ❌ 新功能开发
39
-
40
- ---
41
-
42
- ## 2. 问题清单与优先级
43
-
44
- ### 2.1 P0 级问题(必须修复)
45
-
46
- | ID | 问题 | 影响 | 文件 |
47
- |---|---|---|---|
48
- | P0-1 | 路径遍历漏洞 | 攻击者可读取任意文件 | `src/web/routes/skills.ts`, `src/web/routes/patch.ts` |
49
- | P0-2 | Git 命令注入 | 攻击者可执行任意命令 | `src/web/routes/trace.ts` |
50
- | P0-3 | 类型安全缺失 | 运行时类型错误 | `src/core/storage/events.ts` |
51
-
52
- ### 2.2 P1 级问题(本迭代处理)
53
-
54
- | ID | 问题 | 影响 | 文件 |
55
- |---|---|---|---|
56
- | P1-1 | 缺失数据库索引 | 查询性能差 | `src/core/storage/schema.sql` |
57
- | P1-2 | 0% 测试覆盖 | 重构风险高 | 全局 |
58
- | P1-3 | 错误处理不统一 | daemon 崩溃 | `src/daemon/router.ts`, `src/web/routes/*.ts` |
59
- | P1-4 | 请求体大小无限制 | DoS 攻击风险 | `src/web/server.ts` |
60
-
61
- ---
62
-
63
- ## 3. 改动文件清单
64
-
65
- ### 3.1 安全修复(P0)
66
-
67
- | 文件 | 改动类型 | 预计行数 | 说明 |
68
- |---|---|---|---|
69
- | `src/web/routes/skills.ts` | 修改 | +15 | 添加文件名校验 |
70
- | `src/web/routes/patch.ts` | 修改 | +15 | 添加路径校验 |
71
- | `src/web/routes/trace.ts` | 修改 | +20 | 添加 projectPath 校验 |
72
- | `src/core/storage/events.ts` | 修改 | +30 | 添加 Zod 运行时校验 |
73
- | `tests/unit/security.test.ts` | 新增 | +100 | 安全漏洞回归测试 |
74
-
75
- ### 3.2 基础设施改进(P1)
76
-
77
- | 文件 | 改动类型 | 预计行数 | 说明 |
78
- |---|---|---|---|
79
- | `src/core/storage/schema.sql` | 修改 | +15 | 添加复合索引 |
80
- | `src/daemon/router.ts` | 修改 | +30 | 添加错误边界 |
81
- | `src/web/server.ts` | 修改 | +5 | 添加请求体大小限制 |
82
- | `src/web/routes/error-handler.ts` | 新增 | +50 | 统一错误处理中间件 |
83
- | `tests/unit/storage.test.ts` | 新增 | +200 | Storage 单元测试 |
84
- | `tests/unit/router.test.ts` | 新增 | +150 | Router 单元测试 |
85
- | `tests/unit/type-guards.test.ts` | 新增 | +100 | 类型守卫测试 |
86
- | `tests/helpers/mock-storage.ts` | 新增 | +80 | 测试工具函数 |
87
- | `tests/helpers/mock-ai.ts` | 新增 | +60 | 测试工具函数 |
88
-
89
- ### 3.3 CI/CD 配置
90
-
91
- | 文件 | 改动类型 | 预计行数 | 说明 |
92
- |---|---|---|---|
93
- | `.github/workflows/test.yml` | 新增 | +50 | CI 测试流程 |
94
- | `.github/workflows/security.yml` | 新增 | +40 | 安全扫描流程 |
95
-
96
- **总计**:
97
- - 新增文件:9 个
98
- - 修改文件:7 个
99
- - 预计改动行数:~960 行
100
-
101
- ---
102
-
103
- ## 4. 实施步骤(按依赖顺序)
104
-
105
- ### Step 1: 修复 P0-1 路径遍历漏洞(1 天)
106
-
107
- **目标**:防止攻击者通过 `../../../etc/passwd` 等路径读取任意文件
108
-
109
- **改动**:
110
-
111
- 1. **修复 skills.ts**(第 33 行)
112
- ```typescript
113
- // 当前代码
114
- const filePath = path.join(skillsDir, `${name}.md`);
115
-
116
- // 修复后
117
- if (name.includes('/') || name.includes('\\') || name.includes('..')) {
118
- return res.status(400).json({ error: 'Invalid skill name' });
119
- }
120
- const safeName = name.replace(/[^a-zA-Z0-9_-]/g, '_');
121
- const filePath = path.join(skillsDir, `${safeName}.md`);
122
- ```
123
-
124
- 2. **修复 patch.ts**(第 45 行)
125
- ```typescript
126
- function resolvePatchTarget(targetType: string, targetName: string): string {
127
- // 添加路径校验
128
- if (targetName.includes('/') || targetName.includes('\\') || targetName.includes('..')) {
129
- throw new Error('Invalid target name');
130
- }
131
-
132
- if (targetType === 'skill') {
133
- return path.join(getSkillsDir(), `${targetName}.md`);
134
- }
135
- // ...
136
- }
137
- ```
138
-
139
- **验证方法**:
140
- ```bash
141
- # 测试恶意输入
142
- curl http://localhost:3456/api/skills/../../../etc/passwd
143
- # 预期:返回 400 错误
144
-
145
- curl -X PUT http://localhost:3456/api/skills/../../../tmp/evil \
146
- -H "Content-Type: application/json" \
147
- -d '{"content": "malicious"}'
148
- # 预期:返回 400 错误
149
- ```
150
-
151
- **回滚方案**:
152
- - Git revert 到修改前的 commit
153
-
154
- ---
155
-
156
- ### Step 2: 修复 P0-2 Git 命令注入漏洞(1 天)
157
-
158
- **目标**:防止攻击者通过恶意 projectPath 执行任意命令
159
-
160
- **改动**:
161
-
162
- 1. **修复 trace.ts**(第 28 行)
163
- ```typescript
164
- // 当前代码
165
- const projectPath = req.query.project as string | undefined;
166
-
167
- // 修复后
168
- const projectPath = req.query.project as string | undefined;
169
-
170
- // 校验 projectPath
171
- if (!projectPath) {
172
- return res.status(400).json({ error: 'Missing project parameter' });
173
- }
174
-
175
- if (!path.isAbsolute(projectPath)) {
176
- return res.status(400).json({ error: 'Project path must be absolute' });
177
- }
178
-
179
- if (!fs.existsSync(projectPath)) {
180
- return res.status(404).json({ error: 'Project path does not exist' });
181
- }
182
-
183
- if (!fs.existsSync(path.join(projectPath, '.git'))) {
184
- return res.status(400).json({ error: 'Not a git repository' });
185
- }
186
-
187
- // 继续执行 git 命令
188
- ```
189
-
190
- **验证方法**:
191
- ```bash
192
- # 测试恶意输入
193
- curl "http://localhost:3456/api/trace/HEAD?project=/tmp;%20rm%20-rf%20/"
194
- # 预期:返回 400 错误,不执行 rm 命令
195
- ```
196
-
197
- **回滚方案**:
198
- - Git revert
199
-
200
- ---
201
-
202
- ### Step 3: 修复 P0-3 类型安全缺失(2 天)
203
-
204
- **目标**:在 storage 层添加运行时类型校验,防止数据库返回异常数据导致崩溃
205
-
206
- **改动**:
207
-
208
- 1. **添加 Zod schema**(`src/core/storage/events.ts`)
209
- ```typescript
210
- import { z } from 'zod';
211
-
212
- const EventRowSchema = z.object({
213
- event_id: z.string(),
214
- session_id: z.string(),
215
- project_path: z.string(),
216
- timestamp: z.string(),
217
- hook_type: z.enum(['PreToolUse', 'PostToolUse', 'UserPromptSubmit', 'Stop', 'Notification']),
218
- tool_name: z.string().optional(),
219
- tool_input: z.string().optional(), // JSON string
220
- tool_output: z.string().optional(), // JSON string
221
- user_prompt: z.string().optional(),
222
- ai_response: z.string().optional(),
223
- });
224
-
225
- private rowToEvent(row: unknown): ForgeEvent {
226
- // 运行时校验
227
- const validated = EventRowSchema.parse(row);
228
-
229
- return {
230
- event_id: validated.event_id,
231
- session_id: validated.session_id,
232
- project_path: validated.project_path,
233
- timestamp: validated.timestamp,
234
- hook_type: validated.hook_type,
235
- tool_name: validated.tool_name,
236
- tool_input: validated.tool_input ? JSON.parse(validated.tool_input) : undefined,
237
- tool_output: validated.tool_output ? JSON.parse(validated.tool_output) : undefined,
238
- user_prompt: validated.user_prompt,
239
- ai_response: validated.ai_response,
240
- };
241
- }
242
- ```
243
-
244
- 2. **错误处理**
245
- ```typescript
246
- queryEvents(filter: EventFilter): ForgeEvent[] {
247
- try {
248
- const rows = this.db.prepare(sql).all(...params);
249
- return rows.map(row => this.rowToEvent(row));
250
- } catch (err) {
251
- if (err instanceof z.ZodError) {
252
- logger.error('[Storage] Invalid event row from database:', err.errors);
253
- return []; // 返回空数组而非崩溃
254
- }
255
- throw err;
256
- }
257
- }
258
- ```
259
-
260
- **验证方法**:
261
- ```bash
262
- # 运行单元测试
263
- npx vitest run tests/unit/storage.test.ts
264
-
265
- # 手动测试:插入异常数据
266
- sqlite3 ~/.claude-forge/data.db "INSERT INTO events (event_id, session_id, hook_type) VALUES ('test', 'test', 'InvalidType');"
267
- # 预期:queryEvents 返回空数组,不崩溃
268
- ```
269
-
270
- **回滚方案**:
271
- - 保留原 `rowToEvent` 为 `unsafeRowToEvent`
272
- - 如果 Zod 校验导致合法数据被拒绝,临时回退
273
-
274
- ---
275
-
276
- ### Step 4: 添加缺失的数据库索引(0.5 天)
277
-
278
- **目标**:优化高频查询性能
279
-
280
- **改动**:
281
-
282
- 1. **添加索引**(`src/core/storage/schema.sql`)
283
- ```sql
284
- -- routing_events 表:obeyed 查询优化
285
- CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed_ts
286
- ON routing_events(obeyed, ts DESC);
287
-
288
- -- events 表:session + hook_type 复合查询优化
289
- CREATE INDEX IF NOT EXISTS idx_events_session_hook
290
- ON events(session_id, hook_type, timestamp DESC);
291
-
292
- -- injections 表:session + handler 复合查询优化
293
- CREATE INDEX IF NOT EXISTS idx_injections_session_handler
294
- ON injections(session_id, source_handler);
295
- ```
296
-
297
- 2. **迁移脚本**(`src/core/storage/base.ts`)
298
- ```typescript
299
- private runMigrations(): void {
300
- // 添加索引(幂等操作)
301
- this.db.exec(`
302
- CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed_ts ON routing_events(obeyed, ts DESC);
303
- CREATE INDEX IF NOT EXISTS idx_events_session_hook ON events(session_id, hook_type, timestamp DESC);
304
- CREATE INDEX IF NOT EXISTS idx_injections_session_handler ON injections(session_id, source_handler);
305
- `);
306
- logger.info('[SQLiteStorage] Performance indexes created');
307
- }
308
- ```
309
-
310
- **验证方法**:
311
- ```bash
312
- # 检查索引
313
- sqlite3 ~/.claude-forge/data.db "SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_%';"
314
-
315
- # 验证查询计划
316
- sqlite3 ~/.claude-forge/data.db "EXPLAIN QUERY PLAN SELECT * FROM routing_events WHERE obeyed IS NULL ORDER BY ts DESC;"
317
- # 预期:SEARCH routing_events USING INDEX idx_routing_events_obeyed_ts
318
- ```
319
-
320
- ---
321
-
322
- ### Step 5: 补充核心模块单元测试(5 天)
323
-
324
- **目标**:测试覆盖率从 0% 提升到 50%
325
-
326
- **改动**:
327
-
328
- 1. **测试工具函数**(`tests/helpers/mock-storage.ts`)
329
- ```typescript
330
- import Database from 'better-sqlite3';
331
- import { SQLiteStorage } from '../../src/core/storage/sqlite.js';
332
- import { tmpdir } from 'node:os';
333
- import { join } from 'node:path';
334
- import { randomUUID } from 'node:crypto';
335
-
336
- export function createMockStorage(): SQLiteStorage {
337
- const dbPath = join(tmpdir(), `test-${randomUUID()}.db`);
338
- return new SQLiteStorage(dbPath);
339
- }
340
-
341
- export function cleanupMockStorage(storage: SQLiteStorage): void {
342
- const dbPath = storage.getDbPath();
343
- storage.close();
344
- if (fs.existsSync(dbPath)) {
345
- fs.unlinkSync(dbPath);
346
- }
347
- }
348
- ```
349
-
350
- 2. **Storage 测试**(`tests/unit/storage.test.ts`)
351
- - 测试 `writeEvent` / `queryEvents` / `upsertSession`
352
- - 测试事务处理
353
- - 测试并发写入
354
- - 测试索引生效
355
-
356
- 3. **Router 测试**(`tests/unit/router.test.ts`)
357
- - 测试事件路由逻辑
358
- - 测试类型守卫
359
- - 测试错误边界
360
-
361
- 4. **Type Guards 测试**(`tests/unit/type-guards.test.ts`)
362
- - 测试所有类型守卫函数
363
- - 测试边界情况(缺失字段、错误类型)
364
-
365
- **验证方法**:
366
- ```bash
367
- # 运行测试
368
- npm test
369
-
370
- # 生成覆盖率报告
371
- npm test -- --coverage
372
-
373
- # 检查覆盖率
374
- cat coverage/coverage-summary.json | jq '.total.lines.pct'
375
- # 预期:>= 50
376
- ```
377
-
378
- ---
379
-
380
- ### Step 6: 统一错误处理 + 请求体限制(1 天)
381
-
382
- **目标**:提升 daemon 和 Web 服务稳定性
383
-
384
- **改动**:
385
-
386
- 1. **添加错误边界**(`src/daemon/router.ts`)
387
- ```typescript
388
- export async function routeEvent(event: ForgeEvent, handlers: Handlers): Promise<HookResult | void> {
389
- try {
390
- if (isUserPromptSubmit(event)) return await handlers.UserPromptSubmit.handle(event);
391
- if (isPostToolUse(event)) return await handlers.PostToolUse.handle(event);
392
- if (isStop(event)) return await handlers.Stop.handle(event);
393
- } catch (err) {
394
- logger.error(`[Router] Handler failed for ${event.hook_type}:`, err);
395
- return { allow: true }; // 默认放行,避免阻塞 Claude Code
396
- }
397
- }
398
- ```
399
-
400
- 2. **统一错误处理中间件**(`src/web/routes/error-handler.ts`)
401
- ```typescript
402
- export function errorHandler(err: Error, req: Request, res: Response, next: NextFunction) {
403
- logger.error(`[API Error] ${req.method} ${req.path}:`, err);
404
-
405
- const statusCode = (err as any).statusCode || 500;
406
- const errorCode = (err as any).code || 'INTERNAL_ERROR';
407
-
408
- res.status(statusCode).json({
409
- error: {
410
- code: errorCode,
411
- message: err.message,
412
- }
413
- });
414
- }
415
- ```
416
-
417
- 3. **请求体大小限制**(`src/web/server.ts`)
418
- ```typescript
419
- this.app.use(express.json({ limit: '1mb' }));
420
- this.app.use(express.urlencoded({ extended: true, limit: '1mb' }));
421
- ```
422
-
423
- **验证方法**:
424
- ```bash
425
- # 测试大请求体
426
- curl -X POST http://localhost:3456/api/patch/preview \
427
- -H "Content-Type: application/json" \
428
- -d "$(python3 -c 'print("{\"data\": \"" + "A"*2000000 + "\"}")')"
429
- # 预期:返回 413 Payload Too Large
430
- ```
431
-
432
- ---
433
-
434
- ## 5. 风险点与缓解措施
435
-
436
- ### 5.1 高风险改动
437
-
438
- | 改动 | 风险 | 缓解措施 |
439
- |---|---|---|
440
- | 路径校验逻辑 | 可能拒绝合法路径 | 保留旧函数作为 fallback;充分测试 |
441
- | Zod 运行时校验 | 性能开销 | 仅在边界层使用;缓存 schema |
442
- | 错误边界 | 可能隐藏真实错误 | 详细日志记录;监控错误率 |
443
-
444
- ### 5.2 回滚策略
445
-
446
- - 所有改动通过 Git 管理,可快速 revert
447
- - 关键改动保留旧代码为 `unsafe*` 或 `legacy*` 函数
448
- - 测试失败立即停止部署
449
-
450
- ---
451
-
452
- ## 6. 测试策略
453
-
454
- ### 6.1 单元测试覆盖目标
455
-
456
- | 模块 | 当前覆盖率 | 目标覆盖率 | 优先级 |
457
- |---|---|---|---|
458
- | `src/core/storage/` | 0% | 60% | P0 |
459
- | `src/daemon/router.ts` | 0% | 70% | P0 |
460
- | `src/core/types.ts` (type guards) | 0% | 80% | P0 |
461
- | `src/web/routes/` | 0% | 40% | P1 |
462
-
463
- ### 6.2 集成测试场景
464
-
465
- 1. **端到端事件流**
466
- - UserPromptSubmit → Router → Handler → Storage
467
- - 验证事件正确写入数据库
468
-
469
- 2. **安全漏洞回归测试**
470
- - 路径遍历攻击
471
- - Git 命令注入
472
- - 类型错误注入
473
-
474
- 3. **性能测试**
475
- - 索引生效验证
476
- - 并发写入测试
477
-
478
- ---
479
-
480
- ## 7. 验收标准
481
-
482
- ### 7.1 功能验收
483
-
484
- - ✅ 所有现有功能正常(回归测试通过)
485
- - ✅ daemon 启动正常
486
- - ✅ Web 仪表盘正常访问
487
- - ✅ CLI 命令正常执行
488
-
489
- ### 7.2 安全验收
490
-
491
- - ✅ 路径遍历攻击被拦截(返回 400)
492
- - ✅ Git 命令注入被拦截(返回 400)
493
- - ✅ 异常数据不导致崩溃(返回空数组或错误)
494
-
495
- ### 7.3 性能验收
496
-
497
- - ✅ 索引创建成功(`EXPLAIN QUERY PLAN` 显示使用索引)
498
- - ✅ 查询性能提升(对比修改前后的查询时间)
499
-
500
- ### 7.4 测试验收
501
-
502
- - ✅ 单元测试覆盖率 >= 50%
503
- - ✅ 所有测试通过
504
- - ✅ CI 流程正常运行
505
-
506
- ---
507
-
508
- ## 8. 时间估算
509
-
510
- | 步骤 | 工作量(天) | 依赖 |
511
- |---|---|---|
512
- | Step 1: 路径遍历漏洞 | 1 | 无 |
513
- | Step 2: Git 命令注入 | 1 | 无 |
514
- | Step 3: 类型安全 | 2 | 无 |
515
- | Step 4: 数据库索引 | 0.5 | 无 |
516
- | Step 5: 单元测试 | 5 | Step 1-4 完成后 |
517
- | Step 6: 错误处理 | 1 | 无 |
518
- | **总计** | **10.5 天** | - |
519
-
520
- **缓冲时间**:1.5 天(应对意外问题)
521
- **总工作量**:12 天(约 2 周)
522
-
523
- ---
524
-
525
- ## 9. 里程碑
526
-
527
- | 日期 | 里程碑 | 交付物 |
528
- |---|---|---|
529
- | 2026-05-17 | P0 安全漏洞修复完成 | 3 个漏洞修复 + 回归测试 |
530
- | 2026-05-20 | 基础设施改进完成 | 索引 + 错误处理 + 请求体限制 |
531
- | 2026-05-27 | 单元测试完成 | 覆盖率 >= 50% |
532
- | 2026-05-29 | 第 1 迭代验收 | 所有验收标准通过 |
533
-
534
- ---
535
-
536
- ## 10. 下一步
537
-
538
- **Phase 1.5: User Review**
539
-
540
- 请 review 本方案后回复:
541
- - **"批准"** / **"approve"** → spawn coder 开始实施
542
- - **"修改 [意见]"** → 调整 spec
543
- - **"取消"** → 停止任务