@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,297 +0,0 @@
1
- # AI 辅助 official skill 升级 Spec
2
-
3
- ## 目标
4
-
5
- 为 `claude-forge` 新增 `cf skills upgrade` 命令,通过 AI 评估将外部开源 skill 仓库(addyosmani/agent-skills、obra/superpowers)的优质内容合并进 `src/skills/official/*.md`(永久内置 skill),而不是让它们在用户目录独立存在。整个流程默认 dry-run,用户审核 markdown 报告后执行 `--apply`。
6
-
7
- ## 用户决策(已通过对话确认)
8
-
9
- | 决策点 | 确认值 |
10
- |--------|--------|
11
- | 候选源目录 | `~/.claude-forge/skill-candidates/<source-name>/` |
12
- | AI 评估使用 | `config.ai.model` + `config.ai.base_url` |
13
- | 覆盖目标 | `src/skills/official/*.md`(编译进 dist 的永久内置) |
14
- | 报告路径 | `~/.claude-forge/skill-upgrade-report.md` |
15
- | 默认行为 | dry-run(只生成报告) |
16
- | `--apply` 行为 | 读取报告中 action,备份后覆写源码 |
17
- | 备份路径 | `~/.claude-forge/backups/skills/<timestamp>/`(已有 FORGE_PATHS.backups('skills')) |
18
-
19
- ## 数据流图
20
-
21
- ```
22
- [cf skills upgrade]
23
-
24
-
25
- [1] pullCandidates()
26
- ├─ git clone/pull ~/.claude-forge/skill-candidates/agent-skills/
27
- └─ git clone/pull ~/.claude-forge/skill-candidates/superpowers/
28
-
29
-
30
- [2] scanCandidateFiles()
31
- └─ 遍历 .md 文件,解析 frontmatter → CandidateSkill[]
32
-
33
-
34
- [3] matchToOfficial() (per candidate)
35
- └─ tag/keyword 模糊匹配 → MatchResult (official id | null)
36
-
37
-
38
- [4] evaluateWithAI() (有 official 匹配时才调用)
39
- └─ ClaudeProvider.complete() → UpgradeDecision (JSON)
40
-
41
-
42
- [5] generateReport()
43
- └─ ~/.claude-forge/skill-upgrade-report.md
44
-
45
- ▼ (用户审核)
46
-
47
- [cf skills upgrade --apply]
48
-
49
-
50
- [6] applyDecisions()
51
- ├─ git status 工作树检查
52
- ├─ backup src/skills/official/ → backups/skills/<ts>/
53
- └─ 覆写 src/skills/official/<id>.md
54
- ```
55
-
56
- ## 模块设计
57
-
58
- ### Module 1: `src/skills/upgrade-engine.ts`
59
-
60
- **职责**:编排全流程,不含 AI prompt 字符串逻辑。
61
-
62
- ```ts
63
- export interface CandidateSkill {
64
- id: string;
65
- source: string; // 'agent-skills' | 'superpowers'
66
- filePath: string;
67
- name: string;
68
- description: string;
69
- keywords: string[];
70
- content: string;
71
- }
72
-
73
- export interface MatchResult {
74
- officialId: string;
75
- score: number; // 0-100,关键词重叠率
76
- }
77
-
78
- export type UpgradeAction = 'upgrade' | 'merge' | 'skip';
79
- export interface UpgradeDecision {
80
- action: UpgradeAction;
81
- confidence: number; // 0-100
82
- reasoning: string;
83
- merged_content: string | null;
84
- }
85
-
86
- export interface ReportEntry {
87
- officialId: string;
88
- candidateId: string;
89
- candidateSource: string;
90
- action: UpgradeAction | 'error' | 'needs_review';
91
- confidence: number;
92
- reasoning: string;
93
- candidateFilePath: string;
94
- merged_content: string | null;
95
- }
96
-
97
- export async function pullCandidates(
98
- sources: Array<{ name: string; url: string }>,
99
- candidatesDir: string,
100
- ): Promise<CandidateSkill[]>
101
-
102
- export function matchToOfficial(
103
- candidate: CandidateSkill,
104
- officialSkills: OfficialSkill[],
105
- ): MatchResult | null // null = 无匹配(score < 30)
106
-
107
- export async function evaluateWithAI(
108
- candidate: CandidateSkill,
109
- official: OfficialSkill,
110
- aiProvider: ClaudeProvider,
111
- ): Promise<UpgradeDecision>
112
-
113
- export async function generateReport(
114
- entries: ReportEntry[],
115
- outputPath: string,
116
- stats: { total: number; matched: number; unmatched: number },
117
- ): Promise<void>
118
-
119
- export async function applyDecisions(
120
- reportPath: string,
121
- officialDir: string,
122
- backupBaseDir: string,
123
- ): Promise<{ applied: number; skipped: number; backupPath: string }>
124
- ```
125
-
126
- **关键逻辑**:
127
- - `pullCandidates`:单源失败 try/catch 跳过
128
- - `matchToOfficial`:keywords + name token overlap,阈值 30 分(满分 100)
129
- - `evaluateWithAI`:`maxTokens: 1200, timeoutMs: 45000`;JSON 解析失败返回 skip + needs_review
130
- - `applyDecisions`:apply 前 `git status --porcelain` 检查工作树是否干净,脏的话 abort
131
-
132
- ### Module 2: `src/skills/upgrade-prompt.ts`
133
-
134
- ```ts
135
- export function buildEvaluationPrompt(
136
- candidate: CandidateSkill,
137
- official: OfficialSkill,
138
- ): { system: string; user: string }
139
- ```
140
-
141
- **System prompt 要点**:
142
- ```
143
- 你是 Claude Code skill 内容评估专家。
144
- 评估维度:主题重叠度 / 内容质量 / 互补性
145
- 返回严格 JSON(不含其他文本):
146
- {"action":"upgrade|merge|skip","confidence":0-100,"reasoning":"...","merged_content":null或合并后完整md}
147
-
148
- 决策标准:
149
- - skip:主题不重叠,或 official 已完整覆盖
150
- - upgrade:候选覆盖 official 全部要点且质量明显更高(+30% depth/breadth)
151
- - merge:主题相同但各有独特章节,合并后价值更高
152
- ```
153
-
154
- **User prompt**:双 skill 内容各截 2000 字 + JSON 要求。
155
-
156
- ### Module 3: 候选源拉取
157
-
158
- ```ts
159
- const DEFAULT_SOURCES = [
160
- { name: 'agent-skills', url: 'https://github.com/addyosmani/agent-skills.git' },
161
- { name: 'superpowers', url: 'https://github.com/obra/superpowers.git' },
162
- ];
163
- ```
164
-
165
- **扫描兼容**:
166
- - agent-skills 格式:`<name>/SKILL.md`(目录格式)
167
- - superpowers 格式:顶层 `*.md`(平铺)
168
- - 复用 `SkillRegistry.scan()` 的格式识别逻辑
169
-
170
- ### Module 4: CLI 子命令
171
-
172
- ```ts
173
- skills
174
- .command('upgrade')
175
- .description('AI-assisted upgrade of official skills (dry-run by default)')
176
- .option('--apply', 'Apply decisions from the last report')
177
- .option('--rollback <timestamp>', 'Rollback to a backup')
178
- .option('--report <path>', 'Custom report path')
179
- .action(async (options) => { await upgradeSkills(options); });
180
- ```
181
-
182
- ## AI 输出契约
183
-
184
- ```ts
185
- type UpgradeDecision = {
186
- action: 'upgrade' | 'merge' | 'skip';
187
- confidence: number; // 0-100 整数
188
- reasoning: string; // 简短中文 < 200 字
189
- merged_content: string | null;
190
- // merged_content 规则:
191
- // merge → 完整合并后 .md(含 frontmatter)
192
- // upgrade → null(直接用候选原文)
193
- // skip → null
194
- };
195
- ```
196
-
197
- 容错:`JSON.parse` 失败 → `action: skip, needs_review: true`,不阻断。
198
-
199
- ## 报告格式
200
-
201
- ```markdown
202
- # Skill Upgrade Report
203
-
204
- Generated: 2026-05-18 19:30 | Model: claude-opus-4-7
205
-
206
- ## Summary
207
-
208
- | Metric | Count |
209
- |--------|-------|
210
- | Candidates scanned | 37 (23 agent-skills + 14 superpowers) |
211
- | Matched to official | 12 |
212
- | Action: upgrade | 5 |
213
- | Action: merge | 4 |
214
- | Action: skip | 3 |
215
- | Unmatched | 25 |
216
-
217
- ## Per-Skill Decisions
218
-
219
- ### official-db-schema-design
220
- - **Action**: upgrade
221
- - **Confidence**: 85%
222
- - **Candidate**: `agent-skills/database-design`
223
- - **Reasoning**: 候选增加"分库分表策略"和"迁移工具对比"...
224
-
225
- <!-- upgrade-entry: official-db-schema-design | <candidatePath> | upgrade -->
226
- ```
227
-
228
- **机器可读标记**:HTML 注释 `<!-- upgrade-entry: <id> | <path> | <action> -->`;merge 用 `<!-- merged-content-begin -->...<!-- merged-content-end -->` 包裹合并内容。`--apply` 解析这些注释。
229
-
230
- ## 备份机制
231
-
232
- ```
233
- ~/.claude-forge/backups/skills/
234
- └── 20260518-1930/
235
- ├── official-tdd.md
236
- └── ... (所有 official .md 快照)
237
- ```
238
-
239
- - 只在 `--apply` 触发备份
240
- - `--rollback <ts>` 还原
241
- - 复用 `FORGE_PATHS.backups('skills')`
242
- - 同 ts 已存在则追加 `-2`、`-3`
243
-
244
- ## 错误处理
245
-
246
- | 场景 | 处理 |
247
- |------|------|
248
- | git clone/pull 失败 | warn + 跳过该 source |
249
- | AI JSON 解析失败 | needs_review,继续 |
250
- | AI API 超时/5xx | retry 2 次失败 → error 标记 |
251
- | `--apply` 工作树脏 | abort,提示先 commit |
252
- | 候选无 frontmatter | 用文件名作 id,keywords=[] |
253
- | 同 ts 备份冲突 | 后缀 -2 -3 |
254
-
255
- ## 改造范围
256
-
257
- | 文件 | 操作 | 行数估计 |
258
- |------|------|---------|
259
- | `src/skills/upgrade-engine.ts` | 新增 | ~200 |
260
- | `src/skills/upgrade-prompt.ts` | 新增 | ~60 |
261
- | `src/cli/commands/skills.ts` | 加 upgrade 子命令 + 函数 | +80 |
262
- | `src/core/constants.ts` | 加 `skillCandidates` 路径(可选)| +2 |
263
-
264
- **不改动**:dist/、daemon、web 路由、hook、SkillRegistry、official-skills.ts。
265
-
266
- ## 测试策略
267
-
268
- | 测试文件 | 内容 |
269
- |---------|------|
270
- | `tests/unit/skills/upgrade-engine.test.ts` | mock ClaudeProvider.complete → 三条路径;applyDecisions dry-run 不写;备份目录创建 |
271
- | `tests/unit/skills/upgrade-prompt.test.ts` | system/user prompt 含必要字段;JSON 格式要求 |
272
- | `tests/unit/skills/upgrade-engine-parse.test.ts` | AI 非 JSON → needs_review;合法 JSON 正确解析 |
273
-
274
- 集成测试可选:本地 mock .md 跑 dry-run 全流程。
275
-
276
- ## 风险与回滚
277
-
278
- | 风险 | 缓解 |
279
- |------|------|
280
- | AI 误判覆盖好 skill | 默认 dry-run;apply 强制 backup;--rollback 还原 |
281
- | 覆写后 build 错 | apply 后提示 `npm run build` 验证 |
282
- | API 成本 | 仅 score>=30 调 AI;截 2000 字;预估 ~18K tokens / 12 matched |
283
- | 候选仓库结构变化 | 单源失败不阻断 |
284
-
285
- ## 实施顺序
286
-
287
- 1. **upgrade-prompt.ts**(纯函数,无依赖)
288
- 2. **upgrade-engine.ts** — matchToOfficial → evaluateWithAI → pullCandidates → generateReport → applyDecisions
289
- 3. **cli/commands/skills.ts** — 注册 upgrade 子命令
290
- 4. (可选)`FORGE_PATHS.skillCandidates`
291
- 5. 测试:upgrade-prompt → upgrade-engine(mock)→ CLI e2e
292
-
293
- ## 命名遵循
294
-
295
- - 文件:kebab-case
296
- - 函数:动词开头 camelCase(`pullCandidates` / `matchToOfficial`)
297
- - 类型:PascalCase(`CandidateSkill` / `UpgradeDecision`)
@@ -1,146 +0,0 @@
1
- # task active GC 修复 Spec
2
-
3
- ## 目标
4
-
5
- 通过周期 GC + completeCurrentTask recover fallback,消除因 ESC 中断、Stop hook 未触发、daemon 重启等场景导致的 task 永久滞留 `active` 状态。
6
-
7
- ## Bug 复现路径
8
-
9
- | 场景 | 触发条件 | 为何漏掉 |
10
- |------|---------|---------|
11
- | A | 用户 ESC 中断 Claude Code,Stop hook 不触发 | completeCurrentTask 永远不被调用 |
12
- | B | daemon 重启后用户 ESC,Stop hook 触发但 `currentTasks` Map 为空 | completeCurrentTask 第 78 行:`const current = this.currentTasks.get(sessionId)` — Map 空直接 return |
13
- | C | 用户切到别的 session 后永不再 prompt 旧 session | shouldStartNewTask 从不被触发,task 无人收尾 |
14
-
15
- ## 方案对比
16
-
17
- | 方案 | 修复场景 | 改动文件数 | 风险 |
18
- |------|---------|-----------|------|
19
- | A:周期 GC | A / C(idle 超阈值后兜底) | 3 | idle 阈值设太短可能误杀长任务 |
20
- | B:completeCurrentTask recover fallback | B | 1 | 仅修场景 B,A/C 仍漏 |
21
- | C:A + B 组合 | A / B / C 全覆盖 | 3 | 最全面,改动仍可控 |
22
- | D:新增 `auto_closed` 状态 | A / B / C + UI 语义区分 | 5+ | 改动大,可作后续优化 |
23
-
24
- **推荐:方案 C**。
25
-
26
- ## 详细设计
27
-
28
- ### 1. storage 新方法:`completeStaleActiveTasks`
29
-
30
- **位置**:`src/core/storage/tasks.ts`(TaskOperations 类内)
31
-
32
- ```ts
33
- /**
34
- * 将 idle 超过阈值的 active task 批量转为 completed。
35
- * 条件:status='active' AND end_time IS NOT NULL
36
- * AND (now - end_time) > idleMinutes 分钟。
37
- * 返回:受影响行数。
38
- */
39
- completeStaleActiveTasks(idleMinutes: number): number {
40
- const result = this.db.prepare(`
41
- UPDATE tasks
42
- SET status = 'completed'
43
- WHERE status = 'active'
44
- AND end_time IS NOT NULL
45
- AND (julianday('now') - julianday(end_time)) * 24 * 60 > ?
46
- `).run(idleMinutes);
47
- return result.changes;
48
- }
49
- ```
50
-
51
- 同步在 `SQLiteStorage` facade(`sqlite.ts`)暴露同名代理方法。
52
-
53
- 注意:`end_time` 由 `linkEventToTask` 持续更新,作为 idle 判定基准合理。没有 `end_time` 的 task(从未 link 过事件)不纳入 GC,避免误杀刚创建的 task。
54
-
55
- ### 2. TaskSegmenter.completeCurrentTask 加 recover fallback
56
-
57
- **位置**:`src/daemon/services/task-segmenter.ts:77`
58
-
59
- ```ts
60
- completeCurrentTask(sessionId: string, timestamp: string): void {
61
- const current = this.currentTasks.get(sessionId) ?? this.recoverActiveTask(sessionId);
62
- if (!current) return;
63
- ...
64
- }
65
- ```
66
-
67
- 一行改动,与 `processPrompt` / `linkEvent` 模式一致。
68
-
69
- ### 3. maintenanceInterval 加 GC 调度
70
-
71
- **位置**:`src/daemon/index.ts:105-116`
72
-
73
- 现有 `maintenanceInterval` 是 **24 小时**,仅清理旧 events。需新增独立的**短周期 GC interval**:
74
-
75
- ```ts
76
- // ── 5.6. Stale task GC (every 5 minutes) ──────────────────────────
77
- const STALE_TASK_GC_INTERVAL = 5 * 60 * 1000; // 5 分钟
78
- const STALE_TASK_IDLE_MINUTES = 10; // idle 超 10 分钟视为滞留
79
-
80
- const staleTaskGcInterval = setInterval(() => {
81
- try {
82
- const closed = storage.completeStaleActiveTasks(STALE_TASK_IDLE_MINUTES);
83
- if (closed > 0) {
84
- logger.info(`[Maintenance] Auto-completed ${closed} stale active task(s)`);
85
- }
86
- } catch (err) {
87
- logger.error(`[Maintenance] Stale task GC failed: ${err}`);
88
- }
89
- }, STALE_TASK_GC_INTERVAL);
90
- ```
91
-
92
- 关闭时需调用 `clearInterval(staleTaskGcInterval)`(在现有 graceful shutdown 段追加)。
93
-
94
- ## 改造范围
95
-
96
- | 文件 | 改动内容 | 估算行数 |
97
- |------|---------|---------|
98
- | `src/core/storage/tasks.ts` | 新增 `completeStaleActiveTasks` 方法 | +12 |
99
- | `src/core/storage/sqlite.ts` | facade 代理方法 | +3 |
100
- | `src/daemon/services/task-segmenter.ts` | completeCurrentTask recover fallback(1 行) | +1 |
101
- | `src/daemon/index.ts` | 新增 GC interval + clearInterval | +12 |
102
-
103
- 共 4 文件,约 28 行净增。
104
-
105
- ## 配置
106
-
107
- | 参数 | 值 | 说明 |
108
- |------|----|------|
109
- | `STALE_TASK_IDLE_MINUTES` | 10 | idle 超 10 分钟视为放弃,不可配置(硬编码常量) |
110
- | `STALE_TASK_GC_INTERVAL` | 5 分钟 | GC 轮询间隔,独立于 24h 维护周期 |
111
-
112
- 如未来需要可迁移到 `config.yaml` 的 `tasks.stale_gc_minutes` 字段。
113
-
114
- ## 测试策略
115
-
116
- | 测试类型 | 测试用例 | 文件位置 |
117
- |---------|---------|---------|
118
- | 单测:`completeStaleActiveTasks` | 空表返回 0 | 新增 `tests/unit/storage/tasks-stale-gc.test.ts` |
119
- | | 1 idle 超阈值 + 1 未超:只关超的 | 同上 |
120
- | | `status='completed'` 的 task 不被改动 | 同上 |
121
- | | `end_time IS NULL` 的 task 不被纳入 | 同上 |
122
- | 单测:recover fallback | Map 为空时仍能 complete DB 中 active task | 扩展现有 task-segmenter 测试 |
123
-
124
- ## 风险与回滚
125
-
126
- | 风险 | 概率 | 缓解措施 |
127
- |------|------|---------|
128
- | 误杀正在进行的长任务 | 低(idle 阈值 10 分钟,linkEvent 持续刷新 end_time) | 阈值可调大;日志可审计 |
129
- | 旧库一次性批量 GC | 必然发生,且是预期行为 | 无需回滚,这正是修 bug 的目的 |
130
- | GC interval 异常退出 | 极低(try-catch 包裹) | 日志记录,不影响主流程 |
131
-
132
- **回滚**:删除 daemon/index.ts 中的 `staleTaskGcInterval` 代码块即可完全禁用 GC,其他改动无副作用。
133
-
134
- ## 实施顺序
135
-
136
- 1. `tasks.ts` — 新增 `completeStaleActiveTasks` + 单测
137
- 2. `sqlite.ts` — facade 代理方法
138
- 3. `task-segmenter.ts` — recover fallback 单行 + 单测
139
- 4. `daemon/index.ts` — GC interval 注册 + clearInterval
140
- 5. 全量测试 `npm test`
141
-
142
- ## 命名遵循
143
-
144
- - `completeStaleActiveTasks`:`complete` 前缀(语义清晰,优于 `write`)
145
- - `STALE_TASK_GC_INTERVAL` / `STALE_TASK_IDLE_MINUTES`:全大写常量
146
- - `staleTaskGcInterval`:camelCase 变量,与 `maintenanceInterval` 风格一致
@@ -1,208 +0,0 @@
1
- # Tasks 列表筛选 + 分页 — 设计 Spec
2
-
3
- **日期**: 2026-05-18
4
- **状态**: Draft(待用户 review)
5
-
6
- ---
7
-
8
- ## 工作流路径
9
-
10
- **hybrid-feature-with-safety**
11
-
12
- **理由**:`src/web/routes/` 有 19 个路由文件,`tests/unit/web/` 仅 6 个测试文件,覆盖率约 **32%**(低于 50% 阈值)。实现阶段每个后端改动文件均需配套新增/扩展测试用例。前端为单 HTML 文件无组件测试,route + storage 层必须达到 80% 分支覆盖。
13
-
14
- ---
15
-
16
- ## 1. 目标 + 成功标准
17
-
18
- 让 `GET /api/tasks` 支持完整服务端筛选与分页;前端 tasks 视图新增筛选栏 + 分页组件,URL 同步状态。
19
-
20
- ### 验收用例
21
-
22
- | # | 场景 | 期望 |
23
- |---|------|------|
24
- | A1 | `GET /api/tasks?limit=10&offset=0` | `{ items: [...10], total, has_more }` |
25
- | A2 | `GET /api/tasks?project=/path/foo` | 仅返回该 project_path 的 tasks |
26
- | A3 | `?project=a&project=b` | 两个项目 OR 关系 |
27
- | A4 | `?from=2026-01-01T00:00:00Z&to=2026-01-31T23:59:59Z` | start_time 范围过滤 |
28
- | A5 | `?search=重构` | title LIKE `%重构%` |
29
- | A6 | `?limit=201` | clamp 到 200 |
30
- | A7 | 前端选「24h」+ 搜索「build」 | URL: `?range=24h&search=build&page=1`,刷新保留 |
31
- | A8 | 点「下一页」 | offset 递增,total 不变 |
32
-
33
- **非目标**:FTS5 全文检索、status 多选、修改 `/api/tasks/:taskId` 详情接口。
34
-
35
- ---
36
-
37
- ## 2. 后端设计
38
-
39
- ### 2.1 Route 层 `src/web/routes/tasks.ts`
40
-
41
- **已有**:`limit`(默认 20)、`session`
42
- **待加**:`offset`、`project`(多值)、`from`、`to`、`search`,返回结构升级
43
-
44
- ```
45
- QueryParams (Zod):
46
- limit: number, default 50, max 200, min 1
47
- offset: number, default 0, min 0
48
- project: string | string[] // 多值
49
- from/to: ISO 8601 string, optional
50
- search: string, optional, maxLength 100
51
- session: string, optional // 保留
52
- ```
53
-
54
- 返回从 `Task[]` 升级为 `{ items, total, has_more }`。**破坏性变更**:内部 dashboard 无外部消费者,可接受。
55
-
56
- ### 2.2 Storage 层 `src/core/storage/tasks.ts`
57
-
58
- **关键挑战**:`tasks` 表无 `project_path` 字段,需 JOIN `sessions` 表。
59
-
60
- ```sql
61
- -- 数据查询
62
- SELECT t.*, s.project_path
63
- FROM tasks t
64
- JOIN sessions s ON t.session_id = s.session_id
65
- WHERE
66
- [t.session_id = ?]
67
- [AND s.project_path IN (?, ?)]
68
- [AND t.start_time >= ?]
69
- [AND t.start_time <= ?]
70
- [AND t.title LIKE ?]
71
- ORDER BY t.start_time DESC
72
- LIMIT ? OFFSET ?;
73
-
74
- -- 总数查询:复用相同 WHERE,不带 LIMIT/OFFSET
75
- SELECT COUNT(*) FROM tasks t JOIN sessions s ON t.session_id = s.session_id WHERE [...];
76
- ```
77
-
78
- `TaskRecord` 新增可选字段 `project_path?: string`。
79
-
80
- ### 2.3 索引评估
81
-
82
- | 查询 | 现有 | 是否够 |
83
- |------|------|--------|
84
- | `ORDER BY start_time DESC` | `idx_tasks_start_time` | ✅ |
85
- | `WHERE session_id = ?` | `idx_tasks_session` | ✅ |
86
- | `WHERE s.project_path IN (...)` | `idx_sessions_project` | ✅ |
87
- | `WHERE t.title LIKE '%xxx%'` | 无 | ❌ 全表扫描,但数据量 <10k,可接受 |
88
- | `WHERE start_time BETWEEN ?` | `idx_tasks_start_time` | ✅ 范围扫描 |
89
-
90
- **新增**:`CREATE INDEX idx_tasks_start_time_session ON tasks(start_time DESC, session_id)`。
91
- **不引入 FTS5**(复杂度不值)。
92
-
93
- ### 2.4 新 Endpoint `GET /api/tasks/projects`
94
-
95
- 前端项目下拉需要"所有项目"列表:
96
-
97
- ```sql
98
- SELECT DISTINCT s.project_path FROM sessions s JOIN tasks t ON t.session_id = s.session_id;
99
- ```
100
-
101
- ---
102
-
103
- ## 3. 前端设计
104
-
105
- ### ⚠️ 重要发现
106
-
107
- 调研显示前端是**原生 HTML + Vanilla JS**(`src/web/static/index.html` 单文件),不是 CLAUDE.md 描述的 React/Vite。当前页面切换通过 `nav(pageName)` + `id="page-xxx"` div 控制。
108
-
109
- > **请用户确认**:(a) spec 按 Vanilla JS 实施(与现状一致);(b) 顺手迁移到 React(额外大改);(c) CLAUDE.md 该改技术栈描述
110
-
111
- ### 3.2 新增 `#page-tasks` 视图
112
-
113
- Sidebar 加 "Tasks" 导航项。
114
-
115
- ```
116
- page-tasks
117
- ├── .toolbar
118
- │ ├── #tasks-project-filter (多选 select)
119
- │ ├── #tasks-range-filter (1h/24h/7d/自定义)
120
- │ ├── #tasks-date-from/to (datetime-local,自定义时显示)
121
- │ └── #tasks-search (300ms 防抖)
122
- ├── <table id="tasks-table"> 时间 / 标题 / 项目 / 状态 / 事件数
123
- └── .pagination-bar
124
- ├── "共 N 条,第 X-Y"
125
- ├── 每页 [20/50/100]
126
- └── [上一页] [下一页]
127
- ```
128
-
129
- ### 3.3 URL 状态同步
130
-
131
- `URLSearchParams` + `history.pushState`:
132
-
133
- | URL | 控件 |
134
- |-----|------|
135
- | `project` | 多选下拉(可重复) |
136
- | `range` | 1h/24h/7d/custom |
137
- | `from`/`to` | 自定义时间 |
138
- | `search` | 搜索框 |
139
- | `page` | offset = (page-1) * limit |
140
- | `size` | 20/50/100 |
141
-
142
- ### 3.4 防抖
143
-
144
- 搜索框 `oninput` → setTimeout 300ms → `loadTasks()`,每次键入重置。
145
-
146
- ---
147
-
148
- ## 4. 改动文件清单
149
-
150
- | 文件 | 改动 | 行数 |
151
- |------|------|------|
152
- | `src/core/storage/tasks.ts` | 扩展 filter + COUNT + project_path | +40 |
153
- | `src/core/storage/schema.sql` | 加复合索引 | +2 |
154
- | `src/web/routes/tasks.ts` | Zod 解析 + 多参数 + 返回结构 + `/projects` 子路由 | +50 |
155
- | `src/web/static/index.html` | `#page-tasks` 视图 + JS 函数 + URL 同步 + 防抖 | +200 |
156
- | `tests/unit/web/routes-tasks.test.ts` | 扩展参数组合用例 | +80 |
157
-
158
- ---
159
-
160
- ## 5. 风险点
161
-
162
- | 风险 | 缓解 |
163
- |------|------|
164
- | tasks 无 project_path,需 JOIN sessions | `TaskRecord` 加可选 `project_path?` |
165
- | 项目下拉数据来源 | 新增 `/api/tasks/projects` |
166
- | project_path 太长(绝对路径) | 截断显示最后 2 段,title 属性放完整 |
167
- | 返回结构破坏性变更 | 搜 index.html 所有 `/api/tasks` 调用点同步更新 |
168
- | LIKE 性能 | <10k 行可接受,不引入 FTS5 |
169
- | 前端无组件测试 | 仅 route 集成测试,前端 E2E 手工 |
170
-
171
- ---
172
-
173
- ## 6. 测试策略
174
-
175
- ### 单元测试 `tests/unit/web/routes-tasks.test.ts`
176
-
177
- - `project` 单值/多值(OR)
178
- - `from`/`to` 边界
179
- - `search` LIKE 匹配(SQLite ASCII 不区分大小写)
180
- - `limit` clamp
181
- - `offset` 分页 + `has_more` 准确
182
- - 返回结构 schema
183
- - `GET /api/tasks/projects` 去重
184
-
185
- ### 集成测试
186
-
187
- 新建 `tests/integration/tasks-filter.test.ts`,真实 SQLite 验证 JOIN + COUNT。
188
-
189
- ### 前端 E2E
190
-
191
- 按 A1-A8 在 dashboard 手工验证 + 截图。
192
-
193
- ---
194
-
195
- ## 7. 执行步骤(自底向上)
196
-
197
- 1. `schema.sql` — 加索引 `idx_tasks_start_time_session`
198
- 2. `storage/tasks.ts` — 扩 filter / JOIN / COUNT / project_path
199
- 3. Storage 单元测试
200
- 4. `routes/tasks.ts` — Zod + 多参数 + 返回结构 + `/projects`
201
- 5. Route 单元测试
202
- 6. `index.html` — `#page-tasks` 视图 + JS + URL 同步 + 防抖
203
- 7. `npm test` + `npx tsc --noEmit`
204
- 8. 按 A1-A8 手工验收
205
-
206
- ---
207
-
208
- **Hybrid-feature-with-safety 工作流**:先 safety-net(扩展 routes-tasks 现有测试,锁定旧 `Task[]` 返回行为)→ design → implement → test → review
@@ -1,22 +0,0 @@
1
- # daemon skill 自动同步 Changelog
2
-
3
- **Date**: 2026-05-18 20:00
4
- **Status**: 完成
5
-
6
- ## 背景
7
- 类比 v8.51.1 hook-sync:npm 升级 dist/skills/official/ 但不会自动同步
8
- ~/.claude/skills/ 本地副本,SkillRegistry 优先级 user > official 加载
9
- 旧副本,导致 skill 残缺/功能错乱。
10
-
11
- ## 改动
12
- - 新建 src/daemon/skill-sync.ts: syncSkills() sha256 比对自动同步
13
- - daemon/index.ts 启动时调用(紧挨 syncHooks)
14
- - 失败 logger.warn 不阻断
15
-
16
- ## 测试
17
- - 5 case 单测全过
18
- - 现有测试不退化
19
- - tsc 0 errors
20
-
21
- ## 已知问题
22
- - linkEventToTask pre-existing(sqlite-refactor-harness.test.ts)