@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.
- package/DEVELOPMENT.md +290 -221
- package/README.md +50 -8
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +7 -3
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/init/hook-manager.d.ts +1 -1
- package/dist/cli/init/hook-manager.d.ts.map +1 -1
- package/dist/cli/init/hook-manager.js +1 -0
- package/dist/cli/init/hook-manager.js.map +1 -1
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +0 -1
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/maintenance.d.ts +25 -3
- package/dist/core/storage/maintenance.d.ts.map +1 -1
- package/dist/core/storage/maintenance.js +33 -4
- package/dist/core/storage/maintenance.js.map +1 -1
- package/dist/core/storage/routing.d.ts +4 -0
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +10 -4
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/sessions.d.ts +17 -0
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +64 -0
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +4 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +10 -2
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +5 -0
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +6 -0
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +2 -0
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/types.d.ts +7 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +19 -4
- package/dist/daemon/index.js.map +1 -1
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +13 -2
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/semantic-matcher.d.ts +2 -2
- package/dist/skills/semantic-matcher.d.ts.map +1 -1
- package/dist/skills/semantic-matcher.js +14 -19
- package/dist/skills/semantic-matcher.js.map +1 -1
- package/dist/skills/upgrade-engine.d.ts +3 -1
- package/dist/skills/upgrade-engine.d.ts.map +1 -1
- package/dist/skills/upgrade-engine.js +25 -14
- package/dist/skills/upgrade-engine.js.map +1 -1
- package/dist/web/analytics/weekly-report.d.ts.map +1 -1
- package/dist/web/analytics/weekly-report.js +21 -29
- package/dist/web/analytics/weekly-report.js.map +1 -1
- package/dist/web/routes/patch.d.ts.map +1 -1
- package/dist/web/routes/patch.js +32 -2
- package/dist/web/routes/patch.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +9 -7
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/trace.d.ts.map +1 -1
- package/dist/web/routes/trace.js +2 -3
- package/dist/web/routes/trace.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +3 -2
- package/dist/web/server.js.map +1 -1
- package/package.json +12 -2
- package/scripts/postinstall.cjs +21 -0
- package/.claude/CLAUDE.md +0 -17
- package/.eslintrc.js +0 -23
- package/.prettierrc +0 -8
- package/ARCHITECTURE_ISSUES.md +0 -249
- package/CLAUDE.md +0 -265
- package/CLAUDE.md.backup +0 -488
- package/docs/concurrent-agents.md +0 -129
- package/docs/design/architecture-review-20260516.md +0 -232
- package/docs/design/fix-skills-data-and-set-leak-spec-20260516-1300.md +0 -219
- package/docs/design/h1-storage-aggregation-spec-20260518-1121.md +0 -299
- package/docs/design/h2-getdatabase-encapsulation-spec-20260518-1450.md +0 -191
- package/docs/design/h3-fallback-removal-spec-20260518-1245.md +0 -76
- package/docs/design/h4-index-dedup-spec-20260518-1230.md +0 -109
- package/docs/design/h6-services-migration-spec-20260518-1355.md +0 -82
- package/docs/design/hook-failure-queue-spec-20260516-1530.md +0 -204
- package/docs/design/l1-swarm-protocol-extract-spec-20260518-1605.md +0 -106
- package/docs/design/m10-forge-paths-spec-20260518-1320.md +0 -121
- package/docs/design/m2-m3-tool-input-spec-20260518-1425.md +0 -131
- package/docs/design/m7-routing-event-association-spec-20260518-1545.md +0 -103
- package/docs/design/project-path-gitroot-spec-20260518-1715.md +0 -134
- package/docs/design/refactor-phase1-spec-20260515-1600.md +0 -543
- package/docs/design/refactor-phase2-spec-20260515-1700.md +0 -424
- package/docs/design/skill-ai-upgrade-spec-20260518-1930.md +0 -297
- package/docs/design/task-active-gc-spec-20260518-1745.md +0 -146
- package/docs/design/tasks-list-filter-pagination-spec-20260518-0930.md +0 -208
- package/docs/implementation/daemon-skill-sync-changelog-20260518-2000.md +0 -22
- package/docs/implementation/fix-skills-data-and-set-leak-changelog-20260516-1300.md +0 -104
- package/docs/implementation/h1-storage-aggregation-changelog-20260518-1121.md +0 -82
- package/docs/implementation/h2-final-changelog-20260518-1530.md +0 -61
- package/docs/implementation/h2-phase1-safety-net-changelog-20260518-1450.md +0 -70
- package/docs/implementation/h2-phase2-operations-changelog-20260518-1450.md +0 -120
- package/docs/implementation/h2-phase3-callsites-changelog-20260518-1450.md +0 -71
- package/docs/implementation/h3-fallback-removal-changelog-20260518-1245.md +0 -71
- package/docs/implementation/h4-index-dedup-changelog-20260518-1230.md +0 -60
- package/docs/implementation/h6-services-migration-changelog-20260518-1355.md +0 -46
- package/docs/implementation/h7-m9-defaults-changelog-20260518-1300.md +0 -46
- package/docs/implementation/hook-failure-queue-changelog-20260516-1530.md +0 -196
- package/docs/implementation/hotfix-daemon-event-reject-20260516-1430.md +0 -56
- package/docs/implementation/l1-swarm-protocol-extract-changelog-20260518-1605.md +0 -45
- package/docs/implementation/l3-l4-daemon-perf-changelog-20260518-1410.md +0 -63
- package/docs/implementation/l6-l8-final-cleanup-changelog-20260518-1640.md +0 -38
- package/docs/implementation/m1-m4-m5-l7-cleanup-changelog-20260518-1310.md +0 -58
- package/docs/implementation/m10-forge-paths-changelog-20260518-1320.md +0 -60
- package/docs/implementation/m2-m3-tool-input-changelog-20260518-1425.md +0 -43
- package/docs/implementation/m6-m8-naming-shutdown-changelog-20260518-1340.md +0 -56
- package/docs/implementation/m7-routing-association-changelog-20260518-1545.md +0 -69
- package/docs/implementation/project-path-gitroot-changelog-20260518-1715.md +0 -63
- package/docs/implementation/refactor-phase1-changelog-20260515-1630.md +0 -354
- package/docs/implementation/refactor-phase2-changelog-20260515-1705.md +0 -421
- package/docs/implementation/skill-ai-upgrade-changelog-20260518-1930.md +0 -49
- package/docs/implementation/task-active-gc-changelog-20260518-1745.md +0 -35
- package/docs/implementation/task-title-summary-changelog-20260518-1130.md +0 -39
- package/docs/implementation/tasks-detail-back-loses-filters-changelog-20260518-1100.md +0 -22
- package/docs/implementation/tasks-list-filter-pagination-changelog-20260518-0930.md +0 -72
- package/docs/implementation/tasks-page-white-screen-hotfix-changelog-20260518-1015.md +0 -56
- package/docs/reviews/claudemd-template-sync.md +0 -54
- package/docs/reviews/task-title-summary.md +0 -92
- package/docs/reviews/tasks-detail-back-loses-filters.md +0 -58
- package/docs/reviews/tasks-filter-pagination.md +0 -80
- package/docs/reviews/tasks-page-white-screen-hotfix.md +0 -126
- package/docs/ruflo-learning-strategy.md +0 -322
- package/docs/skills-deduplication-analysis.md +0 -83
- package/docs/skills-multiformat-support.md +0 -177
- package/docs/skills-third-party.md +0 -183
- package/docs/testing/tasks-filter-pagination-test-report.md +0 -86
- package/forge +0 -321
- package/playwright.config.ts +0 -40
- package/scripts/demo-v2.ts +0 -91
- package/scripts/dev-daemon.sh +0 -232
- package/scripts/dev-web.ts +0 -109
- package/scripts/e2e-mcp-link.ts +0 -423
- package/scripts/e2e-methodology-quality.ts +0 -253
- package/scripts/e2e-routing.ts +0 -456
- package/scripts/e2e-user-methodology.ts +0 -326
- package/scripts/e2e-web-workflows.ts +0 -299
- package/scripts/migrate-legacy-to-dynamic.sql +0 -108
- package/scripts/regenerate-execution-docs.ts +0 -116
- package/scripts/sync-agent-skills.ts +0 -193
- package/scripts/test-hook.sh +0 -71
- package/scripts/verify-skill-loading.ts +0 -62
- package/src/claudemd/claudemd-generator.ts +0 -568
- package/src/claudemd/convention-extractor.ts +0 -69
- package/src/claudemd/index.ts +0 -35
- package/src/claudemd/persona-manager.ts +0 -88
- package/src/claudemd/resume-manager.ts +0 -236
- package/src/claudemd/tech-detector.ts +0 -220
- package/src/claudemd/templates/swarm-protocol.md +0 -222
- package/src/cli/commands/claudemd.ts +0 -84
- package/src/cli/commands/config.ts +0 -46
- package/src/cli/commands/daemon.ts +0 -310
- package/src/cli/commands/executions.ts +0 -115
- package/src/cli/commands/init.ts +0 -204
- package/src/cli/commands/logs.ts +0 -181
- package/src/cli/commands/mcp.ts +0 -242
- package/src/cli/commands/menu.ts +0 -357
- package/src/cli/commands/skills.ts +0 -328
- package/src/cli/commands/stats.ts +0 -73
- package/src/cli/commands/status.ts +0 -69
- package/src/cli/commands/template.ts +0 -77
- package/src/cli/commands/trace.ts +0 -148
- package/src/cli/index.ts +0 -42
- package/src/cli/init/hook-manager.ts +0 -132
- package/src/core/ai/provider.ts +0 -308
- package/src/core/ai/types.ts +0 -51
- package/src/core/config.ts +0 -124
- package/src/core/constants.ts +0 -67
- package/src/core/event-fields.ts +0 -32
- package/src/core/queue/index.ts +0 -192
- package/src/core/storage/base.ts +0 -302
- package/src/core/storage/events.ts +0 -434
- package/src/core/storage/injections.ts +0 -78
- package/src/core/storage/maintenance.ts +0 -59
- package/src/core/storage/migrations/002_add_skill_tracking.sql +0 -6
- package/src/core/storage/migrations/003_add_skill_invocations.sql +0 -23
- package/src/core/storage/performance-indexes.sql +0 -23
- package/src/core/storage/routing.ts +0 -322
- package/src/core/storage/rows.ts +0 -112
- package/src/core/storage/schema.sql +0 -224
- package/src/core/storage/sessions.ts +0 -168
- package/src/core/storage/skills.ts +0 -233
- package/src/core/storage/sqlite.ts +0 -293
- package/src/core/storage/tasks.ts +0 -318
- package/src/core/storage/token-usage.ts +0 -93
- package/src/core/types.ts +0 -181
- package/src/core/utils/error-handler.ts +0 -257
- package/src/core/utils/forge-resume-block.ts +0 -74
- package/src/core/utils/format.ts +0 -69
- package/src/core/utils/git.ts +0 -23
- package/src/core/utils/logger.ts +0 -134
- package/src/core/utils/lru-cache.ts +0 -54
- package/src/core/utils/path.ts +0 -19
- package/src/core/utils/session.ts +0 -26
- package/src/core/utils/time.ts +0 -37
- package/src/core/utils/token-tracker.ts +0 -97
- package/src/daemon/event-parser.ts +0 -36
- package/src/daemon/handlers/history-exporter.ts +0 -117
- package/src/daemon/handlers/post-tool-use.ts +0 -54
- package/src/daemon/handlers/stop.ts +0 -208
- package/src/daemon/handlers/user-prompt.ts +0 -178
- package/src/daemon/hook-sync.ts +0 -91
- package/src/daemon/index.ts +0 -312
- package/src/daemon/launchd/com.claude-forge.daemon.plist.template +0 -47
- package/src/daemon/launchd-installer.ts +0 -260
- package/src/daemon/lifecycle.ts +0 -128
- package/src/daemon/router.ts +0 -40
- package/src/daemon/server.ts +0 -196
- package/src/daemon/services/task-segmenter.ts +0 -112
- package/src/daemon/skill-sync.ts +0 -88
- package/src/hooks/hook-lib.sh +0 -118
- package/src/hooks/notification.sh +0 -35
- package/src/hooks/post-tool-use.sh +0 -61
- package/src/hooks/pre-tool-use.sh +0 -63
- package/src/hooks/stop.sh +0 -43
- package/src/hooks/user-prompt-submit.sh +0 -69
- package/src/mcp/server.ts +0 -322
- package/src/skills/index.ts +0 -2
- package/src/skills/invocation-guard.ts +0 -177
- package/src/skills/matcher.ts +0 -148
- package/src/skills/official/code-simplifier.md +0 -52
- package/src/skills/official/find-skills.md +0 -142
- package/src/skills/official/official-api-design.md +0 -30
- package/src/skills/official/official-architecture-decision.md +0 -41
- package/src/skills/official/official-bmad.md +0 -118
- package/src/skills/official/official-db-schema-design.md +0 -34
- package/src/skills/official/official-debug.md +0 -25
- package/src/skills/official/official-doc-driven.md +0 -31
- package/src/skills/official/official-harness-engineering.md +0 -108
- package/src/skills/official/official-performance-optimization.md +0 -30
- package/src/skills/official/official-pr-review.md +0 -35
- package/src/skills/official/official-release-checklist.md +0 -30
- package/src/skills/official/official-security-hardening.md +0 -32
- package/src/skills/official/official-spec-driven-design.md +0 -31
- package/src/skills/official/planning-with-files.md +0 -241
- package/src/skills/official/ui-ux-pro-max.md +0 -105
- package/src/skills/official/webapp-testing.md +0 -96
- package/src/skills/official-skills.ts +0 -89
- package/src/skills/registry.ts +0 -355
- package/src/skills/semantic-matcher.ts +0 -234
- package/src/skills/tools/pipeline-suggest.ts +0 -226
- package/src/skills/tools/skill-invoke.ts +0 -168
- package/src/skills/tools/skill-list.ts +0 -59
- package/src/skills/upgrade-engine.ts +0 -541
- package/src/skills/upgrade-prompt.ts +0 -84
- package/src/templates/go.yaml +0 -53
- package/src/templates/python.yaml +0 -59
- package/src/templates/react.yaml +0 -55
- package/src/templates/template-manager.ts +0 -170
- package/src/web/analytics/anti-pattern-detector.ts +0 -367
- package/src/web/analytics/drift-detector.ts +0 -219
- package/src/web/analytics/weekly-report.ts +0 -431
- package/src/web/auth-middleware.ts +0 -54
- package/src/web/routes/_helpers.ts +0 -34
- package/src/web/routes/ai.ts +0 -204
- package/src/web/routes/auth.ts +0 -22
- package/src/web/routes/drift.ts +0 -25
- package/src/web/routes/error-handler.ts +0 -120
- package/src/web/routes/events.ts +0 -47
- package/src/web/routes/insights.ts +0 -43
- package/src/web/routes/patch.ts +0 -117
- package/src/web/routes/reports.ts +0 -34
- package/src/web/routes/rules.ts +0 -76
- package/src/web/routes/sessions.ts +0 -250
- package/src/web/routes/skill-stats.ts +0 -92
- package/src/web/routes/skills.ts +0 -350
- package/src/web/routes/static.ts +0 -67
- package/src/web/routes/stats.ts +0 -50
- package/src/web/routes/status.ts +0 -30
- package/src/web/routes/tasks.ts +0 -193
- package/src/web/routes/token-usage.ts +0 -20
- package/src/web/routes/trace.ts +0 -126
- package/src/web/routes/types.ts +0 -57
- package/src/web/server.ts +0 -134
- package/src/web/ssrf-guard.ts +0 -112
- package/src/web/static/index.html +0 -3251
- package/src/web/static/vendor/chart.umd.min.js +0 -20
- package/tests/e2e/dashboard.spec.ts +0 -205
- package/tests/e2e/routing-skill-e2e.test.ts +0 -39
- package/tests/helpers/mock-ai.ts +0 -92
- package/tests/helpers/mock-storage.ts +0 -159
- package/tests/integration/claudemd-generator.test.ts +0 -90
- package/tests/integration/queue-replay.integration.test.ts +0 -193
- package/tests/integration/tasks-filter.integration.test.ts +0 -154
- package/tests/integration/web-analytics.integration.test.ts +0 -133
- package/tests/integration/web-stats.integration.test.ts +0 -135
- package/tests/integration/web-trace.integration.test.ts +0 -175
- package/tests/performance/database.benchmark.ts +0 -161
- package/tests/semantic-matcher.test.ts +0 -99
- package/tests/skill-matcher.test.ts +0 -110
- package/tests/unit/ai-provider-retry.test.ts +0 -194
- package/tests/unit/ai-provider-vision.test.ts +0 -224
- package/tests/unit/claudemd-generator.test.ts +0 -68
- package/tests/unit/cli-mcp.test.ts +0 -141
- package/tests/unit/core/forge-paths.test.ts +0 -99
- package/tests/unit/daemon/hook-sync.test.ts +0 -71
- package/tests/unit/daemon/post-tool-use.test.ts +0 -121
- package/tests/unit/daemon/skill-sync.test.ts +0 -75
- package/tests/unit/daemon/stop-handler-behavior-summary.test.ts +0 -202
- package/tests/unit/daemon/task-segmenter-recover.test.ts +0 -84
- package/tests/unit/event-fields.test.ts +0 -88
- package/tests/unit/event-parser.test.ts +0 -55
- package/tests/unit/handlers.test.ts +0 -171
- package/tests/unit/hooks/resolve-project-path.test.ts +0 -122
- package/tests/unit/invocation-guard.test.ts +0 -125
- package/tests/unit/queue.test.ts +0 -272
- package/tests/unit/router.test.ts +0 -138
- package/tests/unit/security.test.ts +0 -128
- package/tests/unit/skill-invocations-workflow.test.ts +0 -495
- package/tests/unit/skill-registry.test.ts +0 -94
- package/tests/unit/skills/invocation-guard-ttl.test.ts +0 -211
- package/tests/unit/skills/official-skills-loader.test.ts +0 -126
- package/tests/unit/skills/registry-multiformat.test.ts +0 -92
- package/tests/unit/skills/upgrade-engine-parse.test.ts +0 -138
- package/tests/unit/skills/upgrade-engine.test.ts +0 -401
- package/tests/unit/skills/upgrade-prompt.test.ts +0 -89
- package/tests/unit/socket-server.test.ts +0 -183
- package/tests/unit/storage/event-operations-aggregates.test.ts +0 -342
- package/tests/unit/storage/migration-idempotent.test.ts +0 -304
- package/tests/unit/storage/routing-aggregates.test.ts +0 -276
- package/tests/unit/storage/routing.test.ts +0 -117
- package/tests/unit/storage/schema-missing.test.ts +0 -81
- package/tests/unit/storage/session-operations-aggregates.test.ts +0 -120
- package/tests/unit/storage/sessions-aggregate.test.ts +0 -435
- package/tests/unit/storage/skill-operations-counts.test.ts +0 -106
- package/tests/unit/storage/skills-aggregates.test.ts +0 -104
- package/tests/unit/storage/sqlite-refactor-harness.test.ts +0 -314
- package/tests/unit/storage/task-operations-counts.test.ts +0 -46
- package/tests/unit/storage/tasks-getById.test.ts +0 -343
- package/tests/unit/storage/tasks-stale-gc.test.ts +0 -86
- package/tests/unit/storage.test.ts +0 -172
- package/tests/unit/token-usage.test.ts +0 -144
- package/tests/unit/type-guards.test.ts +0 -201
- package/tests/unit/utils/format.test.ts +0 -189
- package/tests/unit/utils/session.test.ts +0 -89
- package/tests/unit/utils/time.test.ts +0 -112
- package/tests/unit/web/navigation-back-contract.test.ts +0 -134
- package/tests/unit/web/routes-auth.test.ts +0 -93
- package/tests/unit/web/routes-events.test.ts +0 -101
- package/tests/unit/web/routes-rules.test.ts +0 -182
- package/tests/unit/web/routes-sessions.test.ts +0 -181
- package/tests/unit/web/routes-skill-stats.test.ts +0 -179
- package/tests/unit/web/routes-stats.test.ts +0 -92
- package/tests/unit/web/routes-tasks.test.ts +0 -385
- package/tests/unit/web/task-title-contract.test.ts +0 -210
- package/tests/unit/web/tasks-component-contract.test.ts +0 -179
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -21
- package/vitest.integration.config.ts +0 -16
- package/web/CLAUDE.md +0 -20
- package/web/index.html +0 -13
- package/web/package-lock.json +0 -4854
- package/web/package.json +0 -35
- package/web/postcss.config.js +0 -6
- package/web/src/App.tsx +0 -110
- package/web/src/components/CodeBlock.tsx +0 -31
- package/web/src/components/Confirm.tsx +0 -96
- package/web/src/components/Drawer.tsx +0 -60
- package/web/src/components/Layout.tsx +0 -145
- package/web/src/components/MarkdownRenderer.tsx +0 -77
- package/web/src/components/SearchInput.tsx +0 -31
- package/web/src/components/SessionDetailContent.tsx +0 -157
- package/web/src/components/Toast.tsx +0 -92
- package/web/src/index.css +0 -19
- package/web/src/main.tsx +0 -31
- package/web/src/pages/AIConfig.tsx +0 -233
- package/web/src/pages/Dashboard.tsx +0 -572
- package/web/src/pages/Events.tsx +0 -271
- package/web/src/pages/Reports.tsx +0 -428
- package/web/src/pages/SessionDetail.tsx +0 -162
- package/web/src/pages/Sessions.tsx +0 -205
- package/web/src/pages/Skills.tsx +0 -180
- package/web/src/pages/TaskDetail.tsx +0 -515
- package/web/src/pages/Tasks.tsx +0 -415
- package/web/src/utils/auth.ts +0 -59
- package/web/src/utils/export.ts +0 -54
- package/web/src/utils/navigation.ts +0 -25
- package/web/src/utils/task-title.ts +0 -49
- package/web/src/utils/time.ts +0 -13
- package/web/tailwind.config.js +0 -11
- package/web/tsconfig.json +0 -21
- package/web/tsconfig.node.json +0 -10
- package/web/vite.config.ts +0 -76
- 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)
|