@skillsmith/mcp-server 0.4.13 → 0.5.1
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 +37 -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 +34 -2
- 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/compare.types.js +1 -1
- package/dist/src/tools/compare.types.js.map +1 -1
- 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/get-skill.d.ts.map +1 -1
- package/dist/src/tools/get-skill.js +1 -1
- package/dist/src/tools/get-skill.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 +168 -8
- 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 +136 -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/recommend.types.js +1 -1
- package/dist/src/tools/recommend.types.js.map +1 -1
- package/dist/src/tools/search.d.ts +2 -2
- package/dist/src/tools/search.d.ts.map +1 -1
- 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 +11 -2
- 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/install-assets.test.d.ts +16 -0
- package/dist/tests/install-assets.test.d.ts.map +1 -0
- package/dist/tests/install-assets.test.js +72 -0
- package/dist/tests/install-assets.test.js.map +1 -0
- 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/tool-descriptions.test.d.ts +16 -0
- package/dist/tests/tool-descriptions.test.d.ts.map +1 -0
- package/dist/tests/tool-descriptions.test.js +63 -0
- package/dist/tests/tool-descriptions.test.js.map +1 -0
- 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 +109 -80
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `claudeCodeAdapter` — v1 implementation of `FrameworkAdapter`.
|
|
3
|
+
* Wraps Wave 1's `scanLocalInventory`, Wave 2's `applyRename`,
|
|
4
|
+
* and Wave 3's `applyRecommendedEdit` behind a uniform seam.
|
|
5
|
+
* @module @skillsmith/mcp-server/audit/framework-adapter
|
|
6
|
+
*
|
|
7
|
+
* Plan: docs/internal/implementation/smi-4590-cli-mcp-framework-adapter.md §5.
|
|
8
|
+
*
|
|
9
|
+
* v1 contract (Claude-Code only):
|
|
10
|
+
* - `scanPaths` delegates to `scanLocalInventory` and returns `entries[]`.
|
|
11
|
+
* - `applyAction({kind:'rename'})` is REFUSED — a thin {from, to} pair
|
|
12
|
+
* cannot reconstruct the `InventoryEntry` Wave 2's `applyRename`
|
|
13
|
+
* needs (kind discriminator, identifier, source_path), and a raw
|
|
14
|
+
* `fs.rename` would bypass the backup + namespace ledger and leave
|
|
15
|
+
* the user without a revert path. Callers must use the
|
|
16
|
+
* `applyRename(entry, newName, { auditId })` convenience wrapper.
|
|
17
|
+
* The bare `{kind:'rename'}` shape stays in the union as a forward-
|
|
18
|
+
* compat surface for v2 adapters that own their own audit-history.
|
|
19
|
+
* - `applyAction({kind:'inline-edit', searchMode:'literal'})` translates
|
|
20
|
+
* the action into a Wave 3 `RecommendedEdit` and dispatches to
|
|
21
|
+
* `applyRecommendedEdit`. Requires `action.auditId` + `action.pattern`;
|
|
22
|
+
* missing context throws `namespace.adapter.missing_context`.
|
|
23
|
+
* - `applyAction({kind:'inline-edit', searchMode:'regex'})` throws the
|
|
24
|
+
* typed error `namespace.adapter.unsupported_search_mode`. Reserved
|
|
25
|
+
* for v2 cursorAdapter.
|
|
26
|
+
* - Convenience wrappers `applyRename` + `applyEdit` build the right
|
|
27
|
+
* `AdapterAction` shape from inventory/edit context and call
|
|
28
|
+
* `applyAction`. They do NOT re-implement Wave 2/3 — the rename
|
|
29
|
+
* wrapper goes through Wave 2's full path (backup + ledger), and the
|
|
30
|
+
* edit wrapper goes through Wave 3's `applyRecommendedEdit`.
|
|
31
|
+
*/
|
|
32
|
+
import * as fs from 'node:fs/promises';
|
|
33
|
+
import { newAuditId, deriveCollisionId } from './audit-history.js';
|
|
34
|
+
import { applyRecommendedEdit, APPLY_TEMPLATE_REGISTRY } from './edit-applier.js';
|
|
35
|
+
import { applyRename as applyRenameEngine } from './rename-engine.js';
|
|
36
|
+
import { scanLocalInventory } from '../utils/local-inventory.js';
|
|
37
|
+
/**
|
|
38
|
+
* Typed error class for adapter-layer failures. Callers `switch` on
|
|
39
|
+
* `kind` to branch on the failure mode without parsing strings.
|
|
40
|
+
*/
|
|
41
|
+
export class FrameworkAdapterError extends Error {
|
|
42
|
+
kind;
|
|
43
|
+
/**
|
|
44
|
+
* For `'subcall_failed'`, carries the inner typed-error `kind` from
|
|
45
|
+
* Wave 2 (`RenameError`) or Wave 3 (`EditApplyError`) so callers can
|
|
46
|
+
* `switch` on it without parsing strings.
|
|
47
|
+
*/
|
|
48
|
+
innerKind;
|
|
49
|
+
constructor(kind, message, innerKind) {
|
|
50
|
+
super(message);
|
|
51
|
+
this.name = 'FrameworkAdapterError';
|
|
52
|
+
this.kind = kind;
|
|
53
|
+
this.innerKind = innerKind;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Map an `InventoryEntry.kind` to the Wave 2 `RenameAction` discriminator.
|
|
58
|
+
*/
|
|
59
|
+
function inventoryKindToRenameAction(entry) {
|
|
60
|
+
switch (entry.kind) {
|
|
61
|
+
case 'command':
|
|
62
|
+
return 'rename_command_file';
|
|
63
|
+
case 'agent':
|
|
64
|
+
return 'rename_agent_file';
|
|
65
|
+
case 'skill':
|
|
66
|
+
return 'rename_skill_dir_and_frontmatter';
|
|
67
|
+
case 'claude_md_rule':
|
|
68
|
+
// CLAUDE.md trigger lines are not file-renamable — the inline-edit
|
|
69
|
+
// path is the right surface for them. Reject so callers cannot
|
|
70
|
+
// accidentally pass a `claude_md_rule` entry into the rename flow.
|
|
71
|
+
throw new FrameworkAdapterError('namespace.adapter.unsupported_action', `inventory kind "claude_md_rule" cannot be renamed; use applyEdit instead`);
|
|
72
|
+
default: {
|
|
73
|
+
const exhaustive = entry.kind;
|
|
74
|
+
throw new FrameworkAdapterError('namespace.adapter.unsupported_action', `unknown inventory kind: ${String(exhaustive)}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Translate an `InlineEditAction` (literal mode) into a Wave 3
|
|
80
|
+
* `RecommendedEdit`. Locates the literal `search` substring in the file
|
|
81
|
+
* and computes a 1-indexed inclusive line range covering it.
|
|
82
|
+
*
|
|
83
|
+
* Throws if `search` is absent from the file or appears more than once
|
|
84
|
+
* (Wave 3's stale-before guard requires byte-for-byte exact match at
|
|
85
|
+
* the recorded `lineRange`).
|
|
86
|
+
*/
|
|
87
|
+
async function buildRecommendedEditFromInlineEdit(action) {
|
|
88
|
+
if (!action.auditId) {
|
|
89
|
+
throw new FrameworkAdapterError('namespace.adapter.missing_context', `inline-edit dispatch requires action.auditId for v1 claudeCodeAdapter`);
|
|
90
|
+
}
|
|
91
|
+
if (!action.pattern) {
|
|
92
|
+
throw new FrameworkAdapterError('namespace.adapter.missing_context', `inline-edit dispatch requires action.pattern for v1 claudeCodeAdapter`);
|
|
93
|
+
}
|
|
94
|
+
if (!APPLY_TEMPLATE_REGISTRY.has(action.pattern)) {
|
|
95
|
+
throw new FrameworkAdapterError('namespace.adapter.template_not_in_apply_registry', `template pattern "${action.pattern}" is not in APPLY_TEMPLATE_REGISTRY`);
|
|
96
|
+
}
|
|
97
|
+
const fileContent = await fs.readFile(action.filePath, 'utf-8');
|
|
98
|
+
const firstIndex = fileContent.indexOf(action.search);
|
|
99
|
+
if (firstIndex < 0) {
|
|
100
|
+
throw new FrameworkAdapterError('namespace.adapter.search_not_found', `literal search string not found in ${action.filePath}`);
|
|
101
|
+
}
|
|
102
|
+
const secondIndex = fileContent.indexOf(action.search, firstIndex + 1);
|
|
103
|
+
if (secondIndex >= 0) {
|
|
104
|
+
throw new FrameworkAdapterError('namespace.adapter.search_not_unique', `literal search string occurs more than once in ${action.filePath}; refusing to mutate`);
|
|
105
|
+
}
|
|
106
|
+
// Compute 1-indexed inclusive line range covering the match. Wave 3's
|
|
107
|
+
// applier uses line-based slicing (`fileLines.slice(start-1, end).join('\n')`
|
|
108
|
+
// must equal `before`), so we expand the substring search to the full
|
|
109
|
+
// line(s) it sits on and replace within those lines.
|
|
110
|
+
const fileLines = fileContent.split('\n');
|
|
111
|
+
// UTF-16 code-unit offsets (matches `String.indexOf` semantics) for
|
|
112
|
+
// the start of each line. Not byte offsets — for ASCII content the
|
|
113
|
+
// two coincide, but multi-byte glyphs (em dashes, emoji) make the
|
|
114
|
+
// distinction load-bearing if this is ever consumed as a byte index.
|
|
115
|
+
const lineStartOffsets = [0];
|
|
116
|
+
for (let i = 0; i < fileLines.length - 1; i++) {
|
|
117
|
+
// +1 for the consumed '\n' separator
|
|
118
|
+
lineStartOffsets.push(lineStartOffsets[i] + fileLines[i].length + 1);
|
|
119
|
+
}
|
|
120
|
+
// Locate the start line for `firstIndex`.
|
|
121
|
+
let startLine = 1;
|
|
122
|
+
for (let i = lineStartOffsets.length - 1; i >= 0; i--) {
|
|
123
|
+
if (firstIndex >= lineStartOffsets[i]) {
|
|
124
|
+
startLine = i + 1;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// The match may span multiple lines if `search` contains '\n'.
|
|
129
|
+
const matchLineCount = action.search.split('\n').length;
|
|
130
|
+
const endLine = startLine + matchLineCount - 1;
|
|
131
|
+
// Whole-line `before` = the lines covering the substring match.
|
|
132
|
+
const beforeLines = fileLines.slice(startLine - 1, endLine).join('\n');
|
|
133
|
+
// Whole-line `after` = same lines with `search` substituted for `replace`.
|
|
134
|
+
const afterLines = beforeLines.replace(action.search, action.replace);
|
|
135
|
+
// collisionId is derived from auditId + filePath (single-entry adapter
|
|
136
|
+
// dispatch). Use a synthetic single-entry InventoryEntry shape solely
|
|
137
|
+
// to feed `deriveCollisionId`'s sorted-paths input — the resulting
|
|
138
|
+
// CollisionId is opaque to the caller and stable for the same
|
|
139
|
+
// (auditId, filePath) pair.
|
|
140
|
+
const collisionId = deriveCollisionId(action.auditId, [
|
|
141
|
+
{
|
|
142
|
+
kind: 'claude_md_rule',
|
|
143
|
+
source_path: action.filePath,
|
|
144
|
+
identifier: action.search.slice(0, 64),
|
|
145
|
+
triggerSurface: [],
|
|
146
|
+
},
|
|
147
|
+
]);
|
|
148
|
+
return {
|
|
149
|
+
collisionId,
|
|
150
|
+
category: 'description_overlap',
|
|
151
|
+
pattern: action.pattern,
|
|
152
|
+
filePath: action.filePath,
|
|
153
|
+
lineRange: { start: startLine, end: endLine },
|
|
154
|
+
before: beforeLines,
|
|
155
|
+
after: afterLines,
|
|
156
|
+
rationale: 'inline-edit dispatched via claudeCodeAdapter.applyAction (literal-mode translation)',
|
|
157
|
+
applyAction: 'recommended_edit',
|
|
158
|
+
applyMode: 'apply_with_confirmation',
|
|
159
|
+
otherEntry: { identifier: '', sourcePath: '' },
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* v1 implementation of `FrameworkAdapter` for Claude-Code.
|
|
164
|
+
*/
|
|
165
|
+
export const claudeCodeAdapter = {
|
|
166
|
+
name: 'claude-code',
|
|
167
|
+
describesFiles: () => [
|
|
168
|
+
'~/.claude/skills/*/SKILL.md',
|
|
169
|
+
'~/.claude/commands/*.md',
|
|
170
|
+
'~/.claude/agents/*.md',
|
|
171
|
+
'~/.claude/CLAUDE.md',
|
|
172
|
+
'<project>/CLAUDE.md',
|
|
173
|
+
],
|
|
174
|
+
scanPaths: async (homeDir, projectDir) => {
|
|
175
|
+
const result = await scanLocalInventory({ homeDir, projectDir });
|
|
176
|
+
return result.entries;
|
|
177
|
+
},
|
|
178
|
+
applyAction: async (action) => {
|
|
179
|
+
if (action.kind === 'rename') {
|
|
180
|
+
// v1 Claude-Code refuses bare `applyAction({kind:'rename'})` — a
|
|
181
|
+
// raw `fs.rename` would bypass Wave 2's backup + namespace
|
|
182
|
+
// ledger, leaving the user without a revert path. Callers must
|
|
183
|
+
// use the `applyRename(entry, newName, { auditId })` convenience
|
|
184
|
+
// wrapper which routes through Wave 2's full flow. The richer
|
|
185
|
+
// entry context (kind discriminator, identifier, source_path)
|
|
186
|
+
// cannot be reconstructed from a thin {from, to} pair.
|
|
187
|
+
throw new FrameworkAdapterError('namespace.adapter.missing_context', `claudeCodeAdapter.applyAction({kind:'rename'}) refused — use applyRename(entry, newName, { auditId }) so the rename is backed up + recorded in the namespace ledger`);
|
|
188
|
+
}
|
|
189
|
+
if (action.kind === 'inline-edit') {
|
|
190
|
+
if (action.searchMode === 'regex') {
|
|
191
|
+
throw new FrameworkAdapterError('namespace.adapter.unsupported_search_mode', `searchMode "regex" not supported by v1 claudeCodeAdapter; reserved for v2 cursorAdapter`);
|
|
192
|
+
}
|
|
193
|
+
// Literal mode: translate to RecommendedEdit + dispatch to Wave 3.
|
|
194
|
+
const edit = await buildRecommendedEditFromInlineEdit(action);
|
|
195
|
+
const result = await applyRecommendedEdit(edit, {
|
|
196
|
+
// narrowed by buildRecommendedEditFromInlineEdit:
|
|
197
|
+
auditId: action.auditId,
|
|
198
|
+
mode: 'apply_with_confirmation',
|
|
199
|
+
});
|
|
200
|
+
if (!result.success) {
|
|
201
|
+
throw new FrameworkAdapterError('namespace.adapter.subcall_failed', `applyRecommendedEdit failed: ${result.error?.message ?? 'unknown'}`, result.error?.kind);
|
|
202
|
+
}
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
// Exhaustiveness guard.
|
|
206
|
+
const exhaustive = action;
|
|
207
|
+
throw new FrameworkAdapterError('namespace.adapter.unsupported_action', `unsupported action shape: ${JSON.stringify(exhaustive)}`);
|
|
208
|
+
},
|
|
209
|
+
applyRename: async (entry, newName, opts) => {
|
|
210
|
+
// Build a minimal RenameSuggestion and call Wave 2's applyRename
|
|
211
|
+
// for the full backup + ledger + atomic rename flow. The
|
|
212
|
+
// collisionId is synthetic (derived from auditId + the single
|
|
213
|
+
// entry's path) — the Wave 2 ledger entry is keyed by
|
|
214
|
+
// (skillId, kind, originalIdentifier), not by collisionId, so
|
|
215
|
+
// a synthetic id is acceptable for adapter-mediated renames.
|
|
216
|
+
const collisionId = deriveCollisionId(opts.auditId, [entry]);
|
|
217
|
+
const suggestion = {
|
|
218
|
+
collisionId,
|
|
219
|
+
entry,
|
|
220
|
+
currentName: entry.identifier,
|
|
221
|
+
suggested: newName,
|
|
222
|
+
applyAction: inventoryKindToRenameAction(entry),
|
|
223
|
+
reason: 'claudeCodeAdapter.applyRename convenience wrapper',
|
|
224
|
+
};
|
|
225
|
+
const result = await applyRenameEngine({
|
|
226
|
+
suggestion,
|
|
227
|
+
request: { action: 'apply', auditId: opts.auditId },
|
|
228
|
+
});
|
|
229
|
+
if (!result.success) {
|
|
230
|
+
throw new FrameworkAdapterError('namespace.adapter.subcall_failed', `applyRename failed: ${result.error?.message ?? 'unknown'}`, result.error?.kind);
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
applyEdit: async (edit, opts) => {
|
|
234
|
+
// Convenience wrapper: build an InlineEditAction and dispatch
|
|
235
|
+
// through applyAction so the literal-mode translation path runs
|
|
236
|
+
// its registry guard + uniqueness check uniformly.
|
|
237
|
+
const action = {
|
|
238
|
+
kind: 'inline-edit',
|
|
239
|
+
filePath: edit.filePath,
|
|
240
|
+
search: edit.before,
|
|
241
|
+
replace: edit.after,
|
|
242
|
+
searchMode: 'literal',
|
|
243
|
+
auditId: opts.auditId,
|
|
244
|
+
pattern: edit.pattern,
|
|
245
|
+
};
|
|
246
|
+
await claudeCodeAdapter.applyAction(action);
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
// Re-export helpers used by tests + callers.
|
|
250
|
+
export { newAuditId };
|
|
251
|
+
//# sourceMappingURL=framework-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-adapter.js","sourceRoot":"","sources":["../../../src/audit/framework-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type vocabulary for the FrameworkAdapter seam — v1 ships
|
|
3
|
+
* `claude-code` only; v2 reserves `cursor`, `copilot`, `aider`,
|
|
4
|
+
* `continue`, `cline`. Defines `AdapterAction` (discriminated
|
|
5
|
+
* union over `FileRenameAction` + `InlineEditAction`) and the
|
|
6
|
+
* adapter interface.
|
|
7
|
+
* @module @skillsmith/mcp-server/audit/framework-adapter.types
|
|
8
|
+
*
|
|
9
|
+
* Plan: docs/internal/implementation/smi-4590-cli-mcp-framework-adapter.md §1, §5.
|
|
10
|
+
*
|
|
11
|
+
* Why this seam exists (per plan §5): `.cursorrules` (Cursor v2) is a
|
|
12
|
+
* monolithic file with multiple trigger phrases inside a single file; a
|
|
13
|
+
* `FileRenameAction`-only shape would break Cursor support. Shipping
|
|
14
|
+
* `InlineEditAction` from v1 is a forcing function that lets v2 swap in
|
|
15
|
+
* `cursorAdapter` without refactoring call sites.
|
|
16
|
+
*
|
|
17
|
+
* v1 contract (claudeCodeAdapter):
|
|
18
|
+
* - `FileRenameAction` is supported via convenience wrapper `applyRename`
|
|
19
|
+
* which performs the full Wave 2 `applyRename` flow (backup + ledger
|
|
20
|
+
* append + atomic rename). The bare `applyAction({kind:'rename'})`
|
|
21
|
+
* entry point is a raw transport seam (forward-compat for v2 adapters
|
|
22
|
+
* that own their own audit-history); v1 callers should prefer the
|
|
23
|
+
* `applyRename` wrapper which threads `auditId` through correctly.
|
|
24
|
+
* - `InlineEditAction` with `searchMode: 'literal'` translates to a
|
|
25
|
+
* `RecommendedEdit` and dispatches to Wave 3's `applyRecommendedEdit`.
|
|
26
|
+
* - `InlineEditAction` with `searchMode: 'regex'` is rejected with the
|
|
27
|
+
* typed error `namespace.adapter.unsupported_search_mode`. Reserved
|
|
28
|
+
* for v2 cursorAdapter.
|
|
29
|
+
*/
|
|
30
|
+
import type { InventoryEntry } from '../utils/local-inventory.types.js';
|
|
31
|
+
import type { RecommendedEdit } from './edit-suggester.types.js';
|
|
32
|
+
/**
|
|
33
|
+
* Set of frameworks the audit pipeline can target. v1 ships `claude-code`
|
|
34
|
+
* exclusively. The v2 reserved values document the intended extension
|
|
35
|
+
* surface — adding a new entry here without a matching adapter
|
|
36
|
+
* implementation is a compile-time signal, not a runtime contract.
|
|
37
|
+
*/
|
|
38
|
+
export type FrameworkName = 'claude-code' | 'cursor' | 'copilot' | 'aider' | 'continue' | 'cline';
|
|
39
|
+
/**
|
|
40
|
+
* Rename a single file (or directory + frontmatter for `.claude/skills/`).
|
|
41
|
+
*
|
|
42
|
+
* For Claude-Code, this maps to Wave 2's `applyRename` flow: the caller
|
|
43
|
+
* should normally invoke the `applyRename` convenience wrapper which
|
|
44
|
+
* builds the action from a full `InventoryEntry` + `auditId`. The bare
|
|
45
|
+
* `applyAction({kind:'rename'})` entry is a transport seam — it expects
|
|
46
|
+
* a richer caller-side context to resolve correctly (see `auditId`
|
|
47
|
+
* field).
|
|
48
|
+
*/
|
|
49
|
+
export interface FileRenameAction {
|
|
50
|
+
kind: 'rename';
|
|
51
|
+
/** Absolute path (current). */
|
|
52
|
+
from: string;
|
|
53
|
+
/** Absolute path (target). */
|
|
54
|
+
to: string;
|
|
55
|
+
/**
|
|
56
|
+
* FK into `~/.skillsmith/audits/<auditId>/result.json`. Required by
|
|
57
|
+
* v1 Claude-Code adapter so the rename can be traced in the namespace
|
|
58
|
+
* overrides ledger. v2 adapters that own a different audit history
|
|
59
|
+
* may treat this as optional, hence the optional declaration here.
|
|
60
|
+
*/
|
|
61
|
+
auditId?: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* In-place edit at a specific point in a file. Required for monolithic
|
|
65
|
+
* files (`.cursorrules`, freeform CLAUDE.md sections) where renaming
|
|
66
|
+
* the file itself is meaningless — the edit happens at a section.
|
|
67
|
+
*
|
|
68
|
+
* v1 Claude-Code adapter accepts only `searchMode: 'literal'` and
|
|
69
|
+
* translates the action into a Wave 3 `RecommendedEdit` shape before
|
|
70
|
+
* dispatching to `applyRecommendedEdit`. `searchMode: 'regex'` is
|
|
71
|
+
* rejected with `namespace.adapter.unsupported_search_mode`.
|
|
72
|
+
*/
|
|
73
|
+
export interface InlineEditAction {
|
|
74
|
+
kind: 'inline-edit';
|
|
75
|
+
/** Absolute path to the file to mutate. */
|
|
76
|
+
filePath: string;
|
|
77
|
+
/**
|
|
78
|
+
* Exact substring (when `searchMode === 'literal'`) or regex source
|
|
79
|
+
* string (when `searchMode === 'regex'`) to locate within the file.
|
|
80
|
+
*/
|
|
81
|
+
search: string;
|
|
82
|
+
/** Replacement text. */
|
|
83
|
+
replace: string;
|
|
84
|
+
/**
|
|
85
|
+
* Required. v1 `claudeCodeAdapter` rejects `'regex'` with the typed
|
|
86
|
+
* error `namespace.adapter.unsupported_search_mode`. Future v2
|
|
87
|
+
* `cursorAdapter` supports both modes.
|
|
88
|
+
*/
|
|
89
|
+
searchMode: 'literal' | 'regex';
|
|
90
|
+
/**
|
|
91
|
+
* FK into `~/.skillsmith/audits/<auditId>/result.json`. Required by
|
|
92
|
+
* v1 Claude-Code adapter so the edit-applier ledger entry is bound
|
|
93
|
+
* to the originating audit. v2 adapters may treat this as optional,
|
|
94
|
+
* hence the optional declaration here.
|
|
95
|
+
*/
|
|
96
|
+
auditId?: string;
|
|
97
|
+
/**
|
|
98
|
+
* The edit-suggester template pattern that produced this action. v1
|
|
99
|
+
* Claude-Code adapter passes this through to Wave 3's
|
|
100
|
+
* `applyRecommendedEdit`, which gates on `APPLY_TEMPLATE_REGISTRY`.
|
|
101
|
+
* Only `'add_domain_qualifier'` is in the registry in v1.
|
|
102
|
+
*/
|
|
103
|
+
pattern?: RecommendedEdit['pattern'];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Discriminated union over every adapter action shape. The `kind`
|
|
107
|
+
* literal narrows the union for downstream dispatchers.
|
|
108
|
+
*/
|
|
109
|
+
export type AdapterAction = FileRenameAction | InlineEditAction;
|
|
110
|
+
/**
|
|
111
|
+
* Framework adapter — abstracts over `claude-code` (v1), `cursor`,
|
|
112
|
+
* `copilot`, `aider`, `continue`, `cline` (v2). Wave 4's MCP tools,
|
|
113
|
+
* the CLI, and Wave 2's install pre-flight all consume the adapter
|
|
114
|
+
* rather than calling `scanLocalInventory` / `applyRename` /
|
|
115
|
+
* `applyRecommendedEdit` directly. This is the seam that lets v2 swap
|
|
116
|
+
* in `cursorAdapter` without touching call sites.
|
|
117
|
+
*/
|
|
118
|
+
export interface FrameworkAdapter {
|
|
119
|
+
name: FrameworkName;
|
|
120
|
+
/** Glob/path examples for transparency in audit reports. */
|
|
121
|
+
describesFiles(): string[];
|
|
122
|
+
/**
|
|
123
|
+
* Scan the framework's relevant filesystem locations for inventory.
|
|
124
|
+
* For `claude-code` this wraps Wave 1's `scanLocalInventory`.
|
|
125
|
+
*/
|
|
126
|
+
scanPaths(homeDir: string, projectDir?: string): Promise<InventoryEntry[]>;
|
|
127
|
+
/**
|
|
128
|
+
* Required unified entry point. v1 Claude-Code:
|
|
129
|
+
* - `kind: 'rename'` — REFUSED. A thin {from, to} pair cannot
|
|
130
|
+
* reconstruct the `InventoryEntry` Wave 2's `applyRename` needs;
|
|
131
|
+
* a raw `fs.rename` would bypass the backup + namespace ledger.
|
|
132
|
+
* Callers must use the `applyRename(entry, newName, opts)`
|
|
133
|
+
* convenience wrapper. The shape stays in the union for v2
|
|
134
|
+
* adapters that own their own audit-history.
|
|
135
|
+
* - `kind: 'inline-edit'` with `searchMode: 'literal'` — translates
|
|
136
|
+
* to a `RecommendedEdit` and dispatches to Wave 3
|
|
137
|
+
* `applyRecommendedEdit`. Requires `auditId` + `pattern`.
|
|
138
|
+
* - `kind: 'inline-edit'` with `searchMode: 'regex'` — rejected
|
|
139
|
+
* with `namespace.adapter.unsupported_search_mode`.
|
|
140
|
+
*/
|
|
141
|
+
applyAction(action: AdapterAction): Promise<void>;
|
|
142
|
+
/**
|
|
143
|
+
* Convenience wrapper for the common `claude-code` rename flow:
|
|
144
|
+
* builds a `FileRenameAction` and forwards. v1 Claude-Code wraps
|
|
145
|
+
* Wave 2's `applyRename` (full backup + ledger append + atomic
|
|
146
|
+
* rename). Optional on the interface — v2 adapters that don't have
|
|
147
|
+
* a per-file rename concept (Cursor) may omit it.
|
|
148
|
+
*/
|
|
149
|
+
applyRename?(entry: InventoryEntry, newName: string, opts: {
|
|
150
|
+
auditId: string;
|
|
151
|
+
}): Promise<void>;
|
|
152
|
+
/**
|
|
153
|
+
* Convenience wrapper for Wave 3's prose-edit surface. v1
|
|
154
|
+
* Claude-Code builds an `InlineEditAction` with
|
|
155
|
+
* `searchMode: 'literal'` from the `RecommendedEdit` shape and
|
|
156
|
+
* forwards to `applyAction`.
|
|
157
|
+
*/
|
|
158
|
+
applyEdit?(edit: RecommendedEdit, opts: {
|
|
159
|
+
auditId: string;
|
|
160
|
+
}): Promise<void>;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=framework-adapter.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-adapter.types.d.ts","sourceRoot":"","sources":["../../../src/audit/framework-adapter.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAEhE;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GACrB,aAAa,GAEb,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,OAAO,CAAA;AAEX;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAA;IACd,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAA;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,UAAU,EAAE,SAAS,GAAG,OAAO,CAAA;IAC/B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;CACrC;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAE/D;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAA;IACnB,4DAA4D;IAC5D,cAAc,IAAI,MAAM,EAAE,CAAA;IAC1B;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IAC1E;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9F;;;;;OAKG;IACH,SAAS,CAAC,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type vocabulary for the FrameworkAdapter seam — v1 ships
|
|
3
|
+
* `claude-code` only; v2 reserves `cursor`, `copilot`, `aider`,
|
|
4
|
+
* `continue`, `cline`. Defines `AdapterAction` (discriminated
|
|
5
|
+
* union over `FileRenameAction` + `InlineEditAction`) and the
|
|
6
|
+
* adapter interface.
|
|
7
|
+
* @module @skillsmith/mcp-server/audit/framework-adapter.types
|
|
8
|
+
*
|
|
9
|
+
* Plan: docs/internal/implementation/smi-4590-cli-mcp-framework-adapter.md §1, §5.
|
|
10
|
+
*
|
|
11
|
+
* Why this seam exists (per plan §5): `.cursorrules` (Cursor v2) is a
|
|
12
|
+
* monolithic file with multiple trigger phrases inside a single file; a
|
|
13
|
+
* `FileRenameAction`-only shape would break Cursor support. Shipping
|
|
14
|
+
* `InlineEditAction` from v1 is a forcing function that lets v2 swap in
|
|
15
|
+
* `cursorAdapter` without refactoring call sites.
|
|
16
|
+
*
|
|
17
|
+
* v1 contract (claudeCodeAdapter):
|
|
18
|
+
* - `FileRenameAction` is supported via convenience wrapper `applyRename`
|
|
19
|
+
* which performs the full Wave 2 `applyRename` flow (backup + ledger
|
|
20
|
+
* append + atomic rename). The bare `applyAction({kind:'rename'})`
|
|
21
|
+
* entry point is a raw transport seam (forward-compat for v2 adapters
|
|
22
|
+
* that own their own audit-history); v1 callers should prefer the
|
|
23
|
+
* `applyRename` wrapper which threads `auditId` through correctly.
|
|
24
|
+
* - `InlineEditAction` with `searchMode: 'literal'` translates to a
|
|
25
|
+
* `RecommendedEdit` and dispatches to Wave 3's `applyRecommendedEdit`.
|
|
26
|
+
* - `InlineEditAction` with `searchMode: 'regex'` is rejected with the
|
|
27
|
+
* typed error `namespace.adapter.unsupported_search_mode`. Reserved
|
|
28
|
+
* for v2 cursorAdapter.
|
|
29
|
+
*/
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=framework-adapter.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-adapter.types.js","sourceRoot":"","sources":["../../../src/audit/framework-adapter.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Public barrel for the consumer-namespace audit module
|
|
3
|
+
* (SMI-4587 Wave 1 Step 9). Wave 2/3/4 callers import from
|
|
4
|
+
* this entrypoint instead of reaching into individual files.
|
|
5
|
+
* @module @skillsmith/mcp-server/audit
|
|
6
|
+
*
|
|
7
|
+
* Surface:
|
|
8
|
+
* - Detection: `detectCollisions`, kind-specific helpers
|
|
9
|
+
* - History: `writeAuditHistory`, `readAuditHistory`, `newAuditId`
|
|
10
|
+
* - Report: `writeAuditReport`, `renderAuditReport`
|
|
11
|
+
* - Telemetry: `emitAuditCompleteEvent`
|
|
12
|
+
* - Bootstrap: `bootstrapUnmanagedSkills`, `isUnmanagedSkill`
|
|
13
|
+
* - Types: `InventoryAuditResult`, collision flag types, branded ids
|
|
14
|
+
*/
|
|
15
|
+
export { bootstrapUnmanagedSkills, detectCollisions, detectExactCollisions, detectGenericTokenFlags, getLastBootstrapWarnings, isUnmanagedSkill, } from './collision-detector.js';
|
|
16
|
+
export type { BootstrapFn, DetectCollisionsOptions } from './collision-detector.js';
|
|
17
|
+
export { deriveCollisionId, hasClaudeMdEntries, newAuditId, readAuditHistory, writeAuditHistory, } from './audit-history.js';
|
|
18
|
+
export type { AuditHistoryOptions, WriteAuditHistoryResult } from './audit-history.js';
|
|
19
|
+
export { renderAuditReport, writeAuditReport } from './audit-report-writer.js';
|
|
20
|
+
export type { AuditReportRenderOptions, AuditReportWriteOptions, AuditReportWriteResult, } from './audit-report-writer.js';
|
|
21
|
+
export { emitAuditCompleteEvent } from '../tools/namespace-audit/telemetry.js';
|
|
22
|
+
export type { AuditCompleteContext, AuditCompleteTelemetryOptions, } from '../tools/namespace-audit/telemetry.js';
|
|
23
|
+
export type { AuditId, CollisionId, ExactCollisionFlag, GenericTokenFlag, InventoryAuditResult, SemanticCollisionFlag, } from './collision-detector.types.js';
|
|
24
|
+
export { appendOverride, findOverride, readLedger, readLedgerResult, writeLedger, } from './namespace-overrides.js';
|
|
25
|
+
export type { LedgerPathOptions } from './namespace-overrides.js';
|
|
26
|
+
export { CURRENT_VERSION as NAMESPACE_OVERRIDES_CURRENT_VERSION } from './namespace-overrides.types.js';
|
|
27
|
+
export type { LedgerVersion, LedgerVersionUnsupportedError, OverrideRecord, OverridesLedger, ReadLedgerResult, } from './namespace-overrides.types.js';
|
|
28
|
+
export type { NamespaceWarning, PendingCollision } from './namespace-audit.types.js';
|
|
29
|
+
export { applyRename, generateSuggestionChain, REVERT_SUMMARY_PREFIX } from './rename-engine.js';
|
|
30
|
+
export type { ApplyRenameRequest, ApplyRenameResult, RenameAction, RenameActionRequest, RenameError, RenameSuggestion, SuggestionChain, } from './rename-engine.types.js';
|
|
31
|
+
export { runInstallPreflight } from './install-preflight.js';
|
|
32
|
+
export type { CandidateSkill, RunInstallPreflightInput, RunInstallPreflightResult, } from './install-preflight.js';
|
|
33
|
+
export { runBackupGC } from '../tools/install.backup-gc.js';
|
|
34
|
+
export type { RunBackupGCOptions, RunBackupGCResult } from '../tools/install.backup-gc.js';
|
|
35
|
+
export { runEditSuggester, V1_TEMPLATE_PATTERNS } from './edit-suggester.js';
|
|
36
|
+
export type { EditCategory, EditTemplate, EditTemplatePattern, RecommendedEdit, } from './edit-suggester.types.js';
|
|
37
|
+
export { APPLY_TEMPLATE_REGISTRY, applyRecommendedEdit } from './edit-applier.js';
|
|
38
|
+
export type { ApplyRecommendedEditOptions } from './edit-applier.js';
|
|
39
|
+
export type { EditApplyError, EditApplyResult } from './edit-applier.types.js';
|
|
40
|
+
export { claudeCodeAdapter, FrameworkAdapterError } from './framework-adapter.js';
|
|
41
|
+
export type { AdapterAction, FileRenameAction, FrameworkAdapter, FrameworkName, InlineEditAction, } from './framework-adapter.types.js';
|
|
42
|
+
export { runInventoryAudit } from './run-inventory-audit.js';
|
|
43
|
+
export type { RunInventoryAuditOptions, RunInventoryAuditResult } from './run-inventory-audit.js';
|
|
44
|
+
export { readAuditSuggestions, writeAuditSuggestions } from './audit-suggestions.js';
|
|
45
|
+
export type { AuditSuggestionsFile, AuditSuggestionsOptions } from './audit-suggestions.js';
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/audit/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Public barrel for the consumer-namespace audit module
|
|
3
|
+
* (SMI-4587 Wave 1 Step 9). Wave 2/3/4 callers import from
|
|
4
|
+
* this entrypoint instead of reaching into individual files.
|
|
5
|
+
* @module @skillsmith/mcp-server/audit
|
|
6
|
+
*
|
|
7
|
+
* Surface:
|
|
8
|
+
* - Detection: `detectCollisions`, kind-specific helpers
|
|
9
|
+
* - History: `writeAuditHistory`, `readAuditHistory`, `newAuditId`
|
|
10
|
+
* - Report: `writeAuditReport`, `renderAuditReport`
|
|
11
|
+
* - Telemetry: `emitAuditCompleteEvent`
|
|
12
|
+
* - Bootstrap: `bootstrapUnmanagedSkills`, `isUnmanagedSkill`
|
|
13
|
+
* - Types: `InventoryAuditResult`, collision flag types, branded ids
|
|
14
|
+
*/
|
|
15
|
+
export { bootstrapUnmanagedSkills, detectCollisions, detectExactCollisions, detectGenericTokenFlags, getLastBootstrapWarnings, isUnmanagedSkill, } from './collision-detector.js';
|
|
16
|
+
export { deriveCollisionId, hasClaudeMdEntries, newAuditId, readAuditHistory, writeAuditHistory, } from './audit-history.js';
|
|
17
|
+
export { renderAuditReport, writeAuditReport } from './audit-report-writer.js';
|
|
18
|
+
export { emitAuditCompleteEvent } from '../tools/namespace-audit/telemetry.js';
|
|
19
|
+
// SMI-4588 Wave 2 PR #1 — namespace-overrides ledger surface.
|
|
20
|
+
export { appendOverride, findOverride, readLedger, readLedgerResult, writeLedger, } from './namespace-overrides.js';
|
|
21
|
+
export { CURRENT_VERSION as NAMESPACE_OVERRIDES_CURRENT_VERSION } from './namespace-overrides.types.js';
|
|
22
|
+
// SMI-4588 Wave 2 PR #2 — rename engine + suggestion chain.
|
|
23
|
+
export { applyRename, generateSuggestionChain, REVERT_SUMMARY_PREFIX } from './rename-engine.js';
|
|
24
|
+
// SMI-4588 Wave 2 PR #3 — install pre-flight.
|
|
25
|
+
export { runInstallPreflight } from './install-preflight.js';
|
|
26
|
+
// SMI-4588 Wave 2 PR #4 — backup garbage collector. Re-exported via the
|
|
27
|
+
// audit barrel so Wave 4's session-start audit hook can import the
|
|
28
|
+
// helper without reaching into `tools/`.
|
|
29
|
+
export { runBackupGC } from '../tools/install.backup-gc.js';
|
|
30
|
+
// SMI-4589 Wave 3 — edit-suggester (templated prose-edit recommendations
|
|
31
|
+
// for `description_overlap` semantic collisions).
|
|
32
|
+
export { runEditSuggester, V1_TEMPLATE_PATTERNS } from './edit-suggester.js';
|
|
33
|
+
// SMI-4589 Wave 3 — edit-applier (mutation path for the registered
|
|
34
|
+
// `add_domain_qualifier` template, gated by APPLY_TEMPLATE_REGISTRY).
|
|
35
|
+
export { APPLY_TEMPLATE_REGISTRY, applyRecommendedEdit } from './edit-applier.js';
|
|
36
|
+
// SMI-4590 Wave 4 PR 2/6 — FrameworkAdapter seam + claudeCodeAdapter (v1).
|
|
37
|
+
export { claudeCodeAdapter, FrameworkAdapterError } from './framework-adapter.js';
|
|
38
|
+
// SMI-4590 Wave 4 PR 4/6 — shared `runInventoryAudit` composition helper
|
|
39
|
+
// + per-audit suggestion persistence. Consumed by the MCP tool surface
|
|
40
|
+
// (`skill_inventory_audit`) and (PR 5) the CLI `sklx audit collisions`
|
|
41
|
+
// command.
|
|
42
|
+
export { runInventoryAudit } from './run-inventory-audit.js';
|
|
43
|
+
export { readAuditSuggestions, writeAuditSuggestions } from './audit-suggestions.js';
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,yBAAyB,CAAA;AAIhC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAI3B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAQ9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAe9E,8DAA8D;AAC9D,OAAO,EACL,cAAc,EACd,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,WAAW,GACZ,MAAM,0BAA0B,CAAA;AAIjC,OAAO,EAAE,eAAe,IAAI,mCAAmC,EAAE,MAAM,gCAAgC,CAAA;AAavG,4DAA4D;AAC5D,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAYhG,8CAA8C;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAQ5D,wEAAwE;AACxE,mEAAmE;AACnE,yCAAyC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAI3D,yEAAyE;AACzE,kDAAkD;AAClD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAS5E,mEAAmE;AACnE,sEAAsE;AACtE,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAMjF,2EAA2E;AAC3E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAUjF,yEAAyE;AACzE,uEAAuE;AACvE,uEAAuE;AACvE,WAAW;AACX,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAI5D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA"}
|