@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,205 +0,0 @@
1
- /**
2
- * E2E 测试:管理后台 Dashboard
3
- *
4
- * 运行前提:
5
- * 1. 安装 Playwright: npm install -D @playwright/test
6
- * 2. 启动守护进程: claude-forge daemon start
7
- * 3. 运行测试: npm run test:e2e
8
- */
9
-
10
- import { test, expect } from '@playwright/test';
11
-
12
- const BASE_URL = 'http://localhost:3721';
13
-
14
- test.describe('Dashboard 页面', () => {
15
- test('应该正确加载并显示统计卡片', async ({ page }) => {
16
- await page.goto(BASE_URL);
17
-
18
- // 等待页面加载
19
- await page.waitForSelector('#dash-stats');
20
-
21
- // 检查统计卡片是否存在
22
- await expect(page.locator('.stat-card')).toHaveCount(4);
23
-
24
- // 检查守护进程状态
25
- const status = await page.locator('#daemon-status').textContent();
26
- expect(['运行中', '离线', '检查中']).toContain(status);
27
- });
28
-
29
- test('应该显示近 7 天活动图表', async ({ page }) => {
30
- await page.goto(BASE_URL);
31
-
32
- // 检查图表容器
33
- await expect(page.locator('#chart-activity')).toBeVisible();
34
- await expect(page.locator('#chart-tools')).toBeVisible();
35
- });
36
-
37
- test('应该显示最近会话列表', async ({ page }) => {
38
- await page.goto(BASE_URL);
39
-
40
- // 检查会话列表容器
41
- await expect(page.locator('#dash-sessions')).toBeVisible();
42
- });
43
- });
44
-
45
- test.describe('Sessions 页面', () => {
46
- test('应该正确加载会话列表', async ({ page }) => {
47
- await page.goto(BASE_URL);
48
-
49
- // 点击 Sessions 导航
50
- await page.click('#nav-sessions');
51
-
52
- // 等待页面切换
53
- await page.waitForSelector('#page-sessions.active');
54
-
55
- // 检查搜索框
56
- await expect(page.locator('#sessions-search')).toBeVisible();
57
-
58
- // 检查列表容器
59
- await expect(page.locator('#sessions-list')).toBeVisible();
60
- });
61
-
62
- test('搜索功能应该正常工作', async ({ page }) => {
63
- await page.goto(BASE_URL);
64
- await page.click('#nav-sessions');
65
- await page.waitForSelector('#page-sessions.active');
66
-
67
- // 输入搜索关键词
68
- await page.fill('#sessions-search', 'test');
69
-
70
- // 等待搜索结果更新(通过 oninput 触发)
71
- await page.waitForTimeout(300);
72
-
73
- // 验证搜索框有值
74
- const searchValue = await page.inputValue('#sessions-search');
75
- expect(searchValue).toBe('test');
76
- });
77
-
78
- test('点击会话应该打开详情抽屉', async ({ page }) => {
79
- await page.goto(BASE_URL);
80
- await page.click('#nav-sessions');
81
- await page.waitForSelector('#page-sessions.active');
82
-
83
- // 等待会话列表加载
84
- await page.waitForTimeout(500);
85
-
86
- // 如果有会话,点击第一个
87
- const firstSession = page.locator('.list-item').first();
88
- if (await firstSession.isVisible()) {
89
- await firstSession.click();
90
-
91
- // 检查抽屉是否打开
92
- await expect(page.locator('#drawer.open')).toBeVisible();
93
- await expect(page.locator('#drawer-title')).toContainText('会话');
94
- }
95
- });
96
- });
97
-
98
- test.describe('Events 页面', () => {
99
- test('应该正确加载事件列表', async ({ page }) => {
100
- await page.goto(BASE_URL);
101
- await page.click('#nav-events');
102
- await page.waitForSelector('#page-events.active');
103
-
104
- // 检查搜索框和筛选器
105
- await expect(page.locator('#events-search')).toBeVisible();
106
- await expect(page.locator('#events-type')).toBeVisible();
107
-
108
- // 检查表格
109
- await expect(page.locator('#events-body')).toBeVisible();
110
- });
111
-
112
- test('类型筛选应该正常工作', async ({ page }) => {
113
- await page.goto(BASE_URL);
114
- await page.click('#nav-events');
115
- await page.waitForSelector('#page-events.active');
116
-
117
- // 选择筛选类型
118
- await page.selectOption('#events-type', 'PreToolUse');
119
-
120
- // 等待筛选结果更新
121
- await page.waitForTimeout(300);
122
-
123
- // 验证筛选器有值
124
- const selectedValue = await page.inputValue('#events-type');
125
- expect(selectedValue).toBe('PreToolUse');
126
- });
127
- });
128
-
129
- test.describe('Injections 页面', () => {
130
- test('应该正确加载注入列表', async ({ page }) => {
131
- await page.goto(BASE_URL);
132
- await page.click('#nav-injections');
133
- await page.waitForSelector('#page-injections.active');
134
-
135
- // 检查搜索框和筛选器
136
- await expect(page.locator('#inj-search')).toBeVisible();
137
- await expect(page.locator('#inj-handler')).toBeVisible();
138
-
139
- // 检查列表容器
140
- await expect(page.locator('#inj-list')).toBeVisible();
141
- });
142
- });
143
-
144
- test.describe('Rules 页面', () => {
145
- test('应该正确加载规则列表', async ({ page }) => {
146
- await page.goto(BASE_URL);
147
- await page.click('#nav-rules');
148
- await page.waitForSelector('#page-rules.active');
149
-
150
- // 检查搜索框
151
- await expect(page.locator('#rules-search')).toBeVisible();
152
-
153
- // 检查列表容器
154
- await expect(page.locator('#rules-list')).toBeVisible();
155
- });
156
- });
157
-
158
- test.describe('Live 页面', () => {
159
- test('应该正确加载实时监控页面', async ({ page }) => {
160
- await page.goto(BASE_URL);
161
- await page.click('#nav-live');
162
- await page.waitForSelector('#page-live.active');
163
-
164
- // 检查状态和按钮
165
- await expect(page.locator('#live-status')).toBeVisible();
166
- await expect(page.locator('#live-btn')).toBeVisible();
167
-
168
- // 检查日志容器
169
- await expect(page.locator('#live-log')).toBeVisible();
170
- });
171
- });
172
-
173
- test.describe('导航功能', () => {
174
- test('所有导航链接应该正常工作', async ({ page }) => {
175
- await page.goto(BASE_URL);
176
-
177
- const navItems = [
178
- { id: 'nav-dashboard', pageId: 'page-dashboard' },
179
- { id: 'nav-sessions', pageId: 'page-sessions' },
180
- { id: 'nav-events', pageId: 'page-events' },
181
- { id: 'nav-injections', pageId: 'page-injections' },
182
- { id: 'nav-live', pageId: 'page-live' },
183
- { id: 'nav-rules', pageId: 'page-rules' }
184
- ];
185
-
186
- for (const item of navItems) {
187
- await page.click(`#${item.id}`);
188
- await page.waitForSelector(`#${item.pageId}.active`);
189
- await expect(page.locator(`#${item.pageId}`)).toHaveClass(/active/);
190
- }
191
- });
192
-
193
- test('刷新按钮应该正常工作', async ({ page }) => {
194
- await page.goto(BASE_URL);
195
-
196
- // 点击刷新按钮
197
- await page.click('button:has-text("刷新")');
198
-
199
- // 等待页面重新加载
200
- await page.waitForTimeout(500);
201
-
202
- // 验证页面仍然可见
203
- await expect(page.locator('#dash-stats')).toBeVisible();
204
- });
205
- });
@@ -1,39 +0,0 @@
1
- /**
2
- * E2E Test Suite: Routing & Skill Invocation Verification
3
- *
4
- * Tests the complete chain:
5
- * 1. UserPrompt → Classifier → AgentRouter → routing_events
6
- * 2. Agent execution → skill_invoke MCP call → skill_invocations
7
- * 3. Data integrity: obeyed tracking, route_request_id linkage
8
- *
9
- * Prerequisites:
10
- * - Daemon must be running (claude-forge daemon start)
11
- * - Database at ~/.claude-forge/data.db
12
- * - MCP server mounted at http://127.0.0.1:3721/mcp
13
- */
14
-
15
- import { describe, it, expect, beforeAll } from 'vitest';
16
- import { readFileSync } from 'node:fs';
17
- import { join } from 'node:path';
18
- import { FORGE_PATHS } from '../../src/core/constants.js';
19
- import { SQLiteStorage } from '../../src/core/storage/sqlite.js';
20
-
21
- const DAEMON_TOKEN_PATH = join(FORGE_PATHS.home(), 'daemon.token');
22
- const DB_PATH = FORGE_PATHS.database();
23
-
24
- describe('E2E: Routing & Skill Invocation', () => {
25
- let storage: SQLiteStorage;
26
- let daemonToken: string;
27
-
28
- beforeAll(() => {
29
- // Read daemon token for MCP auth
30
- try {
31
- daemonToken = readFileSync(DAEMON_TOKEN_PATH, 'utf-8').trim();
32
- } catch (err) {
33
- throw new Error(
34
- `Cannot read daemon token at ${DAEMON_TOKEN_PATH}. ` +
35
- `Is the daemon running? Run: claude-forge daemon start`
36
- );
37
- }
38
-
39
- // Connect to live database
@@ -1,92 +0,0 @@
1
- import type { AIProvider } from '../../src/core/ai/provider.js';
2
-
3
- /**
4
- * Mock AI Provider for testing
5
- */
6
- export class MockAIProvider implements AIProvider {
7
- private responses: string[] = [];
8
- private currentIndex = 0;
9
- public callHistory: Array<{ prompt: string; options?: Record<string, unknown> }> = [];
10
-
11
- constructor(responses: string[] = ['mock response']) {
12
- this.responses = responses;
13
- }
14
-
15
- async complete(prompt: string, options?: { maxTokens?: number; temperature?: number }): Promise<string> {
16
- this.callHistory.push({ prompt, options });
17
-
18
- if (this.currentIndex >= this.responses.length) {
19
- return this.responses[this.responses.length - 1] || 'default mock response';
20
- }
21
-
22
- const response = this.responses[this.currentIndex];
23
- this.currentIndex++;
24
- return response;
25
- }
26
-
27
- /**
28
- * Add more responses to the queue
29
- */
30
- addResponse(response: string): void {
31
- this.responses.push(response);
32
- }
33
-
34
- /**
35
- * Reset the provider state
36
- */
37
- reset(): void {
38
- this.currentIndex = 0;
39
- this.callHistory = [];
40
- }
41
-
42
- /**
43
- * Get the number of times complete() was called
44
- */
45
- getCallCount(): number {
46
- return this.callHistory.length;
47
- }
48
-
49
- /**
50
- * Get the last prompt sent to complete()
51
- */
52
- getLastPrompt(): string | undefined {
53
- return this.callHistory[this.callHistory.length - 1]?.prompt;
54
- }
55
- }
56
-
57
- /**
58
- * Create a mock AI provider that always returns the same response
59
- */
60
- export function createMockAI(response: string = 'mock response'): MockAIProvider {
61
- return new MockAIProvider([response]);
62
- }
63
-
64
- /**
65
- * Create a mock AI provider with multiple responses (returns them in sequence)
66
- */
67
- export function createMockAIWithResponses(responses: string[]): MockAIProvider {
68
- return new MockAIProvider(responses);
69
- }
70
-
71
- /**
72
- * Create a mock AI provider that throws an error
73
- */
74
- export function createFailingMockAI(errorMessage: string = 'Mock AI error'): AIProvider {
75
- return {
76
- async complete(): Promise<string> {
77
- throw new Error(errorMessage);
78
- },
79
- };
80
- }
81
-
82
- /**
83
- * Create a mock AI provider that simulates slow responses
84
- */
85
- export function createSlowMockAI(response: string = 'slow response', delayMs: number = 100): AIProvider {
86
- return {
87
- async complete(): Promise<string> {
88
- await new Promise(resolve => setTimeout(resolve, delayMs));
89
- return response;
90
- },
91
- };
92
- }
@@ -1,159 +0,0 @@
1
- import Database from 'better-sqlite3';
2
- import type { ForgeEvent } from '../../src/core/types.js';
3
- import fs from 'node:fs';
4
- import path from 'node:path';
5
- import { tmpdir } from 'node:os';
6
-
7
- /**
8
- * Create a temporary in-memory SQLite database for testing
9
- */
10
- export function createMockDatabase(): Database.Database {
11
- const db = new Database(':memory:');
12
-
13
- // Create minimal schema
14
- db.exec(`
15
- CREATE TABLE IF NOT EXISTS events (
16
- event_id TEXT PRIMARY KEY,
17
- session_id TEXT NOT NULL,
18
- project_path TEXT NOT NULL,
19
- timestamp TEXT NOT NULL,
20
- hook_type TEXT NOT NULL,
21
- tool_name TEXT,
22
- tool_input TEXT,
23
- tool_output TEXT,
24
- user_prompt TEXT,
25
- ai_response TEXT,
26
- distilled INTEGER DEFAULT 0,
27
- created_at TEXT DEFAULT (datetime('now'))
28
- );
29
-
30
- CREATE TABLE IF NOT EXISTS sessions (
31
- session_id TEXT PRIMARY KEY,
32
- project_path TEXT NOT NULL,
33
- status TEXT NOT NULL DEFAULT 'active',
34
- first_prompt TEXT,
35
- start_time TEXT NOT NULL,
36
- end_time TEXT,
37
- last_event_time TEXT,
38
- event_count INTEGER DEFAULT 0,
39
- created_at TEXT DEFAULT (datetime('now')),
40
- updated_at TEXT DEFAULT (datetime('now'))
41
- );
42
-
43
- CREATE TABLE IF NOT EXISTS routing_events (
44
- id INTEGER PRIMARY KEY AUTOINCREMENT,
45
- session_id TEXT NOT NULL,
46
- route_request_id TEXT,
47
- project_path TEXT NOT NULL,
48
- ts INTEGER NOT NULL,
49
- prompt TEXT NOT NULL,
50
- intent_json TEXT NOT NULL,
51
- routed_to_type TEXT,
52
- routed_to_name TEXT,
53
- is_forced INTEGER DEFAULT 0,
54
- obeyed INTEGER,
55
- classification_ms INTEGER
56
- );
57
-
58
- CREATE TABLE IF NOT EXISTS injections (
59
- id TEXT PRIMARY KEY,
60
- event_id TEXT,
61
- session_id TEXT NOT NULL,
62
- timestamp TEXT NOT NULL,
63
- source_handler TEXT NOT NULL,
64
- injection_type TEXT NOT NULL,
65
- content TEXT NOT NULL,
66
- created_at TEXT DEFAULT (datetime('now'))
67
- );
68
-
69
- CREATE INDEX idx_events_session ON events(session_id);
70
- CREATE INDEX idx_events_timestamp ON events(timestamp DESC);
71
- CREATE INDEX idx_sessions_project ON sessions(project_path);
72
- CREATE INDEX idx_routing_events_session ON routing_events(session_id);
73
- CREATE INDEX idx_injections_session ON injections(session_id);
74
- `);
75
-
76
- return db;
77
- }
78
-
79
- /**
80
- * Create a temporary file-based database for testing
81
- */
82
- export function createTempDatabase(): { db: Database.Database; path: string; cleanup: () => void } {
83
- const dbPath = path.join(tmpdir(), `test-${Date.now()}-${Math.random().toString(36).slice(2)}.db`);
84
- const db = createMockDatabase();
85
-
86
- const cleanup = () => {
87
- try {
88
- db.close();
89
- if (fs.existsSync(dbPath)) {
90
- fs.unlinkSync(dbPath);
91
- }
92
- } catch (err) {
93
- // Ignore cleanup errors
94
- }
95
- };
96
-
97
- return { db, path: dbPath, cleanup };
98
- }
99
-
100
- /**
101
- * Create mock ForgeEvent for testing
102
- */
103
- export function createMockEvent(overrides?: Partial<ForgeEvent>): ForgeEvent {
104
- return {
105
- event_id: `event-${Date.now()}-${Math.random().toString(36).slice(2)}`,
106
- session_id: 'test-session',
107
- project_path: '/test/project',
108
- timestamp: new Date().toISOString(),
109
- hook_type: 'UserPromptSubmit',
110
- user_prompt: 'test prompt',
111
- ...overrides,
112
- };
113
- }
114
-
115
- /**
116
- * Insert mock events into database
117
- */
118
- export function insertMockEvents(db: Database.Database, events: ForgeEvent[]): void {
119
- const stmt = db.prepare(`
120
- INSERT INTO events (event_id, session_id, project_path, timestamp, hook_type,
121
- tool_name, tool_input, tool_output, user_prompt, ai_response, distilled)
122
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
123
- `);
124
-
125
- for (const event of events) {
126
- stmt.run(
127
- event.event_id || `event-${Date.now()}`,
128
- event.session_id,
129
- event.project_path,
130
- event.timestamp,
131
- event.hook_type,
132
- event.tool_name ?? null,
133
- event.tool_input ? JSON.stringify(event.tool_input) : null,
134
- event.tool_output ? JSON.stringify(event.tool_output) : null,
135
- event.user_prompt ?? null,
136
- event.ai_response ?? null,
137
- );
138
- }
139
- }
140
-
141
- /**
142
- * Query all events from database
143
- */
144
- export function queryAllEvents(db: Database.Database): ForgeEvent[] {
145
- const rows = db.prepare('SELECT * FROM events ORDER BY timestamp DESC').all() as Array<Record<string, unknown>>;
146
-
147
- return rows.map(row => ({
148
- event_id: row.event_id as string,
149
- session_id: row.session_id as string,
150
- project_path: row.project_path as string,
151
- timestamp: row.timestamp as string,
152
- hook_type: row.hook_type as ForgeEvent['hook_type'],
153
- tool_name: (row.tool_name as string) || undefined,
154
- tool_input: row.tool_input ? JSON.parse(row.tool_input as string) : undefined,
155
- tool_output: row.tool_output ? JSON.parse(row.tool_output as string) : undefined,
156
- user_prompt: (row.user_prompt as string) || undefined,
157
- ai_response: (row.ai_response as string) || undefined,
158
- }));
159
- }
@@ -1,90 +0,0 @@
1
- /**
2
- * Integration test for ClaudeMdGenerator — safety-net for L1 SWARM_PROTOCOL extraction.
3
- *
4
- * Anchors the SWARM section content (open → projectContent boundary) via SHA256
5
- * so that the .md file extraction must produce byte-for-byte identical output.
6
- */
7
-
8
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
9
- import { mkdtempSync, rmSync } from 'node:fs';
10
- import { tmpdir } from 'node:os';
11
- import { join } from 'node:path';
12
- import { createHash } from 'node:crypto';
13
- import { ClaudeMdGenerator } from '../../src/claudemd/claudemd-generator.js';
14
-
15
- // SWARM section SHA256, captured against the literal-string implementation
16
- // before extracting to swarm-protocol.md. After extraction, this MUST stay equal.
17
- const SWARM_SECTION_SHA256 =
18
- '260dfe1e48fdecc324419a6330428eaa3597e3fd6e6262cf66cdcf301ca32e18';
19
-
20
- /**
21
- * Minimal stub for ClaudeProvider — only `complete` is exercised by generate().
22
- */
23
- function makeFailingAi(): any {
24
- return {
25
- complete: async () => {
26
- throw new Error('forced AI failure (safety-net)');
27
- },
28
- };
29
- }
30
-
31
- describe('ClaudeMdGenerator (safety-net)', () => {
32
- let tmpDir: string;
33
-
34
- beforeEach(() => {
35
- tmpDir = mkdtempSync(join(tmpdir(), 'claudemd-gen-'));
36
- });
37
-
38
- afterEach(() => {
39
- rmSync(tmpDir, { recursive: true, force: true });
40
- });
41
-
42
- it('generates fallback CLAUDE.md containing all SWARM_PROTOCOL anchors', async () => {
43
- const gen = new ClaudeMdGenerator(makeFailingAi());
44
- const output = await gen.generate(tmpDir);
45
-
46
- // ── Key field anchors (SWARM section) ──────────────────────────────
47
- expect(output).toContain('# claude-forge 工作区规范');
48
- expect(output).toContain('## 自检');
49
- expect(output).toContain('Two-Phase Workflow');
50
- expect(output).toContain('harness-hotfix');
51
- expect(output).toContain('refactor-safe');
52
- expect(output).toContain('hybrid-feature-with-safety');
53
-
54
- // ── Total line count ≥ 200 (SWARM ~223 lines + fallback) ───────────
55
- const lineCount = output.split('\n').length;
56
- expect(lineCount).toBeGreaterThanOrEqual(200);
57
- });
58
-
59
- it('SWARM section hash is stable across literal/file-loaded implementations', async () => {
60
- const gen = new ClaudeMdGenerator(makeFailingAi());
61
- const output = await gen.generate(tmpDir);
62
-
63
- // Split SWARM from projectContent: fallback always starts with sectionOverview ("## 项目概述").
64
- // SWARM_PROTOCOL ends with "\n" + "\n\n" separator, so the boundary is the first
65
- // "\n\n## 项目概述" occurrence — everything before that is the SWARM section.
66
- const boundary = output.indexOf('\n\n## 项目概述');
67
- expect(boundary).toBeGreaterThan(0);
68
-
69
- // Include the trailing newline of SWARM_PROTOCOL (it ends with `\n`), exclude the `\n\n` separator.
70
- const swarmSection = output.slice(0, boundary + 1);
71
-
72
- const hash = createHash('sha256').update(swarmSection, 'utf-8').digest('hex');
73
-
74
- // Print for first-run baseline capture (visible with --reporter=verbose).
75
- // eslint-disable-next-line no-console
76
- console.log('[safety-net] SWARM_SECTION_SHA256 =', hash);
77
- // eslint-disable-next-line no-console
78
- console.log('[safety-net] SWARM section length =', swarmSection.length, 'bytes');
79
-
80
- // Sanity: SWARM section must be substantial.
81
- expect(swarmSection.length).toBeGreaterThan(4000);
82
- expect(swarmSection.startsWith('# claude-forge 工作区规范')).toBe(true);
83
- expect(swarmSection.endsWith('(由 daemon 自动更新,记录最近任务上下文)\n\n')).toBe(true);
84
-
85
- // If a known hash is set (non-placeholder), assert equality.
86
- // The placeholder below is the all-zero-ish string used on first run; replaced
87
- // automatically by the orchestration script once baseline is captured.
88
- expect(hash).toBe(SWARM_SECTION_SHA256);
89
- });
90
- });