@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,543 +0,0 @@
|
|
|
1
|
-
# claude-forge 渐进式重构 - 第 1 迭代实施方案
|
|
2
|
-
|
|
3
|
-
**文档版本**: v1.0
|
|
4
|
-
**生成时间**: 2026-05-15 16:00
|
|
5
|
-
**迭代周期**: 2 周(2026-05-15 ~ 2026-05-29)
|
|
6
|
-
**负责范围**: P0 安全漏洞 + 部分 P1 基础设施问题
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 1. 目标与范围
|
|
11
|
-
|
|
12
|
-
### 1.1 迭代目标
|
|
13
|
-
|
|
14
|
-
第 1 迭代聚焦于**安全加固**和**基础设施稳定性**,为后续重构奠定安全基础:
|
|
15
|
-
|
|
16
|
-
1. **修复 P0 级安全漏洞**(3 个)
|
|
17
|
-
- 路径遍历漏洞(skills.ts、patch.ts)
|
|
18
|
-
- Git 命令注入漏洞(trace.ts)
|
|
19
|
-
- 类型安全缺失(storage/events.ts)
|
|
20
|
-
|
|
21
|
-
2. **解决 P1 级基础设施问题**(选择 4 个)
|
|
22
|
-
- 添加缺失的数据库索引(性能优化)
|
|
23
|
-
- 补充核心模块单元测试(覆盖率从 0% → 50%)
|
|
24
|
-
- 统一错误处理(daemon 稳定性)
|
|
25
|
-
- 添加请求体大小限制(DoS 防护)
|
|
26
|
-
|
|
27
|
-
3. **建立测试基础设施**
|
|
28
|
-
- 配置测试环境(Vitest + 覆盖率报告)
|
|
29
|
-
- 编写测试工具函数(mock storage、mock AI provider)
|
|
30
|
-
- 建立 CI 流程(GitHub Actions)
|
|
31
|
-
|
|
32
|
-
### 1.2 不包括的内容(留到后续迭代)
|
|
33
|
-
|
|
34
|
-
- ❌ 架构重构(模块拆分、依赖解耦)
|
|
35
|
-
- ❌ 性能优化(N+1 查询、连接池)
|
|
36
|
-
- ❌ 文档补全(API 文档、架构图)
|
|
37
|
-
- ❌ P2 级问题(代码重复、命名规范)
|
|
38
|
-
- ❌ 新功能开发
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## 2. 问题清单与优先级
|
|
43
|
-
|
|
44
|
-
### 2.1 P0 级问题(必须修复)
|
|
45
|
-
|
|
46
|
-
| ID | 问题 | 影响 | 文件 |
|
|
47
|
-
|---|---|---|---|
|
|
48
|
-
| P0-1 | 路径遍历漏洞 | 攻击者可读取任意文件 | `src/web/routes/skills.ts`, `src/web/routes/patch.ts` |
|
|
49
|
-
| P0-2 | Git 命令注入 | 攻击者可执行任意命令 | `src/web/routes/trace.ts` |
|
|
50
|
-
| P0-3 | 类型安全缺失 | 运行时类型错误 | `src/core/storage/events.ts` |
|
|
51
|
-
|
|
52
|
-
### 2.2 P1 级问题(本迭代处理)
|
|
53
|
-
|
|
54
|
-
| ID | 问题 | 影响 | 文件 |
|
|
55
|
-
|---|---|---|---|
|
|
56
|
-
| P1-1 | 缺失数据库索引 | 查询性能差 | `src/core/storage/schema.sql` |
|
|
57
|
-
| P1-2 | 0% 测试覆盖 | 重构风险高 | 全局 |
|
|
58
|
-
| P1-3 | 错误处理不统一 | daemon 崩溃 | `src/daemon/router.ts`, `src/web/routes/*.ts` |
|
|
59
|
-
| P1-4 | 请求体大小无限制 | DoS 攻击风险 | `src/web/server.ts` |
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## 3. 改动文件清单
|
|
64
|
-
|
|
65
|
-
### 3.1 安全修复(P0)
|
|
66
|
-
|
|
67
|
-
| 文件 | 改动类型 | 预计行数 | 说明 |
|
|
68
|
-
|---|---|---|---|
|
|
69
|
-
| `src/web/routes/skills.ts` | 修改 | +15 | 添加文件名校验 |
|
|
70
|
-
| `src/web/routes/patch.ts` | 修改 | +15 | 添加路径校验 |
|
|
71
|
-
| `src/web/routes/trace.ts` | 修改 | +20 | 添加 projectPath 校验 |
|
|
72
|
-
| `src/core/storage/events.ts` | 修改 | +30 | 添加 Zod 运行时校验 |
|
|
73
|
-
| `tests/unit/security.test.ts` | 新增 | +100 | 安全漏洞回归测试 |
|
|
74
|
-
|
|
75
|
-
### 3.2 基础设施改进(P1)
|
|
76
|
-
|
|
77
|
-
| 文件 | 改动类型 | 预计行数 | 说明 |
|
|
78
|
-
|---|---|---|---|
|
|
79
|
-
| `src/core/storage/schema.sql` | 修改 | +15 | 添加复合索引 |
|
|
80
|
-
| `src/daemon/router.ts` | 修改 | +30 | 添加错误边界 |
|
|
81
|
-
| `src/web/server.ts` | 修改 | +5 | 添加请求体大小限制 |
|
|
82
|
-
| `src/web/routes/error-handler.ts` | 新增 | +50 | 统一错误处理中间件 |
|
|
83
|
-
| `tests/unit/storage.test.ts` | 新增 | +200 | Storage 单元测试 |
|
|
84
|
-
| `tests/unit/router.test.ts` | 新增 | +150 | Router 单元测试 |
|
|
85
|
-
| `tests/unit/type-guards.test.ts` | 新增 | +100 | 类型守卫测试 |
|
|
86
|
-
| `tests/helpers/mock-storage.ts` | 新增 | +80 | 测试工具函数 |
|
|
87
|
-
| `tests/helpers/mock-ai.ts` | 新增 | +60 | 测试工具函数 |
|
|
88
|
-
|
|
89
|
-
### 3.3 CI/CD 配置
|
|
90
|
-
|
|
91
|
-
| 文件 | 改动类型 | 预计行数 | 说明 |
|
|
92
|
-
|---|---|---|---|
|
|
93
|
-
| `.github/workflows/test.yml` | 新增 | +50 | CI 测试流程 |
|
|
94
|
-
| `.github/workflows/security.yml` | 新增 | +40 | 安全扫描流程 |
|
|
95
|
-
|
|
96
|
-
**总计**:
|
|
97
|
-
- 新增文件:9 个
|
|
98
|
-
- 修改文件:7 个
|
|
99
|
-
- 预计改动行数:~960 行
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## 4. 实施步骤(按依赖顺序)
|
|
104
|
-
|
|
105
|
-
### Step 1: 修复 P0-1 路径遍历漏洞(1 天)
|
|
106
|
-
|
|
107
|
-
**目标**:防止攻击者通过 `../../../etc/passwd` 等路径读取任意文件
|
|
108
|
-
|
|
109
|
-
**改动**:
|
|
110
|
-
|
|
111
|
-
1. **修复 skills.ts**(第 33 行)
|
|
112
|
-
```typescript
|
|
113
|
-
// 当前代码
|
|
114
|
-
const filePath = path.join(skillsDir, `${name}.md`);
|
|
115
|
-
|
|
116
|
-
// 修复后
|
|
117
|
-
if (name.includes('/') || name.includes('\\') || name.includes('..')) {
|
|
118
|
-
return res.status(400).json({ error: 'Invalid skill name' });
|
|
119
|
-
}
|
|
120
|
-
const safeName = name.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
121
|
-
const filePath = path.join(skillsDir, `${safeName}.md`);
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
2. **修复 patch.ts**(第 45 行)
|
|
125
|
-
```typescript
|
|
126
|
-
function resolvePatchTarget(targetType: string, targetName: string): string {
|
|
127
|
-
// 添加路径校验
|
|
128
|
-
if (targetName.includes('/') || targetName.includes('\\') || targetName.includes('..')) {
|
|
129
|
-
throw new Error('Invalid target name');
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (targetType === 'skill') {
|
|
133
|
-
return path.join(getSkillsDir(), `${targetName}.md`);
|
|
134
|
-
}
|
|
135
|
-
// ...
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
**验证方法**:
|
|
140
|
-
```bash
|
|
141
|
-
# 测试恶意输入
|
|
142
|
-
curl http://localhost:3456/api/skills/../../../etc/passwd
|
|
143
|
-
# 预期:返回 400 错误
|
|
144
|
-
|
|
145
|
-
curl -X PUT http://localhost:3456/api/skills/../../../tmp/evil \
|
|
146
|
-
-H "Content-Type: application/json" \
|
|
147
|
-
-d '{"content": "malicious"}'
|
|
148
|
-
# 预期:返回 400 错误
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
**回滚方案**:
|
|
152
|
-
- Git revert 到修改前的 commit
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
### Step 2: 修复 P0-2 Git 命令注入漏洞(1 天)
|
|
157
|
-
|
|
158
|
-
**目标**:防止攻击者通过恶意 projectPath 执行任意命令
|
|
159
|
-
|
|
160
|
-
**改动**:
|
|
161
|
-
|
|
162
|
-
1. **修复 trace.ts**(第 28 行)
|
|
163
|
-
```typescript
|
|
164
|
-
// 当前代码
|
|
165
|
-
const projectPath = req.query.project as string | undefined;
|
|
166
|
-
|
|
167
|
-
// 修复后
|
|
168
|
-
const projectPath = req.query.project as string | undefined;
|
|
169
|
-
|
|
170
|
-
// 校验 projectPath
|
|
171
|
-
if (!projectPath) {
|
|
172
|
-
return res.status(400).json({ error: 'Missing project parameter' });
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (!path.isAbsolute(projectPath)) {
|
|
176
|
-
return res.status(400).json({ error: 'Project path must be absolute' });
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
if (!fs.existsSync(projectPath)) {
|
|
180
|
-
return res.status(404).json({ error: 'Project path does not exist' });
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (!fs.existsSync(path.join(projectPath, '.git'))) {
|
|
184
|
-
return res.status(400).json({ error: 'Not a git repository' });
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// 继续执行 git 命令
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
**验证方法**:
|
|
191
|
-
```bash
|
|
192
|
-
# 测试恶意输入
|
|
193
|
-
curl "http://localhost:3456/api/trace/HEAD?project=/tmp;%20rm%20-rf%20/"
|
|
194
|
-
# 预期:返回 400 错误,不执行 rm 命令
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
**回滚方案**:
|
|
198
|
-
- Git revert
|
|
199
|
-
|
|
200
|
-
---
|
|
201
|
-
|
|
202
|
-
### Step 3: 修复 P0-3 类型安全缺失(2 天)
|
|
203
|
-
|
|
204
|
-
**目标**:在 storage 层添加运行时类型校验,防止数据库返回异常数据导致崩溃
|
|
205
|
-
|
|
206
|
-
**改动**:
|
|
207
|
-
|
|
208
|
-
1. **添加 Zod schema**(`src/core/storage/events.ts`)
|
|
209
|
-
```typescript
|
|
210
|
-
import { z } from 'zod';
|
|
211
|
-
|
|
212
|
-
const EventRowSchema = z.object({
|
|
213
|
-
event_id: z.string(),
|
|
214
|
-
session_id: z.string(),
|
|
215
|
-
project_path: z.string(),
|
|
216
|
-
timestamp: z.string(),
|
|
217
|
-
hook_type: z.enum(['PreToolUse', 'PostToolUse', 'UserPromptSubmit', 'Stop', 'Notification']),
|
|
218
|
-
tool_name: z.string().optional(),
|
|
219
|
-
tool_input: z.string().optional(), // JSON string
|
|
220
|
-
tool_output: z.string().optional(), // JSON string
|
|
221
|
-
user_prompt: z.string().optional(),
|
|
222
|
-
ai_response: z.string().optional(),
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
private rowToEvent(row: unknown): ForgeEvent {
|
|
226
|
-
// 运行时校验
|
|
227
|
-
const validated = EventRowSchema.parse(row);
|
|
228
|
-
|
|
229
|
-
return {
|
|
230
|
-
event_id: validated.event_id,
|
|
231
|
-
session_id: validated.session_id,
|
|
232
|
-
project_path: validated.project_path,
|
|
233
|
-
timestamp: validated.timestamp,
|
|
234
|
-
hook_type: validated.hook_type,
|
|
235
|
-
tool_name: validated.tool_name,
|
|
236
|
-
tool_input: validated.tool_input ? JSON.parse(validated.tool_input) : undefined,
|
|
237
|
-
tool_output: validated.tool_output ? JSON.parse(validated.tool_output) : undefined,
|
|
238
|
-
user_prompt: validated.user_prompt,
|
|
239
|
-
ai_response: validated.ai_response,
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
2. **错误处理**
|
|
245
|
-
```typescript
|
|
246
|
-
queryEvents(filter: EventFilter): ForgeEvent[] {
|
|
247
|
-
try {
|
|
248
|
-
const rows = this.db.prepare(sql).all(...params);
|
|
249
|
-
return rows.map(row => this.rowToEvent(row));
|
|
250
|
-
} catch (err) {
|
|
251
|
-
if (err instanceof z.ZodError) {
|
|
252
|
-
logger.error('[Storage] Invalid event row from database:', err.errors);
|
|
253
|
-
return []; // 返回空数组而非崩溃
|
|
254
|
-
}
|
|
255
|
-
throw err;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
**验证方法**:
|
|
261
|
-
```bash
|
|
262
|
-
# 运行单元测试
|
|
263
|
-
npx vitest run tests/unit/storage.test.ts
|
|
264
|
-
|
|
265
|
-
# 手动测试:插入异常数据
|
|
266
|
-
sqlite3 ~/.claude-forge/data.db "INSERT INTO events (event_id, session_id, hook_type) VALUES ('test', 'test', 'InvalidType');"
|
|
267
|
-
# 预期:queryEvents 返回空数组,不崩溃
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
**回滚方案**:
|
|
271
|
-
- 保留原 `rowToEvent` 为 `unsafeRowToEvent`
|
|
272
|
-
- 如果 Zod 校验导致合法数据被拒绝,临时回退
|
|
273
|
-
|
|
274
|
-
---
|
|
275
|
-
|
|
276
|
-
### Step 4: 添加缺失的数据库索引(0.5 天)
|
|
277
|
-
|
|
278
|
-
**目标**:优化高频查询性能
|
|
279
|
-
|
|
280
|
-
**改动**:
|
|
281
|
-
|
|
282
|
-
1. **添加索引**(`src/core/storage/schema.sql`)
|
|
283
|
-
```sql
|
|
284
|
-
-- routing_events 表:obeyed 查询优化
|
|
285
|
-
CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed_ts
|
|
286
|
-
ON routing_events(obeyed, ts DESC);
|
|
287
|
-
|
|
288
|
-
-- events 表:session + hook_type 复合查询优化
|
|
289
|
-
CREATE INDEX IF NOT EXISTS idx_events_session_hook
|
|
290
|
-
ON events(session_id, hook_type, timestamp DESC);
|
|
291
|
-
|
|
292
|
-
-- injections 表:session + handler 复合查询优化
|
|
293
|
-
CREATE INDEX IF NOT EXISTS idx_injections_session_handler
|
|
294
|
-
ON injections(session_id, source_handler);
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
2. **迁移脚本**(`src/core/storage/base.ts`)
|
|
298
|
-
```typescript
|
|
299
|
-
private runMigrations(): void {
|
|
300
|
-
// 添加索引(幂等操作)
|
|
301
|
-
this.db.exec(`
|
|
302
|
-
CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed_ts ON routing_events(obeyed, ts DESC);
|
|
303
|
-
CREATE INDEX IF NOT EXISTS idx_events_session_hook ON events(session_id, hook_type, timestamp DESC);
|
|
304
|
-
CREATE INDEX IF NOT EXISTS idx_injections_session_handler ON injections(session_id, source_handler);
|
|
305
|
-
`);
|
|
306
|
-
logger.info('[SQLiteStorage] Performance indexes created');
|
|
307
|
-
}
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
**验证方法**:
|
|
311
|
-
```bash
|
|
312
|
-
# 检查索引
|
|
313
|
-
sqlite3 ~/.claude-forge/data.db "SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_%';"
|
|
314
|
-
|
|
315
|
-
# 验证查询计划
|
|
316
|
-
sqlite3 ~/.claude-forge/data.db "EXPLAIN QUERY PLAN SELECT * FROM routing_events WHERE obeyed IS NULL ORDER BY ts DESC;"
|
|
317
|
-
# 预期:SEARCH routing_events USING INDEX idx_routing_events_obeyed_ts
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
### Step 5: 补充核心模块单元测试(5 天)
|
|
323
|
-
|
|
324
|
-
**目标**:测试覆盖率从 0% 提升到 50%
|
|
325
|
-
|
|
326
|
-
**改动**:
|
|
327
|
-
|
|
328
|
-
1. **测试工具函数**(`tests/helpers/mock-storage.ts`)
|
|
329
|
-
```typescript
|
|
330
|
-
import Database from 'better-sqlite3';
|
|
331
|
-
import { SQLiteStorage } from '../../src/core/storage/sqlite.js';
|
|
332
|
-
import { tmpdir } from 'node:os';
|
|
333
|
-
import { join } from 'node:path';
|
|
334
|
-
import { randomUUID } from 'node:crypto';
|
|
335
|
-
|
|
336
|
-
export function createMockStorage(): SQLiteStorage {
|
|
337
|
-
const dbPath = join(tmpdir(), `test-${randomUUID()}.db`);
|
|
338
|
-
return new SQLiteStorage(dbPath);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
export function cleanupMockStorage(storage: SQLiteStorage): void {
|
|
342
|
-
const dbPath = storage.getDbPath();
|
|
343
|
-
storage.close();
|
|
344
|
-
if (fs.existsSync(dbPath)) {
|
|
345
|
-
fs.unlinkSync(dbPath);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
2. **Storage 测试**(`tests/unit/storage.test.ts`)
|
|
351
|
-
- 测试 `writeEvent` / `queryEvents` / `upsertSession`
|
|
352
|
-
- 测试事务处理
|
|
353
|
-
- 测试并发写入
|
|
354
|
-
- 测试索引生效
|
|
355
|
-
|
|
356
|
-
3. **Router 测试**(`tests/unit/router.test.ts`)
|
|
357
|
-
- 测试事件路由逻辑
|
|
358
|
-
- 测试类型守卫
|
|
359
|
-
- 测试错误边界
|
|
360
|
-
|
|
361
|
-
4. **Type Guards 测试**(`tests/unit/type-guards.test.ts`)
|
|
362
|
-
- 测试所有类型守卫函数
|
|
363
|
-
- 测试边界情况(缺失字段、错误类型)
|
|
364
|
-
|
|
365
|
-
**验证方法**:
|
|
366
|
-
```bash
|
|
367
|
-
# 运行测试
|
|
368
|
-
npm test
|
|
369
|
-
|
|
370
|
-
# 生成覆盖率报告
|
|
371
|
-
npm test -- --coverage
|
|
372
|
-
|
|
373
|
-
# 检查覆盖率
|
|
374
|
-
cat coverage/coverage-summary.json | jq '.total.lines.pct'
|
|
375
|
-
# 预期:>= 50
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
---
|
|
379
|
-
|
|
380
|
-
### Step 6: 统一错误处理 + 请求体限制(1 天)
|
|
381
|
-
|
|
382
|
-
**目标**:提升 daemon 和 Web 服务稳定性
|
|
383
|
-
|
|
384
|
-
**改动**:
|
|
385
|
-
|
|
386
|
-
1. **添加错误边界**(`src/daemon/router.ts`)
|
|
387
|
-
```typescript
|
|
388
|
-
export async function routeEvent(event: ForgeEvent, handlers: Handlers): Promise<HookResult | void> {
|
|
389
|
-
try {
|
|
390
|
-
if (isUserPromptSubmit(event)) return await handlers.UserPromptSubmit.handle(event);
|
|
391
|
-
if (isPostToolUse(event)) return await handlers.PostToolUse.handle(event);
|
|
392
|
-
if (isStop(event)) return await handlers.Stop.handle(event);
|
|
393
|
-
} catch (err) {
|
|
394
|
-
logger.error(`[Router] Handler failed for ${event.hook_type}:`, err);
|
|
395
|
-
return { allow: true }; // 默认放行,避免阻塞 Claude Code
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
2. **统一错误处理中间件**(`src/web/routes/error-handler.ts`)
|
|
401
|
-
```typescript
|
|
402
|
-
export function errorHandler(err: Error, req: Request, res: Response, next: NextFunction) {
|
|
403
|
-
logger.error(`[API Error] ${req.method} ${req.path}:`, err);
|
|
404
|
-
|
|
405
|
-
const statusCode = (err as any).statusCode || 500;
|
|
406
|
-
const errorCode = (err as any).code || 'INTERNAL_ERROR';
|
|
407
|
-
|
|
408
|
-
res.status(statusCode).json({
|
|
409
|
-
error: {
|
|
410
|
-
code: errorCode,
|
|
411
|
-
message: err.message,
|
|
412
|
-
}
|
|
413
|
-
});
|
|
414
|
-
}
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
3. **请求体大小限制**(`src/web/server.ts`)
|
|
418
|
-
```typescript
|
|
419
|
-
this.app.use(express.json({ limit: '1mb' }));
|
|
420
|
-
this.app.use(express.urlencoded({ extended: true, limit: '1mb' }));
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
**验证方法**:
|
|
424
|
-
```bash
|
|
425
|
-
# 测试大请求体
|
|
426
|
-
curl -X POST http://localhost:3456/api/patch/preview \
|
|
427
|
-
-H "Content-Type: application/json" \
|
|
428
|
-
-d "$(python3 -c 'print("{\"data\": \"" + "A"*2000000 + "\"}")')"
|
|
429
|
-
# 预期:返回 413 Payload Too Large
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
---
|
|
433
|
-
|
|
434
|
-
## 5. 风险点与缓解措施
|
|
435
|
-
|
|
436
|
-
### 5.1 高风险改动
|
|
437
|
-
|
|
438
|
-
| 改动 | 风险 | 缓解措施 |
|
|
439
|
-
|---|---|---|
|
|
440
|
-
| 路径校验逻辑 | 可能拒绝合法路径 | 保留旧函数作为 fallback;充分测试 |
|
|
441
|
-
| Zod 运行时校验 | 性能开销 | 仅在边界层使用;缓存 schema |
|
|
442
|
-
| 错误边界 | 可能隐藏真实错误 | 详细日志记录;监控错误率 |
|
|
443
|
-
|
|
444
|
-
### 5.2 回滚策略
|
|
445
|
-
|
|
446
|
-
- 所有改动通过 Git 管理,可快速 revert
|
|
447
|
-
- 关键改动保留旧代码为 `unsafe*` 或 `legacy*` 函数
|
|
448
|
-
- 测试失败立即停止部署
|
|
449
|
-
|
|
450
|
-
---
|
|
451
|
-
|
|
452
|
-
## 6. 测试策略
|
|
453
|
-
|
|
454
|
-
### 6.1 单元测试覆盖目标
|
|
455
|
-
|
|
456
|
-
| 模块 | 当前覆盖率 | 目标覆盖率 | 优先级 |
|
|
457
|
-
|---|---|---|---|
|
|
458
|
-
| `src/core/storage/` | 0% | 60% | P0 |
|
|
459
|
-
| `src/daemon/router.ts` | 0% | 70% | P0 |
|
|
460
|
-
| `src/core/types.ts` (type guards) | 0% | 80% | P0 |
|
|
461
|
-
| `src/web/routes/` | 0% | 40% | P1 |
|
|
462
|
-
|
|
463
|
-
### 6.2 集成测试场景
|
|
464
|
-
|
|
465
|
-
1. **端到端事件流**
|
|
466
|
-
- UserPromptSubmit → Router → Handler → Storage
|
|
467
|
-
- 验证事件正确写入数据库
|
|
468
|
-
|
|
469
|
-
2. **安全漏洞回归测试**
|
|
470
|
-
- 路径遍历攻击
|
|
471
|
-
- Git 命令注入
|
|
472
|
-
- 类型错误注入
|
|
473
|
-
|
|
474
|
-
3. **性能测试**
|
|
475
|
-
- 索引生效验证
|
|
476
|
-
- 并发写入测试
|
|
477
|
-
|
|
478
|
-
---
|
|
479
|
-
|
|
480
|
-
## 7. 验收标准
|
|
481
|
-
|
|
482
|
-
### 7.1 功能验收
|
|
483
|
-
|
|
484
|
-
- ✅ 所有现有功能正常(回归测试通过)
|
|
485
|
-
- ✅ daemon 启动正常
|
|
486
|
-
- ✅ Web 仪表盘正常访问
|
|
487
|
-
- ✅ CLI 命令正常执行
|
|
488
|
-
|
|
489
|
-
### 7.2 安全验收
|
|
490
|
-
|
|
491
|
-
- ✅ 路径遍历攻击被拦截(返回 400)
|
|
492
|
-
- ✅ Git 命令注入被拦截(返回 400)
|
|
493
|
-
- ✅ 异常数据不导致崩溃(返回空数组或错误)
|
|
494
|
-
|
|
495
|
-
### 7.3 性能验收
|
|
496
|
-
|
|
497
|
-
- ✅ 索引创建成功(`EXPLAIN QUERY PLAN` 显示使用索引)
|
|
498
|
-
- ✅ 查询性能提升(对比修改前后的查询时间)
|
|
499
|
-
|
|
500
|
-
### 7.4 测试验收
|
|
501
|
-
|
|
502
|
-
- ✅ 单元测试覆盖率 >= 50%
|
|
503
|
-
- ✅ 所有测试通过
|
|
504
|
-
- ✅ CI 流程正常运行
|
|
505
|
-
|
|
506
|
-
---
|
|
507
|
-
|
|
508
|
-
## 8. 时间估算
|
|
509
|
-
|
|
510
|
-
| 步骤 | 工作量(天) | 依赖 |
|
|
511
|
-
|---|---|---|
|
|
512
|
-
| Step 1: 路径遍历漏洞 | 1 | 无 |
|
|
513
|
-
| Step 2: Git 命令注入 | 1 | 无 |
|
|
514
|
-
| Step 3: 类型安全 | 2 | 无 |
|
|
515
|
-
| Step 4: 数据库索引 | 0.5 | 无 |
|
|
516
|
-
| Step 5: 单元测试 | 5 | Step 1-4 完成后 |
|
|
517
|
-
| Step 6: 错误处理 | 1 | 无 |
|
|
518
|
-
| **总计** | **10.5 天** | - |
|
|
519
|
-
|
|
520
|
-
**缓冲时间**:1.5 天(应对意外问题)
|
|
521
|
-
**总工作量**:12 天(约 2 周)
|
|
522
|
-
|
|
523
|
-
---
|
|
524
|
-
|
|
525
|
-
## 9. 里程碑
|
|
526
|
-
|
|
527
|
-
| 日期 | 里程碑 | 交付物 |
|
|
528
|
-
|---|---|---|
|
|
529
|
-
| 2026-05-17 | P0 安全漏洞修复完成 | 3 个漏洞修复 + 回归测试 |
|
|
530
|
-
| 2026-05-20 | 基础设施改进完成 | 索引 + 错误处理 + 请求体限制 |
|
|
531
|
-
| 2026-05-27 | 单元测试完成 | 覆盖率 >= 50% |
|
|
532
|
-
| 2026-05-29 | 第 1 迭代验收 | 所有验收标准通过 |
|
|
533
|
-
|
|
534
|
-
---
|
|
535
|
-
|
|
536
|
-
## 10. 下一步
|
|
537
|
-
|
|
538
|
-
**Phase 1.5: User Review**
|
|
539
|
-
|
|
540
|
-
请 review 本方案后回复:
|
|
541
|
-
- **"批准"** / **"approve"** → spawn coder 开始实施
|
|
542
|
-
- **"修改 [意见]"** → 调整 spec
|
|
543
|
-
- **"取消"** → 停止任务
|