@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,46 +0,0 @@
|
|
|
1
|
-
# H6 实施 Changelog
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-18 13:55
|
|
4
|
-
**Spec**: docs/design/h6-services-migration-spec-20260518-1355.md
|
|
5
|
-
**Status**: 完成
|
|
6
|
-
|
|
7
|
-
## 完成清单
|
|
8
|
-
- [x] safety-net: tests/integration/web-analytics.integration.test.ts(3/3 pass,迁移前后均通过)
|
|
9
|
-
- [x] git mv 3 文件到 src/web/analytics/(保留 git history)
|
|
10
|
-
- [x] 改 3 处 import 路径(drift / reports / insights routes)
|
|
11
|
-
- [x] 清理 2 处误导注释(weekly-report 的 "implemented by another agent" + anti-pattern 的 "daemon/services 既定做法")
|
|
12
|
-
- [x] task-segmenter.ts 保留原地不动
|
|
13
|
-
- [x] vitest.config.ts 加入 `tests/integration/**` 到 include(让 safety-net 能被 npm test 拾取)
|
|
14
|
-
|
|
15
|
-
## 关键代码定位
|
|
16
|
-
- 新测试文件:`tests/integration/web-analytics.integration.test.ts:1-67`
|
|
17
|
-
- 迁移后入口:`src/web/analytics/{drift-detector,weekly-report,anti-pattern-detector}.ts`
|
|
18
|
-
- import 变更:
|
|
19
|
-
- `src/web/routes/drift.ts:3` → `from '../analytics/drift-detector.js'`
|
|
20
|
-
- `src/web/routes/reports.ts:10` → `from '../analytics/weekly-report.js'`
|
|
21
|
-
- `src/web/routes/insights.ts:7` → `from '../analytics/anti-pattern-detector.js'`
|
|
22
|
-
- 注释清理:
|
|
23
|
-
- `src/web/analytics/weekly-report.ts:293-297`(aggregateAnomalies 内)
|
|
24
|
-
- `src/web/analytics/anti-pattern-detector.ts:76-81`(queryEventsSince 上方 JSDoc)
|
|
25
|
-
- vitest 配置:`vitest.config.ts:8`
|
|
26
|
-
|
|
27
|
-
## 测试结果
|
|
28
|
-
- web-analytics 集成测试:3 passed(迁移前 baseline、迁移后回归均 3/3)
|
|
29
|
-
- tsc --noEmit:0 errors
|
|
30
|
-
- npm test:455 passed / 1 failed(仅 pre-existing `linkEventToTask` 失败,与本次迁移无关)
|
|
31
|
-
- npm run build:成功(dist/web/analytics/ 产出齐全;dist/daemon/services/ 只剩 task-segmenter)
|
|
32
|
-
|
|
33
|
-
## 超出 spec 改动
|
|
34
|
-
- **vitest.config.ts 更新 include 模式**:原配置只扫描 `tests/unit/**`,导致 `tests/integration/**` 下的测试(含已有的 `tasks-filter.integration.test.ts`)从未跑过。为让 safety-net 真正生效,新增 `tests/integration/**/*.test.ts` 到 include。
|
|
35
|
-
- 副作用确认:把 `tasks-filter.integration.test.ts` 也拉进 CI,但它本就在主测试套件中通过(455 项 passed 含它)。
|
|
36
|
-
|
|
37
|
-
## 已知问题
|
|
38
|
-
- `tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask` 失败(pre-existing,事件 UUID 校验问题,与 H6 迁移无关)
|
|
39
|
-
|
|
40
|
-
## 迁移内文件 import 路径核查
|
|
41
|
-
3 个被迁移的文件原来用 `../../core/...` 引用 core 层。从 `src/daemon/services/` 移到 `src/web/analytics/` 后,相对深度未变(仍为 2 层向上),无需调整。grep 校验通过:
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
grep -rn "daemon/services/drift-detector|daemon/services/weekly-report|daemon/services/anti-pattern-detector" src/ tests/
|
|
45
|
-
→ 无任何匹配
|
|
46
|
-
```
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# H7 + M9 实施 Changelog
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-18 13:00
|
|
4
|
-
**Status**: 完成
|
|
5
|
-
|
|
6
|
-
## 背景修正
|
|
7
|
-
|
|
8
|
-
原 review 误判:`claude-sonnet-4-6` 实际为合法 Sonnet 4.6 ID(非"非法")。
|
|
9
|
-
真实问题:`provider.ts` 的 `DEFAULT_MODEL` 是已过时的 `claude-sonnet-4-20250514`(Sonnet 4.0 旧 ID),应改用 constants 暴露的最新值。
|
|
10
|
-
端口侧的真实问题:`constants.ts` 的 `WEB_PORT: 3456` 是孤儿值(无人引用),而实际事实标准是 `3721`(7 个文件硬编码)。
|
|
11
|
-
|
|
12
|
-
## 完成清单
|
|
13
|
-
|
|
14
|
-
- [x] `constants.ts` `WEB_PORT: 3456` → `3721`
|
|
15
|
-
- [x] `provider.ts` 删除硬编码 `DEFAULT_MODEL`,改用 `DEFAULTS.AI_MODEL`
|
|
16
|
-
- [x] `daemon/index.ts:73` 端口 fallback 用 `DEFAULTS.WEB_PORT`
|
|
17
|
-
- [x] `cli/commands/daemon.ts:46` 同上
|
|
18
|
-
- [x] `cli/commands/init.ts:107` 同上
|
|
19
|
-
- [x] `core/utils/error-handler.ts:224` 同上 (`String(DEFAULTS.WEB_PORT)`)
|
|
20
|
-
- [x] URL 字符串改 template literal(menu.ts ×3, trace.ts ×1)
|
|
21
|
-
|
|
22
|
-
## 关键文件
|
|
23
|
-
|
|
24
|
-
- `src/core/constants.ts:44` — `WEB_PORT: 3721`
|
|
25
|
-
- `src/core/ai/provider.ts:27-29` — 移除 `DEFAULT_MODEL`,新增 `import { DEFAULTS } from '../constants.js'`
|
|
26
|
-
- `src/daemon/index.ts:73` — `?? DEFAULTS.WEB_PORT`
|
|
27
|
-
- `src/cli/commands/daemon.ts:46` — `const DEFAULT_PORT = DEFAULTS.WEB_PORT`
|
|
28
|
-
- `src/cli/commands/init.ts:107` — `let webPort: number = DEFAULTS.WEB_PORT`
|
|
29
|
-
- `src/core/utils/error-handler.ts:224` — `String(DEFAULTS.WEB_PORT)`
|
|
30
|
-
- `src/cli/commands/menu.ts:127,129,244` — template literal `http://localhost:${DEFAULTS.WEB_PORT}`
|
|
31
|
-
- `src/cli/commands/trace.ts:154` — 同上
|
|
32
|
-
|
|
33
|
-
## 测试结果
|
|
34
|
-
|
|
35
|
-
- `npx tsc --noEmit`:0 errors
|
|
36
|
-
- `npm test`:423 passed / 1 failed(pre-existing `linkEventToTask` 与本次变更无关,位于 `tests/unit/storage/sqlite-refactor-harness.test.ts`,根因在 `EventOperations.writeEvent` 校验)
|
|
37
|
-
|
|
38
|
-
## 不改的位置(理由)
|
|
39
|
-
|
|
40
|
-
无。原计划中保守保留的 URL 字符串(menu.ts / trace.ts)由于改造极轻量(template literal),一并收敛进 `DEFAULTS.WEB_PORT`,进一步消除字面量漂移风险。
|
|
41
|
-
|
|
42
|
-
## 影响面 / 风险
|
|
43
|
-
|
|
44
|
-
- 行为变更点:`constants.ts` 的 `WEB_PORT` 之前为 `3456`,但 grep 确认无实际引用,所以此值修正为 `3721` 不产生回归。
|
|
45
|
-
- `provider.ts` 默认模型从过时的 `claude-sonnet-4-20250514` 改为合法的 `claude-sonnet-4-6`:在 `config.ai.model` 未显式设置时,AI 调用将使用 Sonnet 4.6(更新、更便宜、更强)。这是预期升级。
|
|
46
|
-
- 所有端口硬编码已收敛到 `DEFAULTS.WEB_PORT`,后续调整只需改一处。
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
# Hook Failure Queue + Daemon Startup Replay — Implementation Changelog
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-16 14:30 → 15:10
|
|
4
|
-
**Spec**: `docs/design/hook-failure-queue-spec-20260516-1530.md`
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 实际改动文件清单
|
|
9
|
-
|
|
10
|
-
| 路径 | 改动类型 | 说明 |
|
|
11
|
-
|---|---|---|
|
|
12
|
-
| `src/core/queue/index.ts` | 新建 | 队列核心模块(enqueueEvent / replayQueue / pruneQueue) |
|
|
13
|
-
| `src/core/storage/events.ts` | 修改 | UNIQUE constraint 降级为 debug 日志,不再打 error |
|
|
14
|
-
| `src/daemon/index.ts` | 修改 | 新增 `replayQueue` import + `setImmediate` 调用 |
|
|
15
|
-
| `src/hooks/hook-lib.sh` | 新建 | 共享库:`send_event_or_enqueue` + `_enqueue_event_bg` |
|
|
16
|
-
| `src/hooks/user-prompt-submit.sh` | 修改 | source hook-lib.sh,改用 `send_event_or_enqueue` |
|
|
17
|
-
| `src/hooks/pre-tool-use.sh` | 修改 | 同上 |
|
|
18
|
-
| `src/hooks/post-tool-use.sh` | 修改 | 同上 |
|
|
19
|
-
| `src/hooks/notification.sh` | 修改 | 同上(spec 标注"低优先级可选",按主线程要求一并修改) |
|
|
20
|
-
| `tests/unit/queue.test.ts` | 新建 | 单元测试(9 个用例) |
|
|
21
|
-
| `tests/integration/queue-replay.integration.test.ts` | 新建 | 集成测试(3 个用例) |
|
|
22
|
-
| `vitest.integration.config.ts` | 新建 | 临时 vitest 配置,使集成测试可独立运行 |
|
|
23
|
-
|
|
24
|
-
`src/hooks/stop.sh` — 未改,与 spec 一致(Stop 事件无重放意义)。
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 与 Spec 偏差
|
|
29
|
-
|
|
30
|
-
### 偏差 1:hook-lib.sh 决策(主线程修正 3)
|
|
31
|
-
|
|
32
|
-
**选择**:新建 `src/hooks/hook-lib.sh`,共享 `send_event_or_enqueue` 函数。
|
|
33
|
-
|
|
34
|
-
**理由**:5 个 hook 脚本的 enqueue 逻辑完全相同。若各自独立维护 ~15 行,任何 bug 修复都需要改 4 处,容易遗漏。`hook-lib.sh` 约 60 行,每个 hook 只需 `source hook-lib.sh` + 一行调用,减少重复且保持一致性。
|
|
35
|
-
|
|
36
|
-
### 偏差 2:hook 失败判断(主线程修正 2)
|
|
37
|
-
|
|
38
|
-
**选择**:双重检查 — 先检查 `[ -S "$SOCKET_PATH" ]`,再检查 nc 的 exit code。
|
|
39
|
-
|
|
40
|
-
**macOS BSD nc 行为分析**:
|
|
41
|
-
- macOS `nc -U -w N` 对 Unix socket:连接成功 + 连接被远端关闭 → exit 0,即使响应为空字符串
|
|
42
|
-
- socket 文件不存在 → exit 1
|
|
43
|
-
- 连接被拒绝 / 超时 → exit 1
|
|
44
|
-
|
|
45
|
-
**关键约束满足**:daemon 正常返回空响应(无 systemMessage / additionalContext),此时 nc exit code = 0,`HOOK_RESPONSE` 为空字符串 → 不入队。这修复了 spec 原始方案用 `[ -z "$RESPONSE" ]` 造成的误判问题。
|
|
46
|
-
|
|
47
|
-
### 偏差 3:events.ts UNIQUE 约束处理
|
|
48
|
-
|
|
49
|
-
Spec 要求"daemon 侧 writeEvent catch UNIQUE constraint 静默跳过"。
|
|
50
|
-
|
|
51
|
-
**最终方案**:`events.ts` 对 UNIQUE constraint 降级为 debug 日志(不打 error),但**仍然 throw**。原因:`replayQueue` 依赖 throw 来区分"成功入库"(`replayed++`)和"重复"(`skipped++`)。如果 `writeEvent` 静默返回,replayQueue 无法计 skipped。
|
|
52
|
-
|
|
53
|
-
Daemon 的 `handleEvent` 中单独 catch UNIQUE constraint,以防止正常 hook 流量因竞态(极低概率)收到重放的 event_id 而崩溃。
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## 测试结果
|
|
58
|
-
|
|
59
|
-
### 单元测试(9 个,全过)
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
npx vitest run tests/unit/queue.test.ts --reporter=verbose
|
|
63
|
-
|
|
64
|
-
✓ enqueueEvent 写入文件并可被 JSON.parse
|
|
65
|
-
✓ enqueueEvent 保留已有 event_id
|
|
66
|
-
✓ pruneQueue 超过 MAX_FILES 时删最旧文件
|
|
67
|
-
✓ pruneQueue 未到 MAX_FILES 时不删文件
|
|
68
|
-
✓ replayQueue 重放事件入库并删除队列文件
|
|
69
|
-
✓ replayQueue 对重复 event_id 静默跳过(skipped++)
|
|
70
|
-
✓ replayQueue 移动损坏 JSON 到 dead-letter
|
|
71
|
-
✓ replayQueue 移动 TTL 超期文件到 dead-letter
|
|
72
|
-
✓ replayQueue 队列为空时返回全零
|
|
73
|
-
|
|
74
|
-
Tests: 9 passed (9)
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### 集成测试(3 个,全过)
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
npx vitest run --config vitest.integration.config.ts tests/integration/queue-replay.integration.test.ts --reporter=verbose
|
|
81
|
-
|
|
82
|
-
✓ 入队 3 个事件 → replayQueue → DB 有 3 行,队列为空
|
|
83
|
-
✓ 第二次 replayQueue → skipped=3(去重),DB 仍 3 行
|
|
84
|
-
✓ TTL 超期 + 损坏 JSON → dead-letter 2 个,重放 1 个
|
|
85
|
-
|
|
86
|
-
Tests: 3 passed (3)
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 全量单元测试
|
|
90
|
-
|
|
91
|
-
```
|
|
92
|
-
npx vitest run --reporter=dot
|
|
93
|
-
|
|
94
|
-
Test Files: 2 failed | 25 passed (27)
|
|
95
|
-
Tests: 3 failed | 300 passed (303)
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
3 个失败均为**预存在的 bug**(`sqlite-refactor-harness.test.ts` 和 `routes-tasks.test.ts` 使用了非 UUID 格式的 event_id,如 `event-1`,不满足 Zod UUID 验证),与本次改动无关(git stash 验证确认)。
|
|
99
|
-
|
|
100
|
-
### TypeScript 类型检查
|
|
101
|
-
|
|
102
|
-
```
|
|
103
|
-
npx tsc --noEmit
|
|
104
|
-
(无输出 = 通过)
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
## E2E 实测证据
|
|
110
|
-
|
|
111
|
-
### 操作步骤
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
# 1. 停止 daemon
|
|
115
|
-
npm run dev:daemon:stop
|
|
116
|
-
# → "Daemon stopped"
|
|
117
|
-
|
|
118
|
-
# 2. 确认队列为空
|
|
119
|
-
find ~/.claude-forge/queue -name "*.json" | wc -l
|
|
120
|
-
# → 0
|
|
121
|
-
|
|
122
|
-
# 3. 调用 hook(daemon 停机中)
|
|
123
|
-
echo '{"prompt":"队列测试 P3-B","cwd":"/tmp","session_id":"queue-test-001"}' \
|
|
124
|
-
| node -e "const {execSync}=require('child_process');
|
|
125
|
-
execSync('cat | src/hooks/user-prompt-submit.sh', ...)"
|
|
126
|
-
# hook 退出码 0(入队后台子进程)
|
|
127
|
-
|
|
128
|
-
# 4. 验证队列文件已写入
|
|
129
|
-
find ~/.claude-forge/queue -name "*.json"
|
|
130
|
-
# → /Users/admin/.claude-forge/queue/20260516T065031-AF74BF77-D0FE-4911-B6EC-22868527E3E1.json
|
|
131
|
-
|
|
132
|
-
# 5. 启动 daemon
|
|
133
|
-
npm run dev:daemon:start
|
|
134
|
-
# → "Daemon started (PID: 5814)"
|
|
135
|
-
sleep 2
|
|
136
|
-
|
|
137
|
-
# 6. 验证队列为空(已重放)
|
|
138
|
-
find ~/.claude-forge/queue -name "*.json" | wc -l
|
|
139
|
-
# → 0
|
|
140
|
-
|
|
141
|
-
# 7. 查询数据库
|
|
142
|
-
sqlite3 ~/.claude-forge/data.db \
|
|
143
|
-
"SELECT timestamp, user_prompt FROM events WHERE session_id='queue-test-001';"
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### 实测输出
|
|
147
|
-
|
|
148
|
-
```
|
|
149
|
-
sqlite3 query result:
|
|
150
|
-
2026-05-16T06:50:31.000Z|队列测试 P3-B
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Daemon 日志(grep Queue)
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
[2026-05-16T06:50:44.444Z] [INFO] [Queue] Replaying 1 queued event(s)…
|
|
157
|
-
[2026-05-16T06:50:44.448Z] [INFO] [Queue] Replay: 1 replayed, 0 skipped (dup), 0 dead-lettered
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
**结论**:daemon 停机期间发送的事件正确入队,daemon 启动后自动重放并写入 DB,队列清空。
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## 关键实现细节
|
|
165
|
-
|
|
166
|
-
### send_event_or_enqueue 函数(hook-lib.sh)
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
send_event_or_enqueue() {
|
|
170
|
-
local event_json="$1"
|
|
171
|
-
local timeout_secs="${2:-10}"
|
|
172
|
-
HOOK_RESPONSE=""
|
|
173
|
-
|
|
174
|
-
if [ ! -S "$SOCKET_PATH" ]; then
|
|
175
|
-
_enqueue_event_bg "$event_json"
|
|
176
|
-
return 0
|
|
177
|
-
fi
|
|
178
|
-
|
|
179
|
-
local tmp_response
|
|
180
|
-
tmp_response=$(echo "$event_json" | nc -U -w "$timeout_secs" "$SOCKET_PATH" 2>/dev/null)
|
|
181
|
-
local nc_exit=$?
|
|
182
|
-
|
|
183
|
-
if [ $nc_exit -ne 0 ]; then
|
|
184
|
-
_enqueue_event_bg "$event_json"
|
|
185
|
-
return 0
|
|
186
|
-
fi
|
|
187
|
-
|
|
188
|
-
HOOK_RESPONSE="$tmp_response"
|
|
189
|
-
}
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
写入策略:`printf '%s' "$event_json" > "$tmp_file" && mv "$tmp_file" "$QUEUE_DIR/${filename}"` — 先写 .tmp 再 rename,保证原子性。
|
|
193
|
-
|
|
194
|
-
### replayQueue 时序
|
|
195
|
-
|
|
196
|
-
daemon 启动 → `SocketServer` 构造(listen 绑定)→ `setImmediate(replayQueue)` — 利用 setImmediate 确保 listen 回调先执行,socket 文件权限设好后再重放。
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
# Hotfix: Daemon Event Rejection — 20260516-1430
|
|
2
|
-
|
|
3
|
-
## 根因摘要
|
|
4
|
-
|
|
5
|
-
Phase 1/2 重构时收紧了 `ForgeEventSchema`,将 `timestamp` 字段改为 `z.string().datetime()`(要求严格 ISO 8601 带 Z 后缀),同时 `hook_type` enum 漏加了 `Notification`。而 hook 脚本使用的是 `date -u +"%Y-%m-%dT%H:%M:%S"`(无毫秒无 Z),导致 daemon 重启后所有入站事件被 Zod 校验拦截拒收,数据库从 `2026-05-16 06:01:30` 起无新事件写入。
|
|
6
|
-
|
|
7
|
-
## 实际改动文件清单
|
|
8
|
-
|
|
9
|
-
| 文件 | 改动内容 |
|
|
10
|
-
|---|---|
|
|
11
|
-
| `src/core/storage/events.ts` | `timestamp` 从 `z.string().datetime()` 改为 `z.string().min(1)`(向后兼容历史无 Z 的 timestamp);`hook_type` enum 加入 `'Notification'` |
|
|
12
|
-
| `src/hooks/user-prompt-submit.sh` | `date` 格式从 `%H:%M:%S` 改为 `%H:%M:%S.000Z` |
|
|
13
|
-
| `src/hooks/pre-tool-use.sh` | 同上 |
|
|
14
|
-
| `src/hooks/post-tool-use.sh` | 同上 |
|
|
15
|
-
| `src/hooks/stop.sh` | 同上 |
|
|
16
|
-
| `src/hooks/notification.sh` | 同上 |
|
|
17
|
-
| `tests/unit/type-guards.test.ts` | 将 `should reject event with invalid timestamp` 更新为 `should reject event with empty timestamp`,测试用例从 `'not-a-valid-timestamp'` 改为 `''`,与新宽松策略一致 |
|
|
18
|
-
|
|
19
|
-
无其他 `datetime()` 使用点(已全文搜索确认)。
|
|
20
|
-
|
|
21
|
-
## 验证方式
|
|
22
|
-
|
|
23
|
-
### TypeScript 类型检查
|
|
24
|
-
```bash
|
|
25
|
-
npx tsc --noEmit
|
|
26
|
-
# 输出:无错误
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### 构建
|
|
30
|
-
```bash
|
|
31
|
-
npm run build
|
|
32
|
-
# 输出:正常完成,dist/ 含 hooks/*.sh
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### 单元测试
|
|
36
|
-
```bash
|
|
37
|
-
npx vitest run tests/unit/ --reporter=dot
|
|
38
|
-
# 结果:3 failed | 291 passed(3 个失败为本次改动前已存在的预存失败,与本 hotfix 无关)
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
预存失败清单(本 hotfix 前已存在,不在本次修复范围内):
|
|
42
|
-
- `tests/unit/web/routes-tasks.test.ts` x2(使用非 UUID 的 event_id)
|
|
43
|
-
- `tests/unit/storage/sqlite-refactor-harness.test.ts` x1(同上)
|
|
44
|
-
|
|
45
|
-
## 部署步骤(用户需手动执行)
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
# 复制 hooks 到运行时位置
|
|
49
|
-
cp src/hooks/*.sh ~/.claude-forge/hooks/ && chmod +x ~/.claude-forge/hooks/*.sh
|
|
50
|
-
|
|
51
|
-
# 重启 daemon
|
|
52
|
-
./scripts/dev-daemon.sh restart
|
|
53
|
-
|
|
54
|
-
# 验证:新事件应出现在数据库
|
|
55
|
-
sqlite3 ~/.claude-forge/data.db "SELECT timestamp, hook_type FROM events ORDER BY rowid DESC LIMIT 5;"
|
|
56
|
-
```
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# L1 实施 Changelog: SWARM_PROTOCOL 抽到 .md 文件
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-18 16:05
|
|
4
|
-
**Spec**: docs/design/l1-swarm-protocol-extract-spec-20260518-1605.md
|
|
5
|
-
**Status**: 完成
|
|
6
|
-
|
|
7
|
-
## 完成清单
|
|
8
|
-
|
|
9
|
-
- [x] safety-net:`tests/integration/claudemd-generator.test.ts` 建立 baseline(SWARM 段 SHA256 锚定)
|
|
10
|
-
- [x] swarm-protocol.md 抽取(223 行,5441 字符 / 7817 字节)
|
|
11
|
-
- [x] claudemd-generator.ts:`getSwarmProtocol()` 加载器 + 模块级缓存
|
|
12
|
-
- [x] package.json `build`:cp `.md` + fail-fast 校验
|
|
13
|
-
|
|
14
|
-
## 关键代码定位
|
|
15
|
-
|
|
16
|
-
- 新文件 `src/claudemd/templates/swarm-protocol.md`(223 行)
|
|
17
|
-
- `src/claudemd/claudemd-generator.ts:5-9` — import 增加 `dirname` + `fileURLToPath`
|
|
18
|
-
- `src/claudemd/claudemd-generator.ts:14-38` — `getSwarmProtocol()` 加载函数 + `_swarmProtocolCache`
|
|
19
|
-
- `src/claudemd/claudemd-generator.ts:59` — `generate()` 内 `SWARM_PROTOCOL` 引用改为 `getSwarmProtocol()`(实际行号 65)
|
|
20
|
-
- `src/claudemd/claudemd-generator.ts:568` 之后已无字面量(删除 569-804 共 236 行)
|
|
21
|
-
- `package.json:13` — build 中新增 `mkdir -p dist/claudemd/templates && cp src/claudemd/templates/*.md dist/claudemd/templates/`,末尾追加 `test -f dist/claudemd/templates/swarm-protocol.md` 校验
|
|
22
|
-
|
|
23
|
-
## 测试结果
|
|
24
|
-
|
|
25
|
-
- **safety-net SHA256(迁移前后一致)**:`260dfe1e48fdecc324419a6330428eaa3597e3fd6e6262cf66cdcf301ca32e18`
|
|
26
|
-
- **SWARM 段长度(迁移前后一致)**:5442 字节(含分隔符尾的一个 `\n`)
|
|
27
|
-
- **tsc**:0 errors
|
|
28
|
-
- **npm test**:551 / 552 通过(1 个 pre-existing `sqlite-refactor-harness.test.ts > linkEventToTask` 失败,与本次无关)
|
|
29
|
-
- **npm run build**:成功;`dist/claudemd/templates/swarm-protocol.md` 存在(7817 字节,与 src 完全一致)
|
|
30
|
-
|
|
31
|
-
## 顺手清理
|
|
32
|
-
|
|
33
|
-
- 删除 `claudemd-generator.ts` 原 547-553 两段重复的 `Core behavioral rules` 注释块(合并到新的 `getSwarmProtocol` 文档块)。
|
|
34
|
-
- 字面量 555-777(223 行)整体下线。文件总行数 805 → 569(-236)。
|
|
35
|
-
|
|
36
|
-
## 已知问题
|
|
37
|
-
|
|
38
|
-
- `tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask` — pre-existing 失败,未触碰。
|
|
39
|
-
|
|
40
|
-
## 兼容性确认
|
|
41
|
-
|
|
42
|
-
- dev 路径(`tsx src/`):`fileURLToPath(import.meta.url)` 解析到 `src/claudemd/`,同级 `templates/swarm-protocol.md` 存在 → 加载成功。
|
|
43
|
-
- npm install 路径:build 脚本 cp 到 `dist/claudemd/templates/`,末尾 `test -f` fail-fast 校验,CI 一旦缺失立刻报错。
|
|
44
|
-
- 缓存策略:模块级 `_swarmProtocolCache: string | null = null`,首次调用读盘后缓存;进程生命周期内 0 重复 I/O。
|
|
45
|
-
- 字节级等价:safety-net 测试通过 SHA256 哈希逐字符比对,新旧实现完全一致。
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# L3 + L4 实施 Changelog
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-18 14:10
|
|
4
|
-
**Status**: 完成
|
|
5
|
-
|
|
6
|
-
## 完成清单
|
|
7
|
-
|
|
8
|
-
- [x] **L4**: `stop.ts` git 调用异步化
|
|
9
|
-
- 3 个 `execFileSync` → `promisify(execFile)`
|
|
10
|
-
- `writeGitNote` 改为 `async`,主流程改为 **fire-and-forget**(`void this.writeGitNote(event)`)
|
|
11
|
-
- 内部仍按依赖串行 await(rev-parse work-tree → rev-parse HEAD → notes append),但**整体不阻塞 handler 主响应**
|
|
12
|
-
- 失败仍 catch + `logger.debug`,handler 对外契约不变(返回 `{allow: true}`)
|
|
13
|
-
|
|
14
|
-
- [x] **L3**: `server.ts` 避免 N² JSON.parse —— **方案 A(换行符分隔)**
|
|
15
|
-
- 验证 hook 端 `echo "$event_json" | nc -U`:`echo` 默认追加 `\n`,协议天然支持
|
|
16
|
-
- `data` handler 改为:仅在 `buffer.indexOf('\n') !== -1` 时切出完整消息并解析;未见换行就累积等待
|
|
17
|
-
- 抽取 `processMessage(socket, message)` 统一处理 auth 检查 + parser + handler response
|
|
18
|
-
- 兜底:监听 `socket.on('end')`,若 buffer 残留无换行内容(旧客户端)做最后一次解析尝试
|
|
19
|
-
- 删除 dead code `isCompleteJSON`(不再需要"启发式判完整",换行就是边界)
|
|
20
|
-
|
|
21
|
-
## 关键代码定位
|
|
22
|
-
|
|
23
|
-
- `src/daemon/handlers/stop.ts:19-22` —— `promisify(execFile)` 导入
|
|
24
|
-
- `src/daemon/handlers/stop.ts:84-86` —— `void this.writeGitNote(event)` 调用点
|
|
25
|
-
- `src/daemon/handlers/stop.ts:102-135` —— async `writeGitNote` 实现
|
|
26
|
-
- `src/daemon/server.ts:51-122` —— 新的 `handleConnection` + `processMessage`
|
|
27
|
-
- `tests/unit/socket-server.test.ts` —— 新增 5 个测试(4 socket + 1 EventParser sanity)
|
|
28
|
-
|
|
29
|
-
## 测试结果
|
|
30
|
-
|
|
31
|
-
- `npx tsc --noEmit`: **0 errors**
|
|
32
|
-
- `npm test`: **460 passed / 1 failed**(仅 pre-existing `linkEventToTask`)
|
|
33
|
-
- 新增 `tests/unit/socket-server.test.ts`: **5/5 passed**
|
|
34
|
-
|
|
35
|
-
新测试覆盖:
|
|
36
|
-
1. 单 chunk 完整消息(含换行)
|
|
37
|
-
2. 大消息(~50KB)分 20 个 chunk 到达 —— 断言 `JSON.parse` 调用次数 ≤ 3(远小于 chunk 数,强对比旧 N² 行为)
|
|
38
|
-
3. 600KB 无换行 oversized buffer 被丢弃
|
|
39
|
-
4. 无换行结尾消息走 `socket.on('end')` 兜底
|
|
40
|
-
5. EventParser sanity
|
|
41
|
-
|
|
42
|
-
## 实施决策
|
|
43
|
-
|
|
44
|
-
### L4:fire-and-forget + 内部串行
|
|
45
|
-
- **理由**:3 个 git 调用有严格依赖(work-tree 检查 → 拿 HEAD → 写 note),不能 `Promise.all` 并发
|
|
46
|
-
- **关键收益**:原 `execFileSync` 在 handler **主调用链路**中串行阻塞 daemon event loop(最坏 15s);改 `void` 调用后,git I/O 移到下一个 microtask,handler 立刻返回响应给 hook 客户端
|
|
47
|
-
- **副作用控制**:git 失败仍 `logger.debug`,与原行为一致;handler 主体 try/catch 已存在,async fire-and-forget 的未捕获错误已在 `writeGitNote` 内部 catch
|
|
48
|
-
|
|
49
|
-
### L3:方案 A(换行符分隔)
|
|
50
|
-
- **理由**:
|
|
51
|
-
1. 协议天然支持(验证了 `hook-lib.sh` 用 `echo`,默认带 `\n`)
|
|
52
|
-
2. O(1) 检查(`indexOf('\n')` 在 V8 高度优化);旧代码每 chunk 做一次完整 `JSON.parse(buffer)` 在 ~512KB buffer 上是真正的 N²
|
|
53
|
-
3. 单一边界标记,逻辑清晰,无需再保留 `isCompleteJSON` 启发式
|
|
54
|
-
- **兼容性**:保留 `socket.on('end')` 兜底,覆盖未来可能出现的"不带换行的客户端"
|
|
55
|
-
- **协议契约**:不变(hook 端 `echo` 不需要任何修改,服务器只是更聪明地等待 `\n`)
|
|
56
|
-
|
|
57
|
-
## 跳过项
|
|
58
|
-
|
|
59
|
-
无。
|
|
60
|
-
|
|
61
|
-
## 已知问题
|
|
62
|
-
|
|
63
|
-
- **pre-existing**: `tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask` 失败(与本次改动无关,schema 校验 uuid 拒绝测试 fixture 中的 `event_id`)
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# L6 + L8 最终扫尾 Changelog
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-18 16:40
|
|
4
|
-
**Status**: 完成
|
|
5
|
-
|
|
6
|
-
## 完成清单
|
|
7
|
-
|
|
8
|
-
- [x] L6: setLogLevel env 解析移到 logger 模块加载
|
|
9
|
-
- [x] L8: token_usage FK 注释补充
|
|
10
|
-
|
|
11
|
-
## 关键代码定位
|
|
12
|
-
|
|
13
|
-
- `src/core/utils/logger.ts:5-22` — 新增 `getLogLevelFromEnv()`,模块加载时初始化 `currentLevel`
|
|
14
|
-
- `src/daemon/index.ts:23` / `src/daemon/index.ts:60-63` — 删除手动 env 解析与 setLogLevel 调用,import 收窄为 `logger`
|
|
15
|
-
- `src/core/storage/schema.sql:16-18` / `src/core/storage/schema.sql:20` / `src/core/storage/schema.sql:153-163` —
|
|
16
|
-
- header 关系图增加 `token_usage` 章节
|
|
17
|
-
- "Why no FK" 注释主语扩展为 routing_events / skill_invocations / token_usage
|
|
18
|
-
- token_usage.session_id 字段处补充内联注释(与 routing_events / skill_invocations 同口径)
|
|
19
|
-
|
|
20
|
-
## 测试结果
|
|
21
|
-
|
|
22
|
-
- tsc: 0 errors
|
|
23
|
-
- npm test: 551 / 552 通过(1 个 pre-existing 失败:`tests/unit/storage/sqlite-refactor-harness.test.ts` 的 `writeEvent` Invalid uuid 校验失败,与本次改动无关)
|
|
24
|
-
|
|
25
|
-
## 实施决策
|
|
26
|
-
|
|
27
|
-
- **L6**:采用「模块加载时一次性读取 env + `getLogLevelFromEnv()` 辅助函数」混合方案。
|
|
28
|
-
- 顶层 `let currentLevel: LogLevel = getLogLevelFromEnv();` 在模块首次 import 时执行一次。
|
|
29
|
-
- 由于 logger 模块当前无单元测试(`find src/tests tests/unit -name "logger.test.ts"` 为空),顶层副作用不会破坏测试 mock。
|
|
30
|
-
- 保留 `setLogLevel()` 导出函数以便测试或运行时覆写(向后兼容)。
|
|
31
|
-
- daemon/index.ts 不再需要重复 env 解析;其它入口(CLI、web)若 import logger 自动享受同样行为,无需改动。
|
|
32
|
-
- **L8**:纯文档/注释级补充,零 SQL 行为变更。
|
|
33
|
-
- 沿用 routing_events / skill_invocations 已有的 "logical ref,no FK due to write-order race" 表述。
|
|
34
|
-
- 同时更新文件头的表关系图,保持单一信息源。
|
|
35
|
-
|
|
36
|
-
## 已知问题
|
|
37
|
-
|
|
38
|
-
- `tests/unit/storage/sqlite-refactor-harness.test.ts:166` — `writeEvent Invalid uuid` 断言失败(pre-existing,与 `linkEventToTask` 重构 harness 同一组),本次未修复,按指令不扩大范围。
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# M1 + M4 + M5 + L7 清理 Changelog
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-18 13:10
|
|
4
|
-
**Status**: 完成
|
|
5
|
-
|
|
6
|
-
## 完成清单
|
|
7
|
-
- [x] M4: events.ts 删 UpsertCapableEmitter 重复声明
|
|
8
|
-
- [x] L7: types.ts 删 ForgeEvent.pipeline_id 死字段(顺带删除 BaseEvent.pipeline_id)
|
|
9
|
-
- [x] M1: truncateField 抽到 web/routes/_helpers.ts
|
|
10
|
-
- [x] M5: user-prompt.ts 改用 LRUCache(保持两个独立实例)
|
|
11
|
-
|
|
12
|
-
## 关键代码定位
|
|
13
|
-
|
|
14
|
-
### M4 — UpsertCapableEmitter 去重
|
|
15
|
-
- `src/core/storage/events.ts:19-22`(旧 L19-21 + 空行)— 删除
|
|
16
|
-
- `src/core/storage/events.ts:57-59` — 保留(更靠近使用点 L64 constructor)
|
|
17
|
-
|
|
18
|
-
### L7 — pipeline_id 死代码清理
|
|
19
|
-
- `src/core/types.ts:34` — 删除 `ForgeEvent.pipeline_id?`
|
|
20
|
-
- `src/core/types.ts:43` — 删除 `BaseEvent.pipeline_id?`
|
|
21
|
-
- 全量 grep 验证:`pipeline_id` 仅在 types.ts 中出现,无任何运行时引用,无 schema 字段、无注释、无解析逻辑。直接清理。
|
|
22
|
-
|
|
23
|
-
### M1 — truncateField 抽取
|
|
24
|
-
- 新建 `src/web/routes/_helpers.ts` — 导出 `truncateField(obj, maxLen=300, arrayLimit=10)`
|
|
25
|
-
- 增加 `arrayLimit` 参数以兼容两个调用点的不同行为(tasks: 10, sessions: 5)
|
|
26
|
-
- 类型从 `any` 升为 `unknown` + `Record<string, unknown>`
|
|
27
|
-
- `src/web/routes/tasks.ts:1-4` — 新 import `truncateField from './_helpers.js'`
|
|
28
|
-
- `src/web/routes/tasks.ts` — 移除本地 `truncateField` 闭包定义(原 L87-99),调用点保持不变(默认参数 300/10 与原一致)
|
|
29
|
-
- `src/web/routes/sessions.ts:1-3` — 新 import
|
|
30
|
-
- `src/web/routes/sessions.ts` — 移除本地 `truncateField`(原 L189-201),两个调用点显式传 `(toolInput, 200, 5)` / `(toolOutput, 200, 5)` 以保留原有行为
|
|
31
|
-
|
|
32
|
-
### M5 — LRUCache 替换手写 LRU
|
|
33
|
-
- `src/core/utils/lru-cache.ts:39-45` — 新增 `delete(key)` 方法(必须,否则 clearSession 无法实现)
|
|
34
|
-
- `src/daemon/handlers/user-prompt.ts:10` — 新 import `LRUCache`
|
|
35
|
-
- `src/daemon/handlers/user-prompt.ts:19-25` — 字段替换:
|
|
36
|
-
- `resumeInjected: Map<string, number>` → `LRUCache<string, number>(1000)`
|
|
37
|
-
- `conventionInjected: Map<string, number>` → `LRUCache<string, number>(1000)`
|
|
38
|
-
- `src/daemon/handlers/user-prompt.ts:markInjected` — 从 17 行手写 LRU 缩减为单行 `cache.set(key, Date.now())`
|
|
39
|
-
- `src/daemon/handlers/user-prompt.ts:hasInjected` / `clearSession` — 签名从 `Map` 改为 `LRUCache`,行为一致
|
|
40
|
-
|
|
41
|
-
### M5 设计决策:不合并键集合
|
|
42
|
-
两个 Map 虽然 key 类型相同(`sessionKey`),但语义独立:
|
|
43
|
-
- `resumeInjected` 控制 resume context 注入;同时还会触发 `resume.clear()`
|
|
44
|
-
- `conventionInjected` 控制 project guidance 注入
|
|
45
|
-
|
|
46
|
-
如果合并成单一键集合,会丧失"同一 session 各自独立标记是否注入过"的语义。保留两个独立 LRUCache 实例最安全,不扩大改动范围。
|
|
47
|
-
|
|
48
|
-
## 测试结果
|
|
49
|
-
- `npx tsc --noEmit`: **0 errors**
|
|
50
|
-
- `npm test`: **423 passed / 1 failed**
|
|
51
|
-
- 失败项:`tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask associates events with tasks`
|
|
52
|
-
- 失败原因:pre-existing UUID 校验问题,与本次清理无关
|
|
53
|
-
|
|
54
|
-
## 跳过项
|
|
55
|
-
无
|
|
56
|
-
|
|
57
|
-
## 已知问题
|
|
58
|
-
- pre-existing `linkEventToTask` test failure(与本次清理无关)
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# M10 实施 Changelog
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-18 13:20
|
|
4
|
-
**Spec**: docs/design/m10-forge-paths-spec-20260518-1320.md
|
|
5
|
-
**Status**: 完成
|
|
6
|
-
|
|
7
|
-
## 完成清单
|
|
8
|
-
- [x] safety-net: tests/unit/core/forge-paths.test.ts(16 个断言)
|
|
9
|
-
- [x] FORGE_PATHS 扩展 11 方法(daemonSocket/Pid/Token/Log/Stdout/Stderr, hooks, queue, queueDead, routingYaml, backups(kind))
|
|
10
|
-
- [x] Group A: daemon 运行时(lifecycle / cli/daemon / cli/status / cli/mcp / web/auth-middleware)
|
|
11
|
-
- [x] Group B: queue(core/queue/index.ts)
|
|
12
|
-
- [x] Group C: hooks(cli/init/hook-manager.ts)
|
|
13
|
-
- [x] Group D: web patch(web/routes/types.ts + web/routes/skills.ts × 4 处)
|
|
14
|
-
- [x] Group E: cli/stats.ts + error-handler.ts 文案 `forge.sock` → `daemon.sock`
|
|
15
|
-
|
|
16
|
-
## 关键代码定位
|
|
17
|
-
|
|
18
|
-
**FORGE_PATHS 扩展**:
|
|
19
|
-
- `src/core/constants.ts:9-31` — 新增 11 个方法
|
|
20
|
-
- `tests/unit/core/forge-paths.test.ts` — 新增测试文件,16 个用例
|
|
21
|
-
|
|
22
|
-
**Group A(daemon 运行时)**:
|
|
23
|
-
- `src/daemon/lifecycle.ts:8-10` — TOKEN_FILE/PID_FILE 改用 FORGE_PATHS;`getSocketPath` (L51) 复用 daemonSocket
|
|
24
|
-
- `src/cli/commands/daemon.ts:34,44-47,114` — PID_FILE/STDOUT_LOG/STDERR_LOG/logFile,并移除未用的 FORGE_HOME import
|
|
25
|
-
- `src/cli/commands/status.ts:5-8` — PID_FILE 改 FORGE_PATHS.daemonPid();移除 FORGE_HOME import
|
|
26
|
-
- `src/cli/commands/mcp.ts:17-22,45,86` — tokenPath / daemon.pid 路径;移除 homedir/join import
|
|
27
|
-
- `src/web/auth-middleware.ts:13-17` — TOKEN_FILE 改 FORGE_PATHS.daemonToken();移除 path import
|
|
28
|
-
|
|
29
|
-
**Group B(queue)**:
|
|
30
|
-
- `src/core/queue/index.ts:16-27` — QUEUE_DIR/DEAD_DIR 改 FORGE_PATHS;移除 homedir import 与未用的 FORGE_DIR 常量
|
|
31
|
-
|
|
32
|
-
**Group C(hooks)**:
|
|
33
|
-
- `src/cli/init/hook-manager.ts:4,8` — HOOKS_DIR 改 FORGE_PATHS.hooks()
|
|
34
|
-
|
|
35
|
-
**Group D(web patch)**:
|
|
36
|
-
- `src/web/routes/types.ts:11,30-39` — resolvePatchTarget 中 4 处路径全部改 FORGE_PATHS
|
|
37
|
-
- `src/web/routes/skills.ts:7,208,235,279,321` — backupDir × 4 处统一 → FORGE_PATHS.backups('skills')
|
|
38
|
-
|
|
39
|
-
**Group E(其它)**:
|
|
40
|
-
- `src/cli/commands/stats.ts:10-21` — dbPath 改 FORGE_PATHS.database();移除 path/homedir import
|
|
41
|
-
- `src/core/utils/error-handler.ts:239` — 提示文本 `forge.sock` → `daemon.sock`
|
|
42
|
-
|
|
43
|
-
## 测试结果
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
forge-paths.test.ts: 16/16 passed
|
|
47
|
-
tests/unit/core/ + storage/ + queue: 85/86 passed(1 pre-existing linkEventToTask)
|
|
48
|
-
npm test 全量: 439/440 passed(1 pre-existing linkEventToTask)
|
|
49
|
-
npx tsc --noEmit: 0 errors
|
|
50
|
-
npm run build: 成功
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## 超出 spec 改动
|
|
54
|
-
|
|
55
|
-
无。严格按 spec 12 文件机械替换。附带顺手清理(与 spec 风险一致):
|
|
56
|
-
- 删除替换后未引用的 import(`homedir`、`path`、`FORGE_HOME`、`FORGE_DIR` 常量)以保持文件干净,不引入新逻辑。
|
|
57
|
-
|
|
58
|
-
## 已知问题
|
|
59
|
-
|
|
60
|
-
- `tests/unit/storage/sqlite-refactor-harness.test.ts` > `linkEventToTask associates events with tasks` 失败 — pre-existing UUID 校验问题,与 M10 改动无关(spec 已明示)。
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# M2 + M3 实施 Changelog
|
|
2
|
-
|
|
3
|
-
**Date**: 2026-05-18 14:25
|
|
4
|
-
**Spec**: docs/design/m2-m3-tool-input-spec-20260518-1425.md
|
|
5
|
-
**Status**: 完成
|
|
6
|
-
|
|
7
|
-
## 完成清单
|
|
8
|
-
- [x] M3: `event-parser.ts` 改为 `event_id: validated.event_id ?? randomUUID()`,schema 加 `event_id: z.string().uuid().optional()`
|
|
9
|
-
- [x] M2: `ToolInputFields` 接口 + 4 个 getter(`getCommand` / `getFilePath` / `getUserPrompt` / `getSubagentType`)
|
|
10
|
-
- [x] 替换所有 `(tool_input as any)` / `(tool_input as Record<string,unknown>)` 使用点(10 处源文件)
|
|
11
|
-
- [x] 新增 `tests/unit/event-fields.test.ts`(15 cases)
|
|
12
|
-
- [x] 新增 `tests/unit/event-parser.test.ts`(5 cases)
|
|
13
|
-
|
|
14
|
-
## 关键代码定位
|
|
15
|
-
- `src/core/types.ts:25-61` — `ToolInputFields` 接口 + `ForgeEvent.tool_input: ToolInputFields | undefined`
|
|
16
|
-
- `src/core/event-fields.ts:1-32` — 4 个 getter
|
|
17
|
-
- `src/daemon/event-parser.ts:16,23,29` — M3 schema + event_id 透传 + `as ToolInputFields` cast
|
|
18
|
-
- `src/web/routes/sessions.ts:4,82-100,158-167,222-234` — sessions 路由 getter 化(8 处)
|
|
19
|
-
- `src/web/routes/tasks.ts:5,111-131,156-172` — tasks 路由 getter 化(5 处)
|
|
20
|
-
- `src/web/analytics/anti-pattern-detector.ts:95,354-364` — helpers 签名调整为 `ForgeEvent['tool_input']`,line 95 显式 cast
|
|
21
|
-
- `src/daemon/handlers/post-tool-use.ts:5,29` — `getSubagentType(event)`
|
|
22
|
-
- `src/daemon/handlers/history-exporter.ts:102` — 去掉 `as Record<string, unknown>` cast
|
|
23
|
-
- `src/cli/commands/logs.ts:43` — 去掉 `as Record<string, unknown>` cast
|
|
24
|
-
- `src/claudemd/resume-manager.ts:118` — 去掉 `as string` cast,改 `typeof === 'string'` 守卫
|
|
25
|
-
- `src/daemon/index.ts:39-40,161` — import + 改用 `getUserPrompt(event)`
|
|
26
|
-
|
|
27
|
-
## 测试结果
|
|
28
|
-
- `tests/unit/event-fields.test.ts`: 15 / 15 passed
|
|
29
|
-
- `tests/unit/event-parser.test.ts`: 5 / 5 passed
|
|
30
|
-
- `npx tsc --noEmit`: 0 errors
|
|
31
|
-
- `npm test --reporter=dot`: **480 / 481 passed**(唯一失败为 pre-existing `linkEventToTask`,spec 第 5 项明确豁免)
|
|
32
|
-
|
|
33
|
-
## 顺手发现的额外 as any(如有)
|
|
34
|
-
无新增。`src/web/routes/sessions.ts:188-190` 的 `tool_input as any` 同步消除;`tool_output as any` 保留 1 处(`?.error` 防御访问,超出本 spec 范围)。
|
|
35
|
-
|
|
36
|
-
## 已知问题
|
|
37
|
-
- `tests/unit/storage/sqlite-refactor-harness.test.ts > linkEventToTask` 失败:pre-existing,spec 已豁免;根因是测试构造的 event_id 不是 UUID,与本次 M3 schema 收紧无关(写入端 `writeEvent` 早已校验 UUID)。
|
|
38
|
-
- `tests/unit/web/routes-tasks.test.ts` 在全量并行跑时偶发首例 404(B 路径下 `getStorage()` 状态同步问题),单独跑 21/21 全过;非本次回归。
|
|
39
|
-
|
|
40
|
-
## 设计要点
|
|
41
|
-
- `ToolInputFields` 加 `[key: string]: unknown` 索引签名:兼顾 forward-compat 与窄化收益(spec 风险 1 已确认接受)。
|
|
42
|
-
- M3 让 hook 端可选自带 `event_id`:未带时 parser 兜底 `randomUUID()`,与 queue / storage 层 `event.event_id ?? randomUUID()` 形成端到端去重链路(hook 端真正生成 event_id 是后续 follow-up)。
|
|
43
|
-
- `anti-pattern-detector.ts` 走保守路径:保留 `extractFilePath` / `extractBashCommand` 私有签名,只调整参数类型为 `ForgeEvent['tool_input']`,调用方零改动。
|