@skillsmith/mcp-server 0.4.13 → 0.5.0
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/CHANGELOG.md +32 -4
- package/README.md +89 -13
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/__tests__/compare.test.js +5 -5
- package/dist/src/__tests__/compare.test.js.map +1 -1
- package/dist/src/__tests__/context-listeners.test.d.ts +12 -0
- package/dist/src/__tests__/context-listeners.test.d.ts.map +1 -0
- package/dist/src/__tests__/context-listeners.test.js +87 -0
- package/dist/src/__tests__/context-listeners.test.js.map +1 -0
- package/dist/src/__tests__/context.test.js +84 -82
- package/dist/src/__tests__/context.test.js.map +1 -1
- package/dist/src/__tests__/get-skill.api-path.test.js +21 -14
- package/dist/src/__tests__/get-skill.api-path.test.js.map +1 -1
- package/dist/src/__tests__/get-skill.test.js +5 -5
- package/dist/src/__tests__/get-skill.test.js.map +1 -1
- package/dist/src/__tests__/index-local.test.js +5 -5
- package/dist/src/__tests__/index-local.test.js.map +1 -1
- package/dist/src/__tests__/recommend-online-path.test.js +5 -5
- package/dist/src/__tests__/recommend-online-path.test.js.map +1 -1
- package/dist/src/__tests__/recommend.test.js +9 -9
- package/dist/src/__tests__/recommend.test.js.map +1 -1
- package/dist/src/__tests__/search-compatible-with.test.d.ts +10 -0
- package/dist/src/__tests__/search-compatible-with.test.d.ts.map +1 -0
- package/dist/src/__tests__/search-compatible-with.test.js +96 -0
- package/dist/src/__tests__/search-compatible-with.test.js.map +1 -0
- package/dist/src/__tests__/search-online-path.test.js +5 -5
- package/dist/src/__tests__/search-online-path.test.js.map +1 -1
- package/dist/src/__tests__/search.test.js +16 -101
- package/dist/src/__tests__/search.test.js.map +1 -1
- package/dist/src/__tests__/test-utils.d.ts +18 -3
- package/dist/src/__tests__/test-utils.d.ts.map +1 -1
- package/dist/src/__tests__/test-utils.js +24 -7
- package/dist/src/__tests__/test-utils.js.map +1 -1
- package/dist/src/audit/audit-history.d.ts +77 -0
- package/dist/src/audit/audit-history.d.ts.map +1 -0
- package/dist/src/audit/audit-history.js +98 -0
- package/dist/src/audit/audit-history.js.map +1 -0
- package/dist/src/audit/audit-report-writer.d.ts +82 -0
- package/dist/src/audit/audit-report-writer.d.ts.map +1 -0
- package/dist/src/audit/audit-report-writer.js +241 -0
- package/dist/src/audit/audit-report-writer.js.map +1 -0
- package/dist/src/audit/audit-suggestions.d.ts +52 -0
- package/dist/src/audit/audit-suggestions.d.ts.map +1 -0
- package/dist/src/audit/audit-suggestions.js +90 -0
- package/dist/src/audit/audit-suggestions.js.map +1 -0
- package/dist/src/audit/bootstrap-unmanaged.d.ts +66 -0
- package/dist/src/audit/bootstrap-unmanaged.d.ts.map +1 -0
- package/dist/src/audit/bootstrap-unmanaged.js +91 -0
- package/dist/src/audit/bootstrap-unmanaged.js.map +1 -0
- package/dist/src/audit/collision-detector.d.ts +72 -0
- package/dist/src/audit/collision-detector.d.ts.map +1 -0
- package/dist/src/audit/collision-detector.helpers.d.ts +63 -0
- package/dist/src/audit/collision-detector.helpers.d.ts.map +1 -0
- package/dist/src/audit/collision-detector.helpers.js +141 -0
- package/dist/src/audit/collision-detector.helpers.js.map +1 -0
- package/dist/src/audit/collision-detector.js +172 -0
- package/dist/src/audit/collision-detector.js.map +1 -0
- package/dist/src/audit/collision-detector.semantic.helpers.d.ts +49 -0
- package/dist/src/audit/collision-detector.semantic.helpers.d.ts.map +1 -0
- package/dist/src/audit/collision-detector.semantic.helpers.js +121 -0
- package/dist/src/audit/collision-detector.semantic.helpers.js.map +1 -0
- package/dist/src/audit/collision-detector.types.d.ts +70 -0
- package/dist/src/audit/collision-detector.types.d.ts.map +1 -0
- package/dist/src/audit/collision-detector.types.js +9 -0
- package/dist/src/audit/collision-detector.types.js.map +1 -0
- package/dist/src/audit/edit-applier.d.ts +64 -0
- package/dist/src/audit/edit-applier.d.ts.map +1 -0
- package/dist/src/audit/edit-applier.js +233 -0
- package/dist/src/audit/edit-applier.js.map +1 -0
- package/dist/src/audit/edit-applier.types.d.ts +72 -0
- package/dist/src/audit/edit-applier.types.d.ts.map +1 -0
- package/dist/src/audit/edit-applier.types.js +13 -0
- package/dist/src/audit/edit-applier.types.js.map +1 -0
- package/dist/src/audit/edit-suggester.d.ts +63 -0
- package/dist/src/audit/edit-suggester.d.ts.map +1 -0
- package/dist/src/audit/edit-suggester.js +326 -0
- package/dist/src/audit/edit-suggester.js.map +1 -0
- package/dist/src/audit/edit-suggester.types.d.ts +148 -0
- package/dist/src/audit/edit-suggester.types.d.ts.map +1 -0
- package/dist/src/audit/edit-suggester.types.js +17 -0
- package/dist/src/audit/edit-suggester.types.js.map +1 -0
- package/dist/src/audit/framework-adapter.d.ts +54 -0
- package/dist/src/audit/framework-adapter.d.ts.map +1 -0
- package/dist/src/audit/framework-adapter.js +251 -0
- package/dist/src/audit/framework-adapter.js.map +1 -0
- package/dist/src/audit/framework-adapter.types.d.ts +162 -0
- package/dist/src/audit/framework-adapter.types.d.ts.map +1 -0
- package/dist/src/audit/framework-adapter.types.js +31 -0
- package/dist/src/audit/framework-adapter.types.js.map +1 -0
- package/dist/src/audit/index.d.ts +46 -0
- package/dist/src/audit/index.d.ts.map +1 -0
- package/dist/src/audit/index.js +44 -0
- package/dist/src/audit/index.js.map +1 -0
- package/dist/src/audit/install-preflight.d.ts +99 -0
- package/dist/src/audit/install-preflight.d.ts.map +1 -0
- package/dist/src/audit/install-preflight.js +320 -0
- package/dist/src/audit/install-preflight.js.map +1 -0
- package/dist/src/audit/namespace-audit.types.d.ts +100 -0
- package/dist/src/audit/namespace-audit.types.d.ts.map +1 -0
- package/dist/src/audit/namespace-audit.types.js +20 -0
- package/dist/src/audit/namespace-audit.types.js.map +1 -0
- package/dist/src/audit/namespace-overrides.d.ts +79 -0
- package/dist/src/audit/namespace-overrides.d.ts.map +1 -0
- package/dist/src/audit/namespace-overrides.js +228 -0
- package/dist/src/audit/namespace-overrides.js.map +1 -0
- package/dist/src/audit/namespace-overrides.types.d.ts +115 -0
- package/dist/src/audit/namespace-overrides.types.d.ts.map +1 -0
- package/dist/src/audit/namespace-overrides.types.js +26 -0
- package/dist/src/audit/namespace-overrides.types.js.map +1 -0
- package/dist/src/audit/rename-engine.apply-paths.d.ts +54 -0
- package/dist/src/audit/rename-engine.apply-paths.d.ts.map +1 -0
- package/dist/src/audit/rename-engine.apply-paths.js +126 -0
- package/dist/src/audit/rename-engine.apply-paths.js.map +1 -0
- package/dist/src/audit/rename-engine.d.ts +59 -0
- package/dist/src/audit/rename-engine.d.ts.map +1 -0
- package/dist/src/audit/rename-engine.helpers.d.ts +63 -0
- package/dist/src/audit/rename-engine.helpers.d.ts.map +1 -0
- package/dist/src/audit/rename-engine.helpers.js +224 -0
- package/dist/src/audit/rename-engine.helpers.js.map +1 -0
- package/dist/src/audit/rename-engine.js +393 -0
- package/dist/src/audit/rename-engine.js.map +1 -0
- package/dist/src/audit/rename-engine.types.d.ts +157 -0
- package/dist/src/audit/rename-engine.types.d.ts.map +1 -0
- package/dist/src/audit/rename-engine.types.js +15 -0
- package/dist/src/audit/rename-engine.types.js.map +1 -0
- package/dist/src/audit/run-inventory-audit.d.ts +95 -0
- package/dist/src/audit/run-inventory-audit.d.ts.map +1 -0
- package/dist/src/audit/run-inventory-audit.js +245 -0
- package/dist/src/audit/run-inventory-audit.js.map +1 -0
- package/dist/src/audit/suggestion-chain.d.ts +89 -0
- package/dist/src/audit/suggestion-chain.d.ts.map +1 -0
- package/dist/src/audit/suggestion-chain.js +121 -0
- package/dist/src/audit/suggestion-chain.js.map +1 -0
- package/dist/src/audit-tool-dispatch.d.ts +61 -0
- package/dist/src/audit-tool-dispatch.d.ts.map +1 -0
- package/dist/src/audit-tool-dispatch.js +114 -0
- package/dist/src/audit-tool-dispatch.js.map +1 -0
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/LocalIndexer.d.ts +8 -1
- package/dist/src/indexer/LocalIndexer.d.ts.map +1 -1
- package/dist/src/indexer/LocalIndexer.js +42 -38
- package/dist/src/indexer/LocalIndexer.js.map +1 -1
- package/dist/src/middleware/__tests__/license.gate.test.js +21 -2
- package/dist/src/middleware/__tests__/license.gate.test.js.map +1 -1
- package/dist/src/middleware/license.gate.d.ts +14 -0
- package/dist/src/middleware/license.gate.d.ts.map +1 -1
- package/dist/src/middleware/license.gate.js +52 -1
- package/dist/src/middleware/license.gate.js.map +1 -1
- package/dist/src/onboarding/install-assets.d.ts.map +1 -1
- package/dist/src/onboarding/install-assets.js +11 -5
- package/dist/src/onboarding/install-assets.js.map +1 -1
- package/dist/src/tool-dispatch.d.ts.map +1 -1
- package/dist/src/tool-dispatch.js +6 -4
- package/dist/src/tool-dispatch.js.map +1 -1
- package/dist/src/tools/analytics.service.test.js +6 -4
- package/dist/src/tools/analytics.service.test.js.map +1 -1
- package/dist/src/tools/apply-namespace-rename.d.ts +71 -0
- package/dist/src/tools/apply-namespace-rename.d.ts.map +1 -0
- package/dist/src/tools/apply-namespace-rename.js +137 -0
- package/dist/src/tools/apply-namespace-rename.js.map +1 -0
- package/dist/src/tools/apply-namespace-rename.types.d.ts +46 -0
- package/dist/src/tools/apply-namespace-rename.types.d.ts.map +1 -0
- package/dist/src/tools/apply-namespace-rename.types.js +9 -0
- package/dist/src/tools/apply-namespace-rename.types.js.map +1 -0
- package/dist/src/tools/apply-recommended-edit.d.ts +50 -0
- package/dist/src/tools/apply-recommended-edit.d.ts.map +1 -0
- package/dist/src/tools/apply-recommended-edit.js +112 -0
- package/dist/src/tools/apply-recommended-edit.js.map +1 -0
- package/dist/src/tools/apply-recommended-edit.types.d.ts +49 -0
- package/dist/src/tools/apply-recommended-edit.types.d.ts.map +1 -0
- package/dist/src/tools/apply-recommended-edit.types.js +14 -0
- package/dist/src/tools/apply-recommended-edit.types.js.map +1 -0
- package/dist/src/tools/audit-tools.d.ts +4 -4
- package/dist/src/tools/compliance-tools.service.test.js +6 -4
- package/dist/src/tools/compliance-tools.service.test.js.map +1 -1
- package/dist/src/tools/install.backup-gc.d.ts +61 -0
- package/dist/src/tools/install.backup-gc.d.ts.map +1 -0
- package/dist/src/tools/install.backup-gc.js +166 -0
- package/dist/src/tools/install.backup-gc.js.map +1 -0
- package/dist/src/tools/install.conflict-helpers.d.ts +29 -2
- package/dist/src/tools/install.conflict-helpers.d.ts.map +1 -1
- package/dist/src/tools/install.conflict-helpers.js +37 -4
- package/dist/src/tools/install.conflict-helpers.js.map +1 -1
- package/dist/src/tools/install.d.ts +15 -1
- package/dist/src/tools/install.d.ts.map +1 -1
- package/dist/src/tools/install.js +162 -7
- package/dist/src/tools/install.js.map +1 -1
- package/dist/src/tools/install.ledger-replay.d.ts +52 -0
- package/dist/src/tools/install.ledger-replay.d.ts.map +1 -0
- package/dist/src/tools/install.ledger-replay.js +88 -0
- package/dist/src/tools/install.ledger-replay.js.map +1 -0
- package/dist/src/tools/install.namespace-gate.d.ts +68 -0
- package/dist/src/tools/install.namespace-gate.d.ts.map +1 -0
- package/dist/src/tools/install.namespace-gate.js +129 -0
- package/dist/src/tools/install.namespace-gate.js.map +1 -0
- package/dist/src/tools/install.test.js +71 -1
- package/dist/src/tools/install.test.js.map +1 -1
- package/dist/src/tools/install.tool.d.ts +17 -0
- package/dist/src/tools/install.tool.d.ts.map +1 -1
- package/dist/src/tools/install.tool.js +19 -1
- package/dist/src/tools/install.tool.js.map +1 -1
- package/dist/src/tools/install.types.d.ts +35 -1
- package/dist/src/tools/install.types.d.ts.map +1 -1
- package/dist/src/tools/install.types.js +24 -2
- package/dist/src/tools/install.types.js.map +1 -1
- package/dist/src/tools/namespace-audit/telemetry.d.ts +80 -0
- package/dist/src/tools/namespace-audit/telemetry.d.ts.map +1 -0
- package/dist/src/tools/namespace-audit/telemetry.js +129 -0
- package/dist/src/tools/namespace-audit/telemetry.js.map +1 -0
- package/dist/src/tools/outdated.test.js +2 -2
- package/dist/src/tools/outdated.test.js.map +1 -1
- package/dist/src/tools/publish-private.test.js +2 -2
- package/dist/src/tools/publish-private.test.js.map +1 -1
- package/dist/src/tools/recommend.types.d.ts +2 -2
- package/dist/src/tools/search.d.ts +2 -2
- package/dist/src/tools/search.js +3 -3
- package/dist/src/tools/search.js.map +1 -1
- package/dist/src/tools/skill-audit.test.js +2 -2
- package/dist/src/tools/skill-audit.test.js.map +1 -1
- package/dist/src/tools/skill-diff.d.ts +1 -1
- package/dist/src/tools/skill-inventory-audit.d.ts +67 -0
- package/dist/src/tools/skill-inventory-audit.d.ts.map +1 -0
- package/dist/src/tools/skill-inventory-audit.js +112 -0
- package/dist/src/tools/skill-inventory-audit.js.map +1 -0
- package/dist/src/tools/skill-inventory-audit.types.d.ts +67 -0
- package/dist/src/tools/skill-inventory-audit.types.d.ts.map +1 -0
- package/dist/src/tools/skill-inventory-audit.types.js +14 -0
- package/dist/src/tools/skill-inventory-audit.types.js.map +1 -0
- package/dist/src/tools/skill-pack-audit.d.ts.map +1 -1
- package/dist/src/tools/skill-pack-audit.helpers.d.ts.map +1 -1
- package/dist/src/tools/skill-pack-audit.helpers.js +15 -2
- package/dist/src/tools/skill-pack-audit.helpers.js.map +1 -1
- package/dist/src/tools/skill-pack-audit.js +15 -1
- package/dist/src/tools/skill-pack-audit.js.map +1 -1
- package/dist/src/tools/skill-rescan.d.ts.map +1 -1
- package/dist/src/tools/skill-rescan.js +4 -2
- package/dist/src/tools/skill-rescan.js.map +1 -1
- package/dist/src/tools/suggest.d.ts +2 -2
- package/dist/src/tools/uninstall.d.ts +1 -1
- package/dist/src/tools/uninstall.d.ts.map +1 -1
- package/dist/src/tools/uninstall.js +17 -3
- package/dist/src/tools/uninstall.js.map +1 -1
- package/dist/src/tools/validate.types.d.ts +10 -1
- package/dist/src/tools/validate.types.d.ts.map +1 -1
- package/dist/src/tools/validate.types.js +10 -1
- package/dist/src/tools/validate.types.js.map +1 -1
- package/dist/src/utils/installed-skills.d.ts.map +1 -1
- package/dist/src/utils/installed-skills.js +8 -6
- package/dist/src/utils/installed-skills.js.map +1 -1
- package/dist/src/utils/local-inventory.d.ts +29 -0
- package/dist/src/utils/local-inventory.d.ts.map +1 -0
- package/dist/src/utils/local-inventory.helpers.d.ts +96 -0
- package/dist/src/utils/local-inventory.helpers.d.ts.map +1 -0
- package/dist/src/utils/local-inventory.helpers.js +279 -0
- package/dist/src/utils/local-inventory.helpers.js.map +1 -0
- package/dist/src/utils/local-inventory.js +202 -0
- package/dist/src/utils/local-inventory.js.map +1 -0
- package/dist/src/utils/local-inventory.types.d.ts +100 -0
- package/dist/src/utils/local-inventory.types.d.ts.map +1 -0
- package/dist/src/utils/local-inventory.types.js +9 -0
- package/dist/src/utils/local-inventory.types.js.map +1 -0
- package/dist/src/webhooks/stripe-webhook-endpoint.d.ts +12 -0
- package/dist/src/webhooks/stripe-webhook-endpoint.d.ts.map +1 -1
- package/dist/src/webhooks/stripe-webhook-endpoint.js +30 -9
- package/dist/src/webhooks/stripe-webhook-endpoint.js.map +1 -1
- package/dist/src/webhooks/webhook-endpoint.d.ts +13 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -1
- package/dist/src/webhooks/webhook-endpoint.js +31 -9
- package/dist/src/webhooks/webhook-endpoint.js.map +1 -1
- package/dist/tests/compare.test.js +5 -5
- package/dist/tests/compare.test.js.map +1 -1
- package/dist/tests/context-async-listeners.test.d.ts +12 -0
- package/dist/tests/context-async-listeners.test.d.ts.map +1 -0
- package/dist/tests/context-async-listeners.test.js +62 -0
- package/dist/tests/context-async-listeners.test.js.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.js +9 -3
- package/dist/tests/e2e/compare.e2e.test.js.map +1 -1
- package/dist/tests/e2e/install-flow.e2e.test.js +9 -3
- package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -1
- package/dist/tests/e2e/recommend.e2e.test.js +9 -3
- package/dist/tests/e2e/recommend.e2e.test.js.map +1 -1
- package/dist/tests/e2e/skill-flow.e2e.test.js +17 -5
- package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -1
- package/dist/tests/e2e/suggest.e2e.test.js +11 -3
- package/dist/tests/e2e/suggest.e2e.test.js.map +1 -1
- package/dist/tests/integration/audit-roundtrip.test.d.ts +29 -0
- package/dist/tests/integration/audit-roundtrip.test.d.ts.map +1 -0
- package/dist/tests/integration/audit-roundtrip.test.js +214 -0
- package/dist/tests/integration/audit-roundtrip.test.js.map +1 -0
- package/dist/tests/integration/install-namespace.integration.test.d.ts +14 -0
- package/dist/tests/integration/install-namespace.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/install-namespace.integration.test.js +414 -0
- package/dist/tests/integration/install-namespace.integration.test.js.map +1 -0
- package/dist/tests/performance/search-performance.test.js +9 -3
- package/dist/tests/performance/search-performance.test.js.map +1 -1
- package/dist/tests/tools.test.js +5 -5
- package/dist/tests/tools.test.js.map +1 -1
- package/dist/tests/unit/apply-namespace-rename.test.d.ts +24 -0
- package/dist/tests/unit/apply-namespace-rename.test.d.ts.map +1 -0
- package/dist/tests/unit/apply-namespace-rename.test.js +205 -0
- package/dist/tests/unit/apply-namespace-rename.test.js.map +1 -0
- package/dist/tests/unit/apply-recommended-edit.test.d.ts +28 -0
- package/dist/tests/unit/apply-recommended-edit.test.d.ts.map +1 -0
- package/dist/tests/unit/apply-recommended-edit.test.js +229 -0
- package/dist/tests/unit/apply-recommended-edit.test.js.map +1 -0
- package/dist/tests/unit/audit-history.test.d.ts +11 -0
- package/dist/tests/unit/audit-history.test.d.ts.map +1 -0
- package/dist/tests/unit/audit-history.test.js +183 -0
- package/dist/tests/unit/audit-history.test.js.map +1 -0
- package/dist/tests/unit/audit-report-writer.test.d.ts +7 -0
- package/dist/tests/unit/audit-report-writer.test.d.ts.map +1 -0
- package/dist/tests/unit/audit-report-writer.test.js +249 -0
- package/dist/tests/unit/audit-report-writer.test.js.map +1 -0
- package/dist/tests/unit/audit-tool-dispatch.test.d.ts +17 -0
- package/dist/tests/unit/audit-tool-dispatch.test.d.ts.map +1 -0
- package/dist/tests/unit/audit-tool-dispatch.test.js +133 -0
- package/dist/tests/unit/audit-tool-dispatch.test.js.map +1 -0
- package/dist/tests/unit/collision-detector.semantic.test.d.ts +12 -0
- package/dist/tests/unit/collision-detector.semantic.test.d.ts.map +1 -0
- package/dist/tests/unit/collision-detector.semantic.test.js +281 -0
- package/dist/tests/unit/collision-detector.semantic.test.js.map +1 -0
- package/dist/tests/unit/collision-detector.test.d.ts +8 -0
- package/dist/tests/unit/collision-detector.test.d.ts.map +1 -0
- package/dist/tests/unit/collision-detector.test.js +266 -0
- package/dist/tests/unit/collision-detector.test.js.map +1 -0
- package/dist/tests/unit/edit-applier.test.d.ts +17 -0
- package/dist/tests/unit/edit-applier.test.d.ts.map +1 -0
- package/dist/tests/unit/edit-applier.test.js +165 -0
- package/dist/tests/unit/edit-applier.test.js.map +1 -0
- package/dist/tests/unit/edit-suggester.fixtures.d.ts +38 -0
- package/dist/tests/unit/edit-suggester.fixtures.d.ts.map +1 -0
- package/dist/tests/unit/edit-suggester.fixtures.js +84 -0
- package/dist/tests/unit/edit-suggester.fixtures.js.map +1 -0
- package/dist/tests/unit/edit-suggester.test.d.ts +17 -0
- package/dist/tests/unit/edit-suggester.test.d.ts.map +1 -0
- package/dist/tests/unit/edit-suggester.test.js +356 -0
- package/dist/tests/unit/edit-suggester.test.js.map +1 -0
- package/dist/tests/unit/framework-adapter.test.d.ts +30 -0
- package/dist/tests/unit/framework-adapter.test.d.ts.map +1 -0
- package/dist/tests/unit/framework-adapter.test.js +221 -0
- package/dist/tests/unit/framework-adapter.test.js.map +1 -0
- package/dist/tests/unit/install-preflight.test.d.ts +17 -0
- package/dist/tests/unit/install-preflight.test.d.ts.map +1 -0
- package/dist/tests/unit/install-preflight.test.js +270 -0
- package/dist/tests/unit/install-preflight.test.js.map +1 -0
- package/dist/tests/unit/install.backup-gc.test.d.ts +18 -0
- package/dist/tests/unit/install.backup-gc.test.d.ts.map +1 -0
- package/dist/tests/unit/install.backup-gc.test.js +177 -0
- package/dist/tests/unit/install.backup-gc.test.js.map +1 -0
- package/dist/tests/unit/install.ledger-replay.test.d.ts +12 -0
- package/dist/tests/unit/install.ledger-replay.test.d.ts.map +1 -0
- package/dist/tests/unit/install.ledger-replay.test.js +98 -0
- package/dist/tests/unit/install.ledger-replay.test.js.map +1 -0
- package/dist/tests/unit/local-inventory.test.d.ts +8 -0
- package/dist/tests/unit/local-inventory.test.d.ts.map +1 -0
- package/dist/tests/unit/local-inventory.test.js +165 -0
- package/dist/tests/unit/local-inventory.test.js.map +1 -0
- package/dist/tests/unit/namespace-audit-telemetry.test.d.ts +10 -0
- package/dist/tests/unit/namespace-audit-telemetry.test.d.ts.map +1 -0
- package/dist/tests/unit/namespace-audit-telemetry.test.js +215 -0
- package/dist/tests/unit/namespace-audit-telemetry.test.js.map +1 -0
- package/dist/tests/unit/namespace-overrides.test.d.ts +18 -0
- package/dist/tests/unit/namespace-overrides.test.d.ts.map +1 -0
- package/dist/tests/unit/namespace-overrides.test.js +210 -0
- package/dist/tests/unit/namespace-overrides.test.js.map +1 -0
- package/dist/tests/unit/rename-engine.test.d.ts +26 -0
- package/dist/tests/unit/rename-engine.test.d.ts.map +1 -0
- package/dist/tests/unit/rename-engine.test.js +367 -0
- package/dist/tests/unit/rename-engine.test.js.map +1 -0
- package/dist/tests/unit/skill-inventory-audit.test.d.ts +20 -0
- package/dist/tests/unit/skill-inventory-audit.test.d.ts.map +1 -0
- package/dist/tests/unit/skill-inventory-audit.test.js +299 -0
- package/dist/tests/unit/skill-inventory-audit.test.js.map +1 -0
- package/dist/tests/unit/skill-pack-audit.helpers.test.d.ts +11 -0
- package/dist/tests/unit/skill-pack-audit.helpers.test.d.ts.map +1 -0
- package/dist/tests/unit/skill-pack-audit.helpers.test.js +61 -0
- package/dist/tests/unit/skill-pack-audit.helpers.test.js.map +1 -0
- package/dist/tests/unit/skill-pack-audit.test.js +1 -1
- package/dist/tests/unit/skill-pack-audit.test.js.map +1 -1
- package/dist/tests/unit/suggestion-chain.test.d.ts +17 -0
- package/dist/tests/unit/suggestion-chain.test.d.ts.map +1 -0
- package/dist/tests/unit/suggestion-chain.test.js +191 -0
- package/dist/tests/unit/suggestion-chain.test.js.map +1 -0
- package/dist/tests/webhooks/standalone-shutdown.test.d.ts +12 -0
- package/dist/tests/webhooks/standalone-shutdown.test.d.ts.map +1 -0
- package/dist/tests/webhooks/standalone-shutdown.test.js +91 -0
- package/dist/tests/webhooks/standalone-shutdown.test.js.map +1 -0
- package/package.json +17 -4
- package/server.json +3 -3
- package/src/assets/skills/skillsmith/SKILL.md +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collision-detector.semantic.helpers.js","sourceRoot":"","sources":["../../../src/audit/collision-detector.semantic.helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type vocabulary for the collision detector (SMI-4587 Wave 1 Step 1).
|
|
3
|
+
* @module @skillsmith/mcp-server/audit/collision-detector.types
|
|
4
|
+
*
|
|
5
|
+
* Re-exports the collision flag shapes from local-inventory.types and adds
|
|
6
|
+
* the InventoryAuditResult container. Public surface for Wave 2/3/4.
|
|
7
|
+
*/
|
|
8
|
+
import type { AuditId, CollisionId, ExactCollisionFlag, InventoryEntry } from '../utils/local-inventory.types.js';
|
|
9
|
+
export type { AuditId, CollisionId, ExactCollisionFlag, InventoryEntry };
|
|
10
|
+
/**
|
|
11
|
+
* Semantic-overlap collision (filled in by Wave 1 PR2 — Step 6 semantic pass).
|
|
12
|
+
* Type is stable now so the result-writer can reference the field.
|
|
13
|
+
*/
|
|
14
|
+
export interface SemanticCollisionFlag {
|
|
15
|
+
kind: 'semantic';
|
|
16
|
+
collisionId: CollisionId;
|
|
17
|
+
entryA: InventoryEntry;
|
|
18
|
+
entryB: InventoryEntry;
|
|
19
|
+
/** From `OverlapDetector.detectOverlap.overlapScore`. */
|
|
20
|
+
cosineScore: number;
|
|
21
|
+
overlappingPhrases: Array<{
|
|
22
|
+
phrase1: string;
|
|
23
|
+
phrase2: string;
|
|
24
|
+
similarity: number;
|
|
25
|
+
}>;
|
|
26
|
+
severity: 'warning';
|
|
27
|
+
reason: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generic-token quality flag — Step 5 in the next PR plumbs this in via the
|
|
31
|
+
* existing `TriggerQualityEntry` from `skill-pack-audit.types.ts`. Aliased
|
|
32
|
+
* here to keep imports stable.
|
|
33
|
+
*/
|
|
34
|
+
export interface GenericTokenFlag {
|
|
35
|
+
kind: 'generic';
|
|
36
|
+
collisionId: CollisionId;
|
|
37
|
+
identifier: string;
|
|
38
|
+
entry: InventoryEntry;
|
|
39
|
+
matchedTokens: string[];
|
|
40
|
+
severity: 'warning';
|
|
41
|
+
reason: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Top-level result of `detectCollisions`. Contains the inventory snapshot
|
|
45
|
+
* + flags from each pass + summary metrics.
|
|
46
|
+
*
|
|
47
|
+
* Wave 1 PR1 (this PR) populates `auditId`, `inventory`, and
|
|
48
|
+
* `exactCollisions` only. `genericFlags` and `semanticCollisions` are empty
|
|
49
|
+
* arrays until subsequent PRs land Step 5 + Step 6.
|
|
50
|
+
*/
|
|
51
|
+
export interface InventoryAuditResult {
|
|
52
|
+
auditId: AuditId;
|
|
53
|
+
inventory: InventoryEntry[];
|
|
54
|
+
exactCollisions: ExactCollisionFlag[];
|
|
55
|
+
genericFlags: GenericTokenFlag[];
|
|
56
|
+
semanticCollisions: SemanticCollisionFlag[];
|
|
57
|
+
summary: {
|
|
58
|
+
totalEntries: number;
|
|
59
|
+
totalFlags: number;
|
|
60
|
+
errorCount: number;
|
|
61
|
+
warningCount: number;
|
|
62
|
+
durationMs: number;
|
|
63
|
+
passDurations: {
|
|
64
|
+
exact: number;
|
|
65
|
+
generic: number;
|
|
66
|
+
semantic: number;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=collision-detector.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collision-detector.types.d.ts","sourceRoot":"","sources":["../../../src/audit/collision-detector.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,cAAc,EACf,MAAM,mCAAmC,CAAA;AAE1C,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAA;AAExE;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,cAAc,CAAA;IACtB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAA;IACnB,kBAAkB,EAAE,KAAK,CAAC;QACxB,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,UAAU,EAAE,MAAM,CAAA;KACnB,CAAC,CAAA;IACF,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAA;IACf,WAAW,EAAE,WAAW,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,cAAc,CAAA;IACrB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,eAAe,EAAE,kBAAkB,EAAE,CAAA;IACrC,YAAY,EAAE,gBAAgB,EAAE,CAAA;IAChC,kBAAkB,EAAE,qBAAqB,EAAE,CAAA;IAC3C,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KACpE,CAAA;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type vocabulary for the collision detector (SMI-4587 Wave 1 Step 1).
|
|
3
|
+
* @module @skillsmith/mcp-server/audit/collision-detector.types
|
|
4
|
+
*
|
|
5
|
+
* Re-exports the collision flag shapes from local-inventory.types and adds
|
|
6
|
+
* the InventoryAuditResult container. Public surface for Wave 2/3/4.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=collision-detector.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collision-detector.types.js","sourceRoot":"","sources":["../../../src/audit/collision-detector.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Edit-applier — file-mutation path for `RecommendedEdit` (SMI-4589 Wave 3 Step 5).
|
|
3
|
+
* @module @skillsmith/mcp-server/audit/edit-applier
|
|
4
|
+
*
|
|
5
|
+
* `applyRecommendedEdit` mutates a SKILL.md or CLAUDE.md file in-place
|
|
6
|
+
* after the per-template gate has cleared. The mutation flow:
|
|
7
|
+
*
|
|
8
|
+
* 1. Registry guard — reject `pattern`s not in `APPLY_TEMPLATE_REGISTRY`.
|
|
9
|
+
* 2. Stale-before guard — verify file content at `lineRange` matches
|
|
10
|
+
* the recorded `before` snippet byte-for-byte.
|
|
11
|
+
* 3. Backup — `createProseBackup(filePath, 'prose-edit')`.
|
|
12
|
+
* 4. Atomic write — write to `<filePath>.tmp` then `fs.rename`.
|
|
13
|
+
* 5. Ledger append — `appendOverride` + `writeLedger` (Wave 2 PR #1).
|
|
14
|
+
* 6. Return `EditApplyResult` with the inline revert summary
|
|
15
|
+
* (decision #10).
|
|
16
|
+
*
|
|
17
|
+
* Per-template gate (ratified 2026-05-01): `APPLY_TEMPLATE_REGISTRY` is
|
|
18
|
+
* a literal allowlist containing only `'add_domain_qualifier'` in v1
|
|
19
|
+
* (4.10/5 from GPT-5.4 reviewer-#2 scoring). Synthetic edits with
|
|
20
|
+
* `pattern: 'narrow_scope'` or `'reword_trigger_verb'` are rejected with
|
|
21
|
+
* `error: 'edit.template_not_in_apply_registry'` and mutate nothing —
|
|
22
|
+
* the regression guard test asserts this. SMI-4593 reauthors the failing
|
|
23
|
+
* templates; when their bodies clear the per-template gate, that issue
|
|
24
|
+
* extends this allowlist.
|
|
25
|
+
*
|
|
26
|
+
* Plan: docs/internal/implementation/smi-4589-edit-suggester.md §5.
|
|
27
|
+
*/
|
|
28
|
+
import type { EditApplyResult } from './edit-applier.types.js';
|
|
29
|
+
import type { EditTemplatePattern, RecommendedEdit } from './edit-suggester.types.js';
|
|
30
|
+
/**
|
|
31
|
+
* Allowlist of template patterns whose `apply_with_confirmation` mode is
|
|
32
|
+
* registered for file mutation. Per the per-template gate ratified
|
|
33
|
+
* 2026-05-01, only `add_domain_qualifier` (4.10/5) ships in v1.
|
|
34
|
+
*
|
|
35
|
+
* SMI-4593 extends this set when the failing templates clear the gate
|
|
36
|
+
* post-reauthoring. Plan §6 mandates plan-review verifies this set
|
|
37
|
+
* matches `goal_6.per_template_gate.verdicts` PASS templates exactly.
|
|
38
|
+
*
|
|
39
|
+
* Type-narrow: declared as `ReadonlySet<EditTemplatePattern>` so the
|
|
40
|
+
* runtime check can't drift from the type union.
|
|
41
|
+
*/
|
|
42
|
+
export declare const APPLY_TEMPLATE_REGISTRY: ReadonlySet<EditTemplatePattern>;
|
|
43
|
+
export interface ApplyRecommendedEditOptions {
|
|
44
|
+
/**
|
|
45
|
+
* FK into `~/.skillsmith/audits/<auditId>/result.json`. Persisted in
|
|
46
|
+
* the ledger entry so revert can re-derive the original collision
|
|
47
|
+
* context.
|
|
48
|
+
*/
|
|
49
|
+
auditId: string;
|
|
50
|
+
/**
|
|
51
|
+
* Apply mode. Only `'apply_with_confirmation'` triggers mutation; any
|
|
52
|
+
* other value is rejected by registry guard ahead of mutation. The
|
|
53
|
+
* argument is preserved for forward-compat with v2 LLM-driven mode.
|
|
54
|
+
*/
|
|
55
|
+
mode: 'apply_with_confirmation';
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Apply a `RecommendedEdit` to disk. The agent calls this after
|
|
59
|
+
* surfacing the edit + receiving user confirmation. Atomic — failure
|
|
60
|
+
* before mutation leaves the file untouched; failure during mutation
|
|
61
|
+
* leaves the original file in place via tmp-file + rename semantics.
|
|
62
|
+
*/
|
|
63
|
+
export declare function applyRecommendedEdit(edit: RecommendedEdit, opts: ApplyRecommendedEditOptions): Promise<EditApplyResult>;
|
|
64
|
+
//# sourceMappingURL=edit-applier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-applier.d.ts","sourceRoot":"","sources":["../../../src/audit/edit-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAErF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,mBAAmB,CACb,CAAA;AAExD,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,IAAI,EAAE,yBAAyB,CAAA;CAChC;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,eAAe,CAAC,CA2I1B"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Edit-applier — file-mutation path for `RecommendedEdit` (SMI-4589 Wave 3 Step 5).
|
|
3
|
+
* @module @skillsmith/mcp-server/audit/edit-applier
|
|
4
|
+
*
|
|
5
|
+
* `applyRecommendedEdit` mutates a SKILL.md or CLAUDE.md file in-place
|
|
6
|
+
* after the per-template gate has cleared. The mutation flow:
|
|
7
|
+
*
|
|
8
|
+
* 1. Registry guard — reject `pattern`s not in `APPLY_TEMPLATE_REGISTRY`.
|
|
9
|
+
* 2. Stale-before guard — verify file content at `lineRange` matches
|
|
10
|
+
* the recorded `before` snippet byte-for-byte.
|
|
11
|
+
* 3. Backup — `createProseBackup(filePath, 'prose-edit')`.
|
|
12
|
+
* 4. Atomic write — write to `<filePath>.tmp` then `fs.rename`.
|
|
13
|
+
* 5. Ledger append — `appendOverride` + `writeLedger` (Wave 2 PR #1).
|
|
14
|
+
* 6. Return `EditApplyResult` with the inline revert summary
|
|
15
|
+
* (decision #10).
|
|
16
|
+
*
|
|
17
|
+
* Per-template gate (ratified 2026-05-01): `APPLY_TEMPLATE_REGISTRY` is
|
|
18
|
+
* a literal allowlist containing only `'add_domain_qualifier'` in v1
|
|
19
|
+
* (4.10/5 from GPT-5.4 reviewer-#2 scoring). Synthetic edits with
|
|
20
|
+
* `pattern: 'narrow_scope'` or `'reword_trigger_verb'` are rejected with
|
|
21
|
+
* `error: 'edit.template_not_in_apply_registry'` and mutate nothing —
|
|
22
|
+
* the regression guard test asserts this. SMI-4593 reauthors the failing
|
|
23
|
+
* templates; when their bodies clear the per-template gate, that issue
|
|
24
|
+
* extends this allowlist.
|
|
25
|
+
*
|
|
26
|
+
* Plan: docs/internal/implementation/smi-4589-edit-suggester.md §5.
|
|
27
|
+
*/
|
|
28
|
+
import * as crypto from 'node:crypto';
|
|
29
|
+
import * as fs from 'node:fs/promises';
|
|
30
|
+
import { appendOverride, readLedger, writeLedger } from './namespace-overrides.js';
|
|
31
|
+
import { createProseBackup } from '../tools/install.conflict-helpers.js';
|
|
32
|
+
/**
|
|
33
|
+
* Allowlist of template patterns whose `apply_with_confirmation` mode is
|
|
34
|
+
* registered for file mutation. Per the per-template gate ratified
|
|
35
|
+
* 2026-05-01, only `add_domain_qualifier` (4.10/5) ships in v1.
|
|
36
|
+
*
|
|
37
|
+
* SMI-4593 extends this set when the failing templates clear the gate
|
|
38
|
+
* post-reauthoring. Plan §6 mandates plan-review verifies this set
|
|
39
|
+
* matches `goal_6.per_template_gate.verdicts` PASS templates exactly.
|
|
40
|
+
*
|
|
41
|
+
* Type-narrow: declared as `ReadonlySet<EditTemplatePattern>` so the
|
|
42
|
+
* runtime check can't drift from the type union.
|
|
43
|
+
*/
|
|
44
|
+
export const APPLY_TEMPLATE_REGISTRY = new Set(['add_domain_qualifier']);
|
|
45
|
+
/**
|
|
46
|
+
* Apply a `RecommendedEdit` to disk. The agent calls this after
|
|
47
|
+
* surfacing the edit + receiving user confirmation. Atomic — failure
|
|
48
|
+
* before mutation leaves the file untouched; failure during mutation
|
|
49
|
+
* leaves the original file in place via tmp-file + rename semantics.
|
|
50
|
+
*/
|
|
51
|
+
export async function applyRecommendedEdit(edit, opts) {
|
|
52
|
+
// 1. Registry guard. Synthetic edits constructed by tests with a
|
|
53
|
+
// failing-template pattern hit this first — no I/O before reject.
|
|
54
|
+
if (!APPLY_TEMPLATE_REGISTRY.has(edit.pattern)) {
|
|
55
|
+
return {
|
|
56
|
+
success: false,
|
|
57
|
+
collisionId: edit.collisionId,
|
|
58
|
+
pattern: edit.pattern,
|
|
59
|
+
filePath: edit.filePath,
|
|
60
|
+
backupPath: '',
|
|
61
|
+
ledgerEntryId: '',
|
|
62
|
+
summary: '',
|
|
63
|
+
error: {
|
|
64
|
+
kind: 'edit.template_not_in_apply_registry',
|
|
65
|
+
pattern: edit.pattern,
|
|
66
|
+
message: `Template pattern "${edit.pattern}" is not in APPLY_TEMPLATE_REGISTRY; cannot apply. Render in 'manual_review' mode only.`,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// 2. Stale-before guard. Read the file and verify the snippet at
|
|
71
|
+
// lineRange matches byte-for-byte. Any drift → reject.
|
|
72
|
+
let fileContent;
|
|
73
|
+
try {
|
|
74
|
+
fileContent = await fs.readFile(edit.filePath, 'utf-8');
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
return failFsError(edit, `read failed: ${err.message}`);
|
|
78
|
+
}
|
|
79
|
+
const fileLines = fileContent.split('\n');
|
|
80
|
+
const startIdx = edit.lineRange.start - 1;
|
|
81
|
+
const endIdx = edit.lineRange.end - 1;
|
|
82
|
+
if (startIdx < 0 || endIdx >= fileLines.length || startIdx > endIdx) {
|
|
83
|
+
return staleBeforeError(edit, 'line range out of bounds');
|
|
84
|
+
}
|
|
85
|
+
const onDiskSnippet = fileLines.slice(startIdx, endIdx + 1).join('\n');
|
|
86
|
+
if (onDiskSnippet !== edit.before) {
|
|
87
|
+
return staleBeforeError(edit, 'before snippet mismatch');
|
|
88
|
+
}
|
|
89
|
+
// 3. Backup BEFORE any mutation. Failure here aborts — never mutate
|
|
90
|
+
// without a recoverable backup.
|
|
91
|
+
let backupPath;
|
|
92
|
+
try {
|
|
93
|
+
const backup = await createProseBackup(edit.filePath, 'prose-edit');
|
|
94
|
+
backupPath = backup.backupPath;
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
collisionId: edit.collisionId,
|
|
100
|
+
pattern: edit.pattern,
|
|
101
|
+
filePath: edit.filePath,
|
|
102
|
+
backupPath: '',
|
|
103
|
+
ledgerEntryId: '',
|
|
104
|
+
summary: '',
|
|
105
|
+
error: {
|
|
106
|
+
kind: 'edit.backup_failed',
|
|
107
|
+
reason: err.message,
|
|
108
|
+
message: `Backup failed for ${edit.filePath}; file not mutated.`,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// 4. Atomic write — splice in the after-snippet at lineRange, write
|
|
113
|
+
// to <filePath>.<random>.tmp, fs.rename.
|
|
114
|
+
const newLines = [
|
|
115
|
+
...fileLines.slice(0, startIdx),
|
|
116
|
+
...edit.after.split('\n'),
|
|
117
|
+
...fileLines.slice(endIdx + 1),
|
|
118
|
+
];
|
|
119
|
+
const newContent = newLines.join('\n');
|
|
120
|
+
const tmpSuffix = crypto.randomBytes(6).toString('hex');
|
|
121
|
+
const tmpPath = `${edit.filePath}.${tmpSuffix}.tmp`;
|
|
122
|
+
try {
|
|
123
|
+
await fs.writeFile(tmpPath, newContent, 'utf-8');
|
|
124
|
+
await fs.rename(tmpPath, edit.filePath);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
// Best-effort tmp cleanup; ENOENT is fine.
|
|
128
|
+
try {
|
|
129
|
+
await fs.rm(tmpPath, { force: true });
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
/* swallow */
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
collisionId: edit.collisionId,
|
|
137
|
+
pattern: edit.pattern,
|
|
138
|
+
filePath: edit.filePath,
|
|
139
|
+
backupPath,
|
|
140
|
+
ledgerEntryId: '',
|
|
141
|
+
summary: '',
|
|
142
|
+
error: {
|
|
143
|
+
kind: 'edit.fs_error',
|
|
144
|
+
reason: err.message,
|
|
145
|
+
message: `File mutation failed for ${edit.filePath}; backup retained at ${backupPath}.`,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// 5. Ledger append. We piggyback on the namespace-overrides ledger
|
|
150
|
+
// (Wave 2 PR #1) — same last-write-wins atomic semantics. The
|
|
151
|
+
// `kind` field accepts only `InventoryKind` values; we encode the
|
|
152
|
+
// prose-edit case via `originalIdentifier` = filename + lineRange
|
|
153
|
+
// marker so revert can locate the entry by `auditId`.
|
|
154
|
+
const ledger = await readLedger();
|
|
155
|
+
const lineMarker = `lines:${edit.lineRange.start}-${edit.lineRange.end}`;
|
|
156
|
+
const updated = appendOverride(ledger, {
|
|
157
|
+
skillId: null,
|
|
158
|
+
// SMI-4589 carve-out: prose edits target SKILL.md / CLAUDE.md, not
|
|
159
|
+
// a renamed inventory artifact. We tag the kind by best-fit
|
|
160
|
+
// inventory match — `claude_md_rule` for CLAUDE.md edits, `skill`
|
|
161
|
+
// for SKILL.md edits — to keep the existing ledger union
|
|
162
|
+
// unchanged. Wave 4 / SMI-4590 may extend the union with a
|
|
163
|
+
// `'prose_edit'` discriminator if revert ergonomics demand it.
|
|
164
|
+
kind: edit.category === 'claude_md_trigger_overlap' ? 'claude_md_rule' : 'skill',
|
|
165
|
+
originalIdentifier: `${edit.filePath}:${lineMarker}`,
|
|
166
|
+
renamedTo: `${edit.filePath}:${lineMarker}:prose-edit`,
|
|
167
|
+
originalPath: edit.filePath,
|
|
168
|
+
renamedPath: edit.filePath,
|
|
169
|
+
auditId: opts.auditId,
|
|
170
|
+
reason: edit.rationale,
|
|
171
|
+
});
|
|
172
|
+
if (updated !== ledger) {
|
|
173
|
+
await writeLedger(updated);
|
|
174
|
+
}
|
|
175
|
+
const ledgerEntryId = updated === ledger ? '' : (updated.overrides[updated.overrides.length - 1]?.id ?? '');
|
|
176
|
+
// 6. Return success with the inline revert summary literal.
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
collisionId: edit.collisionId,
|
|
180
|
+
pattern: edit.pattern,
|
|
181
|
+
filePath: edit.filePath,
|
|
182
|
+
backupPath,
|
|
183
|
+
ledgerEntryId,
|
|
184
|
+
summary: buildSummary(edit.filePath, edit.lineRange, opts.auditId),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Inline revert-summary literal (decision #10). Mirrors Wave 2's UX —
|
|
189
|
+
* `sklx audit revert <auditId>` is a Wave 4 (SMI-4590) command surface;
|
|
190
|
+
* if Wave 4 hasn't shipped at the time this fires, the summary remains
|
|
191
|
+
* user-facing copy and the command is a no-op until SMI-4590 lands.
|
|
192
|
+
*/
|
|
193
|
+
function buildSummary(filePath, lineRange, auditId) {
|
|
194
|
+
// Always emit `start-end` form even on single-line ranges. The Wave 4
|
|
195
|
+
// CLI surface (`sklx audit revert`) parses the range; a stable two-
|
|
196
|
+
// number form simplifies the parser and matches the literal copy in
|
|
197
|
+
// the plan §5: `"Edited <file> lines <range>. To undo: ..."`.
|
|
198
|
+
const range = `${lineRange.start}-${lineRange.end}`;
|
|
199
|
+
return `Edited ${filePath} lines ${range}. To undo: sklx audit revert ${auditId}`;
|
|
200
|
+
}
|
|
201
|
+
function staleBeforeError(edit, reason) {
|
|
202
|
+
return {
|
|
203
|
+
success: false,
|
|
204
|
+
collisionId: edit.collisionId,
|
|
205
|
+
pattern: edit.pattern,
|
|
206
|
+
filePath: edit.filePath,
|
|
207
|
+
backupPath: '',
|
|
208
|
+
ledgerEntryId: '',
|
|
209
|
+
summary: '',
|
|
210
|
+
error: {
|
|
211
|
+
kind: 'edit.stale_before',
|
|
212
|
+
filePath: edit.filePath,
|
|
213
|
+
message: `Before snippet mismatch for ${edit.filePath} at lines ${edit.lineRange.start}-${edit.lineRange.end} (${reason}). Re-run detection.`,
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
function failFsError(edit, reason) {
|
|
218
|
+
return {
|
|
219
|
+
success: false,
|
|
220
|
+
collisionId: edit.collisionId,
|
|
221
|
+
pattern: edit.pattern,
|
|
222
|
+
filePath: edit.filePath,
|
|
223
|
+
backupPath: '',
|
|
224
|
+
ledgerEntryId: '',
|
|
225
|
+
summary: '',
|
|
226
|
+
error: {
|
|
227
|
+
kind: 'edit.fs_error',
|
|
228
|
+
reason,
|
|
229
|
+
message: `File access failed for ${edit.filePath}: ${reason}`,
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=edit-applier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-applier.js","sourceRoot":"","sources":["../../../src/audit/edit-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAEtC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAIxE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAClC,IAAI,GAAG,CAAsB,CAAC,sBAAsB,CAAC,CAAC,CAAA;AAiBxD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAqB,EACrB,IAAiC;IAEjC,iEAAiE;IACjE,qEAAqE;IACrE,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,EAAE;YACjB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE;gBACL,IAAI,EAAE,qCAAqC;gBAC3C,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,qBAAqB,IAAI,CAAC,OAAO,yFAAyF;aACpI;SACF,CAAA;IACH,CAAC;IAED,iEAAiE;IACjE,0DAA0D;IAC1D,IAAI,WAAmB,CAAA;IACvB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,IAAI,EAAE,gBAAiB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAA;IACrC,IAAI,QAAQ,GAAG,CAAC,IAAI,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,QAAQ,GAAG,MAAM,EAAE,CAAC;QACpE,OAAO,gBAAgB,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtE,IAAI,aAAa,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,gBAAgB,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAA;IAC1D,CAAC;IAED,oEAAoE;IACpE,mCAAmC;IACnC,IAAI,UAAkB,CAAA;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QACnE,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,EAAE;YACjB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAG,GAAa,CAAC,OAAO;gBAC9B,OAAO,EAAE,qBAAqB,IAAI,CAAC,QAAQ,qBAAqB;aACjE;SACF,CAAA;IACH,CAAC;IAED,oEAAoE;IACpE,4CAA4C;IAC5C,MAAM,QAAQ,GAAG;QACf,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;QAC/B,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACzB,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;KAC/B,CAAA;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,SAAS,MAAM,CAAA;IAEnD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;QAChD,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2CAA2C;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU;YACV,aAAa,EAAE,EAAE;YACjB,OAAO,EAAE,EAAE;YACX,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAG,GAAa,CAAC,OAAO;gBAC9B,OAAO,EAAE,4BAA4B,IAAI,CAAC,QAAQ,wBAAwB,UAAU,GAAG;aACxF;SACF,CAAA;IACH,CAAC;IAED,mEAAmE;IACnE,iEAAiE;IACjE,qEAAqE;IACrE,qEAAqE;IACrE,yDAAyD;IACzD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IACjC,MAAM,UAAU,GAAG,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAA;IACxE,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE;QACrC,OAAO,EAAE,IAAI;QACb,mEAAmE;QACnE,4DAA4D;QAC5D,kEAAkE;QAClE,yDAAyD;QACzD,2DAA2D;QAC3D,+DAA+D;QAC/D,IAAI,EAAE,IAAI,CAAC,QAAQ,KAAK,2BAA2B,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO;QAChF,kBAAkB,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,UAAU,EAAE;QACpD,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,UAAU,aAAa;QACtD,YAAY,EAAE,IAAI,CAAC,QAAQ;QAC3B,WAAW,EAAE,IAAI,CAAC,QAAQ;QAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,SAAS;KACvB,CAAC,CAAA;IACF,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IACD,MAAM,aAAa,GACjB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAEvF,4DAA4D;IAC5D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU;QACV,aAAa;QACb,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;KACnE,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CACnB,QAAgB,EAChB,SAAyC,EACzC,OAAe;IAEf,sEAAsE;IACtE,oEAAoE;IACpE,oEAAoE;IACpE,8DAA8D;IAC9D,MAAM,KAAK,GAAG,GAAG,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,GAAG,EAAE,CAAA;IACnD,OAAO,UAAU,QAAQ,UAAU,KAAK,gCAAgC,OAAO,EAAE,CAAA;AACnF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAqB,EAAE,MAAc;IAC7D,OAAO;QACL,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,EAAE;QACd,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,+BAA+B,IAAI,CAAC,QAAQ,aAAa,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,MAAM,sBAAsB;SAC9I;KACF,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAqB,EAAE,MAAc;IACxD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,EAAE;QACd,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,EAAE;QACX,KAAK,EAAE;YACL,IAAI,EAAE,eAAe;YACrB,MAAM;YACN,OAAO,EAAE,0BAA0B,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE;SAC9D;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type vocabulary for the edit-applier (SMI-4589 Wave 3 Step 5).
|
|
3
|
+
* @module @skillsmith/mcp-server/audit/edit-applier.types
|
|
4
|
+
*
|
|
5
|
+
* Mirrors `ApplyRenameResult` (Wave 2 PR #2) so heterogeneous suggestion
|
|
6
|
+
* lists (rename + edit) can be displayed uniformly by Wave 4's MCP tool
|
|
7
|
+
* surface. The error union is purpose-narrow — prose-edit failures don't
|
|
8
|
+
* include any rename-engine codes.
|
|
9
|
+
*
|
|
10
|
+
* Plan: docs/internal/implementation/smi-4589-edit-suggester.md §5.
|
|
11
|
+
*/
|
|
12
|
+
import type { CollisionId } from './collision-detector.types.js';
|
|
13
|
+
import type { EditTemplatePattern } from './edit-suggester.types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Discriminated errors surfaced by `applyRecommendedEdit`. Callers
|
|
16
|
+
* `switch` on `kind` rather than parsing the message string.
|
|
17
|
+
*/
|
|
18
|
+
export type EditApplyError = {
|
|
19
|
+
/** Edit's source template is not in the apply registry allowlist. */
|
|
20
|
+
kind: 'edit.template_not_in_apply_registry';
|
|
21
|
+
pattern: EditTemplatePattern;
|
|
22
|
+
message: string;
|
|
23
|
+
} | {
|
|
24
|
+
/**
|
|
25
|
+
* The file content at `lineRange` no longer matches the recorded
|
|
26
|
+
* `before` snippet — file changed under us between detector run
|
|
27
|
+
* and apply call. The agent should re-run detection and surface
|
|
28
|
+
* the fresh suggestion.
|
|
29
|
+
*/
|
|
30
|
+
kind: 'edit.stale_before';
|
|
31
|
+
filePath: string;
|
|
32
|
+
message: string;
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'edit.backup_failed';
|
|
35
|
+
reason: string;
|
|
36
|
+
message: string;
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'edit.fs_error';
|
|
39
|
+
reason: string;
|
|
40
|
+
message: string;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Result of applying a `RecommendedEdit`. `success === false` populates
|
|
44
|
+
* `error`; `success === true` populates `backupPath`, `ledgerEntryId`,
|
|
45
|
+
* and the inline revert summary text.
|
|
46
|
+
*/
|
|
47
|
+
export interface EditApplyResult {
|
|
48
|
+
success: boolean;
|
|
49
|
+
collisionId: CollisionId;
|
|
50
|
+
/** Pattern that produced the edit (for log-grep + telemetry). */
|
|
51
|
+
pattern: EditTemplatePattern;
|
|
52
|
+
/** Absolute path to the mutated file. */
|
|
53
|
+
filePath: string;
|
|
54
|
+
/**
|
|
55
|
+
* Backup directory created by `createProseBackup`. Empty string on
|
|
56
|
+
* failure. Backup is retained until the 30-day GC sweep.
|
|
57
|
+
*/
|
|
58
|
+
backupPath: string;
|
|
59
|
+
/** ULID of the appended ledger entry (`ovr_…`). Empty string on failure. */
|
|
60
|
+
ledgerEntryId: string;
|
|
61
|
+
/**
|
|
62
|
+
* Inline revert summary (decision #10). Literal text on success:
|
|
63
|
+
*
|
|
64
|
+
* `"Edited <file> lines <range>. To undo: sklx audit revert <auditId>"`
|
|
65
|
+
*
|
|
66
|
+
* Empty string on failure.
|
|
67
|
+
*/
|
|
68
|
+
summary: string;
|
|
69
|
+
/** Discriminated error on failure; `undefined` on success. */
|
|
70
|
+
error?: EditApplyError;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=edit-applier.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-applier.types.d.ts","sourceRoot":"","sources":["../../../src/audit/edit-applier.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAEpE;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB;IACE,qEAAqE;IACrE,IAAI,EAAE,qCAAqC,CAAA;IAC3C,OAAO,EAAE,mBAAmB,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;CAChB,GACD;IACE;;;;;OAKG;IACH,IAAI,EAAE,mBAAmB,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB,GACD;IACE,IAAI,EAAE,oBAAoB,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,GACD;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAEL;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,iEAAiE;IACjE,OAAO,EAAE,mBAAmB,CAAA;IAC5B,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAA;IACrB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,KAAK,CAAC,EAAE,cAAc,CAAA;CACvB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type vocabulary for the edit-applier (SMI-4589 Wave 3 Step 5).
|
|
3
|
+
* @module @skillsmith/mcp-server/audit/edit-applier.types
|
|
4
|
+
*
|
|
5
|
+
* Mirrors `ApplyRenameResult` (Wave 2 PR #2) so heterogeneous suggestion
|
|
6
|
+
* lists (rename + edit) can be displayed uniformly by Wave 4's MCP tool
|
|
7
|
+
* surface. The error union is purpose-narrow — prose-edit failures don't
|
|
8
|
+
* include any rename-engine codes.
|
|
9
|
+
*
|
|
10
|
+
* Plan: docs/internal/implementation/smi-4589-edit-suggester.md §5.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=edit-applier.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-applier.types.js","sourceRoot":"","sources":["../../../src/audit/edit-applier.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Edit-suggester core (SMI-4589 Wave 3 Steps 2-3).
|
|
3
|
+
* @module @skillsmith/mcp-server/audit/edit-suggester
|
|
4
|
+
*
|
|
5
|
+
* Takes the semantic-collision flags from Wave 1's `InventoryAuditResult`
|
|
6
|
+
* and produces `RecommendedEdit[]` — templated, deterministic prose-edit
|
|
7
|
+
* suggestions. No LLM calls. No fuzziness.
|
|
8
|
+
*
|
|
9
|
+
* Per-template gate (ratified 2026-05-01): v1 ships only
|
|
10
|
+
* `add_domain_qualifier` (4.10/5 from GPT-5.4 reviewer-#2 scoring). The
|
|
11
|
+
* other two templates (`narrow_scope` 1.70/5, `reword_trigger_verb`
|
|
12
|
+
* 2.35/5) FAILED the gate and are NOT shipped in any form — neither as
|
|
13
|
+
* auto-apply nor as `manual_review`. They route to SMI-4593 for
|
|
14
|
+
* reauthoring. Test cases 2-3 in `edit-suggester.test.ts` assert empty
|
|
15
|
+
* output for collisions that would have matched those failing templates,
|
|
16
|
+
* guarding against accidental re-registration before the gate clears.
|
|
17
|
+
*
|
|
18
|
+
* Dispatch pattern (plan §1):
|
|
19
|
+
* 1. Walk `result.semanticCollisions[]`, collect unique file paths
|
|
20
|
+
* across the surviving template's `applies()` checks.
|
|
21
|
+
* 2. `await Promise.all(uniqueFilePaths.map(fs.readFile))` — single
|
|
22
|
+
* parallel read phase. Latency budget is linear in unique-files,
|
|
23
|
+
* not templates × collisions.
|
|
24
|
+
* 3. Iterate flags; for each, walk templates pre-sorted by descending
|
|
25
|
+
* `priority`; first `applies()` true wins; `generate()` is
|
|
26
|
+
* synchronous over the cached `fileContent`.
|
|
27
|
+
* 4. Filter null results (template matched but generate() couldn't
|
|
28
|
+
* synthesize a valid edit — e.g. file content drifted).
|
|
29
|
+
*
|
|
30
|
+
* Plan: docs/internal/implementation/smi-4589-edit-suggester.md §1, §Steps 2-3.
|
|
31
|
+
*/
|
|
32
|
+
import type { InventoryAuditResult } from './collision-detector.types.js';
|
|
33
|
+
import type { EditTemplate, EditTemplatePattern, RecommendedEdit } from './edit-suggester.types.js';
|
|
34
|
+
/**
|
|
35
|
+
* Run the edit-suggester over an `InventoryAuditResult`'s semantic
|
|
36
|
+
* collisions. Returns `RecommendedEdit[]` — one per flag that matches a
|
|
37
|
+
* registered template AND whose template successfully synthesized a
|
|
38
|
+
* non-empty edit.
|
|
39
|
+
*
|
|
40
|
+
* Order of returned edits: same as `result.semanticCollisions[]` input
|
|
41
|
+
* order. Tests assert this stability so PR diffs in the audit-report
|
|
42
|
+
* markdown are deterministic.
|
|
43
|
+
*
|
|
44
|
+
* I/O: reads each unique referenced file ONCE, in parallel, before
|
|
45
|
+
* iterating templates. Templates see only `fileContent` strings, not
|
|
46
|
+
* paths — keeps templates pure and unit-testable without fixtures on
|
|
47
|
+
* disk.
|
|
48
|
+
*
|
|
49
|
+
* Failure model: any per-flag template error (fileRead failure, snippet
|
|
50
|
+
* locate failure, `generate()` returning null) skips that flag silently.
|
|
51
|
+
* The other flags still produce edits. An empty
|
|
52
|
+
* `result.semanticCollisions[]` short-circuits with no I/O.
|
|
53
|
+
*/
|
|
54
|
+
export declare function runEditSuggester(result: InventoryAuditResult, opts?: {
|
|
55
|
+
templateOverrides?: ReadonlyArray<EditTemplate>;
|
|
56
|
+
}): Promise<RecommendedEdit[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Public registry-key accessor. Re-exports the pattern strings so the
|
|
59
|
+
* apply-path registry (`edit-applier.ts`) can import a single source of
|
|
60
|
+
* truth instead of stringly-typed literals.
|
|
61
|
+
*/
|
|
62
|
+
export declare const V1_TEMPLATE_PATTERNS: ReadonlyArray<EditTemplatePattern>;
|
|
63
|
+
//# sourceMappingURL=edit-suggester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-suggester.d.ts","sourceRoot":"","sources":["../../../src/audit/edit-suggester.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAAyB,MAAM,+BAA+B,CAAA;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAqGnG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;CAAE,GACzD,OAAO,CAAC,eAAe,EAAE,CAAC,CA8D5B;AA8HD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,mBAAmB,CAEnE,CAAA"}
|