@winspan/claude-forge 8.51.1 → 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 +121 -2
- 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/constants.d.ts +2 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +4 -0
- package/dist/core/constants.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 +30 -5
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/skill-sync.d.ts +21 -0
- package/dist/daemon/skill-sync.d.ts.map +1 -0
- package/dist/daemon/skill-sync.js +75 -0
- package/dist/daemon/skill-sync.js.map +1 -0
- package/dist/hooks/notification.sh +1 -1
- package/dist/hooks/post-tool-use.sh +1 -1
- package/dist/hooks/pre-tool-use.sh +1 -1
- package/dist/hooks/stop.sh +1 -1
- package/dist/hooks/user-prompt-submit.sh +1 -1
- package/dist/skills/official/code-simplifier.md +37 -1
- package/dist/skills/official/find-skills.md +120 -1
- package/dist/skills/official/official-api-design.md +14 -1
- package/dist/skills/official/official-architecture-decision.md +22 -1
- package/dist/skills/official/official-db-schema-design.md +19 -1
- package/dist/skills/official/official-debug.md +9 -1
- package/dist/skills/official/official-pr-review.md +1 -1
- package/dist/skills/official/official-security-hardening.md +7 -1
- package/dist/skills/official/planning-with-files.md +206 -2
- package/dist/skills/official/ui-ux-pro-max.md +88 -1
- package/dist/skills/official/webapp-testing.md +85 -1
- package/dist/skills/registry.d.ts +1 -1
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +15 -4
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/semantic-matcher.d.ts +4 -3
- package/dist/skills/semantic-matcher.d.ts.map +1 -1
- package/dist/skills/semantic-matcher.js +20 -22
- package/dist/skills/semantic-matcher.js.map +1 -1
- package/dist/skills/upgrade-engine.d.ts +93 -0
- package/dist/skills/upgrade-engine.d.ts.map +1 -0
- package/dist/skills/upgrade-engine.js +447 -0
- package/dist/skills/upgrade-engine.js.map +1 -0
- package/dist/skills/upgrade-prompt.d.ts +20 -0
- package/dist/skills/upgrade-prompt.d.ts.map +1 -0
- package/dist/skills/upgrade-prompt.js +75 -0
- package/dist/skills/upgrade-prompt.js.map +1 -0
- 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/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/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/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 -185
- 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 -62
- 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 -302
- 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/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 -16
- package/src/skills/official/find-skills.md +0 -23
- package/src/skills/official/official-api-design.md +0 -17
- package/src/skills/official/official-architecture-decision.md +0 -20
- package/src/skills/official/official-bmad.md +0 -118
- package/src/skills/official/official-db-schema-design.md +0 -16
- package/src/skills/official/official-debug.md +0 -17
- 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 -26
- package/src/skills/official/official-spec-driven-design.md +0 -31
- package/src/skills/official/planning-with-files.md +0 -37
- package/src/skills/official/ui-ux-pro-max.md +0 -18
- package/src/skills/official/webapp-testing.md +0 -12
- package/src/skills/official-skills.ts +0 -89
- package/src/skills/registry.ts +0 -355
- package/src/skills/semantic-matcher.ts +0 -231
- 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/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/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/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,232 +0,0 @@
|
|
|
1
|
-
# claude-forge 架构评审报告
|
|
2
|
-
|
|
3
|
-
生成时间:2026-05-16
|
|
4
|
-
|
|
5
|
-
## 一、当前架构概览
|
|
6
|
-
|
|
7
|
-
### 1.1 分层架构
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
claude-forge/
|
|
11
|
-
├── src/
|
|
12
|
-
│ ├── cli/ # CLI 命令层(用户交互入口)
|
|
13
|
-
│ ├── daemon/ # 守护进程层(事件处理、生命周期管理)
|
|
14
|
-
│ ├── web/ # Web API 层(Express + React Dashboard)
|
|
15
|
-
│ ├── mcp/ # MCP 协议层(Model Context Protocol)
|
|
16
|
-
│ ├── core/ # 核心共享层(storage、config、types、ai)
|
|
17
|
-
│ ├── skills/ # Skill 匹配与注入层
|
|
18
|
-
│ ├── claudemd/ # CLAUDE.md 生成器
|
|
19
|
-
│ └── templates/ # 模板管理
|
|
20
|
-
├── tests/
|
|
21
|
-
│ └── integration/ # 集成测试(28 个测试文件)
|
|
22
|
-
└── web/ # React 前端源码
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### 1.2 核心依赖关系
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
┌─────────────────────────────────────┐
|
|
29
|
-
│ CLI (用户入口) │
|
|
30
|
-
└──────────────┬──────────────────────┘
|
|
31
|
-
│
|
|
32
|
-
┌───────┴────────┐
|
|
33
|
-
▼ ▼
|
|
34
|
-
┌──────────────┐ ┌──────────────┐
|
|
35
|
-
│ Daemon │ │ Web │
|
|
36
|
-
│ (事件处理) │ │ (API/UI) │
|
|
37
|
-
└──────┬───────┘ └──────┬───────┘
|
|
38
|
-
│ │
|
|
39
|
-
└────────┬────────┘
|
|
40
|
-
▼
|
|
41
|
-
┌───────────────┐
|
|
42
|
-
│ Core │
|
|
43
|
-
│ (storage/ai) │
|
|
44
|
-
└───────┬───────┘
|
|
45
|
-
│
|
|
46
|
-
┌───────┴────────┐
|
|
47
|
-
▼ ▼
|
|
48
|
-
┌──────────┐ ┌──────────┐
|
|
49
|
-
│ Skills │ │ CLAUDEmd │
|
|
50
|
-
│ (匹配器) │ │ (生成器) │
|
|
51
|
-
└──────────┘ └──────────┘
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 1.3 数据流
|
|
55
|
-
|
|
56
|
-
```
|
|
57
|
-
Claude Code Hook
|
|
58
|
-
↓ (Unix Socket)
|
|
59
|
-
Daemon Server (router.ts)
|
|
60
|
-
↓
|
|
61
|
-
Event Handlers (user-prompt.ts / post-tool-use.ts / stop.ts)
|
|
62
|
-
↓
|
|
63
|
-
Storage (SQLite) + Services (TaskSegmenter / ResumeManager / SkillRegistry)
|
|
64
|
-
↓
|
|
65
|
-
Injection (systemMessage / additionalContext)
|
|
66
|
-
↓
|
|
67
|
-
Claude Code (返回给 AI)
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## 二、发现的问题
|
|
71
|
-
|
|
72
|
-
### 2.1 严重问题(P0)
|
|
73
|
-
|
|
74
|
-
**无严重架构问题**
|
|
75
|
-
|
|
76
|
-
当前架构清晰,分层合理,依赖方向正确(单向依赖 core)。
|
|
77
|
-
|
|
78
|
-
### 2.2 中等问题(P1)
|
|
79
|
-
|
|
80
|
-
#### 问题 1:单元测试缺失
|
|
81
|
-
|
|
82
|
-
- **现状**:`src/` 目录下 0 个单元测试,仅 `tests/integration/` 有 28 个集成测试
|
|
83
|
-
- **影响**:重构风险高,无法快速验证单个模块的正确性
|
|
84
|
-
- **位置**:所有 `src/**/*.ts` 文件
|
|
85
|
-
- **建议**:为 core 层(storage/utils/types)补充单元测试
|
|
86
|
-
|
|
87
|
-
#### 问题 2:Web 层路由文件过多
|
|
88
|
-
|
|
89
|
-
- **现状**:`src/web/routes/` 下有 15+ 个路由文件
|
|
90
|
-
- **影响**:维护成本高,每个功能一个文件略显碎片化
|
|
91
|
-
- **位置**:`src/web/routes/`
|
|
92
|
-
- **建议**:考虑按功能域合并(如 stats + skill-stats + reports + insights 合并为 analytics 路由)
|
|
93
|
-
|
|
94
|
-
### 2.3 轻微问题(P2)
|
|
95
|
-
|
|
96
|
-
#### 问题 3:Daemon 主文件职责过多
|
|
97
|
-
|
|
98
|
-
- **现状**:`src/daemon/index.ts` 包含初始化、生命周期、事件处理、维护任务等多个职责
|
|
99
|
-
- **影响**:文件较长(250 行),职责边界不够清晰
|
|
100
|
-
- **位置**:`src/daemon/index.ts`
|
|
101
|
-
- **建议**:将维护任务(maintenance interval)抽取为独立模块
|
|
102
|
-
|
|
103
|
-
#### 问题 4:Storage 层已重构但缺乏文档
|
|
104
|
-
|
|
105
|
-
- **现状**:`sqlite.ts` 已从 1000+ 行单文件拆分为 9 个 Operations 类,但重构文档缺失
|
|
106
|
-
- **影响**:新开发者可能不清楚如何添加新的存储操作
|
|
107
|
-
- **位置**:`src/core/storage/`
|
|
108
|
-
- **建议**:添加 `README.md` 说明存储层架构和扩展方式
|
|
109
|
-
|
|
110
|
-
#### 问题 5:类型系统可以更严格
|
|
111
|
-
|
|
112
|
-
- **现状**:`ForgeEvent` 使用可选字段(`tool_name?`),需要运行时检查
|
|
113
|
-
- **影响**:类型安全性略低,需要 type guard 保护
|
|
114
|
-
- **位置**:`src/core/types.ts`
|
|
115
|
-
- **建议**:当前已通过 `ForgeEventNarrow` 联合类型解决,无需进一步优化
|
|
116
|
-
|
|
117
|
-
## 三、重构必要性评估
|
|
118
|
-
|
|
119
|
-
### 评估结论:**建议优化,无需大规模重构**
|
|
120
|
-
|
|
121
|
-
### 理由
|
|
122
|
-
|
|
123
|
-
1. **架构健康度高**
|
|
124
|
-
- 分层清晰(CLI / Daemon / Web / Core)
|
|
125
|
-
- 依赖方向正确(单向依赖 core)
|
|
126
|
-
- 模块边界明确(storage / skills / claudemd)
|
|
127
|
-
|
|
128
|
-
2. **已有重构基础良好**
|
|
129
|
-
- Storage 层已完成职责拆分(9 个 Operations 类)
|
|
130
|
-
- 类型系统已优化(ForgeEvent → ForgeEventNarrow)
|
|
131
|
-
- 命名规范已统一(kebab-case 文件名)
|
|
132
|
-
|
|
133
|
-
3. **主要问题是测试覆盖不足**
|
|
134
|
-
- 缺少单元测试是新功能的最大风险
|
|
135
|
-
- 但不需要架构重构,只需补充测试
|
|
136
|
-
|
|
137
|
-
### 如果要重构,优先级排序
|
|
138
|
-
|
|
139
|
-
1. **P1:补充单元测试**(提升重构信心)
|
|
140
|
-
- 范围:core/storage, core/utils, daemon/handlers
|
|
141
|
-
- 工作量:中等(约 2-3 周)
|
|
142
|
-
- 风险:低(不改变现有代码)
|
|
143
|
-
|
|
144
|
-
2. **P2:合并 Web 路由**(降低维护成本)
|
|
145
|
-
- 范围:stats + skill-stats + reports + insights → analytics
|
|
146
|
-
- 工作量:小(约 2-3 天)
|
|
147
|
-
- 风险:低(仅文件合并)
|
|
148
|
-
|
|
149
|
-
3. **P3:抽取 Daemon 维护任务**(职责分离)
|
|
150
|
-
- 范围:daemon/index.ts 中的 maintenance interval
|
|
151
|
-
- 工作量:极小(约 1 天)
|
|
152
|
-
- 风险:极低(纯重构)
|
|
153
|
-
|
|
154
|
-
## 四、升维优化方向(如果决定重构)
|
|
155
|
-
|
|
156
|
-
### 方向 1:事件驱动架构升级
|
|
157
|
-
|
|
158
|
-
**目标**:将当前同步事件处理改为异步消息队列
|
|
159
|
-
|
|
160
|
-
**收益**:
|
|
161
|
-
- 提升吞吐量(高并发场景)
|
|
162
|
-
- 支持事件重放和恢复
|
|
163
|
-
- 解耦事件生产者和消费者
|
|
164
|
-
|
|
165
|
-
**代价**:
|
|
166
|
-
- 引入消息队列(如 BullMQ)
|
|
167
|
-
- 架构复杂度上升
|
|
168
|
-
- 需要处理消息幂等性
|
|
169
|
-
|
|
170
|
-
**适用场景**:单机事件量 > 10万/天
|
|
171
|
-
|
|
172
|
-
### 方向 2:插件化架构
|
|
173
|
-
|
|
174
|
-
**目标**:将 Skills、CLAUDE.md、Handlers 都设计为可插拔插件
|
|
175
|
-
|
|
176
|
-
**收益**:
|
|
177
|
-
- 用户可自定义扩展(如自定义 Handler)
|
|
178
|
-
- 核心代码更稳定
|
|
179
|
-
- 便于社区贡献
|
|
180
|
-
|
|
181
|
-
**代价**:
|
|
182
|
-
- 需要设计插件 API
|
|
183
|
-
- 插件版本管理复杂
|
|
184
|
-
- 文档负担增加
|
|
185
|
-
|
|
186
|
-
**适用场景**:用户有自定义扩展需求
|
|
187
|
-
|
|
188
|
-
### 方向 3:多租户隔离
|
|
189
|
-
|
|
190
|
-
**目标**:支持多项目隔离存储和配置
|
|
191
|
-
|
|
192
|
-
**收益**:
|
|
193
|
-
- 支持团队协作场景
|
|
194
|
-
- 数据隔离更安全
|
|
195
|
-
- 可支持 SaaS 模式
|
|
196
|
-
|
|
197
|
-
**代价**:
|
|
198
|
-
- 数据库 schema 需要调整
|
|
199
|
-
- 权限控制复杂度上升
|
|
200
|
-
- 需要租户管理功能
|
|
201
|
-
|
|
202
|
-
**适用场景**:企业级团队使用
|
|
203
|
-
|
|
204
|
-
## 五、建议
|
|
205
|
-
|
|
206
|
-
### 短期建议(1-2 个月)
|
|
207
|
-
|
|
208
|
-
1. **补充单元测试**:优先为 core/storage 和 daemon/handlers 添加测试
|
|
209
|
-
2. **添加存储层文档**:在 `src/core/storage/README.md` 说明架构
|
|
210
|
-
3. **合并 Web 路由**:将相关路由文件合并(analytics 相关)
|
|
211
|
-
|
|
212
|
-
### 中期建议(3-6 个月)
|
|
213
|
-
|
|
214
|
-
1. **评估事件驱动升级**:如果事件量增长,考虑引入消息队列
|
|
215
|
-
2. **插件化设计调研**:如果用户有自定义需求,启动插件 API 设计
|
|
216
|
-
|
|
217
|
-
### 长期建议(6-12 个月)
|
|
218
|
-
|
|
219
|
-
1. **多租户支持**:如果转向企业级产品,启动多租户架构设计
|
|
220
|
-
|
|
221
|
-
## 六、总结
|
|
222
|
-
|
|
223
|
-
**当前架构评级:B+(良好)**
|
|
224
|
-
|
|
225
|
-
- ✅ 分层清晰,依赖方向正确
|
|
226
|
-
- ✅ 已完成部分重构(Storage 层拆分)
|
|
227
|
-
- ⚠️ 单元测试缺失,重构风险较高
|
|
228
|
-
- ⚠️ Web 路由略碎片化
|
|
229
|
-
|
|
230
|
-
**核心建议:补充测试 > 小范围优化 > 大规模重构**
|
|
231
|
-
|
|
232
|
-
当前架构足够支撑业务发展,优先补充测试覆盖,无需立即进行大规模重构。
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
# Fix Spec: Official Skills 数据分离 + UserPromptHandler Set 内存泄漏
|
|
2
|
-
|
|
3
|
-
**日期**: 2026-05-16
|
|
4
|
-
**状态**: Draft(待用户 review)
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 一、目标
|
|
9
|
-
|
|
10
|
-
| # | 修复点 | 成功标准 |
|
|
11
|
-
|---|--------|---------|
|
|
12
|
-
| 1 | Official Skills 数据/代码分离 | `official-skills.ts` 不再包含任何 skill 内容字符串;新增 `.md` 文件可被 `tsc` + `npm pack` 正确带入 `dist/` |
|
|
13
|
-
| 2 | UserPromptHandler 无界 Set 内存泄漏 | `resumeInjected` / `conventionInjected` Set 在 session 结束后被清理,或存在 LRU 上限,daemon 长期运行不会无限增长 |
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 二、调研结论摘要
|
|
18
|
-
|
|
19
|
-
### 修复点 1 — 现状数据结构
|
|
20
|
-
|
|
21
|
-
`OfficialSkill` 接口(`src/skills/official-skills.ts:6-12`)有 5 个字段:
|
|
22
|
-
|
|
23
|
-
| 字段 | 类型 | 说明 |
|
|
24
|
-
|------|------|------|
|
|
25
|
-
| `name` | `string` | skill id,如 `official-tdd` |
|
|
26
|
-
| `version` | `string` | 版本号,如 `1.2.0` |
|
|
27
|
-
| `description` | `string` | 一句话描述 |
|
|
28
|
-
| `keywords` | `string[]` | 关键词(部分 skill 有扩展 keywords 在 `OFFICIAL_SKILL_KEYWORDS` 里) |
|
|
29
|
-
| `content` | `string` | 完整 `.md` 文本,包含 frontmatter |
|
|
30
|
-
|
|
31
|
-
共 19 个 skill(OFFICIAL_SKILLS 数组) + 1 个关键词映射表 `OFFICIAL_SKILL_KEYWORDS`(19 条)。
|
|
32
|
-
`content` 字段本身已是 frontmatter+body 的完整 markdown,说明 skill 文件可直接拆分为独立 `.md`。
|
|
33
|
-
|
|
34
|
-
### 修复点 1 — npm 发布打包现状
|
|
35
|
-
|
|
36
|
-
`package.json` 无 `files` 字段,默认发布全部未被 `.gitignore` 的文件。
|
|
37
|
-
`build` 脚本(`package.json:13`)仅用 `tsc` 编译 `src/**/*.ts` 到 `dist/`,静态文件靠 `cp` 显式拷贝(`schema.sql`、`hooks/*.sh`、`launchd/*.template`)。
|
|
38
|
-
**关键结论**:`.md` 数据文件不在 `tsc` 编译范围内,**需要在 build 脚本中加 `cp` 命令**,否则 `dist/` 运行时找不到文件。
|
|
39
|
-
|
|
40
|
-
### 修复点 1 — registry 加载逻辑
|
|
41
|
-
|
|
42
|
-
`SkillRegistry.scan()`(`src/skills/registry.ts:49-133`)分两段:
|
|
43
|
-
1. 先循环 `OFFICIAL_SKILLS` 数组,直接写入 Map(无文件读取)
|
|
44
|
-
2. 再扫 `~/.claude/skills/*.md`,用 `gray-matter` 解析
|
|
45
|
-
|
|
46
|
-
改造后只需把第 1 段改为扫内置目录的 `.md`,解析逻辑与第 2 段完全一致。
|
|
47
|
-
|
|
48
|
-
### 修复点 2 — Set 的语义
|
|
49
|
-
|
|
50
|
-
两个 Set 均以 `${session_id}:${project_path}` 为 key,目的是**每个 session 只注入一次 resume/convention**。
|
|
51
|
-
|
|
52
|
-
`InvocationGuard` 的参考方案(`src/skills/invocation-guard.ts`):
|
|
53
|
-
- 用 `Map<sessionId, SessionInvocations>` 存状态
|
|
54
|
-
- 有 TTL(30 min)+ 5 min 定时清理
|
|
55
|
-
- StopHandler 显式调用 `guard.clear(sessionId)`(`src/daemon/handlers/stop.ts:61-65`)
|
|
56
|
-
|
|
57
|
-
两种修复方案对比:
|
|
58
|
-
|
|
59
|
-
| | 方案 A:StopHandler 清理 | 方案 B:TTL + 定时清理 |
|
|
60
|
-
|-|---|---|
|
|
61
|
-
| 原理 | Stop 事件时从 Set 删除对应 key | 用 `Map<key, {timestamp}>` 替换 Set,定期扫描过期 |
|
|
62
|
-
| 实现复杂度 | 低(3-5 行)| 中(需改 Set 为 Map + 定时器)|
|
|
63
|
-
| 覆盖范围 | 正常关闭的 session | 还能覆盖 crash/无 Stop 事件的情况 |
|
|
64
|
-
| 与现有代码一致性 | 与 InvocationGuard.clear() 模式完全一致 | 需引入新依赖模式 |
|
|
65
|
-
| 内存界限保证 | 依赖 Stop 事件的完整性 | 绝对有界 |
|
|
66
|
-
|
|
67
|
-
**结论**:采用 **方案 A(StopHandler 清理)为主 + 方案 B LRU 上限 1000 为兜底**,两者互补。
|
|
68
|
-
|
|
69
|
-
---
|
|
70
|
-
|
|
71
|
-
## 三、改动文件清单
|
|
72
|
-
|
|
73
|
-
### 修复点 1
|
|
74
|
-
|
|
75
|
-
| 文件路径 | 改动类型 | 改动概述 |
|
|
76
|
-
|----------|----------|---------|
|
|
77
|
-
| `src/skills/official/*.md` | **新建 19 个文件** | 每个 skill 对应一个 `.md`,内容为现有 `content` 字段(已含 frontmatter);skill `name` 和 `version` 在 frontmatter 中保留 |
|
|
78
|
-
| `src/skills/official-skills.ts` | **大幅削减** | 删除 `OFFICIAL_SKILLS` 数组全部 skill 字面量;保留 `OFFICIAL_SKILL_KEYWORDS` 常量和 `OfficialSkill` 接口(供类型引用);新增导出函数 `loadOfficialSkills(builtinDir: string): OfficialSkill[]` |
|
|
79
|
-
| `src/skills/registry.ts` | **修改** | `scan()` 第 1 段改为调用 `loadOfficialSkills(resolveBuiltinDir())`;新增私有方法 `resolveBuiltinDir()` 解析 `import.meta.url` 相对路径(兼容 npm 安装和开发环境)|
|
|
80
|
-
| `package.json` | **修改** | `build` 脚本末尾追加 `mkdir -p dist/skills/official && cp src/skills/official/*.md dist/skills/official/` |
|
|
81
|
-
| `tests/unit/skill-registry.test.ts` | **修改** | 调整 skill 数量断言(现在硬编码 `>= 16`,改为 `>= 19` 或使用动态读取数量)|
|
|
82
|
-
|
|
83
|
-
### 修复点 2
|
|
84
|
-
|
|
85
|
-
| 文件路径 | 改动类型 | 改动概述 |
|
|
86
|
-
|----------|----------|---------|
|
|
87
|
-
| `src/daemon/handlers/user-prompt.ts` | **修改** | 将两个 `Set<string>` 改为 `Map<string, number>`(值存写入时间戳);新增 `clearSession(sessionKey: string)` 公共方法;新增静态常量 `MAX_INJECTION_KEYS = 1000` 作为 LRU 上限兜底 |
|
|
88
|
-
| `src/daemon/handlers/stop.ts` | **修改** | 在 Step 4(InvocationGuard 清理)之后,增加 Step 5:调用 `userPromptHandler.clearSession(sessionKey)` |
|
|
89
|
-
| `src/daemon/index.ts` 或 handler 初始化处 | **修改**(视注入方式) | 确保 `StopHandler` 持有 `UserPromptHandler` 的引用,或通过事件总线传递 |
|
|
90
|
-
| `tests/unit/handlers.test.ts` | **修改** | 新增 case:同一 session 两次调用只注入一次;stop 后再次调用会重新注入 |
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## 四、关键设计决策
|
|
95
|
-
|
|
96
|
-
### 修复点 1
|
|
97
|
-
|
|
98
|
-
**决策 1-A:每个 skill 一个 `.md` 文件,不拆 json+md**
|
|
99
|
-
|
|
100
|
-
理由:`content` 字段本身已是 frontmatter+markdown 格式,直接拆分零转换成本。独立文件对 diff 友好,增删 skill 只需增删一个文件。避免引入额外的索引文件维护负担。
|
|
101
|
-
|
|
102
|
-
**决策 1-B:文件放在 `src/skills/official/` 而非 `data/official-skills/`**
|
|
103
|
-
|
|
104
|
-
理由:与其他 skill 相关代码同目录,减少跨目录路径解析复杂度。`tsc` 的 `rootDir` 是 `src/`,`outDir` 是 `dist/`,拷贝路径天然对应 `dist/skills/official/`,逻辑清晰。
|
|
105
|
-
|
|
106
|
-
**决策 1-C:`loadOfficialSkills` 接收 `builtinDir` 参数而非硬编码 `__dirname`**
|
|
107
|
-
|
|
108
|
-
理由:便于单元测试(可传入临时目录)。`registry.ts` 中统一用 `resolveBuiltinDir()` 计算路径,该函数用 `import.meta.url` 解析(ESM 环境),兼容 npm 全局安装后路径变更的场景(参考 `feedback_npm_path.md` 记录的教训)。
|
|
109
|
-
|
|
110
|
-
### 修复点 2
|
|
111
|
-
|
|
112
|
-
**决策 2-A:采用方案 A(Stop 清理)+ 方案 B(LRU 上限 1000)双保险**
|
|
113
|
-
|
|
114
|
-
理由:方案 A 是精确清理,与 InvocationGuard 模式一致,代码可读性强;方案 B 兜底 crash/无 Stop 场景。上限 1000 entry 约占内存 < 100KB(每个 key 约 80 bytes),完全可接受。
|
|
115
|
-
|
|
116
|
-
**决策 2-B:将 Set 改为 `Map<string, number>`(保存 timestamp),不引入 TTL 定时器**
|
|
117
|
-
|
|
118
|
-
理由:timestamp 用于 LRU 淘汰,在 `add` 时若超过 1000 条则删最旧的一条。不需要独立定时器(依赖 Stop 清理 + 容量上限已足够),避免增加守护进程复杂度。
|
|
119
|
-
|
|
120
|
-
**决策 2-C:新增 `clearSession(sessionKey)` 为 public 方法,不通过构造函数注入 StopHandler**
|
|
121
|
-
|
|
122
|
-
理由:`UserPromptHandler` 不应依赖 `StopHandler`,应由 `StopHandler` 持有 `UserPromptHandler` 的引用(单向依赖)。在 daemon 初始化时将 `UserPromptHandler` 实例传入 `StopHandler` 构造函数(或 setter)。
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## 五、风险点
|
|
127
|
-
|
|
128
|
-
| 风险 | 影响 | 缓解措施 |
|
|
129
|
-
|------|------|---------|
|
|
130
|
-
| **npm 发布后找不到 `.md` 文件** | 运行时加载 0 个 official skill,功能退化 | build 脚本加 `cp`;发布前验证 `dist/skills/official/` 目录存在(可加 `prebuild` 检查) |
|
|
131
|
-
| **`import.meta.url` 路径解析在 CJS 降级时失效** | N/A(项目是纯 ESM,`"type": "module"`)| 无需处理 |
|
|
132
|
-
| **`StopHandler` 持有 `UserPromptHandler` 引用导致循环依赖** | 编译报错 | 检查依赖链:`user-prompt.ts` 不 import `stop.ts`,反向持有安全 |
|
|
133
|
-
| **同 `session_id` 不同 `project_path` 切换**(同一 session key 不同 project)| 理论上 session_id 全局唯一,不会出现此情况 | 无需处理 |
|
|
134
|
-
| **官方 skill 版本管理** | 拆成独立文件后版本号散落各 `.md` frontmatter,不易整体更新 | 可在 `OFFICIAL_SKILL_KEYWORDS` 常量旁维护一个 `OFFICIAL_SKILL_VERSIONS` 对象供版本检查(可选,Phase 2 再做)|
|
|
135
|
-
| **测试中 skill 数量硬编码** | 修复点 1 后 skill 数量变为 19,现有断言 `>= 16` 可能需要调整 | 改动时同步更新 `tests/unit/skill-registry.test.ts` 断言 |
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## 六、测试策略
|
|
140
|
-
|
|
141
|
-
### 修复点 1
|
|
142
|
-
|
|
143
|
-
| 测试文件 | 测试内容 |
|
|
144
|
-
|----------|---------|
|
|
145
|
-
| `tests/unit/skill-registry.test.ts` | 修改:`skills.length >= 19`;新增:`official-tdd` 等具体 skill 可被加载;`path !== '<built-in>'`(改为真实文件路径) |
|
|
146
|
-
| 新建 `tests/unit/skills/official-skills-loader.test.ts` | 验证 `loadOfficialSkills(tempDir)` 从指定目录读取所有 `.md`;验证 frontmatter 解析正确(name、version、description、keywords);验证目录不存在时抛出有意义的错误 |
|
|
147
|
-
| `tests/unit/skills/registry-multiformat.test.ts` | 现有测试保持不变(测试 gray-matter 解析逻辑,与文件位置无关)|
|
|
148
|
-
|
|
149
|
-
### 修复点 2
|
|
150
|
-
|
|
151
|
-
| 测试文件 | 测试内容 |
|
|
152
|
-
|----------|---------|
|
|
153
|
-
| `tests/unit/handlers.test.ts` | 新增:同一 session 第二次调用 `handle()` 不重复注入 resume/convention;新增:`clearSession()` 后再次调用会重新注入;新增:超过 1000 个不同 sessionKey 后不崩溃(LRU 上限生效) |
|
|
154
|
-
| `tests/unit/invocation-guard.test.ts` | 参考现有结构确认模式一致性,无需改动 |
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## 七、执行步骤(自底向上)
|
|
159
|
-
|
|
160
|
-
```
|
|
161
|
-
修复点 1:官方 Skills 数据分离
|
|
162
|
-
──────────────────────────────
|
|
163
|
-
Step 1 从 official-skills.ts 提取每个 skill 的 content 字段,
|
|
164
|
-
在 src/skills/official/ 下创建对应 .md 文件(19 个)
|
|
165
|
-
文件名 = skill.name + '.md'(如 official-tdd.md)
|
|
166
|
-
内容 = content 字段原文(已含 frontmatter)
|
|
167
|
-
|
|
168
|
-
Step 2 在 src/skills/official-skills.ts 中:
|
|
169
|
-
- 删除 OFFICIAL_SKILLS 数组(整个 export const OFFICIAL_SKILLS)
|
|
170
|
-
- 保留 OfficialSkill interface
|
|
171
|
-
- 保留 OFFICIAL_SKILL_KEYWORDS 常量
|
|
172
|
-
- 新增 loadOfficialSkills(builtinDir: string): OfficialSkill[] 函数
|
|
173
|
-
(用 fs.readdirSync + gray-matter 解析,与 registry 现有 user skill 逻辑对齐)
|
|
174
|
-
|
|
175
|
-
Step 3 修改 src/skills/registry.ts:
|
|
176
|
-
- 新增私有方法 resolveBuiltinDir(): string
|
|
177
|
-
使用 new URL('./official', import.meta.url).pathname
|
|
178
|
-
- scan() 第 1 段改为调用 loadOfficialSkills(this.resolveBuiltinDir())
|
|
179
|
-
- 其余逻辑不变
|
|
180
|
-
|
|
181
|
-
Step 4 修改 package.json build 脚本:
|
|
182
|
-
末尾追加 && mkdir -p dist/skills/official && cp src/skills/official/*.md dist/skills/official/
|
|
183
|
-
|
|
184
|
-
Step 5 修改 tests/unit/skill-registry.test.ts 断言数量
|
|
185
|
-
|
|
186
|
-
Step 6 新建 tests/unit/skills/official-skills-loader.test.ts
|
|
187
|
-
|
|
188
|
-
Step 7 运行测试验证:
|
|
189
|
-
npx vitest run tests/unit/skill-registry.test.ts --reporter=verbose
|
|
190
|
-
npx vitest run tests/unit/skills/ --reporter=verbose
|
|
191
|
-
npx tsc --noEmit
|
|
192
|
-
|
|
193
|
-
修复点 2:UserPromptHandler Set 内存泄漏
|
|
194
|
-
─────────────────────────────────────────
|
|
195
|
-
Step 8 修改 src/daemon/handlers/user-prompt.ts:
|
|
196
|
-
- 将 resumeInjected: Set<string> 改为 Map<string, number>
|
|
197
|
-
- 将 conventionInjected: Set<string> 改为 Map<string, number>
|
|
198
|
-
- 新增常量 MAX_INJECTION_KEYS = 1000
|
|
199
|
-
- 封装私有方法 hasInjected(map, key): boolean
|
|
200
|
-
- 封装私有方法 markInjected(map, key): void
|
|
201
|
-
(在 map.size >= MAX_INJECTION_KEYS 时删除最旧的一条)
|
|
202
|
-
- 新增 public clearSession(sessionKey: string): void
|
|
203
|
-
(同时从两个 Map 删除该 key)
|
|
204
|
-
|
|
205
|
-
Step 9 修改 src/daemon/handlers/stop.ts:
|
|
206
|
-
- 构造函数新增可选参数 userPromptHandler?: UserPromptHandler
|
|
207
|
-
- Step 4 的 InvocationGuard.clear() 之后,调用
|
|
208
|
-
userPromptHandler?.clearSession(`${event.session_id}:${event.project_path}`)
|
|
209
|
-
|
|
210
|
-
Step 10 修改 daemon 初始化处(src/daemon/index.ts 或类似文件),
|
|
211
|
-
在构造 StopHandler 时传入 userPromptHandler 实例
|
|
212
|
-
|
|
213
|
-
Step 11 修改 tests/unit/handlers.test.ts,新增 3 个 case(见测试策略)
|
|
214
|
-
|
|
215
|
-
Step 12 运行测试验证:
|
|
216
|
-
npx vitest run tests/unit/handlers.test.ts --reporter=verbose
|
|
217
|
-
npx tsc --noEmit
|
|
218
|
-
npm test -- --reporter=dot
|
|
219
|
-
```
|