mewkit 1.14.0 → 1.15.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/README.md +7 -0
- package/dist/commands/capabilities.d.ts +13 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +230 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/context.d.ts +10 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +125 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts +27 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +123 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/providers.d.ts +2 -0
- package/dist/commands/providers.d.ts.map +1 -1
- package/dist/commands/providers.js +77 -0
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/task-state.d.ts +13 -0
- package/dist/commands/task-state.d.ts.map +1 -0
- package/dist/commands/task-state.js +106 -0
- package/dist/commands/task-state.js.map +1 -0
- package/dist/commands/validate.d.ts +48 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +97 -24
- package/dist/commands/validate.js.map +1 -1
- package/dist/core/availability.d.ts +40 -0
- package/dist/core/availability.d.ts.map +1 -0
- package/dist/core/availability.js +47 -0
- package/dist/core/availability.js.map +1 -0
- package/dist/core/bootstrap.d.ts +19 -0
- package/dist/core/bootstrap.d.ts.map +1 -0
- package/dist/core/bootstrap.js +42 -0
- package/dist/core/bootstrap.js.map +1 -0
- package/dist/core/build-capabilities.d.ts +9 -0
- package/dist/core/build-capabilities.d.ts.map +1 -0
- package/dist/core/build-capabilities.js +123 -0
- package/dist/core/build-capabilities.js.map +1 -0
- package/dist/core/build-inventory.d.ts +2 -0
- package/dist/core/build-inventory.d.ts.map +1 -1
- package/dist/core/build-inventory.js +1 -1
- package/dist/core/build-inventory.js.map +1 -1
- package/dist/core/capability-authored.d.ts +26 -0
- package/dist/core/capability-authored.d.ts.map +1 -0
- package/dist/core/capability-authored.js +117 -0
- package/dist/core/capability-authored.js.map +1 -0
- package/dist/core/capability-snapshot.d.ts +13 -0
- package/dist/core/capability-snapshot.d.ts.map +1 -0
- package/dist/core/capability-snapshot.js +53 -0
- package/dist/core/capability-snapshot.js.map +1 -0
- package/dist/core/capability.d.ts +519 -0
- package/dist/core/capability.d.ts.map +1 -0
- package/dist/core/capability.js +114 -0
- package/dist/core/capability.js.map +1 -0
- package/dist/core/compute-checksums.d.ts.map +1 -1
- package/dist/core/compute-checksums.js +8 -2
- package/dist/core/compute-checksums.js.map +1 -1
- package/dist/core/consolidation-ledger.d.ts +30 -0
- package/dist/core/consolidation-ledger.d.ts.map +1 -0
- package/dist/core/consolidation-ledger.js +145 -0
- package/dist/core/consolidation-ledger.js.map +1 -0
- package/dist/core/generate-capability-view.d.ts +21 -0
- package/dist/core/generate-capability-view.d.ts.map +1 -0
- package/dist/core/generate-capability-view.js +48 -0
- package/dist/core/generate-capability-view.js.map +1 -0
- package/dist/core/install-metadata.d.ts +47 -30
- package/dist/core/install-metadata.d.ts.map +1 -1
- package/dist/core/install-metadata.js +49 -9
- package/dist/core/install-metadata.js.map +1 -1
- package/dist/core/plugin-manifest.d.ts +16 -16
- package/dist/core/provider-adapter.d.ts +28 -0
- package/dist/core/provider-adapter.d.ts.map +1 -0
- package/dist/core/provider-adapter.js +31 -0
- package/dist/core/provider-adapter.js.map +1 -0
- package/dist/core/provider-invocation.d.ts +14 -0
- package/dist/core/provider-invocation.d.ts.map +1 -0
- package/dist/core/provider-invocation.js +56 -0
- package/dist/core/provider-invocation.js.map +1 -0
- package/dist/core/provider-lifecycle.d.ts +35 -0
- package/dist/core/provider-lifecycle.d.ts.map +1 -0
- package/dist/core/provider-lifecycle.js +101 -0
- package/dist/core/provider-lifecycle.js.map +1 -0
- package/dist/core/provider-projection.d.ts +29 -0
- package/dist/core/provider-projection.d.ts.map +1 -0
- package/dist/core/provider-projection.js +47 -0
- package/dist/core/provider-projection.js.map +1 -0
- package/dist/core/release-metadata.d.ts +9 -2
- package/dist/core/release-metadata.d.ts.map +1 -1
- package/dist/core/release-metadata.js +13 -0
- package/dist/core/release-metadata.js.map +1 -1
- package/dist/core/repo-context-adapter.d.ts +23 -0
- package/dist/core/repo-context-adapter.d.ts.map +1 -0
- package/dist/core/repo-context-adapter.js +44 -0
- package/dist/core/repo-context-adapter.js.map +1 -0
- package/dist/core/repo-context.d.ts +147 -0
- package/dist/core/repo-context.d.ts.map +1 -0
- package/dist/core/repo-context.js +204 -0
- package/dist/core/repo-context.js.map +1 -0
- package/dist/core/resolve-capabilities.d.ts +70 -0
- package/dist/core/resolve-capabilities.d.ts.map +1 -0
- package/dist/core/resolve-capabilities.js +124 -0
- package/dist/core/resolve-capabilities.js.map +1 -0
- package/dist/core/smart-update.d.ts.map +1 -1
- package/dist/core/smart-update.js +13 -12
- package/dist/core/smart-update.js.map +1 -1
- package/dist/core/task-record.d.ts +252 -0
- package/dist/core/task-record.d.ts.map +1 -0
- package/dist/core/task-record.js +252 -0
- package/dist/core/task-record.js.map +1 -0
- package/dist/core/validate-capabilities.d.ts +12 -0
- package/dist/core/validate-capabilities.d.ts.map +1 -0
- package/dist/core/validate-capabilities.js +138 -0
- package/dist/core/validate-capabilities.js.map +1 -0
- package/dist/index.js +66 -4
- package/dist/index.js.map +1 -1
- package/dist/migrate/apply-env-var-rewrites.d.ts +15 -0
- package/dist/migrate/apply-env-var-rewrites.d.ts.map +1 -0
- package/dist/migrate/apply-env-var-rewrites.js +26 -0
- package/dist/migrate/apply-env-var-rewrites.js.map +1 -0
- package/dist/migrate/capability-bootstrap-projection.d.ts +11 -0
- package/dist/migrate/capability-bootstrap-projection.d.ts.map +1 -0
- package/dist/migrate/capability-bootstrap-projection.js +48 -0
- package/dist/migrate/capability-bootstrap-projection.js.map +1 -0
- package/dist/migrate/converters/command-to-codex-skill.d.ts.map +1 -1
- package/dist/migrate/converters/command-to-codex-skill.js +15 -5
- package/dist/migrate/converters/command-to-codex-skill.js.map +1 -1
- package/dist/migrate/converters/fm-to-codex-toml.d.ts +4 -1
- package/dist/migrate/converters/fm-to-codex-toml.d.ts.map +1 -1
- package/dist/migrate/converters/fm-to-codex-toml.js +7 -2
- package/dist/migrate/converters/fm-to-codex-toml.js.map +1 -1
- package/dist/migrate/converters/index.js +1 -1
- package/dist/migrate/converters/index.js.map +1 -1
- package/dist/migrate/discovery/config-discovery.d.ts +29 -0
- package/dist/migrate/discovery/config-discovery.d.ts.map +1 -1
- package/dist/migrate/discovery/config-discovery.js +45 -0
- package/dist/migrate/discovery/config-discovery.js.map +1 -1
- package/dist/migrate/discovery/handlers-json-filter.d.ts.map +1 -1
- package/dist/migrate/discovery/handlers-json-filter.js +4 -2
- package/dist/migrate/discovery/handlers-json-filter.js.map +1 -1
- package/dist/migrate/discovery/hooks-discovery.d.ts +5 -0
- package/dist/migrate/discovery/hooks-discovery.d.ts.map +1 -1
- package/dist/migrate/discovery/hooks-discovery.js +21 -5
- package/dist/migrate/discovery/hooks-discovery.js.map +1 -1
- package/dist/migrate/hooks/codex-hook-wrapper.d.ts +15 -1
- package/dist/migrate/hooks/codex-hook-wrapper.d.ts.map +1 -1
- package/dist/migrate/hooks/codex-hook-wrapper.js +78 -7
- package/dist/migrate/hooks/codex-hook-wrapper.js.map +1 -1
- package/dist/migrate/hooks/codex-path-safety.d.ts +29 -0
- package/dist/migrate/hooks/codex-path-safety.d.ts.map +1 -1
- package/dist/migrate/hooks/codex-path-safety.js +36 -1
- package/dist/migrate/hooks/codex-path-safety.js.map +1 -1
- package/dist/migrate/hooks/codex-sh-wrapper-script.d.ts +8 -0
- package/dist/migrate/hooks/codex-sh-wrapper-script.d.ts.map +1 -0
- package/dist/migrate/hooks/codex-sh-wrapper-script.js +118 -0
- package/dist/migrate/hooks/codex-sh-wrapper-script.js.map +1 -0
- package/dist/migrate/hooks/codex-shell-env-installer.d.ts +14 -0
- package/dist/migrate/hooks/codex-shell-env-installer.d.ts.map +1 -0
- package/dist/migrate/hooks/codex-shell-env-installer.js +82 -0
- package/dist/migrate/hooks/codex-shell-env-installer.js.map +1 -0
- package/dist/migrate/hooks/codex-toml-installer.d.ts +2 -0
- package/dist/migrate/hooks/codex-toml-installer.d.ts.map +1 -1
- package/dist/migrate/hooks/codex-toml-installer.js +3 -1
- package/dist/migrate/hooks/codex-toml-installer.js.map +1 -1
- package/dist/migrate/hooks/hooks-settings-merger.d.ts +3 -0
- package/dist/migrate/hooks/hooks-settings-merger.d.ts.map +1 -1
- package/dist/migrate/hooks/hooks-settings-merger.js +152 -20
- package/dist/migrate/hooks/hooks-settings-merger.js.map +1 -1
- package/dist/migrate/migrate-orchestrator.d.ts +19 -0
- package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
- package/dist/migrate/migrate-orchestrator.js +176 -24
- package/dist/migrate/migrate-orchestrator.js.map +1 -1
- package/dist/migrate/migrate-ui-summary.d.ts +23 -0
- package/dist/migrate/migrate-ui-summary.d.ts.map +1 -1
- package/dist/migrate/migrate-ui-summary.js +24 -0
- package/dist/migrate/migrate-ui-summary.js.map +1 -1
- package/dist/migrate/model-routing-config.d.ts +3 -1
- package/dist/migrate/model-routing-config.d.ts.map +1 -1
- package/dist/migrate/model-routing-config.js +28 -0
- package/dist/migrate/model-routing-config.js.map +1 -1
- package/dist/migrate/portable-installer.d.ts +14 -1
- package/dist/migrate/portable-installer.d.ts.map +1 -1
- package/dist/migrate/portable-installer.js +110 -9
- package/dist/migrate/portable-installer.js.map +1 -1
- package/dist/migrate/providers/codex/capabilities.d.ts +5 -0
- package/dist/migrate/providers/codex/capabilities.d.ts.map +1 -1
- package/dist/migrate/providers/codex/capabilities.js +31 -0
- package/dist/migrate/providers/codex/capabilities.js.map +1 -1
- package/dist/migrate/providers/codex/config.d.ts.map +1 -1
- package/dist/migrate/providers/codex/config.js +8 -2
- package/dist/migrate/providers/codex/config.js.map +1 -1
- package/dist/migrate/providers/codex/shell-env-policy-emitter.d.ts +27 -0
- package/dist/migrate/providers/codex/shell-env-policy-emitter.d.ts.map +1 -0
- package/dist/migrate/providers/codex/shell-env-policy-emitter.js +86 -0
- package/dist/migrate/providers/codex/shell-env-policy-emitter.js.map +1 -0
- package/dist/migrate/reconcile/index.d.ts +1 -1
- package/dist/migrate/reconcile/index.d.ts.map +1 -1
- package/dist/migrate/reconcile/index.js +1 -1
- package/dist/migrate/reconcile/index.js.map +1 -1
- package/dist/migrate/reconcile/portable-manifest.d.ts +6 -0
- package/dist/migrate/reconcile/portable-manifest.d.ts.map +1 -1
- package/dist/migrate/reconcile/portable-manifest.js +23 -0
- package/dist/migrate/reconcile/portable-manifest.js.map +1 -1
- package/dist/migrate/reconcile/reconcile-state-builders.d.ts +12 -5
- package/dist/migrate/reconcile/reconcile-state-builders.d.ts.map +1 -1
- package/dist/migrate/reconcile/reconcile-state-builders.js +2 -2
- package/dist/migrate/reconcile/reconcile-state-builders.js.map +1 -1
- package/dist/migrate/references/env-var-rewrite-table.d.ts +36 -0
- package/dist/migrate/references/env-var-rewrite-table.d.ts.map +1 -0
- package/dist/migrate/references/env-var-rewrite-table.js +97 -0
- package/dist/migrate/references/env-var-rewrite-table.js.map +1 -0
- package/dist/migrate/references/reference-classifier.d.ts +15 -0
- package/dist/migrate/references/reference-classifier.d.ts.map +1 -1
- package/dist/migrate/references/reference-classifier.js +33 -0
- package/dist/migrate/references/reference-classifier.js.map +1 -1
- package/dist/migrate/runtime-compat-audit.d.ts +1 -0
- package/dist/migrate/runtime-compat-audit.d.ts.map +1 -1
- package/dist/migrate/runtime-compat-audit.js +8 -3
- package/dist/migrate/runtime-compat-audit.js.map +1 -1
- package/dist/migrate/runtime-coupling-patterns.d.ts +30 -2
- package/dist/migrate/runtime-coupling-patterns.d.ts.map +1 -1
- package/dist/migrate/runtime-coupling-patterns.js +36 -8
- package/dist/migrate/runtime-coupling-patterns.js.map +1 -1
- package/dist/migrate/skill-directory-audit.d.ts +14 -0
- package/dist/migrate/skill-directory-audit.d.ts.map +1 -1
- package/dist/migrate/skill-directory-audit.js +68 -10
- package/dist/migrate/skill-directory-audit.js.map +1 -1
- package/dist/migrate/skill-directory-installer.d.ts +3 -0
- package/dist/migrate/skill-directory-installer.d.ts.map +1 -1
- package/dist/migrate/skill-directory-installer.js +98 -1
- package/dist/migrate/skill-directory-installer.js.map +1 -1
- package/dist/migrate/state-changing-script-detector.d.ts +16 -0
- package/dist/migrate/state-changing-script-detector.d.ts.map +1 -0
- package/dist/migrate/state-changing-script-detector.js +144 -0
- package/dist/migrate/state-changing-script-detector.js.map +1 -0
- package/dist/migrate/validation/migrate-conversion-report.d.ts +28 -0
- package/dist/migrate/validation/migrate-conversion-report.d.ts.map +1 -1
- package/dist/migrate/validation/migrate-conversion-report.js +48 -7
- package/dist/migrate/validation/migrate-conversion-report.js.map +1 -1
- package/dist/migrate/validation/migration-ledger-inputs.d.ts +56 -0
- package/dist/migrate/validation/migration-ledger-inputs.d.ts.map +1 -0
- package/dist/migrate/validation/migration-ledger-inputs.js +160 -0
- package/dist/migrate/validation/migration-ledger-inputs.js.map +1 -0
- package/dist/migrate/validation/migration-record-types.d.ts +38 -0
- package/dist/migrate/validation/migration-record-types.d.ts.map +1 -0
- package/dist/migrate/validation/migration-record-types.js +12 -0
- package/dist/migrate/validation/migration-record-types.js.map +1 -0
- package/dist/migrate/validation/migration-report-writer.d.ts +98 -0
- package/dist/migrate/validation/migration-report-writer.d.ts.map +1 -0
- package/dist/migrate/validation/migration-report-writer.js +0 -0
- package/dist/migrate/validation/migration-report-writer.js.map +1 -0
- package/dist/orchviz-web/index.js +3 -3
- package/package.json +1 -1
- package/portable-manifest.json +10 -2
- package/dist/commands/evolve.d.ts +0 -11
- package/dist/commands/evolve.d.ts.map +0 -1
- package/dist/commands/evolve.js +0 -63
- package/dist/commands/evolve.js.map +0 -1
- package/dist/commands/health.d.ts +0 -14
- package/dist/commands/health.d.ts.map +0 -1
- package/dist/commands/health.js +0 -193
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/policy.d.ts +0 -8
- package/dist/commands/policy.d.ts.map +0 -1
- package/dist/commands/policy.js +0 -65
- package/dist/commands/policy.js.map +0 -1
- package/dist/commands/portability.d.ts +0 -7
- package/dist/commands/portability.d.ts.map +0 -1
- package/dist/commands/portability.js +0 -50
- package/dist/commands/portability.js.map +0 -1
- package/dist/commands/reflect.d.ts +0 -14
- package/dist/commands/reflect.d.ts.map +0 -1
- package/dist/commands/reflect.js +0 -135
- package/dist/commands/reflect.js.map +0 -1
- package/dist/commands/simulate.d.ts +0 -14
- package/dist/commands/simulate.d.ts.map +0 -1
- package/dist/commands/simulate.js +0 -86
- package/dist/commands/simulate.js.map +0 -1
- package/dist/core/event-log.d.ts +0 -44
- package/dist/core/event-log.d.ts.map +0 -1
- package/dist/core/event-log.js +0 -169
- package/dist/core/event-log.js.map +0 -1
- package/dist/core/evolution/event-clusters.d.ts +0 -4
- package/dist/core/evolution/event-clusters.d.ts.map +0 -1
- package/dist/core/evolution/event-clusters.js +0 -82
- package/dist/core/evolution/event-clusters.js.map +0 -1
- package/dist/core/evolution/recommendation-renderer.d.ts +0 -3
- package/dist/core/evolution/recommendation-renderer.d.ts.map +0 -1
- package/dist/core/evolution/recommendation-renderer.js +0 -24
- package/dist/core/evolution/recommendation-renderer.js.map +0 -1
- package/dist/core/evolution/review-failure-clusters.d.ts +0 -10
- package/dist/core/evolution/review-failure-clusters.d.ts.map +0 -1
- package/dist/core/evolution/review-failure-clusters.js +0 -30
- package/dist/core/evolution/review-failure-clusters.js.map +0 -1
- package/dist/core/evolution/suggestions.d.ts +0 -24
- package/dist/core/evolution/suggestions.d.ts.map +0 -1
- package/dist/core/evolution/suggestions.js +0 -11
- package/dist/core/evolution/suggestions.js.map +0 -1
- package/dist/core/gate-policy.d.ts +0 -20
- package/dist/core/gate-policy.d.ts.map +0 -1
- package/dist/core/gate-policy.js +0 -64
- package/dist/core/gate-policy.js.map +0 -1
- package/dist/core/portability-matrix.d.ts +0 -17
- package/dist/core/portability-matrix.d.ts.map +0 -1
- package/dist/core/portability-matrix.js +0 -31
- package/dist/core/portability-matrix.js.map +0 -1
- package/dist/core/simulation-runner.d.ts +0 -93
- package/dist/core/simulation-runner.d.ts.map +0 -1
- package/dist/core/simulation-runner.js +0 -161
- package/dist/core/simulation-runner.js.map +0 -1
- package/dist/core/usage/usage-analyzer.d.ts +0 -18
- package/dist/core/usage/usage-analyzer.d.ts.map +0 -1
- package/dist/core/usage/usage-analyzer.js +0 -41
- package/dist/core/usage/usage-analyzer.js.map +0 -1
- package/dist/memory/archive.d.ts +0 -9
- package/dist/memory/archive.d.ts.map +0 -1
- package/dist/memory/archive.js +0 -42
- package/dist/memory/archive.js.map +0 -1
- package/dist/memory/compact.d.ts +0 -9
- package/dist/memory/compact.d.ts.map +0 -1
- package/dist/memory/compact.js +0 -33
- package/dist/memory/compact.js.map +0 -1
- package/dist/memory/conflicts.d.ts +0 -8
- package/dist/memory/conflicts.d.ts.map +0 -1
- package/dist/memory/conflicts.js +0 -28
- package/dist/memory/conflicts.js.map +0 -1
- package/dist/memory/promote.d.ts +0 -8
- package/dist/memory/promote.d.ts.map +0 -1
- package/dist/memory/promote.js +0 -10
- package/dist/memory/promote.js.map +0 -1
- package/dist/memory/store-utils.d.ts +0 -14
- package/dist/memory/store-utils.d.ts.map +0 -1
- package/dist/memory/store-utils.js +0 -44
- package/dist/memory/store-utils.js.map +0 -1
- package/dist/migrate/__tests__/frontmatter-parser.test.d.ts +0 -2
- package/dist/migrate/__tests__/frontmatter-parser.test.d.ts.map +0 -1
- package/dist/migrate/__tests__/frontmatter-parser.test.js +0 -73
- package/dist/migrate/__tests__/frontmatter-parser.test.js.map +0 -1
- package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts +0 -2
- package/dist/migrate/__tests__/md-strip-mewkit.test.d.ts.map +0 -1
- package/dist/migrate/__tests__/md-strip-mewkit.test.js +0 -55
- package/dist/migrate/__tests__/md-strip-mewkit.test.js.map +0 -1
- package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts +0 -2
- package/dist/migrate/__tests__/migrate-scope-resolver.test.d.ts.map +0 -1
- package/dist/migrate/__tests__/migrate-scope-resolver.test.js +0 -53
- package/dist/migrate/__tests__/migrate-scope-resolver.test.js.map +0 -1
- package/dist/migrate/__tests__/process-lock.test.d.ts +0 -2
- package/dist/migrate/__tests__/process-lock.test.d.ts.map +0 -1
- package/dist/migrate/__tests__/process-lock.test.js +0 -63
- package/dist/migrate/__tests__/process-lock.test.js.map +0 -1
- package/dist/migrate/__tests__/provider-registry.test.d.ts +0 -2
- package/dist/migrate/__tests__/provider-registry.test.d.ts.map +0 -1
- package/dist/migrate/__tests__/provider-registry.test.js +0 -53
- package/dist/migrate/__tests__/provider-registry.test.js.map +0 -1
- package/dist/migrate/__tests__/reconciler.test.d.ts +0 -2
- package/dist/migrate/__tests__/reconciler.test.d.ts.map +0 -1
- package/dist/migrate/__tests__/reconciler.test.js +0 -180
- package/dist/migrate/__tests__/reconciler.test.js.map +0 -1
- package/dist/migrate/__tests__/skill-id-utils.test.d.ts +0 -2
- package/dist/migrate/__tests__/skill-id-utils.test.d.ts.map +0 -1
- package/dist/migrate/__tests__/skill-id-utils.test.js +0 -78
- package/dist/migrate/__tests__/skill-id-utils.test.js.map +0 -1
- package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts +0 -15
- package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.d.ts.map +0 -1
- package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js +0 -165
- package/dist/orchviz/plan/__tests__/apply-todo-toggle.test.js.map +0 -1
- package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts +0 -11
- package/dist/orchviz/plan/__tests__/atomic-write.test.d.ts.map +0 -1
- package/dist/orchviz/plan/__tests__/atomic-write.test.js +0 -89
- package/dist/orchviz/plan/__tests__/atomic-write.test.js.map +0 -1
- package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts +0 -10
- package/dist/orchviz/plan/__tests__/end-to-end.test.d.ts.map +0 -1
- package/dist/orchviz/plan/__tests__/end-to-end.test.js +0 -132
- package/dist/orchviz/plan/__tests__/end-to-end.test.js.map +0 -1
- package/dist/orchviz/plan/__tests__/etag.test.d.ts +0 -11
- package/dist/orchviz/plan/__tests__/etag.test.d.ts.map +0 -1
- package/dist/orchviz/plan/__tests__/etag.test.js +0 -92
- package/dist/orchviz/plan/__tests__/etag.test.js.map +0 -1
- package/dist/orchviz/plan/__tests__/list-plans.test.d.ts +0 -14
- package/dist/orchviz/plan/__tests__/list-plans.test.d.ts.map +0 -1
- package/dist/orchviz/plan/__tests__/list-plans.test.js +0 -154
- package/dist/orchviz/plan/__tests__/list-plans.test.js.map +0 -1
- package/dist/orchviz/server/__tests__/security-smoke.test.d.ts +0 -13
- package/dist/orchviz/server/__tests__/security-smoke.test.d.ts.map +0 -1
- package/dist/orchviz/server/__tests__/security-smoke.test.js +0 -207
- package/dist/orchviz/server/__tests__/security-smoke.test.js.map +0 -1
- package/dist/orchviz/server/__tests__/write-handlers.test.d.ts +0 -24
- package/dist/orchviz/server/__tests__/write-handlers.test.d.ts.map +0 -1
- package/dist/orchviz/server/__tests__/write-handlers.test.js +0 -347
- package/dist/orchviz/server/__tests__/write-handlers.test.js.map +0 -1
- package/dist/orchviz/test-server-boot.d.ts +0 -28
- package/dist/orchviz/test-server-boot.d.ts.map +0 -1
- package/dist/orchviz/test-server-boot.js +0 -64
- package/dist/orchviz/test-server-boot.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readdir, readFile, stat } from "node:fs/promises";
|
|
2
2
|
import { extname, join, relative } from "node:path";
|
|
3
3
|
import { findRuntimeCouplingMatches } from "./runtime-coupling-patterns.js";
|
|
4
|
+
import { detectStateChanging, languageFor } from "./state-changing-script-detector.js";
|
|
4
5
|
import { isBinaryContent } from "./reconcile/checksum-utils.js";
|
|
5
6
|
const MAX_TEXT_FILE_BYTES = 512 * 1024;
|
|
6
7
|
const EXECUTABLE_EXTENSIONS = new Set([".sh", ".py", ".js", ".cjs", ".mjs", ".ts"]);
|
|
@@ -30,9 +31,16 @@ function shouldScanFile(filePath, size) {
|
|
|
30
31
|
return false;
|
|
31
32
|
return TEXT_EXTENSIONS.has(extname(filePath).toLowerCase());
|
|
32
33
|
}
|
|
33
|
-
function
|
|
34
|
-
const base =
|
|
35
|
-
|
|
34
|
+
function classifyFile(relativePath) {
|
|
35
|
+
const base = relativePath.split("/").pop()?.toLowerCase() ?? "";
|
|
36
|
+
const ext = extname(relativePath).toLowerCase();
|
|
37
|
+
if (EXECUTABLE_EXTENSIONS.has(ext))
|
|
38
|
+
return "script";
|
|
39
|
+
if (base === "skill.md")
|
|
40
|
+
return "entry";
|
|
41
|
+
if (ext === ".md" || ext === ".mdx")
|
|
42
|
+
return "reference";
|
|
43
|
+
return "other";
|
|
36
44
|
}
|
|
37
45
|
function isMarkdownFile(filePath) {
|
|
38
46
|
const extension = extname(filePath).toLowerCase();
|
|
@@ -52,10 +60,52 @@ async function collectFiles(rootDir) {
|
|
|
52
60
|
}
|
|
53
61
|
return files;
|
|
54
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Severity-aware, per-pattern verdict. This is where the LOCKED script policy and
|
|
65
|
+
* the reference-grade downgrade live:
|
|
66
|
+
*
|
|
67
|
+
* - Reference-grade markdown (references/*.md, non-entry docs): every runtime
|
|
68
|
+
* coupling downgrades to warn+annotate. Markdown never executes.
|
|
69
|
+
* - Entry markdown (SKILL.md): env-var patterns are table-rewriteable (a safe
|
|
70
|
+
* static lookup) → warn+annotate; CLI/path/config patterns downgrade to warn
|
|
71
|
+
* too, because a markdown doc line is not runnable. (High-risk == a runnable
|
|
72
|
+
* *script*, not the fact of being SKILL.md.)
|
|
73
|
+
* - Scripts: if the whole script is state-changing AND carries ANY coupling
|
|
74
|
+
* match → FAIL-CLOSED for every match (a rewrite never downgrades it). A
|
|
75
|
+
* non-state-changing script rewrites known env-var patterns (warn+annotate),
|
|
76
|
+
* else warn+preserve — per the locked policy.
|
|
77
|
+
*/
|
|
78
|
+
function verdictFor(match, fileClass, scriptIsStateChanging, stateChangingReason) {
|
|
79
|
+
if (fileClass === "script" && scriptIsStateChanging) {
|
|
80
|
+
return {
|
|
81
|
+
kind: "fail",
|
|
82
|
+
message: `${match.message} (state-changing script ${stateChangingReason ?? ""}; fail-closed — no rewrite path downgrades it)`.trimEnd(),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (match.cls === "claude-env-var" && match.rewrite) {
|
|
86
|
+
const detail = match.rewrite.disposition === "rewrite" ? "rewritten" : "neutralized";
|
|
87
|
+
return { kind: "warn", message: `${match.message} (${detail})`, annotation: match.rewrite.annotation };
|
|
88
|
+
}
|
|
89
|
+
// Non-env patterns (CLI, .claude/ path, CLAUDE.md token).
|
|
90
|
+
if (fileClass === "reference" || fileClass === "entry") {
|
|
91
|
+
return {
|
|
92
|
+
kind: "warn",
|
|
93
|
+
message: `${match.message} (documentation reference)`,
|
|
94
|
+
annotation: `${match.message}; preserved in migrated docs — adapt manually for the target runtime`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Non-state-changing script, non-rewriteable pattern → warn + preserve.
|
|
98
|
+
return {
|
|
99
|
+
kind: "warn",
|
|
100
|
+
message: `${match.message} (preserved)`,
|
|
101
|
+
annotation: `${match.message}; left unchanged (no safe portable rewrite) — adapt manually for the target runtime`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
55
104
|
export async function auditSkillDirectory(rootDir, provider, skillName, options = {}) {
|
|
56
105
|
if (provider === "claude-code")
|
|
57
|
-
return { errors: [] };
|
|
106
|
+
return { errors: [], waivers: [] };
|
|
58
107
|
const errors = [];
|
|
108
|
+
const waivers = [];
|
|
59
109
|
for (const filePath of await collectFiles(rootDir)) {
|
|
60
110
|
const info = await stat(filePath);
|
|
61
111
|
if (!shouldScanFile(filePath, info.size))
|
|
@@ -67,15 +117,23 @@ export async function auditSkillDirectory(rootDir, provider, skillName, options
|
|
|
67
117
|
const relativePath = relative(rootDir, filePath).replace(/\\/g, "/");
|
|
68
118
|
if (options.ignoreRewriteableMarkdown && isMarkdownFile(relativePath))
|
|
69
119
|
continue;
|
|
120
|
+
const fileClass = classifyFile(relativePath);
|
|
121
|
+
const stateChange = fileClass === "script" ? detectStateChanging(content, languageFor(relativePath)) : { stateChanging: false };
|
|
70
122
|
const occurrences = options.occurrencesByFile?.get(relativePath) ?? [];
|
|
71
123
|
for (const match of findRuntimeCouplingMatches(content, occurrences)) {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
124
|
+
const verdict = verdictFor(match, fileClass, stateChange.stateChanging, stateChange.reason);
|
|
125
|
+
const severity = fileClass === "script" || fileClass === "entry" ? "high-risk" : "runtime-coupled";
|
|
126
|
+
if (verdict.kind === "fail") {
|
|
127
|
+
errors.push({
|
|
128
|
+
filePath: relativePath,
|
|
129
|
+
message: `${provider} skill/${skillName} ${severity} file ${relativePath} ${verdict.message}`,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
waivers.push({ filePath: relativePath, message: verdict.message, annotation: verdict.annotation });
|
|
134
|
+
}
|
|
77
135
|
}
|
|
78
136
|
}
|
|
79
|
-
return { errors };
|
|
137
|
+
return { errors, waivers };
|
|
80
138
|
}
|
|
81
139
|
//# sourceMappingURL=skill-directory-audit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-directory-audit.js","sourceRoot":"","sources":["../../src/migrate/skill-directory-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,0BAA0B,
|
|
1
|
+
{"version":3,"file":"skill-directory-audit.js","sourceRoot":"","sources":["../../src/migrate/skill-directory-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ReferenceIntegrityIndex } from "./references/fence-aware-reference-rewriter.js";
|
|
2
2
|
import { type InstalledBackRef } from "../core/install-metadata-backref.js";
|
|
3
|
+
import type { MigrationDecisionRecord } from "./validation/migration-record-types.js";
|
|
3
4
|
import type { ProviderType, SkillInfo } from "./types.js";
|
|
4
5
|
export interface SkillInstallResult {
|
|
5
6
|
skill: string;
|
|
@@ -7,6 +8,8 @@ export interface SkillInstallResult {
|
|
|
7
8
|
success: boolean;
|
|
8
9
|
path?: string;
|
|
9
10
|
error?: string;
|
|
11
|
+
/** Structured decision records (migrated / failed / partial-with-waivers) for the run report. */
|
|
12
|
+
records?: MigrationDecisionRecord[];
|
|
10
13
|
}
|
|
11
14
|
/**
|
|
12
15
|
* Install a single skill directory to the target provider.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-directory-installer.d.ts","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"AAOA,OAAO,EAGN,KAAK,uBAAuB,EAC5B,MAAM,gDAAgD,CAAC;AAMxD,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-directory-installer.d.ts","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"AAOA,OAAO,EAGN,KAAK,uBAAuB,EAC5B,MAAM,gDAAgD,CAAC;AAMxD,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAIrG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAe1D,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,OAAO,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACpC;AAqGD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAC1C,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;IACR,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;CAC9C,GACC,OAAO,CAAC,kBAAkB,CAAC,CA2I7B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC1B,MAAM,GAAG,IAAI,CAGf"}
|
|
@@ -12,6 +12,20 @@ import { computeContentChecksum } from "./reconcile/checksum-utils.js";
|
|
|
12
12
|
import { addPortableInstallation } from "./reconcile/portable-registry.js";
|
|
13
13
|
import { resolveInstalledBackRef } from "../core/install-metadata-backref.js";
|
|
14
14
|
import { auditSkillDirectory } from "./skill-directory-audit.js";
|
|
15
|
+
import { applyEnvVarRewrites } from "./apply-env-var-rewrites.js";
|
|
16
|
+
import { detectStateChanging, languageFor } from "./state-changing-script-detector.js";
|
|
17
|
+
const NON_STATE_CHANGING_REWRITE_EXTENSIONS = new Set([".sh", ".py", ".js", ".cjs", ".mjs", ".ts", ".tsx"]);
|
|
18
|
+
const REWRITE_SCANNABLE_EXTENSIONS = new Set([
|
|
19
|
+
...NON_STATE_CHANGING_REWRITE_EXTENSIONS,
|
|
20
|
+
".md",
|
|
21
|
+
".mdx",
|
|
22
|
+
".txt",
|
|
23
|
+
".json",
|
|
24
|
+
".jsonc",
|
|
25
|
+
".yaml",
|
|
26
|
+
".yml",
|
|
27
|
+
".toml",
|
|
28
|
+
]);
|
|
15
29
|
async function canonicalize(path) {
|
|
16
30
|
try {
|
|
17
31
|
return await realpath(path);
|
|
@@ -56,6 +70,50 @@ async function rewriteMarkdownFilesForProvider(rootDir, provider, migratedRefs,
|
|
|
56
70
|
}
|
|
57
71
|
}
|
|
58
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Apply the static env-var rewrite table across the copied tree BEFORE the audit.
|
|
75
|
+
* State-changing scripts are NOT rewritten — a rewrite path must never downgrade a
|
|
76
|
+
* state-changing script (LOCKED policy 4a); it fail-closes in the audit regardless.
|
|
77
|
+
* Only "rewrite"-disposition tokens are substituted; "neutralize" tokens remain for
|
|
78
|
+
* the audit to warn+annotate. Returns one migration record per file that changed.
|
|
79
|
+
*/
|
|
80
|
+
async function applyEnvVarRewritesForProvider(rootDir, provider, skill, baseDir = rootDir) {
|
|
81
|
+
const records = [];
|
|
82
|
+
const entries = await readdir(rootDir, { withFileTypes: true });
|
|
83
|
+
for (const entry of entries) {
|
|
84
|
+
const fullPath = join(rootDir, entry.name);
|
|
85
|
+
if (entry.isDirectory()) {
|
|
86
|
+
records.push(...(await applyEnvVarRewritesForProvider(fullPath, provider, skill, baseDir)));
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (!entry.isFile())
|
|
90
|
+
continue;
|
|
91
|
+
const ext = fullPath.slice(fullPath.lastIndexOf(".")).toLowerCase();
|
|
92
|
+
if (!REWRITE_SCANNABLE_EXTENSIONS.has(ext))
|
|
93
|
+
continue;
|
|
94
|
+
const original = await readFile(fullPath, "utf-8");
|
|
95
|
+
// Never rewrite a state-changing script — it stays fail-closed by policy.
|
|
96
|
+
if (NON_STATE_CHANGING_REWRITE_EXTENSIONS.has(ext) && detectStateChanging(original, languageFor(fullPath)).stateChanging)
|
|
97
|
+
continue;
|
|
98
|
+
const { content, applied } = applyEnvVarRewrites(original);
|
|
99
|
+
if (applied.length === 0)
|
|
100
|
+
continue;
|
|
101
|
+
await writeFile(fullPath, content, "utf-8");
|
|
102
|
+
const relPath = fullPath.slice(baseDir.length + 1).replace(/\\/g, "/");
|
|
103
|
+
for (const a of applied) {
|
|
104
|
+
records.push({
|
|
105
|
+
source: `.claude/skills/${skill.dirName}/${relPath}`,
|
|
106
|
+
type: "skill",
|
|
107
|
+
provider,
|
|
108
|
+
outcome: "partial",
|
|
109
|
+
reason: "runtime-neutralized",
|
|
110
|
+
detail: a.annotation,
|
|
111
|
+
target: relPath,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return records;
|
|
116
|
+
}
|
|
59
117
|
/**
|
|
60
118
|
* Install a single skill directory to the target provider.
|
|
61
119
|
* Source dir → target dir using node fs.cp recursive.
|
|
@@ -77,6 +135,10 @@ export async function installSkillDirectory(skill, provider, options) {
|
|
|
77
135
|
};
|
|
78
136
|
}
|
|
79
137
|
const targetDir = join(targetBase, sanitizedName);
|
|
138
|
+
// Structured decision records — populated during install (waivers/rewrites) and
|
|
139
|
+
// on audit failure (fail-closed). Surfaced on the result so no outcome is silent.
|
|
140
|
+
const installRecords = [];
|
|
141
|
+
let failureRecords = [];
|
|
80
142
|
try {
|
|
81
143
|
const parent = dirname(targetDir);
|
|
82
144
|
if (!existsSync(parent))
|
|
@@ -100,10 +162,38 @@ export async function installSkillDirectory(skill, provider, options) {
|
|
|
100
162
|
const selfIndex = createReferenceIntegrityIndex([`.claude/skills/${skill.dirName}/`]);
|
|
101
163
|
const occurrencesByFile = new Map();
|
|
102
164
|
await rewriteMarkdownFilesForProvider(targetDir, provider, combineIntegrityIndexes(selfIndex, options.migratedRefs), occurrencesByFile);
|
|
165
|
+
// Apply the static env-var rewrite table across the tree (scripts + markdown)
|
|
166
|
+
// BEFORE the audit, so table-known tokens (e.g. $CLAUDE_PROJECT_DIR) are already
|
|
167
|
+
// neutralized to a provider-neutral literal when the audit runs. State-changing
|
|
168
|
+
// scripts are skipped inside the helper and stay fail-closed.
|
|
169
|
+
const rewriteRecords = provider === "claude-code" ? [] : await applyEnvVarRewritesForProvider(targetDir, provider, skill);
|
|
170
|
+
installRecords.push(...rewriteRecords);
|
|
103
171
|
const audit = await auditSkillDirectory(targetDir, provider, skill.name, { occurrencesByFile });
|
|
104
172
|
if (audit.errors.length > 0) {
|
|
173
|
+
// Fail-closed: emit a structured failure record (never a silent absence),
|
|
174
|
+
// then throw so the catch block rolls the whole skill dir back.
|
|
175
|
+
failureRecords = audit.errors.map((e) => ({
|
|
176
|
+
source: `.claude/skills/${skill.dirName}/${e.filePath}`,
|
|
177
|
+
type: "skill",
|
|
178
|
+
provider,
|
|
179
|
+
outcome: "failed",
|
|
180
|
+
reason: "audit-rejected",
|
|
181
|
+
detail: e.message,
|
|
182
|
+
}));
|
|
105
183
|
throw new Error(`Skill runtime compatibility audit failed: ${audit.errors.map((e) => e.message).join("; ")}`);
|
|
106
184
|
}
|
|
185
|
+
// Downgraded matches (warn+annotate) become partial-migration records.
|
|
186
|
+
for (const w of audit.waivers) {
|
|
187
|
+
installRecords.push({
|
|
188
|
+
source: `.claude/skills/${skill.dirName}/${w.filePath}`,
|
|
189
|
+
type: "skill",
|
|
190
|
+
provider,
|
|
191
|
+
outcome: "partial",
|
|
192
|
+
reason: "runtime-neutralized",
|
|
193
|
+
detail: `${w.message}: ${w.annotation}`,
|
|
194
|
+
target: w.filePath,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
107
197
|
const skillMdPath = join(skill.sourcePath, "SKILL.md");
|
|
108
198
|
const skillMdTarget = join(targetDir, "SKILL.md");
|
|
109
199
|
const sourceChecksum = computeContentChecksum(await readFile(skillMdPath, "utf-8"));
|
|
@@ -134,7 +224,13 @@ export async function installSkillDirectory(skill, provider, options) {
|
|
|
134
224
|
if (backupDir && existsSync(backupDir)) {
|
|
135
225
|
await rm(backupDir, { recursive: true, force: true });
|
|
136
226
|
}
|
|
137
|
-
return {
|
|
227
|
+
return {
|
|
228
|
+
skill: skill.name,
|
|
229
|
+
provider,
|
|
230
|
+
success: true,
|
|
231
|
+
path: targetDir,
|
|
232
|
+
records: installRecords.length > 0 ? installRecords : undefined,
|
|
233
|
+
};
|
|
138
234
|
}
|
|
139
235
|
catch (err) {
|
|
140
236
|
return {
|
|
@@ -142,6 +238,7 @@ export async function installSkillDirectory(skill, provider, options) {
|
|
|
142
238
|
provider,
|
|
143
239
|
success: false,
|
|
144
240
|
error: err instanceof Error ? err.message : String(err),
|
|
241
|
+
records: failureRecords.length > 0 ? failureRecords : undefined,
|
|
145
242
|
};
|
|
146
243
|
}
|
|
147
244
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-directory-installer.js","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,kGAAkG;AAElG,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACN,uBAAuB,EACvB,6BAA6B,GAE7B,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAyB,MAAM,qCAAqC,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-directory-installer.js","sourceRoot":"","sources":["../../src/migrate/skill-directory-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type ScriptLanguage = "shell" | "python" | "node" | "unknown";
|
|
2
|
+
export declare function languageFor(filePath: string): ScriptLanguage;
|
|
3
|
+
export interface StateChangingResult {
|
|
4
|
+
stateChanging: boolean;
|
|
5
|
+
/** Reason for the first matched state-changing command (for records/escalation). */
|
|
6
|
+
reason?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Report whether `content` contains a state-changing command. `language` scopes the
|
|
10
|
+
* language-specific rules; omit it (or pass "unknown") to apply ALL rules — the
|
|
11
|
+
* most conservative choice. Comment lines and (for shell command patterns) quoted
|
|
12
|
+
* strings are excluded so a mention in a comment/string is not a false positive.
|
|
13
|
+
* `content` is DATA: matched, never executed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectStateChanging(content: string, language?: ScriptLanguage): StateChangingResult;
|
|
16
|
+
//# sourceMappingURL=state-changing-script-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-changing-script-detector.d.ts","sourceRoot":"","sources":["../../src/migrate/state-changing-script-detector.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAmErE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAe5D;AAED,MAAM,WAAW,mBAAmB;IACnC,aAAa,EAAE,OAAO,CAAC;IACvB,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAmBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,cAA0B,GAAG,mBAAmB,CAsB9G"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// Conservative detector for state-changing commands inside a migrated executable
|
|
2
|
+
// script. Used by the fail-closed script policy: a script that both (a) contains a
|
|
3
|
+
// state-changing command AND (b) carries a Claude-runtime coupling match stays
|
|
4
|
+
// FAIL-CLOSED — a rewrite path never downgrades it.
|
|
5
|
+
//
|
|
6
|
+
// SECURITY: this detector is deliberately over-inclusive within each language. A
|
|
7
|
+
// false positive keeps a harmless script fail-closed (safe, escalated with
|
|
8
|
+
// evidence); a false negative would let a destructive script downgrade to a
|
|
9
|
+
// warning (unsafe). It is scoped by language so a numeric comparison (`x > 100`) in
|
|
10
|
+
// a Python/JS file is not mistaken for a shell redirect — that scoping removes a
|
|
11
|
+
// large false-positive class WITHOUT weakening detection of real writes, which in
|
|
12
|
+
// those languages use explicit APIs (open('w'), writeFileSync, os.remove, ...).
|
|
13
|
+
// Content is DATA — pattern-matched here, never executed and never used to build
|
|
14
|
+
// any output.
|
|
15
|
+
import { extname } from "node:path";
|
|
16
|
+
/** Cross-language state-changing commands (invoked via a shell in any script). */
|
|
17
|
+
const COMMON_PATTERNS = [
|
|
18
|
+
// Destructive filesystem removal (word-boundary rm, with a flag or path arg).
|
|
19
|
+
{ pattern: /(^|[;&|(]|\bsudo\s+|&&\s*|\|\|\s*)\brm\s+-|\brm\s+["'$]/m, reason: "runs rm (filesystem delete)" },
|
|
20
|
+
{ pattern: /\brmdir\b/, reason: "runs rmdir" },
|
|
21
|
+
// Remote-mutating git.
|
|
22
|
+
{ pattern: /\bgit\s+push\b/, reason: "runs git push" },
|
|
23
|
+
// Mutating HTTP verbs.
|
|
24
|
+
{ pattern: /\bcurl\b[^\n]*\s-X\s*(POST|PUT|DELETE|PATCH)\b/i, reason: "issues a mutating HTTP request (curl -X)" },
|
|
25
|
+
{ pattern: /\bcurl\b[^\n]*--request\s*(POST|PUT|DELETE|PATCH)\b/i, reason: "issues a mutating HTTP request (curl --request)" },
|
|
26
|
+
{ pattern: /\bwget\b[^\n]*--method=(POST|PUT|DELETE|PATCH)\b/i, reason: "issues a mutating HTTP request (wget --method)" },
|
|
27
|
+
// Security-sensitive env mutation: export/unset of a credential/secret var.
|
|
28
|
+
{
|
|
29
|
+
pattern: /\b(export|unset)\s+[A-Z0-9_]*(TOKEN|SECRET|KEY|PASSWORD|CREDENTIAL|API)[A-Z0-9_]*/,
|
|
30
|
+
reason: "exports/unsets a security-sensitive environment variable",
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
// Shell file-write via redirection. This is line-based instead of a single regex
|
|
34
|
+
// so it can (a) skip comment lines and (b) ignore `>` that lives inside a quoted
|
|
35
|
+
// string (e.g. an embedded awk body `'if (x > 0)'`). A real redirect is `>`/`>>`
|
|
36
|
+
// followed by a filename target, excluding fd redirects (`2>&1`, `>&2`) and the
|
|
37
|
+
// comparison/arrow operators (`>=`, `->`, `=>`). Reduces the large false-positive
|
|
38
|
+
// class of usage-comment arrows and quoted comparisons WITHOUT missing real writes.
|
|
39
|
+
function shellWritesViaRedirection(content) {
|
|
40
|
+
for (const rawLine of content.split("\n")) {
|
|
41
|
+
// Strip a leading-comment line entirely.
|
|
42
|
+
const trimmed = rawLine.replace(/^\s+/, "");
|
|
43
|
+
if (trimmed.startsWith("#"))
|
|
44
|
+
continue;
|
|
45
|
+
// Collapse quoted regions to a single placeholder token `Q` so a `>` INSIDE a
|
|
46
|
+
// string (awk body `'if (x > 0)'`) disappears, but a quoted redirect TARGET
|
|
47
|
+
// (`> "$file"` → `> Q`) is still recognized as a write target.
|
|
48
|
+
const unquoted = rawLine.replace(/'[^']*'/g, "Q").replace(/"[^"]*"/g, "Q");
|
|
49
|
+
// Drop an inline comment tail (best-effort — after quote collapse).
|
|
50
|
+
const code = unquoted.replace(/#.*$/, "");
|
|
51
|
+
// Remove `<placeholder>` angle-bracket tokens (usage text like `<rubric.md>`),
|
|
52
|
+
// which are never real redirects; then discard non-file redirect targets
|
|
53
|
+
// (`>/dev/null`, `>&2`, `> /dev/stderr`).
|
|
54
|
+
const withoutDiscards = code
|
|
55
|
+
.replace(/<[^<>\s][^<>]*>/g, "")
|
|
56
|
+
.replace(/>>?\s*&?\s*\/?dev\/\w+/g, "")
|
|
57
|
+
.replace(/>>?\s*&\s*\d/g, "");
|
|
58
|
+
// A real file-writing redirect: `>`/`>>` not part of an fd/compare/arrow
|
|
59
|
+
// operator, followed by a filename target (quote, $var, path, or word) — but
|
|
60
|
+
// NOT a bare number (`> 0` is an awk/test comparison, not a redirect).
|
|
61
|
+
if (/(^|[^0-9&<>=!$-])>>?(?![>=&])\s*(?![0-9]+\b)[$A-Za-z0-9_./~-]/.test(withoutDiscards))
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
const PYTHON_PATTERNS = [
|
|
67
|
+
{ pattern: /\bopen\s*\([^)]*,\s*["'][wax]\+?b?["']/, reason: "opens a file for writing (Python)" },
|
|
68
|
+
{ pattern: /\.write_text\s*\(|\.write_bytes\s*\(/, reason: "writes a file (Python pathlib)" },
|
|
69
|
+
{ pattern: /\bos\.remove\b|\bos\.unlink\b|\bshutil\.rmtree\b|\bos\.rmdir\b/, reason: "removes files (Python)" },
|
|
70
|
+
{ pattern: /\bos\.makedirs\b|\bos\.mkdir\b|\.mkdir\s*\(/, reason: "creates directories (Python)" },
|
|
71
|
+
];
|
|
72
|
+
const NODE_PATTERNS = [
|
|
73
|
+
{
|
|
74
|
+
pattern: /\b(writeFile|writeFileSync|appendFile|appendFileSync|rmSync|unlink|unlinkSync|mkdirSync)\s*\(/,
|
|
75
|
+
reason: "writes/removes files (Node fs)",
|
|
76
|
+
},
|
|
77
|
+
{ pattern: /\bfs\.rm\s*\(/, reason: "removes files (Node fs)" },
|
|
78
|
+
];
|
|
79
|
+
export function languageFor(filePath) {
|
|
80
|
+
switch (extname(filePath).toLowerCase()) {
|
|
81
|
+
case ".sh":
|
|
82
|
+
return "shell";
|
|
83
|
+
case ".py":
|
|
84
|
+
return "python";
|
|
85
|
+
case ".js":
|
|
86
|
+
case ".cjs":
|
|
87
|
+
case ".mjs":
|
|
88
|
+
case ".ts":
|
|
89
|
+
case ".tsx":
|
|
90
|
+
return "node";
|
|
91
|
+
default:
|
|
92
|
+
return "unknown";
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Strip comment lines + inline comments so a mention in a comment is not a match. */
|
|
96
|
+
function stripComments(content, language) {
|
|
97
|
+
const lineComment = language === "node" ? "//" : "#";
|
|
98
|
+
return content
|
|
99
|
+
.split("\n")
|
|
100
|
+
.map((raw) => {
|
|
101
|
+
const trimmed = raw.replace(/^\s+/, "");
|
|
102
|
+
if (trimmed.startsWith(lineComment))
|
|
103
|
+
return "";
|
|
104
|
+
// Best-effort inline-comment strip after removing quoted regions so a `#`/`//`
|
|
105
|
+
// inside a string is not treated as a comment start.
|
|
106
|
+
const unquoted = raw.replace(/'[^']*'/g, "''").replace(/"[^"]*"/g, '""');
|
|
107
|
+
const idx = unquoted.indexOf(lineComment);
|
|
108
|
+
return idx >= 0 ? raw.slice(0, idx) : raw;
|
|
109
|
+
})
|
|
110
|
+
.join("\n");
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Report whether `content` contains a state-changing command. `language` scopes the
|
|
114
|
+
* language-specific rules; omit it (or pass "unknown") to apply ALL rules — the
|
|
115
|
+
* most conservative choice. Comment lines and (for shell command patterns) quoted
|
|
116
|
+
* strings are excluded so a mention in a comment/string is not a false positive.
|
|
117
|
+
* `content` is DATA: matched, never executed.
|
|
118
|
+
*/
|
|
119
|
+
export function detectStateChanging(content, language = "unknown") {
|
|
120
|
+
const code = stripComments(content, language);
|
|
121
|
+
// Shell command patterns (rm/git/curl/export) — also strip quoted strings so a
|
|
122
|
+
// command name mentioned inside a string literal is not a match.
|
|
123
|
+
const shellCode = code.replace(/'[^']*'/g, "''").replace(/"[^"]*"/g, '""');
|
|
124
|
+
for (const { pattern, reason } of COMMON_PATTERNS) {
|
|
125
|
+
if (pattern.test(shellCode))
|
|
126
|
+
return { stateChanging: true, reason };
|
|
127
|
+
}
|
|
128
|
+
// Language file-write APIs — need argument quotes preserved (e.g. open(..,'w')).
|
|
129
|
+
if (language === "python" || language === "unknown") {
|
|
130
|
+
for (const { pattern, reason } of PYTHON_PATTERNS)
|
|
131
|
+
if (pattern.test(code))
|
|
132
|
+
return { stateChanging: true, reason };
|
|
133
|
+
}
|
|
134
|
+
if (language === "node" || language === "unknown") {
|
|
135
|
+
for (const { pattern, reason } of NODE_PATTERNS)
|
|
136
|
+
if (pattern.test(code))
|
|
137
|
+
return { stateChanging: true, reason };
|
|
138
|
+
}
|
|
139
|
+
if ((language === "shell" || language === "unknown") && shellWritesViaRedirection(code)) {
|
|
140
|
+
return { stateChanging: true, reason: "writes files via redirection" };
|
|
141
|
+
}
|
|
142
|
+
return { stateChanging: false };
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=state-changing-script-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-changing-script-detector.js","sourceRoot":"","sources":["../../src/migrate/state-changing-script-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
import { type ReferenceIntegrityIndex } from "../references/fence-aware-reference-rewriter.js";
|
|
2
|
+
import type { ReferenceOccurrence } from "../references/reference-types.js";
|
|
2
3
|
import type { ReconcileAction } from "../reconcile/reconcile-types.js";
|
|
3
4
|
import type { PortableItem, PortableType, ProviderType, SkillInfo } from "../types.js";
|
|
5
|
+
import type { MigrationDecisionRecord } from "./migration-record-types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Run-ledger: an append-only accumulator of per-artifact decision records emitted
|
|
8
|
+
* across the migration run (Phase 1 reference occurrences, Phase 2 hook decisions,
|
|
9
|
+
* Phase 3 skill audit/waiver decisions, plus the orchestrator's install outcomes).
|
|
10
|
+
* The Phase 6 report writer serializes this ledger into `migration-report.{json,md}`.
|
|
11
|
+
*
|
|
12
|
+
* This is purely additive to the existing preflight `ConversionReport` — the
|
|
13
|
+
* preflight builder is unchanged; the ledger is the new run-time collection point.
|
|
14
|
+
*/
|
|
15
|
+
export declare class MigrationLedger {
|
|
16
|
+
private readonly records;
|
|
17
|
+
/** Append one decision record (no-op for null/undefined). */
|
|
18
|
+
add(record: MigrationDecisionRecord | null | undefined): void;
|
|
19
|
+
/** Append many decision records; null/undefined entries are ignored. */
|
|
20
|
+
addAll(records: readonly (MigrationDecisionRecord | null | undefined)[] | undefined): void;
|
|
21
|
+
/** Snapshot of every decision recorded so far (defensive copy). */
|
|
22
|
+
all(): MigrationDecisionRecord[];
|
|
23
|
+
get size(): number;
|
|
24
|
+
}
|
|
4
25
|
export interface ConversionReport {
|
|
5
26
|
/** Preserved-with-warning references: "file:line — ref (reason)" */
|
|
6
27
|
warnedReferences: string[];
|
|
@@ -10,6 +31,13 @@ export interface ConversionReport {
|
|
|
10
31
|
budgetLines: string[];
|
|
11
32
|
/** Internal invariant violations from the unresolved-reference scanner */
|
|
12
33
|
validationErrors: string[];
|
|
34
|
+
/**
|
|
35
|
+
* Raw preserved-with-warning occurrences (file/line/original/reason), for the
|
|
36
|
+
* run-report ledger. Additive: the preflight printer reads `warnedReferences`;
|
|
37
|
+
* this field lets the ledger attach concrete file:line:pattern detail per
|
|
38
|
+
* artifact. The `.env` reason is reclassified downstream via classifyEnvReference.
|
|
39
|
+
*/
|
|
40
|
+
preservedOccurrences: ReferenceOccurrence[];
|
|
13
41
|
}
|
|
14
42
|
export declare function buildConversionReport(input: {
|
|
15
43
|
actions: ReconcileAction[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-conversion-report.d.ts","sourceRoot":"","sources":["../../../src/migrate/validation/migrate-conversion-report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrate-conversion-report.d.ts","sourceRoot":"","sources":["../../../src/migrate/validation/migrate-conversion-report.ts"],"names":[],"mappings":"AAUA,OAAO,EAIN,KAAK,uBAAuB,EAC5B,MAAM,iDAAiD,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAG3E;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IAEzD,6DAA6D;IAC7D,GAAG,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAI7D,wEAAwE;IACxE,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,uBAAuB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,SAAS,GAAG,IAAI;IAK1F,mEAAmE;IACnE,GAAG,IAAI,uBAAuB,EAAE;IAIhC,IAAI,IAAI,IAAI,MAAM,CAEjB;CACD;AAED,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gFAAgF;IAChF,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,4DAA4D;IAC5D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,0EAA0E;IAC1E,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;CAC5C;AAqBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC5C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;IAClD,gBAAgB,EAAE,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;IACjD,YAAY,EAAE,uBAAuB,CAAC;CACtC,GAAG,gBAAgB,CAqFnB"}
|