@winspan/claude-forge 8.53.2 → 8.54.4

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