@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
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* upgrade-engine.ts
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the AI-assisted official skill upgrade pipeline.
|
|
5
|
+
* Does NOT contain AI prompt strings — those live in upgrade-prompt.ts.
|
|
6
|
+
*/
|
|
7
|
+
import type { OfficialSkill } from './official-skills.js';
|
|
8
|
+
import type { ClaudeProvider } from '../core/ai/provider.js';
|
|
9
|
+
export interface CandidateSkill {
|
|
10
|
+
id: string;
|
|
11
|
+
source: string;
|
|
12
|
+
filePath: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
keywords: string[];
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
export interface MatchResult {
|
|
19
|
+
officialId: string;
|
|
20
|
+
score: number;
|
|
21
|
+
}
|
|
22
|
+
export type UpgradeAction = 'upgrade' | 'merge' | 'skip';
|
|
23
|
+
export interface UpgradeDecision {
|
|
24
|
+
action: UpgradeAction;
|
|
25
|
+
confidence: number;
|
|
26
|
+
reasoning: string;
|
|
27
|
+
merged_content: string | null;
|
|
28
|
+
}
|
|
29
|
+
export interface ReportEntry {
|
|
30
|
+
officialId: string;
|
|
31
|
+
candidateId: string;
|
|
32
|
+
candidateSource: string;
|
|
33
|
+
action: UpgradeAction | 'error' | 'needs_review';
|
|
34
|
+
confidence: number;
|
|
35
|
+
reasoning: string;
|
|
36
|
+
candidateFilePath: string;
|
|
37
|
+
merged_content: string | null;
|
|
38
|
+
}
|
|
39
|
+
export declare const DEFAULT_SOURCES: Array<{
|
|
40
|
+
name: string;
|
|
41
|
+
url: string;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Clone or pull each source into `candidatesDir/<source.name>/`, then scan
|
|
45
|
+
* all .md files and parse them into CandidateSkill objects.
|
|
46
|
+
* Individual source failures are caught and logged; they do not abort the run.
|
|
47
|
+
*/
|
|
48
|
+
export declare function pullCandidates(sources: Array<{
|
|
49
|
+
name: string;
|
|
50
|
+
url: string;
|
|
51
|
+
}>, candidatesDir: string): Promise<CandidateSkill[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Match a candidate skill to the best official skill using keyword + name token
|
|
54
|
+
* overlap. Returns null if the best score is below the 15-point threshold.
|
|
55
|
+
* (Threshold lowered from 30 in v8.53.1 to accommodate English↔中文 keyword mismatch;
|
|
56
|
+
* substring boost forces score=50 when keyword appears as substring in the other's text.)
|
|
57
|
+
*/
|
|
58
|
+
export declare function matchToOfficial(candidate: CandidateSkill, officialSkills: OfficialSkill[]): MatchResult | null;
|
|
59
|
+
/**
|
|
60
|
+
* Ask the AI provider to evaluate whether a candidate should upgrade / merge /
|
|
61
|
+
* skip the matched official skill. Returns a parsed UpgradeDecision.
|
|
62
|
+
*
|
|
63
|
+
* On JSON parse failure → returns { action: 'skip', confidence: 0, reasoning:
|
|
64
|
+
* 'AI response could not be parsed', merged_content: null } with needs_review=true
|
|
65
|
+
* embedded in the reasoning (caller promotes to needs_review).
|
|
66
|
+
*/
|
|
67
|
+
export declare function evaluateWithAI(candidate: CandidateSkill, official: OfficialSkill, aiProvider: ClaudeProvider): Promise<UpgradeDecision & {
|
|
68
|
+
needs_review?: boolean;
|
|
69
|
+
}>;
|
|
70
|
+
/**
|
|
71
|
+
* Write the upgrade report as a markdown file with embedded HTML comment
|
|
72
|
+
* machine markers for `applyDecisions` to parse.
|
|
73
|
+
*/
|
|
74
|
+
export declare function generateReport(entries: ReportEntry[], outputPath: string, stats: {
|
|
75
|
+
total: number;
|
|
76
|
+
matched: number;
|
|
77
|
+
unmatched: number;
|
|
78
|
+
}): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Apply the decisions recorded in a report file to the official skills directory.
|
|
81
|
+
*
|
|
82
|
+
* Safety checks:
|
|
83
|
+
* 1. `git status --porcelain <officialDir>` must be clean
|
|
84
|
+
* 2. Full backup created in `backupBaseDir/<YYYYMMDD-HHMM>/` (conflict → -2/-3)
|
|
85
|
+
*
|
|
86
|
+
* Returns { applied, skipped, backupPath }.
|
|
87
|
+
*/
|
|
88
|
+
export declare function applyDecisions(reportPath: string, officialDir: string, backupBaseDir: string): Promise<{
|
|
89
|
+
applied: number;
|
|
90
|
+
skipped: number;
|
|
91
|
+
backupPath: string;
|
|
92
|
+
}>;
|
|
93
|
+
//# sourceMappingURL=upgrade-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-engine.d.ts","sourceRoot":"","sources":["../../src/skills/upgrade-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQ7D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,aAAa,GAAG,OAAO,GAAG,cAAc,CAAC;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAID,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAGhE,CAAC;AAuFF;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EAC7C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,EAAE,CAAC,CAkD3B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,cAAc,EACzB,cAAc,EAAE,aAAa,EAAE,GAC9B,WAAW,GAAG,IAAI,CAoEpB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,eAAe,GAAG;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAyDvD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,IAAI,CAAC,CA0Df;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAgHnE"}
|
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* upgrade-engine.ts
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the AI-assisted official skill upgrade pipeline.
|
|
5
|
+
* Does NOT contain AI prompt strings — those live in upgrade-prompt.ts.
|
|
6
|
+
*/
|
|
7
|
+
import { exec, execFile } from 'node:child_process';
|
|
8
|
+
import { promises as fs, readFileSync } from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { promisify } from 'node:util';
|
|
11
|
+
import matter from 'gray-matter';
|
|
12
|
+
import { buildEvaluationPrompt } from './upgrade-prompt.js';
|
|
13
|
+
import { logger } from '../core/utils/logger.js';
|
|
14
|
+
const execAsync = promisify(exec);
|
|
15
|
+
const execFileAsync = promisify(execFile);
|
|
16
|
+
// ── Default candidate sources ───────────────────────────────────────────────
|
|
17
|
+
export const DEFAULT_SOURCES = [
|
|
18
|
+
{ name: 'agent-skills', url: 'https://github.com/addyosmani/agent-skills.git' },
|
|
19
|
+
{ name: 'superpowers', url: 'https://github.com/obra/superpowers.git' },
|
|
20
|
+
];
|
|
21
|
+
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Parse a .md file into a CandidateSkill.
|
|
24
|
+
* Returns null if frontmatter `name` is missing or keywords are absent —
|
|
25
|
+
* such candidates cannot be meaningfully matched and should not pollute
|
|
26
|
+
* the AI evaluation pipeline.
|
|
27
|
+
*/
|
|
28
|
+
function parseCandidateFile(filePath, sourceName) {
|
|
29
|
+
try {
|
|
30
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
31
|
+
const parsed = matter(raw);
|
|
32
|
+
const { data } = parsed;
|
|
33
|
+
// Require frontmatter name — fileName fallback produces noisy / unmatchable candidates
|
|
34
|
+
if (typeof data.name !== 'string' || data.name.trim().length === 0) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const id = data.name;
|
|
38
|
+
const name = data.name;
|
|
39
|
+
const description = typeof data.description === 'string' ? data.description : '';
|
|
40
|
+
const rawKeywords = data.keywords ?? data.tags;
|
|
41
|
+
const keywords = Array.isArray(rawKeywords)
|
|
42
|
+
? rawKeywords.filter((k) => typeof k === 'string')
|
|
43
|
+
: [];
|
|
44
|
+
// Require at least one keyword OR a non-empty description to ground the AI match
|
|
45
|
+
if (keywords.length === 0 && description.trim().length === 0) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
id,
|
|
50
|
+
source: sourceName,
|
|
51
|
+
filePath,
|
|
52
|
+
name,
|
|
53
|
+
description,
|
|
54
|
+
keywords,
|
|
55
|
+
content: raw,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Recursively scan a directory for .md files.
|
|
64
|
+
* Supports both directory/SKILL.md format (agent-skills) and flat *.md format.
|
|
65
|
+
*/
|
|
66
|
+
async function scanMdFiles(dir) {
|
|
67
|
+
const results = [];
|
|
68
|
+
async function walk(current) {
|
|
69
|
+
let entries;
|
|
70
|
+
try {
|
|
71
|
+
entries = await fs.readdir(current, { withFileTypes: true });
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
for (const entry of entries) {
|
|
77
|
+
const fullPath = path.join(current, entry.name);
|
|
78
|
+
if (entry.isDirectory()) {
|
|
79
|
+
// Check for SKILL.md inside this directory (agent-skills format)
|
|
80
|
+
const skillMd = path.join(fullPath, 'SKILL.md');
|
|
81
|
+
try {
|
|
82
|
+
await fs.access(skillMd);
|
|
83
|
+
results.push(skillMd);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Recurse into sub-directories that don't have SKILL.md directly
|
|
87
|
+
await walk(fullPath);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (entry.isFile() && entry.name.endsWith('.md') && entry.name !== 'README.md') {
|
|
91
|
+
results.push(fullPath);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
await walk(dir);
|
|
96
|
+
return results;
|
|
97
|
+
}
|
|
98
|
+
// ── Exported pipeline functions ─────────────────────────────────────────────
|
|
99
|
+
/**
|
|
100
|
+
* Clone or pull each source into `candidatesDir/<source.name>/`, then scan
|
|
101
|
+
* all .md files and parse them into CandidateSkill objects.
|
|
102
|
+
* Individual source failures are caught and logged; they do not abort the run.
|
|
103
|
+
*/
|
|
104
|
+
export async function pullCandidates(sources, candidatesDir) {
|
|
105
|
+
await fs.mkdir(candidatesDir, { recursive: true });
|
|
106
|
+
const candidates = [];
|
|
107
|
+
for (const source of sources) {
|
|
108
|
+
const targetDir = path.join(candidatesDir, source.name);
|
|
109
|
+
let exists = false;
|
|
110
|
+
try {
|
|
111
|
+
await fs.access(targetDir);
|
|
112
|
+
exists = true;
|
|
113
|
+
}
|
|
114
|
+
catch { /* not exists */ }
|
|
115
|
+
// Try pull/clone, but don't abort scan if pull fails on existing dir
|
|
116
|
+
try {
|
|
117
|
+
if (exists) {
|
|
118
|
+
logger.info(`[upgrade] Pulling ${source.name}...`);
|
|
119
|
+
await execAsync(`git -C "${targetDir}" pull --ff-only`, { timeout: 60_000 });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
logger.info(`[upgrade] Cloning ${source.name}...`);
|
|
123
|
+
await execAsync(`git clone --depth=1 "${source.url}" "${targetDir}"`, { timeout: 120_000 });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
128
|
+
if (exists) {
|
|
129
|
+
logger.warn(`[upgrade] ${source.name} pull failed (using existing checkout): ${msg}`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
logger.warn(`[upgrade] ${source.name} clone failed, skipping: ${msg}`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Always scan if dir exists (even when pull fails — old checkout is better than nothing)
|
|
137
|
+
try {
|
|
138
|
+
const mdFiles = await scanMdFiles(targetDir);
|
|
139
|
+
for (const filePath of mdFiles) {
|
|
140
|
+
const candidate = parseCandidateFile(filePath, source.name);
|
|
141
|
+
if (candidate) {
|
|
142
|
+
candidates.push(candidate);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
logger.info(`[upgrade] ${source.name}: ${mdFiles.length} .md files found`);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
149
|
+
logger.warn(`[upgrade] Skipping source ${source.name}: ${msg}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return candidates;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Match a candidate skill to the best official skill using keyword + name token
|
|
156
|
+
* overlap. Returns null if the best score is below the 15-point threshold.
|
|
157
|
+
* (Threshold lowered from 30 in v8.53.1 to accommodate English↔中文 keyword mismatch;
|
|
158
|
+
* substring boost forces score=50 when keyword appears as substring in the other's text.)
|
|
159
|
+
*/
|
|
160
|
+
export function matchToOfficial(candidate, officialSkills) {
|
|
161
|
+
/** Tokenise a string into lowercase words / tokens. */
|
|
162
|
+
function tokenise(text) {
|
|
163
|
+
// L3: 中文按字符边界切分(`一-鿿` 范围内每个汉字单独成 token);英文按空白/连字符。
|
|
164
|
+
// 这种方式对「调试 / debugging」之类的跨语言匹配很弱(中文整词不会切出 "调试"
|
|
165
|
+
// 而是 "调" + "试")。
|
|
166
|
+
// TODO: v8.54+ 引入 jieba 或类似分词,提升中英混合 keyword 命中率。
|
|
167
|
+
return new Set(text
|
|
168
|
+
.toLowerCase()
|
|
169
|
+
.replace(/[^a-z0-9一-鿿\s-]/g, ' ')
|
|
170
|
+
.split(/[\s-]+/)
|
|
171
|
+
.filter((t) => t.length > 1));
|
|
172
|
+
}
|
|
173
|
+
/** Jaccard-like overlap score (0–100). */
|
|
174
|
+
function overlapScore(aSet, bSet) {
|
|
175
|
+
if (aSet.size === 0 && bSet.size === 0)
|
|
176
|
+
return 0;
|
|
177
|
+
let intersection = 0;
|
|
178
|
+
for (const t of aSet) {
|
|
179
|
+
if (bSet.has(t))
|
|
180
|
+
intersection++;
|
|
181
|
+
}
|
|
182
|
+
const union = new Set([...aSet, ...bSet]).size;
|
|
183
|
+
return union === 0 ? 0 : Math.round((intersection / union) * 100);
|
|
184
|
+
}
|
|
185
|
+
const candidateKeywordTokens = tokenise(candidate.keywords.join(' '));
|
|
186
|
+
const candidateNameTokens = tokenise(candidate.name + ' ' + candidate.description);
|
|
187
|
+
let best = null;
|
|
188
|
+
for (const official of officialSkills) {
|
|
189
|
+
const officialKeywordTokens = tokenise(official.keywords.join(' '));
|
|
190
|
+
const officialNameTokens = tokenise(official.name + ' ' + official.description);
|
|
191
|
+
// keyword overlap (weight 60) + name/description token overlap (weight 40)
|
|
192
|
+
const keywordScore = overlapScore(candidateKeywordTokens, officialKeywordTokens);
|
|
193
|
+
const nameScore = overlapScore(candidateNameTokens, officialNameTokens);
|
|
194
|
+
let combined = Math.round(keywordScore * 0.6 + nameScore * 0.4);
|
|
195
|
+
// Substring boost: candidate id/name contains official keyword (or vice versa)
|
|
196
|
+
// helps with English↔中文 token mismatch (e.g. "debugging" ↔ "debug"/"调试")
|
|
197
|
+
const candidateText = (candidate.id + ' ' + candidate.name + ' ' + candidate.description).toLowerCase();
|
|
198
|
+
const officialText = (official.name + ' ' + official.description).toLowerCase();
|
|
199
|
+
for (const kw of official.keywords) {
|
|
200
|
+
const kwLower = kw.toLowerCase();
|
|
201
|
+
if (kwLower.length >= 3 && candidateText.includes(kwLower)) {
|
|
202
|
+
combined = Math.max(combined, 50);
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
for (const kw of candidate.keywords) {
|
|
207
|
+
const kwLower = kw.toLowerCase();
|
|
208
|
+
if (kwLower.length >= 3 && officialText.includes(kwLower)) {
|
|
209
|
+
combined = Math.max(combined, 50);
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (combined >= 15) {
|
|
214
|
+
if (!best || combined > best.score) {
|
|
215
|
+
best = { officialId: official.name, score: combined };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return best;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Ask the AI provider to evaluate whether a candidate should upgrade / merge /
|
|
223
|
+
* skip the matched official skill. Returns a parsed UpgradeDecision.
|
|
224
|
+
*
|
|
225
|
+
* On JSON parse failure → returns { action: 'skip', confidence: 0, reasoning:
|
|
226
|
+
* 'AI response could not be parsed', merged_content: null } with needs_review=true
|
|
227
|
+
* embedded in the reasoning (caller promotes to needs_review).
|
|
228
|
+
*/
|
|
229
|
+
export async function evaluateWithAI(candidate, official, aiProvider) {
|
|
230
|
+
const { system, user } = buildEvaluationPrompt(candidate, official);
|
|
231
|
+
let raw;
|
|
232
|
+
try {
|
|
233
|
+
raw = await aiProvider.complete(user, {
|
|
234
|
+
system,
|
|
235
|
+
maxTokens: 1200,
|
|
236
|
+
timeoutMs: 45_000,
|
|
237
|
+
maxRetries: 2,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
242
|
+
return {
|
|
243
|
+
action: 'skip',
|
|
244
|
+
confidence: 0,
|
|
245
|
+
reasoning: `AI 调用失败: ${msg}`,
|
|
246
|
+
merged_content: null,
|
|
247
|
+
needs_review: true,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
// Strip markdown code fences if model wrapped the JSON
|
|
251
|
+
const stripped = raw
|
|
252
|
+
.replace(/^```(?:json)?\s*/im, '')
|
|
253
|
+
.replace(/\s*```$/im, '')
|
|
254
|
+
.trim();
|
|
255
|
+
try {
|
|
256
|
+
const parsed = JSON.parse(stripped);
|
|
257
|
+
const validActions = new Set(['upgrade', 'merge', 'skip']);
|
|
258
|
+
const action = typeof parsed.action === 'string' && validActions.has(parsed.action)
|
|
259
|
+
? parsed.action
|
|
260
|
+
: 'skip';
|
|
261
|
+
const confidence = typeof parsed.confidence === 'number'
|
|
262
|
+
? Math.max(0, Math.min(100, parsed.confidence))
|
|
263
|
+
: 0;
|
|
264
|
+
const reasoning = typeof parsed.reasoning === 'string' ? parsed.reasoning : '';
|
|
265
|
+
const merged_content = typeof parsed.merged_content === 'string' ? parsed.merged_content : null;
|
|
266
|
+
return { action, confidence, reasoning, merged_content };
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return {
|
|
270
|
+
action: 'skip',
|
|
271
|
+
confidence: 0,
|
|
272
|
+
reasoning: `AI 返回内容无法解析为 JSON,需人工审核。原始响应片段: ${stripped.slice(0, 200)}`,
|
|
273
|
+
merged_content: null,
|
|
274
|
+
needs_review: true,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Write the upgrade report as a markdown file with embedded HTML comment
|
|
280
|
+
* machine markers for `applyDecisions` to parse.
|
|
281
|
+
*/
|
|
282
|
+
export async function generateReport(entries, outputPath, stats) {
|
|
283
|
+
const now = new Date();
|
|
284
|
+
const timestamp = now.toISOString().replace('T', ' ').slice(0, 16);
|
|
285
|
+
const actionCounts = { upgrade: 0, merge: 0, skip: 0, error: 0, needs_review: 0 };
|
|
286
|
+
for (const e of entries) {
|
|
287
|
+
if (e.action in actionCounts) {
|
|
288
|
+
actionCounts[e.action]++;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const lines = [
|
|
292
|
+
'# Skill Upgrade Report',
|
|
293
|
+
'',
|
|
294
|
+
`Generated: ${timestamp}`,
|
|
295
|
+
'',
|
|
296
|
+
'## Summary',
|
|
297
|
+
'',
|
|
298
|
+
'| Metric | Count |',
|
|
299
|
+
'|--------|-------|',
|
|
300
|
+
`| Candidates scanned | ${stats.total} |`,
|
|
301
|
+
`| Matched to official | ${stats.matched} |`,
|
|
302
|
+
`| Action: upgrade | ${actionCounts.upgrade} |`,
|
|
303
|
+
`| Action: merge | ${actionCounts.merge} |`,
|
|
304
|
+
`| Action: skip | ${actionCounts.skip} |`,
|
|
305
|
+
`| Needs review | ${actionCounts.needs_review} |`,
|
|
306
|
+
`| Error | ${actionCounts.error} |`,
|
|
307
|
+
`| Unmatched | ${stats.unmatched} |`,
|
|
308
|
+
'',
|
|
309
|
+
'## Per-Skill Decisions',
|
|
310
|
+
'',
|
|
311
|
+
];
|
|
312
|
+
for (const entry of entries) {
|
|
313
|
+
lines.push(`### ${entry.officialId}`);
|
|
314
|
+
lines.push(`- **Action**: ${entry.action}`);
|
|
315
|
+
lines.push(`- **Confidence**: ${entry.confidence}%`);
|
|
316
|
+
lines.push(`- **Candidate**: \`${entry.candidateSource}/${entry.candidateId}\``);
|
|
317
|
+
lines.push(`- **Candidate path**: \`${entry.candidateFilePath}\``);
|
|
318
|
+
lines.push(`- **Reasoning**: ${entry.reasoning}`);
|
|
319
|
+
// Machine-readable marker for applyDecisions
|
|
320
|
+
lines.push('');
|
|
321
|
+
lines.push(`<!-- upgrade-entry: ${entry.officialId} | ${entry.candidateFilePath} | ${entry.action} -->`);
|
|
322
|
+
if (entry.action === 'merge' && entry.merged_content) {
|
|
323
|
+
lines.push('');
|
|
324
|
+
lines.push('<!-- merged-content-begin -->');
|
|
325
|
+
lines.push(entry.merged_content);
|
|
326
|
+
lines.push('<!-- merged-content-end -->');
|
|
327
|
+
}
|
|
328
|
+
lines.push('');
|
|
329
|
+
}
|
|
330
|
+
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
|
331
|
+
await fs.writeFile(outputPath, lines.join('\n'), 'utf-8');
|
|
332
|
+
logger.info(`[upgrade] Report written to ${outputPath}`);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Apply the decisions recorded in a report file to the official skills directory.
|
|
336
|
+
*
|
|
337
|
+
* Safety checks:
|
|
338
|
+
* 1. `git status --porcelain <officialDir>` must be clean
|
|
339
|
+
* 2. Full backup created in `backupBaseDir/<YYYYMMDD-HHMM>/` (conflict → -2/-3)
|
|
340
|
+
*
|
|
341
|
+
* Returns { applied, skipped, backupPath }.
|
|
342
|
+
*/
|
|
343
|
+
export async function applyDecisions(reportPath, officialDir, backupBaseDir) {
|
|
344
|
+
// 1. Check git working tree is clean (use execFile to avoid shell injection via officialDir)
|
|
345
|
+
try {
|
|
346
|
+
const { stdout } = await execFileAsync('git', ['status', '--porcelain', officialDir]);
|
|
347
|
+
if (stdout.trim().length > 0) {
|
|
348
|
+
throw new Error(`Working tree is dirty in ${officialDir}. Commit or stash changes before applying.\n${stdout}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
// If git is not available or it's not a repo, rethrow only for dirty-tree errors
|
|
353
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
354
|
+
if (msg.includes('Working tree is dirty'))
|
|
355
|
+
throw err;
|
|
356
|
+
logger.warn(`[upgrade] git status check failed (not a git repo?): ${msg}`);
|
|
357
|
+
}
|
|
358
|
+
// 2. Create timestamped backup directory (YYYYMMDD-HHMM format)
|
|
359
|
+
const tsFormatted = (() => {
|
|
360
|
+
const d = new Date();
|
|
361
|
+
const YYYY = d.getFullYear();
|
|
362
|
+
const MM = String(d.getMonth() + 1).padStart(2, '0');
|
|
363
|
+
const DD = String(d.getDate()).padStart(2, '0');
|
|
364
|
+
const HH = String(d.getHours()).padStart(2, '0');
|
|
365
|
+
const mm = String(d.getMinutes()).padStart(2, '0');
|
|
366
|
+
return `${YYYY}${MM}${DD}-${HH}${mm}`;
|
|
367
|
+
})();
|
|
368
|
+
let backupPath = path.join(backupBaseDir, tsFormatted);
|
|
369
|
+
// Handle conflict: try -2, -3, ...
|
|
370
|
+
let suffix = 2;
|
|
371
|
+
while (true) {
|
|
372
|
+
try {
|
|
373
|
+
await fs.access(backupPath);
|
|
374
|
+
// Directory exists — try next suffix
|
|
375
|
+
backupPath = path.join(backupBaseDir, `${tsFormatted}-${suffix}`);
|
|
376
|
+
suffix++;
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
break; // doesn't exist, we can use it
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
await fs.mkdir(backupPath, { recursive: true });
|
|
383
|
+
// Copy all .md files from officialDir into backup
|
|
384
|
+
const officialFiles = (await fs.readdir(officialDir)).filter((f) => f.endsWith('.md'));
|
|
385
|
+
for (const file of officialFiles) {
|
|
386
|
+
await fs.copyFile(path.join(officialDir, file), path.join(backupPath, file));
|
|
387
|
+
}
|
|
388
|
+
logger.info(`[upgrade] Backed up ${officialFiles.length} files to ${backupPath}`);
|
|
389
|
+
// 3. Parse report
|
|
390
|
+
const reportContent = await fs.readFile(reportPath, 'utf-8');
|
|
391
|
+
// Parse <!-- upgrade-entry: id | path | action --> markers
|
|
392
|
+
const entryPattern = /<!-- upgrade-entry: (.+?) \| (.+?) \| (.+?) -->/g;
|
|
393
|
+
let match;
|
|
394
|
+
const entries = [];
|
|
395
|
+
while ((match = entryPattern.exec(reportContent)) !== null) {
|
|
396
|
+
entries.push({
|
|
397
|
+
officialId: match[1].trim(),
|
|
398
|
+
candidatePath: match[2].trim(),
|
|
399
|
+
action: match[3].trim(),
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
// Parse merged content blocks
|
|
403
|
+
const mergedContentMap = new Map();
|
|
404
|
+
// Associate merged-content blocks with the preceding entry
|
|
405
|
+
const mergedPattern = /<!-- upgrade-entry: (.+?) \| (.+?) \| merge -->[\s\S]*?<!-- merged-content-begin -->\n([\s\S]*?)\n<!-- merged-content-end -->/g;
|
|
406
|
+
while ((match = mergedPattern.exec(reportContent)) !== null) {
|
|
407
|
+
mergedContentMap.set(match[1].trim(), match[3]);
|
|
408
|
+
}
|
|
409
|
+
let applied = 0;
|
|
410
|
+
let skipped = 0;
|
|
411
|
+
for (const entry of entries) {
|
|
412
|
+
if (entry.action === 'skip' || entry.action === 'error' || entry.action === 'needs_review') {
|
|
413
|
+
skipped++;
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
const targetFile = path.join(officialDir, `${entry.officialId}.md`);
|
|
417
|
+
try {
|
|
418
|
+
if (entry.action === 'upgrade') {
|
|
419
|
+
// Copy candidate file content
|
|
420
|
+
const candidateContent = await fs.readFile(entry.candidatePath, 'utf-8');
|
|
421
|
+
await fs.writeFile(targetFile, candidateContent, 'utf-8');
|
|
422
|
+
applied++;
|
|
423
|
+
logger.info(`[upgrade] Applied upgrade: ${entry.officialId}`);
|
|
424
|
+
}
|
|
425
|
+
else if (entry.action === 'merge') {
|
|
426
|
+
const mergedContent = mergedContentMap.get(entry.officialId);
|
|
427
|
+
if (mergedContent) {
|
|
428
|
+
await fs.writeFile(targetFile, mergedContent, 'utf-8');
|
|
429
|
+
applied++;
|
|
430
|
+
logger.info(`[upgrade] Applied merge: ${entry.officialId}`);
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
logger.warn(`[upgrade] Merge entry ${entry.officialId} has no merged content; skipping`);
|
|
434
|
+
skipped++;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
catch (err) {
|
|
439
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
440
|
+
logger.error(`[upgrade] Failed to apply ${entry.officialId}: ${msg}`);
|
|
441
|
+
skipped++;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
logger.info(`[upgrade] Apply complete: ${applied} applied, ${skipped} skipped`);
|
|
445
|
+
return { applied, skipped, backupPath };
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=upgrade-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-engine.js","sourceRoot":"","sources":["../../src/skills/upgrade-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* upgrade-prompt.ts
|
|
3
|
+
*
|
|
4
|
+
* Builds the system + user prompts for AI-assisted skill evaluation.
|
|
5
|
+
* Pure functions — no I/O, no side effects.
|
|
6
|
+
*/
|
|
7
|
+
import type { CandidateSkill } from './upgrade-engine.js';
|
|
8
|
+
import type { OfficialSkill } from './official-skills.js';
|
|
9
|
+
/**
|
|
10
|
+
* Build system + user prompts for evaluating whether a candidate skill should
|
|
11
|
+
* upgrade, merge with, or skip an official skill.
|
|
12
|
+
*
|
|
13
|
+
* The system prompt defines the decision criteria and output JSON contract.
|
|
14
|
+
* The user prompt contains the two skill bodies (capped at 2000 chars each).
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildEvaluationPrompt(candidate: CandidateSkill, official: OfficialSkill): {
|
|
17
|
+
system: string;
|
|
18
|
+
user: string;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=upgrade-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-prompt.d.ts","sourceRoot":"","sources":["../../src/skills/upgrade-prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAa1D;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,aAAa,GACtB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAoDlC"}
|