@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,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)