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
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// Minimal durable task state (Phase 4): the one per-task record that lets a fresh session
|
|
2
|
+
// resume and audit capability use. Plans stay the human source of truth — this record JOINS
|
|
3
|
+
// to a plan by path, it does not replace it. Compatibility is governed by the record's own
|
|
4
|
+
// `schemaVersion` checked against the CLI's supported range (OQ6 decision): the record is
|
|
5
|
+
// decoupled from the npm-CLI version line and the kit-release version line, which are recorded
|
|
6
|
+
// as provenance only. Integrity: validated id, realpath containment, atomic replace under a
|
|
7
|
+
// per-file lock (reuses the install-metadata writer pattern).
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync } from "node:fs";
|
|
9
|
+
import { rename, unlink, writeFile } from "node:fs/promises";
|
|
10
|
+
import { join, relative, isAbsolute, sep } from "node:path";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { withFileLock } from "./file-lock.js";
|
|
13
|
+
import { distinctRepos } from "./repo-context.js";
|
|
14
|
+
/** The record schema version THIS CLI writes. Bump on any breaking record shape change. */
|
|
15
|
+
export const TASK_RECORD_SCHEMA_VERSION = "1.0";
|
|
16
|
+
/** Record schema versions this CLI can safely READ. A record outside this set is rejected. */
|
|
17
|
+
export const SUPPORTED_TASK_RECORD_SCHEMAS = new Set(["1.0"]);
|
|
18
|
+
/** Valid task id: lowercase slug, filename-safe (it becomes `<id>.json`). */
|
|
19
|
+
const TASK_ID_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
20
|
+
export const CapabilityDecisionSchema = z.object({
|
|
21
|
+
capabilityId: z.string(),
|
|
22
|
+
decision: z.enum(["selected", "skipped", "unavailable", "unsupported"]),
|
|
23
|
+
reason: z.string(),
|
|
24
|
+
/** References the Phase-3 availability snapshot that justified the decision. */
|
|
25
|
+
adapterSnapshotId: z.string().optional(),
|
|
26
|
+
});
|
|
27
|
+
export const RepoRefSchema = z.object({
|
|
28
|
+
/** Stable repository identity (remote URL, path hash, or name) — never invented. */
|
|
29
|
+
identity: z.string(),
|
|
30
|
+
/** VCS revision when available; null for non-git roots (no fabricated revision). */
|
|
31
|
+
revision: z.string().nullable(),
|
|
32
|
+
});
|
|
33
|
+
export const TaskRecordSchema = z.object({
|
|
34
|
+
schemaVersion: z.literal("1.0"),
|
|
35
|
+
taskId: z.string().regex(TASK_ID_RE),
|
|
36
|
+
planPath: z.string().nullable().default(null),
|
|
37
|
+
status: z.enum(["active", "blocked", "done"]),
|
|
38
|
+
currentStep: z.string().default(""),
|
|
39
|
+
repos: z.array(RepoRefSchema).default([]),
|
|
40
|
+
blockers: z.array(z.string()).default([]),
|
|
41
|
+
nextAction: z.string().default(""),
|
|
42
|
+
verificationSummaries: z.array(z.object({ ref: z.string(), result: z.string() })).default([]),
|
|
43
|
+
evidenceRefs: z.array(z.string()).default([]),
|
|
44
|
+
capabilityDecisions: z.array(CapabilityDecisionSchema).default([]),
|
|
45
|
+
/** Provenance only (never the compatibility gate): who wrote this record. */
|
|
46
|
+
writtenByCli: z.string().default(""),
|
|
47
|
+
writtenByKit: z.string().default(""),
|
|
48
|
+
updatedAt: z.string(),
|
|
49
|
+
})
|
|
50
|
+
// Preserve unknown keys through a read→write round-trip. A future CLI may add an
|
|
51
|
+
// additive field WITHOUT bumping schemaVersion (per the versioning note above); an older
|
|
52
|
+
// CLI must not silently strip it when it updates the record.
|
|
53
|
+
.passthrough();
|
|
54
|
+
/** Thrown when a record's schemaVersion is outside this CLI's supported range (loud, non-zero). */
|
|
55
|
+
export class IncompatibleTaskRecordError extends Error {
|
|
56
|
+
detail;
|
|
57
|
+
constructor(detail) {
|
|
58
|
+
super(`Incompatible task record: ${detail}`);
|
|
59
|
+
this.detail = detail;
|
|
60
|
+
this.name = "IncompatibleTaskRecordError";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* `<projectRoot>/tasks/active` — the durable task-record home. This is the SAME path for a
|
|
65
|
+
* flat-copy AND a plugin install: task records are the CONSUMER PROJECT's state (keyed to the
|
|
66
|
+
* project the agent is working in, `process.cwd()`), not plugin-owned state. `tasks/` is
|
|
67
|
+
* framework-internal state that keeps its path (skill-authoring Rule 2's exception), so it does
|
|
68
|
+
* NOT move to `${CLAUDE_PLUGIN_DATA}` — that root is for a plugin's OWN cross-session data, and
|
|
69
|
+
* putting consumer task records there would misplace them. Resolves P4 open decision #2.
|
|
70
|
+
*/
|
|
71
|
+
function activeDir(projectRoot) {
|
|
72
|
+
return join(projectRoot, "tasks", "active");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The current active-plan pointer, mirroring the existing hook contract
|
|
76
|
+
* (`session-state/active-plan.json` → `path` || `slug`, else legacy plain-text
|
|
77
|
+
* `session-state/active-plan`). Null when absent. This is the CHECKPOINT JOIN: the task record
|
|
78
|
+
* whose `planPath` matches the pointer is the current task (resolves P4 open decision #3).
|
|
79
|
+
*/
|
|
80
|
+
export function readActivePlanPointer(projectRoot) {
|
|
81
|
+
const jsonPath = join(projectRoot, "session-state", "active-plan.json");
|
|
82
|
+
if (existsSync(jsonPath)) {
|
|
83
|
+
try {
|
|
84
|
+
const d = JSON.parse(readFileSync(jsonPath, "utf-8"));
|
|
85
|
+
const p = (typeof d.path === "string" && d.path) || (typeof d.slug === "string" && d.slug) || "";
|
|
86
|
+
if (p.trim())
|
|
87
|
+
return p.trim();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
/* fall through to legacy */
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const legacy = join(projectRoot, "session-state", "active-plan");
|
|
94
|
+
if (existsSync(legacy)) {
|
|
95
|
+
const txt = readFileSync(legacy, "utf-8").trim();
|
|
96
|
+
if (txt)
|
|
97
|
+
return txt;
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
/** Resolve a task-record path and assert it stays contained under tasks/active (realpath). */
|
|
102
|
+
function recordPath(projectRoot, taskId) {
|
|
103
|
+
if (!TASK_ID_RE.test(taskId))
|
|
104
|
+
throw new Error(`invalid task id: ${JSON.stringify(taskId)}`);
|
|
105
|
+
const dir = activeDir(projectRoot);
|
|
106
|
+
const abs = join(dir, `${taskId}.json`);
|
|
107
|
+
// Lexical + realpath containment: the id regex already bars separators/.., this is defense in depth.
|
|
108
|
+
const rel = relative(dir, abs);
|
|
109
|
+
if (rel === ".." || rel.startsWith(".." + sep) || isAbsolute(rel))
|
|
110
|
+
throw new Error(`task path escapes tasks/active: ${taskId}`);
|
|
111
|
+
return abs;
|
|
112
|
+
}
|
|
113
|
+
/** Parse + version-check a record already read from disk. Throws on schema drift. */
|
|
114
|
+
function parseAndCheck(raw) {
|
|
115
|
+
const parsed = JSON.parse(raw);
|
|
116
|
+
if (typeof parsed.schemaVersion === "string" && !SUPPORTED_TASK_RECORD_SCHEMAS.has(parsed.schemaVersion)) {
|
|
117
|
+
throw new IncompatibleTaskRecordError(`record schemaVersion "${parsed.schemaVersion}" not in supported ${JSON.stringify([...SUPPORTED_TASK_RECORD_SCHEMAS])}`);
|
|
118
|
+
}
|
|
119
|
+
return TaskRecordSchema.parse(parsed);
|
|
120
|
+
}
|
|
121
|
+
/** Read + version-check a single task record. Throws IncompatibleTaskRecordError on schema drift. */
|
|
122
|
+
export function readTaskRecord(projectRoot, taskId) {
|
|
123
|
+
const abs = recordPath(projectRoot, taskId);
|
|
124
|
+
if (!existsSync(abs))
|
|
125
|
+
return null;
|
|
126
|
+
return parseAndCheck(readFileSync(abs, "utf-8"));
|
|
127
|
+
}
|
|
128
|
+
/** Atomic temp+rename write of an already-validated record (NO lock — callers hold it). */
|
|
129
|
+
async function atomicReplace(target, record) {
|
|
130
|
+
const serialized = JSON.stringify(record, null, 2) + "\n";
|
|
131
|
+
const tmp = `${target}.tmp-${process.pid}`;
|
|
132
|
+
try {
|
|
133
|
+
await writeFile(tmp, serialized, "utf-8");
|
|
134
|
+
await rename(tmp, target);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
try {
|
|
138
|
+
await unlink(tmp);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
/* best-effort cleanup */
|
|
142
|
+
}
|
|
143
|
+
throw err;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Prepare tasks/active and assert realpath containment; returns the resolved target path. */
|
|
147
|
+
function prepareTarget(projectRoot, taskId) {
|
|
148
|
+
const dir = activeDir(projectRoot);
|
|
149
|
+
mkdirSync(dir, { recursive: true });
|
|
150
|
+
// Realpath containment — reject a symlinked tasks/active escaping the project root.
|
|
151
|
+
const relDir = relative(realpathSync(projectRoot), realpathSync(dir));
|
|
152
|
+
if (relDir.startsWith("..") || isAbsolute(relDir))
|
|
153
|
+
throw new Error("tasks/active escapes the project root");
|
|
154
|
+
return recordPath(projectRoot, taskId);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Atomically write a task record under a per-id lock. Refuses to overwrite an on-disk record
|
|
158
|
+
* whose schemaVersion this CLI cannot read (fails closed — never clobbers an incompatible
|
|
159
|
+
* record). Prefer `updateTaskRecord` for read-modify-write; this is the low-level put.
|
|
160
|
+
*/
|
|
161
|
+
export async function writeTaskRecord(projectRoot, record) {
|
|
162
|
+
const validated = TaskRecordSchema.parse(record);
|
|
163
|
+
const target = prepareTarget(projectRoot, validated.taskId);
|
|
164
|
+
const lockPath = join(activeDir(projectRoot), `.${validated.taskId}.lock`);
|
|
165
|
+
await withFileLock(lockPath, async () => {
|
|
166
|
+
if (existsSync(target))
|
|
167
|
+
parseAndCheck(readFileSync(target, "utf-8")); // throws if on-disk is incompatible
|
|
168
|
+
await atomicReplace(target, validated);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Read → mutate → write a task record atomically under ONE lock, so concurrent updates to the
|
|
173
|
+
* same id cannot lose each other's changes (the read-modify-write cycle is serialized). The
|
|
174
|
+
* mutator receives the current record (or null if absent) and returns the next one. An
|
|
175
|
+
* incompatible on-disk record makes the read throw before any write — it is never clobbered.
|
|
176
|
+
*/
|
|
177
|
+
export async function updateTaskRecord(projectRoot, taskId, mutate) {
|
|
178
|
+
const target = prepareTarget(projectRoot, taskId);
|
|
179
|
+
const lockPath = join(activeDir(projectRoot), `.${taskId}.lock`);
|
|
180
|
+
return withFileLock(lockPath, async () => {
|
|
181
|
+
const existing = existsSync(target) ? parseAndCheck(readFileSync(target, "utf-8")) : null;
|
|
182
|
+
const next = TaskRecordSchema.parse(mutate(existing));
|
|
183
|
+
await atomicReplace(target, next);
|
|
184
|
+
return next;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Record a repo-context envelope's evidence into an EXISTING durable task record (Phase 5
|
|
189
|
+
* slice 2). Merges — never replaces — so evidence accumulates across a task's steps:
|
|
190
|
+
* - `repos`: the DISTINCT owning repos of the envelope's evidence (via `distinctRepos`), unioned
|
|
191
|
+
* with the record's repos by identity; the newest envelope's revision wins for a repo already
|
|
192
|
+
* present. Multi-repo context is preserved: every owning repo stays its own entry.
|
|
193
|
+
* - `evidenceRefs`: the evidence PATHS unioned with the record's, deduped. The record stays a
|
|
194
|
+
* COMPACT resume summary — the full envelope (with content hashes) lives on disk and is
|
|
195
|
+
* re-checked on demand via `context check`, not duplicated here.
|
|
196
|
+
*
|
|
197
|
+
* Refuses to create a record: context evidence belongs to an active durable task (task-state
|
|
198
|
+
* emission Rule 1). `now` is passed in — the pure core never reads the clock.
|
|
199
|
+
*/
|
|
200
|
+
export async function recordContextEvidence(projectRoot, taskId, envelope, now) {
|
|
201
|
+
return updateTaskRecord(projectRoot, taskId, (existing) => {
|
|
202
|
+
if (!existing)
|
|
203
|
+
throw new Error(`no active task record "${taskId}" — context evidence is recorded only for an existing durable task`);
|
|
204
|
+
// Union owning repos by identity (newest revision wins for a repo already recorded).
|
|
205
|
+
const revByIdentity = new Map(existing.repos.map((r) => [r.identity, r.revision]));
|
|
206
|
+
for (const r of distinctRepos(envelope.evidence))
|
|
207
|
+
revByIdentity.set(r.identity, r.revision);
|
|
208
|
+
const repos = [...revByIdentity]
|
|
209
|
+
.map(([identity, revision]) => ({ identity, revision }))
|
|
210
|
+
.sort((a, b) => (a.identity < b.identity ? -1 : a.identity > b.identity ? 1 : 0));
|
|
211
|
+
// Union evidence paths (compact resume summary — never the hashes).
|
|
212
|
+
const paths = new Set(existing.evidenceRefs);
|
|
213
|
+
for (const e of envelope.evidence)
|
|
214
|
+
paths.add(e.path);
|
|
215
|
+
return { ...existing, repos, evidenceRefs: [...paths].sort(), updatedAt: now };
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
/** List all active-dir task ids (record filenames), for resume reconstruction. */
|
|
219
|
+
export function listTaskRecordIds(projectRoot) {
|
|
220
|
+
const dir = activeDir(projectRoot);
|
|
221
|
+
if (!existsSync(dir))
|
|
222
|
+
return [];
|
|
223
|
+
return readdirSync(dir)
|
|
224
|
+
.filter((f) => f.endsWith(".json"))
|
|
225
|
+
.map((f) => f.replace(/\.json$/, ""))
|
|
226
|
+
.filter((id) => TASK_ID_RE.test(id))
|
|
227
|
+
.sort();
|
|
228
|
+
}
|
|
229
|
+
export function reconstructResumeState(projectRoot) {
|
|
230
|
+
const records = [];
|
|
231
|
+
const issues = [];
|
|
232
|
+
// Listing itself is guarded so a dir-removal race can't crash the whole reconstruction.
|
|
233
|
+
let ids = [];
|
|
234
|
+
try {
|
|
235
|
+
ids = listTaskRecordIds(projectRoot);
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
issues.push({ taskId: "(listing)", problem: err.message });
|
|
239
|
+
}
|
|
240
|
+
for (const id of ids) {
|
|
241
|
+
try {
|
|
242
|
+
const r = readTaskRecord(projectRoot, id);
|
|
243
|
+
if (r)
|
|
244
|
+
records.push(r);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
issues.push({ taskId: id, problem: err.message });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return { records, issues, activePlanPointer: readActivePlanPointer(projectRoot) };
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=task-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-record.js","sourceRoot":"","sources":["../../src/core/task-record.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,4FAA4F;AAC5F,2FAA2F;AAC3F,0FAA0F;AAC1F,+FAA+F;AAC/F,4FAA4F;AAC5F,8DAA8D;AAC9D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAwB,MAAM,mBAAmB,CAAC;AAExE,2FAA2F;AAC3F,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAChD,8FAA8F;AAC9F,MAAM,CAAC,MAAM,6BAA6B,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAEnF,6EAA6E;AAC7E,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAE/C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IACvE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,gFAAgF;IAChF,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,oFAAoF;IACpF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,oFAAoF;IACpF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAClC,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7F,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7C,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAClE,6EAA6E;IAC7E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC;IACD,iFAAiF;IACjF,yFAAyF;IACzF,6DAA6D;KAC5D,WAAW,EAAE,CAAC;AAGhB,mGAAmG;AACnG,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACzB;IAA5B,YAA4B,MAAc;QACzC,KAAK,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;QADlB,WAAM,GAAN,MAAM,CAAQ;QAEzC,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC3C,CAAC;CACD;AAED;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,WAAmB;IACrC,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;IACxE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACJ,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAuC,CAAC;YAC5F,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACjG,IAAI,CAAC,CAAC,IAAI,EAAE;gBAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACR,4BAA4B;QAC7B,CAAC;IACF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,8FAA8F;AAC9F,SAAS,UAAU,CAAC,WAAmB,EAAE,MAAc;IACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;IACxC,qGAAqG;IACrG,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,EAAE,CAAC,CAAC;IAChI,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,qFAAqF;AACrF,SAAS,aAAa,CAAC,GAAW;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgC,CAAC;IAC9D,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1G,MAAM,IAAI,2BAA2B,CACpC,yBAAyB,MAAM,CAAC,aAAa,sBAAsB,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC,EAAE,CACvH,CAAC;IACH,CAAC;IACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,MAAc;IACjE,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,2FAA2F;AAC3F,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,MAAkB;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1D,MAAM,GAAG,GAAG,GAAG,MAAM,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3C,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACR,yBAAyB;QAC1B,CAAC;QACD,MAAM,GAAG,CAAC;IACX,CAAC;AACF,CAAC;AAED,8FAA8F;AAC9F,SAAS,aAAa,CAAC,WAAmB,EAAE,MAAc;IACzD,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IACnC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,oFAAoF;IACpF,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC5G,OAAO,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB,EAAE,MAAkB;IAC5E,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,SAAS,CAAC,MAAM,OAAO,CAAC,CAAC;IAC3E,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACvC,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,oCAAoC;QAC1G,MAAM,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,WAAmB,EACnB,MAAc,EACd,MAAmD;IAEnD,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,MAAM,OAAO,CAAC,CAAC;IACjE,OAAO,YAAY,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1F,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtD,MAAM,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,WAAmB,EACnB,MAAc,EACd,QAAyB,EACzB,GAAW;IAEX,OAAO,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE;QACzD,IAAI,CAAC,QAAQ;YACZ,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,oEAAoE,CAAC,CAAC;QACvH,qFAAqF;QACrF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnF,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,CAAC,GAAG,aAAa,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;aACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,oEAAoE;QACpE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAChF,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACpD,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,WAAW,CAAC,GAAG,CAAC;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;SACpC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACnC,IAAI,EAAE,CAAC;AACV,CAAC;AAaD,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACzD,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,wFAAwF;IACxF,IAAI,GAAG,GAAa,EAAE,CAAC;IACvB,IAAI,CAAC;QACJ,GAAG,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC;YACJ,MAAM,CAAC,GAAG,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,qBAAqB,CAAC,WAAW,CAAC,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type InventoryEntry } from "./build-inventory.js";
|
|
2
|
+
import { type CapabilityEntry } from "./capability.js";
|
|
3
|
+
export interface CapabilityIssue {
|
|
4
|
+
level: "error" | "warn";
|
|
5
|
+
capabilityId: string | null;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
/** Validate the manifest built from `claudeDir`. Returns all issues (empty ⇒ clean). */
|
|
9
|
+
export declare function validateCapabilities(claudeDir: string): CapabilityIssue[];
|
|
10
|
+
/** Pure validation over a built manifest + inventory. Injectable for testing. */
|
|
11
|
+
export declare function validateCapabilityEntries(entries: CapabilityEntry[], inventoryEntries: InventoryEntry[]): CapabilityIssue[];
|
|
12
|
+
//# sourceMappingURL=validate-capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-capabilities.d.ts","sourceRoot":"","sources":["../../src/core/validate-capabilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CAChB;AAoCD,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAEzE;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,eAAe,EAAE,CA+F3H"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Validate a capability manifest against the design invariants (Phase 2 §1/§5). Pure over
|
|
2
|
+
// the built manifest + inventory, so it is testable without a live install. Severity:
|
|
3
|
+
// ERROR = a broken contract (cross-ref, containment, uniqueness, unknown invocation ID,
|
|
4
|
+
// dependency cycle); WARN = a coverage/authoring smell (uncovered artifact, duplicate
|
|
5
|
+
// intent across capabilities). No check ever executes a script or trusts a command string.
|
|
6
|
+
import { buildCapabilities } from "./build-capabilities.js";
|
|
7
|
+
import { buildInventory } from "./build-inventory.js";
|
|
8
|
+
import { AUTHORED_CONTEXT_REQUIREMENTS, AUTHORED_INTENTS } from "./capability-authored.js";
|
|
9
|
+
import { KNOWN_INVOCATION_IDS } from "./capability.js";
|
|
10
|
+
/** True when `rel` is a `.claude/`-relative path with no escape (no `..`, not absolute). */
|
|
11
|
+
function isContained(rel) {
|
|
12
|
+
if (rel.startsWith("/") || /^[A-Za-z]:[\\/]/.test(rel))
|
|
13
|
+
return false;
|
|
14
|
+
return !rel.split(/[\\/]/).includes("..");
|
|
15
|
+
}
|
|
16
|
+
/** Detect a cycle in the upstream-dependency graph (DFS with a recursion stack). */
|
|
17
|
+
function findCycle(entries) {
|
|
18
|
+
const upstream = new Map(entries.map((e) => [e.id, e.dependencies.upstream]));
|
|
19
|
+
const state = new Map();
|
|
20
|
+
const stack = [];
|
|
21
|
+
const visit = (id) => {
|
|
22
|
+
if (state.get(id) === "done")
|
|
23
|
+
return null;
|
|
24
|
+
if (state.get(id) === "visiting")
|
|
25
|
+
return [...stack.slice(stack.indexOf(id)), id];
|
|
26
|
+
state.set(id, "visiting");
|
|
27
|
+
stack.push(id);
|
|
28
|
+
for (const dep of upstream.get(id) ?? []) {
|
|
29
|
+
if (!upstream.has(dep))
|
|
30
|
+
continue; // dangling deps are reported by the coverage pass below
|
|
31
|
+
const cycle = visit(dep);
|
|
32
|
+
if (cycle)
|
|
33
|
+
return cycle;
|
|
34
|
+
}
|
|
35
|
+
stack.pop();
|
|
36
|
+
state.set(id, "done");
|
|
37
|
+
return null;
|
|
38
|
+
};
|
|
39
|
+
for (const e of entries) {
|
|
40
|
+
const cycle = visit(e.id);
|
|
41
|
+
if (cycle)
|
|
42
|
+
return cycle;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/** Validate the manifest built from `claudeDir`. Returns all issues (empty ⇒ clean). */
|
|
47
|
+
export function validateCapabilities(claudeDir) {
|
|
48
|
+
return validateCapabilityEntries(buildCapabilities(claudeDir), buildInventory(claudeDir).entries);
|
|
49
|
+
}
|
|
50
|
+
/** Pure validation over a built manifest + inventory. Injectable for testing. */
|
|
51
|
+
export function validateCapabilityEntries(entries, inventoryEntries) {
|
|
52
|
+
const issues = [];
|
|
53
|
+
const invById = new Map(inventoryEntries.map((e) => [e.id, e]));
|
|
54
|
+
const capIds = new Set();
|
|
55
|
+
const aliasOwners = new Map();
|
|
56
|
+
const intentOwners = new Map();
|
|
57
|
+
for (const c of entries) {
|
|
58
|
+
// id uniqueness
|
|
59
|
+
if (capIds.has(c.id))
|
|
60
|
+
issues.push({ level: "error", capabilityId: c.id, message: "duplicate capability id" });
|
|
61
|
+
capIds.add(c.id);
|
|
62
|
+
// path containment (disk-backed kinds only)
|
|
63
|
+
if (c.sourcePath !== null && !isContained(c.sourcePath)) {
|
|
64
|
+
issues.push({ level: "error", capabilityId: c.id, message: `sourcePath escapes .claude/: ${c.sourcePath}` });
|
|
65
|
+
}
|
|
66
|
+
// inventory cross-reference + owner agreement (disk-backed kinds only)
|
|
67
|
+
if (c.inventoryId !== null && c.sourcePath !== null) {
|
|
68
|
+
const inv = invById.get(c.inventoryId);
|
|
69
|
+
if (!inv) {
|
|
70
|
+
issues.push({ level: "error", capabilityId: c.id, message: `inventoryId has no matching inventory entry: ${c.inventoryId}` });
|
|
71
|
+
}
|
|
72
|
+
else if (inv.owner && c.owner && inv.owner !== c.owner) {
|
|
73
|
+
issues.push({ level: "error", capabilityId: c.id, message: `denormalized owner "${c.owner}" disagrees with inventory "${inv.owner}"` });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// invocation id must be a known logical id — hostile frontmatter cannot smuggle a command
|
|
77
|
+
if (!KNOWN_INVOCATION_IDS.has(c.invocation.id)) {
|
|
78
|
+
issues.push({ level: "error", capabilityId: c.id, message: `unknown invocation id: ${c.invocation.id}` });
|
|
79
|
+
}
|
|
80
|
+
// alias uniqueness across entries
|
|
81
|
+
for (const a of c.aliases) {
|
|
82
|
+
const prior = aliasOwners.get(a);
|
|
83
|
+
if (prior && prior !== c.id)
|
|
84
|
+
issues.push({ level: "error", capabilityId: c.id, message: `alias "${a}" also on ${prior}` });
|
|
85
|
+
aliasOwners.set(a, c.id);
|
|
86
|
+
}
|
|
87
|
+
// intent duplication tracking (WARN — inferred keywords can legitimately overlap)
|
|
88
|
+
for (const i of c.intents) {
|
|
89
|
+
intentOwners.set(i, [...(intentOwners.get(i) ?? []), c.id]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const [intent, owners] of intentOwners) {
|
|
93
|
+
if (owners.length > 1) {
|
|
94
|
+
issues.push({ level: "warn", capabilityId: null, message: `intent "${intent}" maps to multiple capabilities: ${owners.join(", ")}` });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Dangling upstream dependency: an upstream id with no matching capability (WARN —
|
|
98
|
+
// a coherence smell, not a hard break, in this pre-resolver slice).
|
|
99
|
+
for (const c of entries) {
|
|
100
|
+
for (const dep of c.dependencies.upstream) {
|
|
101
|
+
if (!capIds.has(dep)) {
|
|
102
|
+
issues.push({ level: "warn", capabilityId: c.id, message: `upstream dependency has no matching capability: ${dep}` });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// coverage: every enumerated invocable-kind artifact should have a capability (WARN)
|
|
107
|
+
const capInventoryIds = new Set(entries.map((e) => e.inventoryId).filter((x) => x !== null));
|
|
108
|
+
for (const inv of inventoryEntries) {
|
|
109
|
+
if (inv.type === "rule")
|
|
110
|
+
continue; // rules are inventory-only context, not capabilities
|
|
111
|
+
if (!capInventoryIds.has(inv.id)) {
|
|
112
|
+
issues.push({ level: "warn", capabilityId: null, message: `inventory artifact has no capability: ${inv.path}` });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// dependency cycle (ERROR)
|
|
116
|
+
const cycle = findCycle(entries);
|
|
117
|
+
if (cycle)
|
|
118
|
+
issues.push({ level: "error", capabilityId: null, message: `dependency cycle: ${cycle.join(" → ")}` });
|
|
119
|
+
// Authored-intent overlay key with no matching capability (WARN): expected on a partial
|
|
120
|
+
// consumer install that omits a flagship skill, but on a full authoring install it means
|
|
121
|
+
// a dead key (e.g. after a skill rename) silently dropping curated intents. The hard guard
|
|
122
|
+
// against a rename is the resolver test asserting every authored phrase resolves to its owner.
|
|
123
|
+
for (const key of Object.keys(AUTHORED_INTENTS)) {
|
|
124
|
+
if (!capIds.has(key)) {
|
|
125
|
+
issues.push({ level: "warn", capabilityId: key, message: `AUTHORED_INTENTS key has no matching capability (partial install or renamed skill): ${key}` });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Symmetric dead-key guard for the repo-context overlay (Phase 5): an
|
|
129
|
+
// AUTHORED_CONTEXT_REQUIREMENTS key with no capability is a partial install or a rename that
|
|
130
|
+
// silently drops the context requirement from a source-grounded flow.
|
|
131
|
+
for (const key of Object.keys(AUTHORED_CONTEXT_REQUIREMENTS)) {
|
|
132
|
+
if (!capIds.has(key)) {
|
|
133
|
+
issues.push({ level: "warn", capabilityId: key, message: `AUTHORED_CONTEXT_REQUIREMENTS key has no matching capability (partial install or renamed skill): ${key}` });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return issues;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=validate-capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-capabilities.js","sourceRoot":"","sources":["../../src/core/validate-capabilities.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,9 @@ import pc from "picocolors";
|
|
|
7
7
|
import { init } from "./commands/init.js";
|
|
8
8
|
import { upgrade } from "./commands/upgrade.js";
|
|
9
9
|
import { validate } from "./commands/validate.js";
|
|
10
|
+
import { capabilities } from "./commands/capabilities.js";
|
|
11
|
+
import { taskState } from "./commands/task-state.js";
|
|
12
|
+
import { context } from "./commands/context.js";
|
|
10
13
|
import { budget, contextBudget } from "./commands/budget.js";
|
|
11
14
|
import { memory } from "./commands/memory.js";
|
|
12
15
|
import { verdictGate } from "./commands/verdict-gate.js";
|
|
@@ -35,15 +38,18 @@ ${pc.bold("Usage:")}
|
|
|
35
38
|
${pc.bold("Commands:")}
|
|
36
39
|
${pc.green("init")} Scaffold or update MeowKit in the current project
|
|
37
40
|
${pc.green("upgrade")} Upgrade MeowKit to the latest version
|
|
38
|
-
${pc.green("validate")} Validate .claude/ project structure
|
|
41
|
+
${pc.green("validate")} Validate .claude/ project structure (--mode authoring|flat-copy; auto-detected)
|
|
42
|
+
${pc.green("capabilities")} Inspect/resolve the capability manifest ('capabilities list|explain <id>|resolve --intent "…"|view|bootstrap|projections' [--json])
|
|
39
43
|
${pc.green("budget")} View token usage and cost log ('budget context' for per-profile size)
|
|
40
44
|
${pc.green("memory")} Manage agent memory (lessons & patterns)
|
|
41
45
|
${pc.green("setup")} Guided post-scaffold configuration
|
|
42
|
-
${pc.green("doctor")} Diagnose common environment issues
|
|
46
|
+
${pc.green("doctor")} Diagnose common environment issues ('doctor provenance --explain' for a read-only provenance report)
|
|
43
47
|
${pc.green("status")} Print version and config summary
|
|
48
|
+
${pc.green("task-state")} Durable task record ('task-state show [--json]' | 'task-state update <id> --status --step --next --plan')
|
|
49
|
+
${pc.green("context")} Repo-context evidence ('context resolve <path> [--root]' | 'context check <envelope.json>' | 'context record --task <id> <envelope.json>')
|
|
44
50
|
${pc.green("task")} Create and list task files (new, list)
|
|
45
51
|
${pc.green("migrate")} Export MeowKit to external coding-agent tools (cursor, codex, ...)
|
|
46
|
-
${pc.green("providers")} Show effective provider support matrix and enforcement levels
|
|
52
|
+
${pc.green("providers")} Show effective provider support matrix and enforcement levels ('providers [<p>] --lifecycle' for the capability-adapter + lifecycle matrix)
|
|
47
53
|
${pc.green("orchviz")} Live web visualizer for the active Claude Code session
|
|
48
54
|
${pc.green("inventory")} List harness artifacts with governance metadata
|
|
49
55
|
${pc.green("trace")} On-demand trace recall: score | audit | propose | --friction
|
|
@@ -60,6 +66,7 @@ ${pc.bold("Options:")}
|
|
|
60
66
|
--providers Doctor/migrate: include provider contract diagnostics
|
|
61
67
|
--state Doctor: include state taxonomy diagnostics
|
|
62
68
|
--hard-gates Doctor: live-probe the hard gates (plan/privacy/injection block)
|
|
69
|
+
--consolidation Doctor: show the Phase-7 consolidation/deprecation ledger (status ≠ runtime availability)
|
|
63
70
|
--portable Validate: include portable provider contract checks
|
|
64
71
|
--strict Validate: treat WARN as failure (exit 1); off by default
|
|
65
72
|
--workflow Validate: run only the workflow.yaml drift-check (CI scope)
|
|
@@ -135,6 +142,7 @@ async function main() {
|
|
|
135
142
|
"providers",
|
|
136
143
|
"state",
|
|
137
144
|
"hard-gates",
|
|
145
|
+
"consolidation",
|
|
138
146
|
"portable",
|
|
139
147
|
"all",
|
|
140
148
|
"dry-run",
|
|
@@ -168,10 +176,20 @@ async function main() {
|
|
|
168
176
|
"packs",
|
|
169
177
|
"rules",
|
|
170
178
|
"substrate",
|
|
179
|
+
"capabilities",
|
|
171
180
|
"emit",
|
|
172
181
|
"commit",
|
|
182
|
+
"explain",
|
|
183
|
+
"write",
|
|
173
184
|
],
|
|
174
185
|
string: [
|
|
186
|
+
"mode",
|
|
187
|
+
"intent",
|
|
188
|
+
"provider",
|
|
189
|
+
"step",
|
|
190
|
+
"next",
|
|
191
|
+
"plan",
|
|
192
|
+
"root",
|
|
175
193
|
"only",
|
|
176
194
|
"type",
|
|
177
195
|
"priority",
|
|
@@ -222,8 +240,14 @@ async function main() {
|
|
|
222
240
|
yes: args.yes,
|
|
223
241
|
});
|
|
224
242
|
break;
|
|
225
|
-
case "validate":
|
|
243
|
+
case "validate": {
|
|
244
|
+
const modeArg = args.mode;
|
|
245
|
+
if (modeArg !== undefined && modeArg !== "authoring" && modeArg !== "flat-copy") {
|
|
246
|
+
console.error(`Invalid --mode "${modeArg}". Expected "authoring" or "flat-copy".`);
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
226
249
|
await validate({
|
|
250
|
+
mode: modeArg,
|
|
227
251
|
portable: args.portable,
|
|
228
252
|
strict: args.strict,
|
|
229
253
|
workflow: args.workflow,
|
|
@@ -232,13 +256,25 @@ async function main() {
|
|
|
232
256
|
packs: args.packs,
|
|
233
257
|
rules: args.rules,
|
|
234
258
|
plugin: args.plugin,
|
|
259
|
+
capabilities: args.capabilities,
|
|
235
260
|
});
|
|
236
261
|
break;
|
|
262
|
+
}
|
|
237
263
|
case "build-plugin":
|
|
238
264
|
await buildPlugin({
|
|
239
265
|
json: args.json,
|
|
240
266
|
});
|
|
241
267
|
break;
|
|
268
|
+
case "capabilities":
|
|
269
|
+
await capabilities({
|
|
270
|
+
subcommand: args._[1],
|
|
271
|
+
target: args._[2],
|
|
272
|
+
json: args.json,
|
|
273
|
+
intent: args.intent,
|
|
274
|
+
provider: args.provider,
|
|
275
|
+
write: args.write,
|
|
276
|
+
});
|
|
277
|
+
break;
|
|
242
278
|
case "pack":
|
|
243
279
|
await pack({
|
|
244
280
|
subcommand: args._[1],
|
|
@@ -253,6 +289,7 @@ async function main() {
|
|
|
253
289
|
await providersCommand({
|
|
254
290
|
provider: args._[1],
|
|
255
291
|
json: args.json,
|
|
292
|
+
lifecycle: args.lifecycle,
|
|
256
293
|
});
|
|
257
294
|
break;
|
|
258
295
|
case "inventory":
|
|
@@ -344,11 +381,36 @@ async function main() {
|
|
|
344
381
|
providers: args.providers,
|
|
345
382
|
state: args.state,
|
|
346
383
|
hardGates: args["hard-gates"],
|
|
384
|
+
// `doctor provenance [--explain]`: read-only provenance report.
|
|
385
|
+
provenance: args._[1] === "provenance" || undefined,
|
|
386
|
+
explain: args.explain,
|
|
387
|
+
consolidation: args.consolidation,
|
|
347
388
|
});
|
|
348
389
|
break;
|
|
349
390
|
case "status":
|
|
350
391
|
await printStatus();
|
|
351
392
|
break;
|
|
393
|
+
case "task-state":
|
|
394
|
+
await taskState({
|
|
395
|
+
subcommand: args._[1],
|
|
396
|
+
taskId: args._[2],
|
|
397
|
+
status: args.status,
|
|
398
|
+
step: args.step,
|
|
399
|
+
next: args.next,
|
|
400
|
+
plan: args.plan,
|
|
401
|
+
json: args.json,
|
|
402
|
+
cliVersion: VERSION,
|
|
403
|
+
});
|
|
404
|
+
break;
|
|
405
|
+
case "context":
|
|
406
|
+
await context({
|
|
407
|
+
subcommand: args._[1],
|
|
408
|
+
target: args._[2],
|
|
409
|
+
root: args.root,
|
|
410
|
+
task: args.task,
|
|
411
|
+
json: args.json,
|
|
412
|
+
});
|
|
413
|
+
break;
|
|
352
414
|
case "task": {
|
|
353
415
|
const subcommand = args._[1];
|
|
354
416
|
// positional description: everything after the subcommand that isn't a flag
|