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