@shrkcrft/cli 0.1.0-alpha.29 → 0.1.0-alpha.31
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/dist/asset-preview/apply-asset-preview.js +1 -1
- package/dist/authoring/authoring-kit.d.ts +9 -1
- package/dist/authoring/authoring-kit.d.ts.map +1 -1
- package/dist/authoring/authoring-kit.js +26 -13
- package/dist/bootstrap/unlinked-workspace-dependency.d.ts +11 -0
- package/dist/bootstrap/unlinked-workspace-dependency.d.ts.map +1 -0
- package/dist/bootstrap/unlinked-workspace-dependency.js +99 -0
- package/dist/command-registry.d.ts +100 -1
- package/dist/command-registry.d.ts.map +1 -1
- package/dist/command-registry.js +130 -3
- package/dist/commands/api-diff.command.d.ts.map +1 -1
- package/dist/commands/api-diff.command.js +12 -0
- package/dist/commands/apply.command.d.ts.map +1 -1
- package/dist/commands/apply.command.js +3 -0
- package/dist/commands/arch.command.d.ts.map +1 -1
- package/dist/commands/arch.command.js +26 -7
- package/dist/commands/architecture.command.d.ts.map +1 -1
- package/dist/commands/architecture.command.js +8 -2
- package/dist/commands/baseline.command.d.ts +76 -0
- package/dist/commands/baseline.command.d.ts.map +1 -1
- package/dist/commands/baseline.command.js +599 -75
- package/dist/commands/biome.command.d.ts.map +1 -1
- package/dist/commands/biome.command.js +20 -0
- package/dist/commands/boundaries.command.d.ts +9 -1
- package/dist/commands/boundaries.command.d.ts.map +1 -1
- package/dist/commands/boundaries.command.js +88 -20
- package/dist/commands/bundle.command.d.ts.map +1 -1
- package/dist/commands/bundle.command.js +57 -11
- package/dist/commands/cache-align.command.d.ts.map +1 -1
- package/dist/commands/cache-align.command.js +3 -1
- package/dist/commands/changelog-data.d.ts.map +1 -1
- package/dist/commands/changelog-data.js +164 -0
- package/dist/commands/changes.command.d.ts.map +1 -1
- package/dist/commands/changes.command.js +15 -0
- package/dist/commands/check.command.d.ts.map +1 -1
- package/dist/commands/check.command.js +1260 -324
- package/dist/commands/checks.command.d.ts.map +1 -1
- package/dist/commands/checks.command.js +188 -40
- package/dist/commands/ci.command.d.ts.map +1 -1
- package/dist/commands/ci.command.js +35 -2
- package/dist/commands/code-intel.command.d.ts.map +1 -1
- package/dist/commands/code-intel.command.js +8 -1
- package/dist/commands/command-catalog.d.ts +23 -1
- package/dist/commands/command-catalog.d.ts.map +1 -1
- package/dist/commands/command-catalog.js +152 -35
- package/dist/commands/commands.command.d.ts +21 -3
- package/dist/commands/commands.command.d.ts.map +1 -1
- package/dist/commands/commands.command.js +172 -27
- package/dist/commands/compress.command.d.ts.map +1 -1
- package/dist/commands/compress.command.js +4 -0
- package/dist/commands/constructs.command.d.ts.map +1 -1
- package/dist/commands/constructs.command.js +50 -12
- package/dist/commands/context.command.d.ts.map +1 -1
- package/dist/commands/context.command.js +40 -5
- package/dist/commands/contract-templates.command.d.ts.map +1 -1
- package/dist/commands/contract-templates.command.js +9 -1
- package/dist/commands/contract.command.d.ts.map +1 -1
- package/dist/commands/contract.command.js +35 -0
- package/dist/commands/conventions.command.d.ts.map +1 -1
- package/dist/commands/conventions.command.js +189 -29
- package/dist/commands/coverage.command.d.ts.map +1 -1
- package/dist/commands/coverage.command.js +9 -0
- package/dist/commands/daily.commands.d.ts +0 -1
- package/dist/commands/daily.commands.d.ts.map +1 -1
- package/dist/commands/daily.commands.js +12 -76
- package/dist/commands/dashboard.command.d.ts.map +1 -1
- package/dist/commands/dashboard.command.js +10 -0
- package/dist/commands/dev.command.d.ts.map +1 -1
- package/dist/commands/dev.command.js +45 -2
- package/dist/commands/diagnostics.command.d.ts +0 -2
- package/dist/commands/diagnostics.command.d.ts.map +1 -1
- package/dist/commands/diagnostics.command.js +5 -78
- package/dist/commands/diff-check.command.d.ts +6 -4
- package/dist/commands/diff-check.command.d.ts.map +1 -1
- package/dist/commands/diff-check.command.js +190 -103
- package/dist/commands/docs-references.command.d.ts +20 -0
- package/dist/commands/docs-references.command.d.ts.map +1 -0
- package/dist/commands/docs-references.command.js +520 -0
- package/dist/commands/doctor.command.d.ts.map +1 -1
- package/dist/commands/doctor.command.js +60 -5
- package/dist/commands/drift.command.d.ts.map +1 -1
- package/dist/commands/drift.command.js +17 -4
- package/dist/commands/eslint.command.d.ts.map +1 -1
- package/dist/commands/eslint.command.js +20 -0
- package/dist/commands/export.command.d.ts.map +1 -1
- package/dist/commands/export.command.js +23 -1
- package/dist/commands/feedback-dispatch.command.d.ts.map +1 -1
- package/dist/commands/feedback-dispatch.command.js +29 -0
- package/dist/commands/feedback.command.d.ts.map +1 -1
- package/dist/commands/feedback.command.js +6 -1
- package/dist/commands/finish.command.d.ts.map +1 -1
- package/dist/commands/finish.command.js +32 -8
- package/dist/commands/fix.command.d.ts.map +1 -1
- package/dist/commands/fix.command.js +19 -0
- package/dist/commands/gate.command.d.ts +6 -1
- package/dist/commands/gate.command.d.ts.map +1 -1
- package/dist/commands/gate.command.js +50 -124
- package/dist/commands/gates.command.d.ts +54 -0
- package/dist/commands/gates.command.d.ts.map +1 -1
- package/dist/commands/gates.command.js +1314 -64
- package/dist/commands/gen.command.d.ts.map +1 -1
- package/dist/commands/gen.command.js +4 -0
- package/dist/commands/generated.command.d.ts +62 -0
- package/dist/commands/generated.command.d.ts.map +1 -1
- package/dist/commands/generated.command.js +639 -156
- package/dist/commands/graph-code-subverbs.d.ts +15 -0
- package/dist/commands/graph-code-subverbs.d.ts.map +1 -1
- package/dist/commands/graph-code-subverbs.js +203 -25
- package/dist/commands/graph.command.d.ts.map +1 -1
- package/dist/commands/graph.command.js +79 -37
- package/dist/commands/help.command.d.ts +30 -6
- package/dist/commands/help.command.d.ts.map +1 -1
- package/dist/commands/help.command.js +323 -199
- package/dist/commands/helper.command.d.ts +1 -0
- package/dist/commands/helper.command.d.ts.map +1 -1
- package/dist/commands/helper.command.js +195 -56
- package/dist/commands/impact.command.d.ts.map +1 -1
- package/dist/commands/impact.command.js +115 -12
- package/dist/commands/infer.command.d.ts.map +1 -1
- package/dist/commands/infer.command.js +20 -45
- package/dist/commands/ingest.command.d.ts +0 -1
- package/dist/commands/ingest.command.d.ts.map +1 -1
- package/dist/commands/ingest.command.js +25 -41
- package/dist/commands/knowledge-author.command.d.ts +0 -3
- package/dist/commands/knowledge-author.command.d.ts.map +1 -1
- package/dist/commands/knowledge-author.command.js +10 -23
- package/dist/commands/knowledge.command.d.ts.map +1 -1
- package/dist/commands/knowledge.command.js +469 -129
- package/dist/commands/languages.command.d.ts.map +1 -1
- package/dist/commands/languages.command.js +27 -0
- package/dist/commands/lint.command.d.ts.map +1 -1
- package/dist/commands/lint.command.js +3 -0
- package/dist/commands/mcp.command.d.ts +18 -0
- package/dist/commands/mcp.command.d.ts.map +1 -1
- package/dist/commands/mcp.command.js +33 -8
- package/dist/commands/onboard.command.d.ts.map +1 -1
- package/dist/commands/onboard.command.js +20 -0
- package/dist/commands/owners.command.d.ts.map +1 -1
- package/dist/commands/owners.command.js +14 -2
- package/dist/commands/packs-new.d.ts +13 -1
- package/dist/commands/packs-new.d.ts.map +1 -1
- package/dist/commands/packs-new.js +500 -335
- package/dist/commands/packs.command.d.ts.map +1 -1
- package/dist/commands/packs.command.js +378 -36
- package/dist/commands/paths.command.d.ts.map +1 -1
- package/dist/commands/paths.command.js +9 -1
- package/dist/commands/pipelines.command.d.ts.map +1 -1
- package/dist/commands/pipelines.command.js +7 -1
- package/dist/commands/plan-check.command.d.ts.map +1 -1
- package/dist/commands/plan-check.command.js +3 -0
- package/dist/commands/plan.command.d.ts.map +1 -1
- package/dist/commands/plan.command.js +3 -0
- package/dist/commands/playbooks.command.d.ts.map +1 -1
- package/dist/commands/playbooks.command.js +7 -2
- package/dist/commands/policy-lint.command.d.ts +19 -2
- package/dist/commands/policy-lint.command.d.ts.map +1 -1
- package/dist/commands/policy-lint.command.js +224 -65
- package/dist/commands/policy.command.d.ts.map +1 -1
- package/dist/commands/policy.command.js +6 -1
- package/dist/commands/pr.command.d.ts.map +1 -1
- package/dist/commands/pr.command.js +14 -0
- package/dist/commands/presets.command.d.ts.map +1 -1
- package/dist/commands/presets.command.js +12 -27
- package/dist/commands/profiles.command.d.ts.map +1 -1
- package/dist/commands/profiles.command.js +94 -26
- package/dist/commands/provenance.command.js +1 -1
- package/dist/commands/quality.command.d.ts.map +1 -1
- package/dist/commands/quality.command.js +129 -33
- package/dist/commands/recommend.command.d.ts +20 -4
- package/dist/commands/recommend.command.d.ts.map +1 -1
- package/dist/commands/recommend.command.js +172 -278
- package/dist/commands/registrations.command.d.ts.map +1 -1
- package/dist/commands/registrations.command.js +138 -13
- package/dist/commands/registry-lifecycle-run.d.ts +14 -0
- package/dist/commands/registry-lifecycle-run.d.ts.map +1 -0
- package/dist/commands/registry-lifecycle-run.js +336 -0
- package/dist/commands/registry.command.d.ts.map +1 -1
- package/dist/commands/registry.command.js +235 -62
- package/dist/commands/release.command.d.ts.map +1 -1
- package/dist/commands/release.command.js +99 -20
- package/dist/commands/report.command.d.ts.map +1 -1
- package/dist/commands/report.command.js +38 -2
- package/dist/commands/reuse-coverage.command.d.ts +23 -0
- package/dist/commands/reuse-coverage.command.d.ts.map +1 -0
- package/dist/commands/reuse-coverage.command.js +536 -0
- package/dist/commands/reuse.command.d.ts +3 -18
- package/dist/commands/reuse.command.d.ts.map +1 -1
- package/dist/commands/reuse.command.js +395 -244
- package/dist/commands/review.command.d.ts.map +1 -1
- package/dist/commands/review.command.js +33 -1
- package/dist/commands/rounds.command.d.ts.map +1 -1
- package/dist/commands/rounds.command.js +5 -0
- package/dist/commands/safety.command.d.ts.map +1 -1
- package/dist/commands/safety.command.js +9 -0
- package/dist/commands/scaffolds.command.d.ts.map +1 -1
- package/dist/commands/scaffolds.command.js +97 -25
- package/dist/commands/search.command.d.ts +0 -8
- package/dist/commands/search.command.d.ts.map +1 -1
- package/dist/commands/search.command.js +136 -28
- package/dist/commands/self-config-xrefs.command.d.ts +24 -0
- package/dist/commands/self-config-xrefs.command.d.ts.map +1 -0
- package/dist/commands/self-config-xrefs.command.js +170 -0
- package/dist/commands/self-config.command.d.ts.map +1 -1
- package/dist/commands/self-config.command.js +261 -65
- package/dist/commands/smart-context.command.d.ts.map +1 -1
- package/dist/commands/smart-context.command.js +39 -3
- package/dist/commands/spec.command.d.ts.map +1 -1
- package/dist/commands/spec.command.js +3 -0
- package/dist/commands/stats.command.d.ts.map +1 -1
- package/dist/commands/stats.command.js +3 -0
- package/dist/commands/surface.command.d.ts +6 -1
- package/dist/commands/surface.command.d.ts.map +1 -1
- package/dist/commands/surface.command.js +256 -54
- package/dist/commands/task-context.command.js +1 -1
- package/dist/commands/task.command.d.ts.map +1 -1
- package/dist/commands/task.command.js +22 -1
- package/dist/commands/templates.command.d.ts +4 -0
- package/dist/commands/templates.command.d.ts.map +1 -1
- package/dist/commands/templates.command.js +109 -22
- package/dist/commands/test.command.d.ts.map +1 -1
- package/dist/commands/test.command.js +161 -33
- package/dist/commands/tests.command.d.ts.map +1 -1
- package/dist/commands/tests.command.js +29 -3
- package/dist/commands/trace.command.d.ts.map +1 -1
- package/dist/commands/trace.command.js +29 -4
- package/dist/commands/watch.command.d.ts.map +1 -1
- package/dist/commands/watch.command.js +3 -0
- package/dist/commands/why.command.d.ts.map +1 -1
- package/dist/commands/why.command.js +3 -0
- package/dist/commands/wiring.command.d.ts +18 -4
- package/dist/commands/wiring.command.d.ts.map +1 -1
- package/dist/commands/wiring.command.js +362 -74
- package/dist/dashboard/code-intelligence-data.js +4 -4
- package/dist/diff/deleted-orphan-coverage.d.ts +32 -0
- package/dist/diff/deleted-orphan-coverage.d.ts.map +1 -0
- package/dist/diff/deleted-orphan-coverage.js +107 -0
- package/dist/diff/deleted-orphan-scope-notes.d.ts +23 -0
- package/dist/diff/deleted-orphan-scope-notes.d.ts.map +1 -0
- package/dist/diff/deleted-orphan-scope-notes.js +49 -0
- package/dist/diff/deleted-orphans.d.ts +32 -0
- package/dist/diff/deleted-orphans.d.ts.map +1 -1
- package/dist/diff/deleted-orphans.js +42 -2
- package/dist/dispatch/closest-match.d.ts +15 -0
- package/dist/dispatch/closest-match.d.ts.map +1 -0
- package/dist/dispatch/closest-match.js +47 -0
- package/dist/dispatch/global-flags.d.ts +94 -0
- package/dist/dispatch/global-flags.d.ts.map +1 -0
- package/dist/dispatch/global-flags.js +123 -0
- package/dist/dispatch/guard-invocation-input.d.ts +24 -0
- package/dist/dispatch/guard-invocation-input.d.ts.map +1 -0
- package/dist/dispatch/guard-invocation-input.js +1 -0
- package/dist/dispatch/guard-invocation.d.ts +33 -0
- package/dist/dispatch/guard-invocation.d.ts.map +1 -0
- package/dist/dispatch/guard-invocation.js +183 -0
- package/dist/dispatch/help-intercept.d.ts +22 -0
- package/dist/dispatch/help-intercept.d.ts.map +1 -0
- package/dist/dispatch/help-intercept.js +42 -0
- package/dist/dispatch/i-declared-invocation.d.ts +17 -0
- package/dist/dispatch/i-declared-invocation.d.ts.map +1 -0
- package/dist/dispatch/i-declared-invocation.js +1 -0
- package/dist/dispatch/i-unknown-flag-refusal-input.d.ts +28 -0
- package/dist/dispatch/i-unknown-flag-refusal-input.d.ts.map +1 -0
- package/dist/dispatch/i-unknown-flag-refusal-input.js +1 -0
- package/dist/dispatch/invocation-rejection-kind.d.ts +15 -0
- package/dist/dispatch/invocation-rejection-kind.d.ts.map +1 -0
- package/dist/dispatch/invocation-rejection-kind.js +15 -0
- package/dist/dispatch/invocation-rejection.d.ts +18 -0
- package/dist/dispatch/invocation-rejection.d.ts.map +1 -0
- package/dist/dispatch/invocation-rejection.js +1 -0
- package/dist/dispatch/judge-invocation.d.ts +24 -0
- package/dist/dispatch/judge-invocation.d.ts.map +1 -0
- package/dist/dispatch/judge-invocation.js +50 -0
- package/dist/dispatch/positional-mode.d.ts +18 -0
- package/dist/dispatch/positional-mode.d.ts.map +1 -0
- package/dist/dispatch/positional-mode.js +18 -0
- package/dist/dispatch/read-tracking-map.d.ts +28 -0
- package/dist/dispatch/read-tracking-map.d.ts.map +1 -0
- package/dist/dispatch/read-tracking-map.js +58 -0
- package/dist/dispatch/refuse-sibling-valve-flags.d.ts +30 -0
- package/dist/dispatch/refuse-sibling-valve-flags.d.ts.map +1 -0
- package/dist/dispatch/refuse-sibling-valve-flags.js +65 -0
- package/dist/dispatch/subverb-spec.d.ts +26 -0
- package/dist/dispatch/subverb-spec.d.ts.map +1 -0
- package/dist/dispatch/subverb-spec.js +1 -0
- package/dist/dispatch/undocumented-flag-reads.d.ts +22 -0
- package/dist/dispatch/undocumented-flag-reads.d.ts.map +1 -0
- package/dist/dispatch/undocumented-flag-reads.js +283 -0
- package/dist/dispatch/unknown-flag-refusal-mode.d.ts +13 -0
- package/dist/dispatch/unknown-flag-refusal-mode.d.ts.map +1 -0
- package/dist/dispatch/unknown-flag-refusal-mode.js +13 -0
- package/dist/dispatch/unknown-flag-refusal.d.ts +22 -0
- package/dist/dispatch/unknown-flag-refusal.d.ts.map +1 -0
- package/dist/dispatch/unknown-flag-refusal.js +57 -0
- package/dist/dispatch/unread-flags.d.ts +152 -0
- package/dist/dispatch/unread-flags.d.ts.map +1 -0
- package/dist/dispatch/unread-flags.js +295 -0
- package/dist/dispatch/verdict-valve-flag.d.ts +21 -0
- package/dist/dispatch/verdict-valve-flag.d.ts.map +1 -0
- package/dist/dispatch/verdict-valve-flag.js +21 -0
- package/dist/dispatch/walk-declared-subverbs.d.ts +14 -0
- package/dist/dispatch/walk-declared-subverbs.d.ts.map +1 -0
- package/dist/dispatch/walk-declared-subverbs.js +28 -0
- package/dist/exit-codes.d.ts +41 -3
- package/dist/exit-codes.d.ts.map +1 -1
- package/dist/exit-codes.js +153 -14
- package/dist/finish/run-finish.d.ts +72 -5
- package/dist/finish/run-finish.d.ts.map +1 -1
- package/dist/finish/run-finish.js +453 -104
- package/dist/gates/accepted-empty-note.d.ts +10 -0
- package/dist/gates/accepted-empty-note.d.ts.map +1 -0
- package/dist/gates/accepted-empty-note.js +11 -0
- package/dist/gates/allow-empty.d.ts +25 -0
- package/dist/gates/allow-empty.d.ts.map +1 -0
- package/dist/gates/allow-empty.js +27 -0
- package/dist/gates/asset-doctor-failing-units.d.ts +16 -0
- package/dist/gates/asset-doctor-failing-units.d.ts.map +1 -0
- package/dist/gates/asset-doctor-failing-units.js +14 -0
- package/dist/gates/asset-doctor-failure-line.d.ts +16 -0
- package/dist/gates/asset-doctor-failure-line.d.ts.map +1 -0
- package/dist/gates/asset-doctor-failure-line.js +28 -0
- package/dist/gates/empty-rule-advice-lines.d.ts +15 -0
- package/dist/gates/empty-rule-advice-lines.d.ts.map +1 -0
- package/dist/gates/empty-rule-advice-lines.js +20 -0
- package/dist/gates/gate-envelope.d.ts +85 -8
- package/dist/gates/gate-envelope.d.ts.map +1 -1
- package/dist/gates/gate-envelope.js +56 -7
- package/dist/gates/gate-rule-globs.d.ts +67 -0
- package/dist/gates/gate-rule-globs.d.ts.map +1 -0
- package/dist/gates/gate-rule-globs.js +139 -0
- package/dist/gates/gate-rule-view.d.ts +25 -6
- package/dist/gates/gate-rule-view.d.ts.map +1 -1
- package/dist/gates/gate-rule-view.js +105 -77
- package/dist/gates/i-coverage-dead-glob.d.ts +19 -0
- package/dist/gates/i-coverage-dead-glob.d.ts.map +1 -0
- package/dist/gates/i-coverage-dead-glob.js +1 -0
- package/dist/gates/i-coverage-negation.d.ts +13 -0
- package/dist/gates/i-coverage-negation.d.ts.map +1 -0
- package/dist/gates/i-coverage-negation.js +1 -0
- package/dist/gates/i-registration-query-settle-input.d.ts +18 -0
- package/dist/gates/i-registration-query-settle-input.d.ts.map +1 -0
- package/dist/gates/i-registration-query-settle-input.js +1 -0
- package/dist/gates/i-unit-state-note-row.d.ts +16 -0
- package/dist/gates/i-unit-state-note-row.d.ts.map +1 -0
- package/dist/gates/i-unit-state-note-row.js +1 -0
- package/dist/gates/i-unit-state-notes.d.ts +32 -0
- package/dist/gates/i-unit-state-notes.d.ts.map +1 -0
- package/dist/gates/i-unit-state-notes.js +1 -0
- package/dist/gates/incomplete-registry-inventory.d.ts +19 -0
- package/dist/gates/incomplete-registry-inventory.d.ts.map +1 -0
- package/dist/gates/incomplete-registry-inventory.js +63 -0
- package/dist/gates/measure-registration-roles.d.ts +10 -0
- package/dist/gates/measure-registration-roles.d.ts.map +1 -0
- package/dist/gates/measure-registration-roles.js +9 -0
- package/dist/gates/plane-verdict.d.ts +14 -0
- package/dist/gates/plane-verdict.d.ts.map +1 -0
- package/dist/gates/plane-verdict.js +22 -0
- package/dist/gates/qualify-clean-for-units.d.ts +12 -0
- package/dist/gates/qualify-clean-for-units.d.ts.map +1 -0
- package/dist/gates/qualify-clean-for-units.js +18 -0
- package/dist/gates/registration-graph-verdict.d.ts +34 -0
- package/dist/gates/registration-graph-verdict.d.ts.map +1 -0
- package/dist/gates/registration-graph-verdict.js +70 -0
- package/dist/gates/registration-roles.d.ts +9 -0
- package/dist/gates/registration-roles.d.ts.map +1 -0
- package/dist/gates/registration-roles.js +1 -0
- package/dist/gates/registry-liveness.d.ts +11 -0
- package/dist/gates/registry-liveness.d.ts.map +1 -0
- package/dist/gates/registry-liveness.js +13 -0
- package/dist/gates/rule-coverage.d.ts +225 -4
- package/dist/gates/rule-coverage.d.ts.map +1 -1
- package/dist/gates/rule-coverage.js +610 -43
- package/dist/gates/run-gate-planes.d.ts +58 -0
- package/dist/gates/run-gate-planes.d.ts.map +1 -0
- package/dist/gates/run-gate-planes.js +403 -0
- package/dist/gates/scaffold-selftest.d.ts +56 -0
- package/dist/gates/scaffold-selftest.d.ts.map +1 -0
- package/dist/gates/scaffold-selftest.js +119 -0
- package/dist/gates/seam-rejected-rules.d.ts +28 -0
- package/dist/gates/seam-rejected-rules.d.ts.map +1 -0
- package/dist/gates/seam-rejected-rules.js +95 -0
- package/dist/gates/self-test-check.d.ts +29 -0
- package/dist/gates/self-test-check.d.ts.map +1 -0
- package/dist/gates/self-test-check.js +1 -0
- package/dist/gates/self-test-subject.d.ts +28 -0
- package/dist/gates/self-test-subject.d.ts.map +1 -0
- package/dist/gates/self-test-subject.js +1 -0
- package/dist/gates/self-test.d.ts +20 -0
- package/dist/gates/self-test.d.ts.map +1 -0
- package/dist/gates/self-test.js +82 -0
- package/dist/gates/settle-verdict.d.ts +14 -0
- package/dist/gates/settle-verdict.d.ts.map +1 -0
- package/dist/gates/settle-verdict.js +13 -0
- package/dist/gates/settled-verdict.d.ts +8 -0
- package/dist/gates/settled-verdict.d.ts.map +1 -0
- package/dist/gates/settled-verdict.js +1 -0
- package/dist/gates/template-registry-coverage.d.ts +18 -0
- package/dist/gates/template-registry-coverage.d.ts.map +1 -0
- package/dist/gates/template-registry-coverage.js +24 -0
- package/dist/gates/unit-state-notes.d.ts +40 -0
- package/dist/gates/unit-state-notes.d.ts.map +1 -0
- package/dist/gates/unit-state-notes.js +71 -0
- package/dist/gates/verdict-line.d.ts +18 -0
- package/dist/gates/verdict-line.d.ts.map +1 -0
- package/dist/gates/verdict-line.js +40 -0
- package/dist/graph/graph-reuse-lookup.d.ts +10 -0
- package/dist/graph/graph-reuse-lookup.d.ts.map +1 -0
- package/dist/graph/graph-reuse-lookup.js +41 -0
- package/dist/graph/index-behind-hint.d.ts +11 -0
- package/dist/graph/index-behind-hint.d.ts.map +1 -0
- package/dist/graph/index-behind-hint.js +27 -0
- package/dist/knowledge/knowledge-stale-gate-flags.d.ts +3 -0
- package/dist/knowledge/knowledge-stale-gate-flags.d.ts.map +1 -0
- package/dist/knowledge/knowledge-stale-gate-flags.js +1 -0
- package/dist/knowledge/knowledge-stale-gate-input.d.ts +3 -0
- package/dist/knowledge/knowledge-stale-gate-input.d.ts.map +1 -0
- package/dist/knowledge/knowledge-stale-gate-input.js +1 -0
- package/dist/knowledge/knowledge-stale-gate-result.d.ts +3 -0
- package/dist/knowledge/knowledge-stale-gate-result.d.ts.map +1 -0
- package/dist/knowledge/knowledge-stale-gate-result.js +1 -0
- package/dist/knowledge/knowledge-stale-gate.d.ts +10 -0
- package/dist/knowledge/knowledge-stale-gate.d.ts.map +1 -0
- package/dist/knowledge/knowledge-stale-gate.js +9 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +204 -83
- package/dist/output/failure-hints.d.ts.map +1 -1
- package/dist/output/failure-hints.js +11 -9
- package/dist/output/rejected-entries-note.d.ts +57 -0
- package/dist/output/rejected-entries-note.d.ts.map +1 -0
- package/dist/output/rejected-entries-note.js +103 -0
- package/dist/output/stdout-is-pipe.d.ts +13 -0
- package/dist/output/stdout-is-pipe.d.ts.map +1 -0
- package/dist/output/stdout-is-pipe.js +21 -0
- package/dist/packs/stale-build-warning.d.ts +11 -0
- package/dist/packs/stale-build-warning.d.ts.map +1 -0
- package/dist/packs/stale-build-warning.js +23 -0
- package/dist/quality/run-quality.d.ts +123 -0
- package/dist/quality/run-quality.d.ts.map +1 -0
- package/dist/quality/run-quality.js +442 -0
- package/dist/schemas/json-schemas.d.ts +184 -3
- package/dist/schemas/json-schemas.d.ts.map +1 -1
- package/dist/schemas/json-schemas.js +113 -2
- package/dist/shrk.d.ts +3 -0
- package/dist/shrk.d.ts.map +1 -0
- package/dist/shrk.js +30 -0
- package/dist/surface/audience-applicability.d.ts +26 -0
- package/dist/surface/audience-applicability.d.ts.map +1 -0
- package/dist/surface/audience-applicability.js +60 -0
- package/dist/surface/catalog-command-safety.d.ts +18 -0
- package/dist/surface/catalog-command-safety.d.ts.map +1 -0
- package/dist/surface/catalog-command-safety.js +62 -0
- package/dist/surface/cli-command-resolver.d.ts +21 -0
- package/dist/surface/cli-command-resolver.d.ts.map +1 -0
- package/dist/surface/cli-command-resolver.js +87 -0
- package/dist/surface/command-dispatch-kind.d.ts +20 -0
- package/dist/surface/command-dispatch-kind.d.ts.map +1 -0
- package/dist/surface/command-dispatch-kind.js +20 -0
- package/dist/surface/command-index-entry.d.ts +40 -0
- package/dist/surface/command-index-entry.d.ts.map +1 -0
- package/dist/surface/command-index-entry.js +1 -0
- package/dist/surface/command-index.d.ts +77 -0
- package/dist/surface/command-index.d.ts.map +1 -0
- package/dist/surface/command-index.js +323 -0
- package/dist/surface/i-command-index.d.ts +22 -0
- package/dist/surface/i-command-index.d.ts.map +1 -0
- package/dist/surface/i-command-index.js +1 -0
- package/dist/surface/i-command-string-context.d.ts +20 -0
- package/dist/surface/i-command-string-context.d.ts.map +1 -0
- package/dist/surface/i-command-string-context.js +1 -0
- package/dist/surface/i-surface-denial.d.ts +13 -0
- package/dist/surface/i-surface-denial.d.ts.map +1 -0
- package/dist/surface/i-surface-denial.js +1 -0
- package/dist/surface/load-surface-context.d.ts +17 -1
- package/dist/surface/load-surface-context.d.ts.map +1 -1
- package/dist/surface/load-surface-context.js +48 -10
- package/dist/surface/not-enabled-error.d.ts +38 -4
- package/dist/surface/not-enabled-error.d.ts.map +1 -1
- package/dist/surface/not-enabled-error.js +96 -6
- package/dist/surface/profiles.d.ts +7 -0
- package/dist/surface/profiles.d.ts.map +1 -1
- package/dist/surface/resolve-command-string.d.ts +10 -0
- package/dist/surface/resolve-command-string.d.ts.map +1 -0
- package/dist/surface/resolve-command-string.js +572 -0
- package/dist/surface/surface-config-writer.d.ts +7 -2
- package/dist/surface/surface-config-writer.d.ts.map +1 -1
- package/dist/surface/surface-config-writer.js +25 -6
- package/dist/surface/surface-layer.d.ts +11 -0
- package/dist/surface/surface-layer.d.ts.map +1 -0
- package/dist/surface/surface-layer.js +11 -0
- package/dist/surface/surface-refusal-reason.d.ts +16 -0
- package/dist/surface/surface-refusal-reason.d.ts.map +1 -0
- package/dist/surface/surface-refusal-reason.js +16 -0
- package/dist/surface/surface-selector.d.ts +26 -0
- package/dist/surface/surface-selector.d.ts.map +1 -0
- package/dist/surface/surface-selector.js +42 -0
- package/dist/surface/surface-summary.d.ts +61 -18
- package/dist/surface/surface-summary.d.ts.map +1 -1
- package/dist/surface/surface-summary.js +147 -60
- package/dist/surface/tier.d.ts +85 -22
- package/dist/surface/tier.d.ts.map +1 -1
- package/dist/surface/tier.js +132 -30
- package/dist/usage/usage-log.d.ts +6 -1
- package/dist/usage/usage-log.d.ts.map +1 -1
- package/dist/usage/usage-log.js +7 -2
- package/dist/validation/run-validation-loop.d.ts +9 -0
- package/dist/validation/run-validation-loop.d.ts.map +1 -1
- package/dist/validation/run-validation-loop.js +14 -11
- package/dist/validation/typecheck-emitted.d.ts +8 -9
- package/dist/validation/typecheck-emitted.d.ts.map +1 -1
- package/dist/validation/typecheck-emitted.js +17 -97
- package/package.json +34 -34
|
@@ -11,9 +11,17 @@
|
|
|
11
11
|
* shrk registrations preview <id> [--var key=value ...] [--json]
|
|
12
12
|
*/
|
|
13
13
|
import * as nodePath from 'node:path';
|
|
14
|
-
import { inspectSharkcraft, listRegistrationHints,
|
|
14
|
+
import { assetDoctorProposedExit, ContributionKind, inspectSharkcraft, listRegistrationHints, buildRegistrationHintDoctorReport, getRegistrationHint, previewRegistrationHint, settledUnitStates, } from '@shrkcrft/inspector';
|
|
15
|
+
import { formatCoverage } from '@shrkcrft/core';
|
|
16
|
+
import { PositionalMode } from "../dispatch/positional-mode.js";
|
|
17
|
+
import { ALLOW_EMPTY_FLAG, allowEmptyValve } from "../gates/allow-empty.js";
|
|
18
|
+
import { assetDoctorFailingUnits } from "../gates/asset-doctor-failing-units.js";
|
|
19
|
+
import { assetDoctorFailureLine } from "../gates/asset-doctor-failure-line.js";
|
|
20
|
+
import { settleVerdict } from "../gates/settle-verdict.js";
|
|
21
|
+
import { verdictLine } from "../gates/verdict-line.js";
|
|
15
22
|
import { flagBool, flagString, flagVars, resolveCwd, } from "../command-registry.js";
|
|
16
23
|
import { asJson, header } from "../output/format-output.js";
|
|
24
|
+
import { writeRejectedEntriesNote } from "../output/rejected-entries-note.js";
|
|
17
25
|
import { savePlanToFile, signPlan } from '@shrkcrft/generator';
|
|
18
26
|
const REGISTRATION_HINT_SYNTHETIC_TEMPLATE = '__registration-hint__';
|
|
19
27
|
const registrationsListCommand = {
|
|
@@ -25,8 +33,11 @@ const registrationsListCommand = {
|
|
|
25
33
|
const source = flagString(args, 'source');
|
|
26
34
|
const all = await listRegistrationHints(inspection);
|
|
27
35
|
const filtered = source ? all.filter((e) => e.source === source) : all;
|
|
36
|
+
// A hint its loader refused is named, never silently absent (round 12, 12.1).
|
|
37
|
+
const note = { ...(source ? { source } : {}), next: 'shrk registrations doctor' };
|
|
28
38
|
if (flagBool(args, 'json')) {
|
|
29
39
|
process.stdout.write(asJson(filtered) + '\n');
|
|
40
|
+
await writeRejectedEntriesNote(inspection, [ContributionKind.RegistrationHint], { ...note, json: true });
|
|
30
41
|
return 0;
|
|
31
42
|
}
|
|
32
43
|
process.stdout.write(header(`Registration hints (${filtered.length})`));
|
|
@@ -36,6 +47,7 @@ const registrationsListCommand = {
|
|
|
36
47
|
if (filtered.length === 0) {
|
|
37
48
|
process.stdout.write(' (no registration hints contributed — packs add them via registrationHintFiles[])\n');
|
|
38
49
|
}
|
|
50
|
+
await writeRejectedEntriesNote(inspection, [ContributionKind.RegistrationHint], note);
|
|
39
51
|
return 0;
|
|
40
52
|
},
|
|
41
53
|
};
|
|
@@ -87,24 +99,99 @@ const registrationsGetCommand = {
|
|
|
87
99
|
};
|
|
88
100
|
const registrationsDoctorCommand = {
|
|
89
101
|
name: 'doctor',
|
|
90
|
-
description: 'Validate registration
|
|
91
|
-
usage: 'shrk registrations doctor [--json]',
|
|
102
|
+
description: 'Validate registration hints (local + pack): load issues, and every hint’s discovery against the live tree — verified / ambiguous / dead / unverified. Exit 0 pass · 1 errors · 2 a dead or capped discovery.',
|
|
103
|
+
usage: 'shrk registrations doctor [--json] [--strict] [--fail-on-dead-units] [--allow-empty]',
|
|
104
|
+
booleanFlags: new Set(['json', 'strict', 'fail-on-dead-units', ALLOW_EMPTY_FLAG]),
|
|
92
105
|
async run(args) {
|
|
93
106
|
const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
|
|
94
|
-
|
|
107
|
+
// THE discovery authority — the same candidate set `preview` acts on.
|
|
108
|
+
const report = await buildRegistrationHintDoctorReport(inspection);
|
|
109
|
+
const errors = report.issues.filter((i) => i.severity === 'error').length;
|
|
110
|
+
const warnings = report.issues.filter((i) => i.severity === 'warning').length;
|
|
111
|
+
// THE asset-doctor proposal (round 13): errors, warnings under --strict, and
|
|
112
|
+
// every settled selector unit THE --fail-on-dead-units predicate fails (a
|
|
113
|
+
// dead one, or a stale LOCAL expectEmpty marker — a pack's is INFO).
|
|
114
|
+
const proposed = assetDoctorProposedExit({ errors, warnings, units: report.liveness.units }, { strict: flagBool(args, 'strict'), failOnDeadUnits: flagBool(args, 'fail-on-dead-units') });
|
|
115
|
+
// No hint declared examined nothing: NOT VERIFIED (2) — the answer the
|
|
116
|
+
// helper / checks / conventions / templates doctors give an empty input,
|
|
117
|
+
// never a 0 that reads as "every hint verified" — unless `--allow-empty`
|
|
118
|
+
// accepts it (printed). Added here, not in the inspector report, so the
|
|
119
|
+
// self-config doctor (which folds these findings) is not vetoed by a repo
|
|
120
|
+
// that simply declares no hints.
|
|
121
|
+
const coverage = report.totals.hints === 0
|
|
122
|
+
? [
|
|
123
|
+
...report.coverage,
|
|
124
|
+
{
|
|
125
|
+
unit: 'registration hints',
|
|
126
|
+
expected: 0,
|
|
127
|
+
examined: 0,
|
|
128
|
+
reason: 'no registration hints declared',
|
|
129
|
+
...allowEmptyValve(args, 0),
|
|
130
|
+
},
|
|
131
|
+
]
|
|
132
|
+
: report.coverage;
|
|
133
|
+
const settled = settleVerdict(proposed, coverage);
|
|
134
|
+
// THE units that fail this run (round 13 review) — printed and in --json,
|
|
135
|
+
// so a 1 from --fail-on-dead-units is never silent about why.
|
|
136
|
+
const failing = assetDoctorFailingUnits(report.liveness.units, {
|
|
137
|
+
failOnDeadUnits: flagBool(args, 'fail-on-dead-units'),
|
|
138
|
+
strict: flagBool(args, 'strict'),
|
|
139
|
+
});
|
|
95
140
|
if (flagBool(args, 'json')) {
|
|
96
|
-
process.stdout.write(asJson({
|
|
97
|
-
|
|
141
|
+
process.stdout.write(asJson({
|
|
142
|
+
issues: report.issues,
|
|
143
|
+
failingUnits: failing.map((u) => ({ list: u.list, unit: u.unit, state: u.state, message: u.message })),
|
|
144
|
+
hints: report.hints,
|
|
145
|
+
totals: report.totals,
|
|
146
|
+
coverage,
|
|
147
|
+
deadUnits: report.deadUnits,
|
|
148
|
+
units: settledUnitStates([report.liveness]),
|
|
149
|
+
exitCode: settled.exit,
|
|
150
|
+
verdict: settled.verdict,
|
|
151
|
+
shortfalls: settled.shortfalls,
|
|
152
|
+
accepted: settled.accepted,
|
|
153
|
+
}) + '\n');
|
|
154
|
+
return settled.exit;
|
|
98
155
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
156
|
+
const t = report.totals;
|
|
157
|
+
// Never "N issues" alone: 0 issues must not read as "N hints verified".
|
|
158
|
+
process.stdout.write(header(`Registration hint doctor — ${t.hints} hint(s): ${t.verified} verified · ${t.ambiguous} ambiguous · ${t.dead} dead · ${t.unverified} unverified${t.intendedEmpty > 0 ? ` · ${t.intendedEmpty} intended-empty` : ''}`));
|
|
159
|
+
// The status column fits every status the doctor prints — `intended-empty`
|
|
160
|
+
// (14 wide) overflowed the old 11-wide column into the id (round 13, K11).
|
|
161
|
+
const statusWidth = Math.max(11, ...report.hints.map((h) => h.status.length));
|
|
162
|
+
for (const h of report.hints) {
|
|
163
|
+
process.stdout.write(` ${h.status.padEnd(statusWidth)} ${h.id.padEnd(36)} ${h.discovery} (${h.candidates} candidate(s))\n`);
|
|
164
|
+
}
|
|
165
|
+
for (const c of report.coverage)
|
|
166
|
+
process.stdout.write(` coverage ${formatCoverage(c)}\n`);
|
|
167
|
+
if (report.issues.length > 0) {
|
|
168
|
+
process.stdout.write(`\nIssues (${report.issues.length}):\n`);
|
|
169
|
+
for (const i of report.issues) {
|
|
170
|
+
process.stdout.write(` ${i.severity.toUpperCase().padEnd(7)} ${i.code.padEnd(30)} ${i.message}\n`);
|
|
171
|
+
}
|
|
103
172
|
}
|
|
104
|
-
|
|
105
|
-
|
|
173
|
+
// A stale LOCAL expectEmpty marker withholds the ✓ (a pack's is INFO: the
|
|
174
|
+
// consumer cannot edit it); an intended-empty one is accepted, printed below.
|
|
175
|
+
const staleLocal = report.liveness.wentLive.filter((u) => u.mark?.packageName === undefined).length;
|
|
176
|
+
const clean = t.hints === 0
|
|
177
|
+
? 'No registration hints declared — nothing to verify.'
|
|
178
|
+
: warnings > 0
|
|
179
|
+
? `No blocking registration-hint issues — ${warnings} warning(s) reported above.`
|
|
180
|
+
: staleLocal > 0
|
|
181
|
+
? `No blocking registration-hint issues — ${staleLocal} expectEmpty marker(s) went live (listed above; remove the markers).`
|
|
182
|
+
: `Every hint's discovery resolves (${t.verified} verified, ${t.ambiguous} ambiguous${t.intendedEmpty > 0 ? `, ${t.intendedEmpty} intended empty` : ''}). ✓`;
|
|
183
|
+
const line = verdictLine(settled, clean);
|
|
184
|
+
if (line)
|
|
185
|
+
process.stdout.write('\n' + line + '\n');
|
|
186
|
+
// Round 13 review: a 1 from --fail-on-dead-units names its units — the
|
|
187
|
+
// doctor printed only INFO issue lines, and `verdictLine` prints nothing
|
|
188
|
+
// for a 1 without a shortfall.
|
|
189
|
+
if (settled.exit === 1) {
|
|
190
|
+
const failure = assetDoctorFailureLine('registration-hint doctor', failing);
|
|
191
|
+
if (failure)
|
|
192
|
+
process.stdout.write('\n' + failure + '\n');
|
|
106
193
|
}
|
|
107
|
-
return
|
|
194
|
+
return settled.exit;
|
|
108
195
|
},
|
|
109
196
|
};
|
|
110
197
|
const registrationsPreviewCommand = {
|
|
@@ -281,6 +368,44 @@ export const registrationsCommand = {
|
|
|
281
368
|
name: 'registrations',
|
|
282
369
|
description: 'Inspect/preview/plan pack-contributed registration hints (downstream registration steps for generated constructs).',
|
|
283
370
|
usage: 'shrk registrations <list|get|doctor|preview|plan> ...',
|
|
371
|
+
// Declared (round 11 review): the dispatcher guard refuses an unknown verb
|
|
372
|
+
// with the closest one, and the declared walk reaches `registrations doctor`
|
|
373
|
+
// — a verdict verb, so a bad flag there exits 3, labelled with its own path.
|
|
374
|
+
positionals: PositionalMode.None,
|
|
375
|
+
subverbs: [
|
|
376
|
+
{
|
|
377
|
+
name: registrationsListCommand.name,
|
|
378
|
+
description: registrationsListCommand.description,
|
|
379
|
+
usage: registrationsListCommand.usage,
|
|
380
|
+
positionals: PositionalMode.None,
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
name: registrationsGetCommand.name,
|
|
384
|
+
description: registrationsGetCommand.description,
|
|
385
|
+
usage: registrationsGetCommand.usage,
|
|
386
|
+
positionals: PositionalMode.Free,
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
name: registrationsDoctorCommand.name,
|
|
390
|
+
description: registrationsDoctorCommand.description,
|
|
391
|
+
usage: registrationsDoctorCommand.usage,
|
|
392
|
+
positionals: PositionalMode.None,
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
name: registrationsPreviewCommand.name,
|
|
396
|
+
description: registrationsPreviewCommand.description,
|
|
397
|
+
usage: registrationsPreviewCommand.usage,
|
|
398
|
+
positionals: PositionalMode.Free,
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
name: registrationsPlanCommand.name,
|
|
402
|
+
description: registrationsPlanCommand.description,
|
|
403
|
+
usage: registrationsPlanCommand.usage,
|
|
404
|
+
positionals: PositionalMode.Free,
|
|
405
|
+
},
|
|
406
|
+
],
|
|
407
|
+
// The group parses every subverb's argv, so the subverbs' boolean flags live here too.
|
|
408
|
+
booleanFlags: new Set(['json', 'strict', 'fail-on-dead-units', ALLOW_EMPTY_FLAG]),
|
|
284
409
|
async run(args) {
|
|
285
410
|
const sub = args.positional[0];
|
|
286
411
|
const rest = { ...args, positional: args.positional.slice(1) };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ParsedArgs } from '../command-registry.js';
|
|
2
|
+
/** The two verbs this body answers for — the gate envelope's `verb`. */
|
|
3
|
+
type RegistryLifecycleVerb = 'check registry-lifecycle' | 'registry lifecycle';
|
|
4
|
+
/** The flag grammar both verbs share (one usage line, one allowlist). */
|
|
5
|
+
export declare const REGISTRY_LIFECYCLE_FLAGS_USAGE = "[--scope <dir>] [--changed-only] [--since <ref>] [--limit <n>] [--offset <n>] [--budget-ms <n>] [--allow-empty] [--json]";
|
|
6
|
+
/**
|
|
7
|
+
* Run a lifecycle scan for `verb`. `options.signal` is the in-process test seam
|
|
8
|
+
* for SIGTERM / SIGINT: aborting it prints the partial report and exits `2`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runRegistryLifecycle(args: ParsedArgs, verb: RegistryLifecycleVerb, options?: {
|
|
11
|
+
readonly signal?: AbortSignal;
|
|
12
|
+
}): Promise<number>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=registry-lifecycle-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-lifecycle-run.d.ts","sourceRoot":"","sources":["../../src/commands/registry-lifecycle-run.ts"],"names":[],"mappings":"AA0BA,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,wBAAwB,CAAC;AAShC,wEAAwE;AACxE,KAAK,qBAAqB,GAAG,0BAA0B,GAAG,oBAAoB,CAAC;AAE/E,yEAAyE;AACzE,eAAO,MAAM,8BAA8B,6HACiF,CAAC;AA6L7H;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,qBAAqB,EAC3B,OAAO,GAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAC9C,OAAO,CAAC,MAAM,CAAC,CA6HjB"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE body behind `shrk check registry-lifecycle` and `shrk registry
|
|
3
|
+
* lifecycle`.
|
|
4
|
+
*
|
|
5
|
+
* The two verbs used to carry copy-pasted bodies with two copies of the exit
|
|
6
|
+
* ternary — both of which forgot the file cap, so a scan that examined 2000 of
|
|
7
|
+
* 2103 candidates printed `missing removers 0` and exited 0 while a real
|
|
8
|
+
* violation sat in the 103 it never read. Now both delegate here, the engine
|
|
9
|
+
* owns the coverage records, and the exit is settled through the gate envelope
|
|
10
|
+
* like every other verdict verb:
|
|
11
|
+
*
|
|
12
|
+
* - a missing remover → `1` (a violation in the examined scope is real);
|
|
13
|
+
* - a cap, an expired budget, a signal, an over-budget / unreadable file,
|
|
14
|
+
* nothing in scope, or no registrations → `2`, with the continuation
|
|
15
|
+
* (`--offset <n>`) that actually reaches the remainder;
|
|
16
|
+
* - otherwise `0`;
|
|
17
|
+
* - a malformed flag → `3` with the usage line.
|
|
18
|
+
*/
|
|
19
|
+
import { renderRegistryLifecycleReportText, resolveChangedFiles, resolveProjectConfig, runRegistryLifecycleScan, } from '@shrkcrft/inspector';
|
|
20
|
+
import { ERROR_CODES } from '@shrkcrft/core';
|
|
21
|
+
import { firstUnknownFlag, flagBool, flagString, resolveCwd, spellFlagAsTyped, } from "../command-registry.js";
|
|
22
|
+
import { GLOBAL_FLAGS } from "../dispatch/global-flags.js";
|
|
23
|
+
import { ExitCode } from "../exit-codes.js";
|
|
24
|
+
import { asJson } from "../output/format-output.js";
|
|
25
|
+
import { buildGateEnvelope } from "../gates/gate-envelope.js";
|
|
26
|
+
import { ALLOW_EMPTY_FLAG, allowEmptyValve } from "../gates/allow-empty.js";
|
|
27
|
+
import { verdictLine } from "../gates/verdict-line.js";
|
|
28
|
+
import { planeVerdictForExit } from "../gates/plane-verdict.js";
|
|
29
|
+
/** The flag grammar both verbs share (one usage line, one allowlist). */
|
|
30
|
+
export const REGISTRY_LIFECYCLE_FLAGS_USAGE = '[--scope <dir>] [--changed-only] [--since <ref>] [--limit <n>] [--offset <n>] [--budget-ms <n>] [--allow-empty] [--json]';
|
|
31
|
+
/**
|
|
32
|
+
* Every flag the verbs honour, plus every dispatcher global (THE list in
|
|
33
|
+
* dispatch/global-flags.ts), which may reach the handler; anything else is a
|
|
34
|
+
* typo that would otherwise read as a satisfied request.
|
|
35
|
+
*/
|
|
36
|
+
const KNOWN_FLAGS = new Set([
|
|
37
|
+
'json',
|
|
38
|
+
'scope',
|
|
39
|
+
'changed-only',
|
|
40
|
+
'since',
|
|
41
|
+
'limit',
|
|
42
|
+
'offset',
|
|
43
|
+
'budget-ms',
|
|
44
|
+
ALLOW_EMPTY_FLAG,
|
|
45
|
+
...GLOBAL_FLAGS,
|
|
46
|
+
]);
|
|
47
|
+
function usage(verb) {
|
|
48
|
+
return `Usage: shrk ${verb} ${REGISTRY_LIFECYCLE_FLAGS_USAGE}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A non-negative integer flag. `undefined` when absent; an error string when
|
|
52
|
+
* present but not an integer ≥ 0 (a bare `--limit`, `--limit abc`, `--limit -1`).
|
|
53
|
+
*/
|
|
54
|
+
function intFlag(args, name) {
|
|
55
|
+
if (!args.flags.has(name))
|
|
56
|
+
return undefined;
|
|
57
|
+
const raw = args.flags.get(name);
|
|
58
|
+
if (typeof raw !== 'string' || !/^\d+$/.test(raw.trim())) {
|
|
59
|
+
return { error: `--${name} needs a non-negative integer (got ${typeof raw === 'string' ? `"${raw}"` : 'no value'})` };
|
|
60
|
+
}
|
|
61
|
+
return Number(raw.trim());
|
|
62
|
+
}
|
|
63
|
+
/** One argument, shell-safe — a path with a space still pastes as one word. */
|
|
64
|
+
function shellArg(value) {
|
|
65
|
+
return /^[\w@%+=:,./-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\''`)}'`;
|
|
66
|
+
}
|
|
67
|
+
/** The command a continuation re-runs: this verb plus every scoping flag the user passed. */
|
|
68
|
+
function continuationCommand(verb, args) {
|
|
69
|
+
const parts = [`shrk ${verb}`];
|
|
70
|
+
// main.ts lifts a global `--cwd` into `args.globalCwd` before the handler
|
|
71
|
+
// runs (resolveCwd reads it there), so reading the flag alone dropped it —
|
|
72
|
+
// and a continuation pasted from another directory paged the wrong root.
|
|
73
|
+
const cwd = flagString(args, 'cwd') ?? args.globalCwd;
|
|
74
|
+
if (cwd)
|
|
75
|
+
parts.push(`--cwd ${shellArg(cwd)}`);
|
|
76
|
+
const scope = flagString(args, 'scope');
|
|
77
|
+
if (scope)
|
|
78
|
+
parts.push(`--scope ${shellArg(scope)}`);
|
|
79
|
+
if (flagBool(args, 'changed-only'))
|
|
80
|
+
parts.push('--changed-only');
|
|
81
|
+
const since = flagString(args, 'since');
|
|
82
|
+
if (since)
|
|
83
|
+
parts.push(`--since ${shellArg(since)}`);
|
|
84
|
+
const limit = flagString(args, 'limit');
|
|
85
|
+
if (limit)
|
|
86
|
+
parts.push(`--limit ${limit}`);
|
|
87
|
+
const budget = flagString(args, 'budget-ms');
|
|
88
|
+
if (budget)
|
|
89
|
+
parts.push(`--budget-ms ${budget}`);
|
|
90
|
+
return parts.join(' ');
|
|
91
|
+
}
|
|
92
|
+
/** The one rule result: the lifecycle rule, judged over the registrations it found. */
|
|
93
|
+
function lifecycleRule(report, coverage) {
|
|
94
|
+
return {
|
|
95
|
+
id: 'registry-lifecycle',
|
|
96
|
+
type: 'lifecycle',
|
|
97
|
+
status: report.missingRemovers.length > 0 ? 'failed' : 'passed',
|
|
98
|
+
severity: 'error',
|
|
99
|
+
counts: {
|
|
100
|
+
candidates: report.totalFiles,
|
|
101
|
+
filesScanned: report.filesScanned,
|
|
102
|
+
registersFound: report.registersFound,
|
|
103
|
+
matchedPairs: report.matchedPairs.length,
|
|
104
|
+
missingRemovers: report.missingRemovers.length,
|
|
105
|
+
oneShotBootstrap: report.oneShotBootstrap.length,
|
|
106
|
+
ignored: report.ignored.length,
|
|
107
|
+
overBudgetFiles: report.overBudgetFiles.length,
|
|
108
|
+
},
|
|
109
|
+
violations: report.missingRemovers.map((m) => ({
|
|
110
|
+
id: m.registerName,
|
|
111
|
+
file: m.file,
|
|
112
|
+
line: m.line,
|
|
113
|
+
message: `no ${m.expectedRemoverNames.slice(0, 3).join(' / ')}`,
|
|
114
|
+
hint: m.suggestion,
|
|
115
|
+
})),
|
|
116
|
+
coverage,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The config-load row. An EXISTING sharkcraft.config.ts that failed to load
|
|
121
|
+
* means the configured skip set was never applied: errored (never
|
|
122
|
+
* `evaluated`), and its engine-owned coverage — 1 config file expected, 0
|
|
123
|
+
* examined — settles a clean run to 2. `--allow-empty` cannot waive it
|
|
124
|
+
* (expected is 1, not 0).
|
|
125
|
+
*/
|
|
126
|
+
function configRule(coverage) {
|
|
127
|
+
return {
|
|
128
|
+
id: 'config',
|
|
129
|
+
type: 'lifecycle',
|
|
130
|
+
status: 'error',
|
|
131
|
+
severity: 'error',
|
|
132
|
+
counts: {},
|
|
133
|
+
violations: [],
|
|
134
|
+
error: `sharkcraft.config.ts ${coverage.reason ?? 'failed to load'}`,
|
|
135
|
+
coverage,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Install SIGTERM / SIGINT handlers that abort the scan for the duration of the
|
|
140
|
+
* run. The JS thread yields between files, so a kill prints the partial report
|
|
141
|
+
* (and the `--offset` that continues it) instead of zero bytes.
|
|
142
|
+
*/
|
|
143
|
+
function trapSignals(controller) {
|
|
144
|
+
const onSignal = () => controller.abort();
|
|
145
|
+
process.once('SIGTERM', onSignal);
|
|
146
|
+
process.once('SIGINT', onSignal);
|
|
147
|
+
return () => {
|
|
148
|
+
process.off('SIGTERM', onSignal);
|
|
149
|
+
process.off('SIGINT', onSignal);
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/** Settle first, render second — one envelope for text and `--json`. */
|
|
153
|
+
function settle(verb, report, args) {
|
|
154
|
+
const proposed = report.missingRemovers.length > 0 ? ExitCode.Failure : ExitCode.VerifiedPass;
|
|
155
|
+
const rules = [
|
|
156
|
+
lifecycleRule(report, {
|
|
157
|
+
...report.registrationCoverage,
|
|
158
|
+
...allowEmptyValve(args, report.registrationCoverage.expected),
|
|
159
|
+
}),
|
|
160
|
+
...(report.configCoverage ? [configRule(report.configCoverage)] : []),
|
|
161
|
+
];
|
|
162
|
+
const run = { ...report.coverage, ...allowEmptyValve(args, report.coverage.expected) };
|
|
163
|
+
// Two literals, not one variable: the contract lock reads the literal FIRST
|
|
164
|
+
// argument of every envelope build and asserts it is a registered verdict verb.
|
|
165
|
+
return verb === 'registry lifecycle'
|
|
166
|
+
? buildGateEnvelope('registry lifecycle', proposed, rules, run)
|
|
167
|
+
: buildGateEnvelope('check registry-lifecycle', proposed, rules, run);
|
|
168
|
+
}
|
|
169
|
+
/** The clean sentence — printed only through `verdictLine`, i.e. only at a settled 0. */
|
|
170
|
+
function cleanSentence(report) {
|
|
171
|
+
const window = report.offset > 0
|
|
172
|
+
? ` (candidates ${report.offset + 1}–${report.totalFiles} of ${report.totalFiles}; earlier ones were not examined in this run)`
|
|
173
|
+
: '';
|
|
174
|
+
return (`No missing removers — ${report.registersFound} register* declaration(s) judged across ` +
|
|
175
|
+
`${report.filesScanned} file(s)${window}. ✓`);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The `--json` reason for the SETTLED verdict, derived from the envelope —
|
|
179
|
+
* never the engine's pre-settlement one, which paired `verdict: 'pass'` (an
|
|
180
|
+
* `--allow-empty` acceptance) with a not-verified reason.
|
|
181
|
+
*
|
|
182
|
+
* - exit 0: the acceptance lines, or nothing;
|
|
183
|
+
* - exit 1: the engine's failure reason, plus any `also not verified: …`;
|
|
184
|
+
* - exit 2: the shortfalls.
|
|
185
|
+
*/
|
|
186
|
+
function settledReason(env, report) {
|
|
187
|
+
if (env.exit === ExitCode.VerifiedPass)
|
|
188
|
+
return env.accepted.length > 0 ? env.accepted.join('; ') : undefined;
|
|
189
|
+
if (env.exit === ExitCode.Failure) {
|
|
190
|
+
const parts = [
|
|
191
|
+
...(report.verdict === 'fail' && report.verdictReason ? [report.verdictReason] : []),
|
|
192
|
+
...(env.shortfalls.length > 0 ? [`also not verified: ${env.shortfalls.join('; ')}`] : []),
|
|
193
|
+
];
|
|
194
|
+
return parts.length > 0 ? parts.join('; ') : undefined;
|
|
195
|
+
}
|
|
196
|
+
return env.shortfalls.length > 0 ? env.shortfalls.join('; ') : undefined;
|
|
197
|
+
}
|
|
198
|
+
/** True when every shortfall is an empty scope (so `--allow-empty` would clear it). */
|
|
199
|
+
function onlyEmptyShortfalls(report) {
|
|
200
|
+
// A config that failed to load is never an empty scope: --allow-empty cannot clear it.
|
|
201
|
+
if (report.configCoverage)
|
|
202
|
+
return false;
|
|
203
|
+
const c = report.coverage;
|
|
204
|
+
if (c.capped)
|
|
205
|
+
return false;
|
|
206
|
+
const filesEmptyOrFull = c.expected === 0 || c.examined >= c.expected;
|
|
207
|
+
return filesEmptyOrFull && (c.expected === 0 || report.registrationCoverage.expected === 0);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Run a lifecycle scan for `verb`. `options.signal` is the in-process test seam
|
|
211
|
+
* for SIGTERM / SIGINT: aborting it prints the partial report and exits `2`.
|
|
212
|
+
*/
|
|
213
|
+
export async function runRegistryLifecycle(args, verb, options = {}) {
|
|
214
|
+
const json = flagBool(args, 'json');
|
|
215
|
+
const badFlag = (error) => {
|
|
216
|
+
process.stderr.write(`${error}\n${usage(verb)}\n`);
|
|
217
|
+
return ExitCode.UsageError;
|
|
218
|
+
};
|
|
219
|
+
// `--offset -1`: the parser reads `-1` as a flag of its own and leaves
|
|
220
|
+
// `--offset` valueless. Report the malformed VALUE — what `intFlag` promises —
|
|
221
|
+
// never an unknown `--1`.
|
|
222
|
+
for (const name of ['limit', 'offset', 'budget-ms']) {
|
|
223
|
+
const at = args.flags.get(name) === true ? (args.argv ?? []).indexOf(`--${name}`) : -1;
|
|
224
|
+
const next = at >= 0 ? args.argv?.[at + 1] : undefined;
|
|
225
|
+
if (next !== undefined && /^-\d/.test(next)) {
|
|
226
|
+
return badFlag(`--${name} needs a non-negative integer (got "${next}")`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const unknown = firstUnknownFlag(args, KNOWN_FLAGS);
|
|
230
|
+
if (unknown !== undefined) {
|
|
231
|
+
process.stderr.write(`unknown option '${spellFlagAsTyped(unknown, args.argv)}'\n${usage(verb)}\n`);
|
|
232
|
+
return ExitCode.UsageError;
|
|
233
|
+
}
|
|
234
|
+
const limit = intFlag(args, 'limit');
|
|
235
|
+
if (typeof limit === 'object')
|
|
236
|
+
return badFlag(limit.error);
|
|
237
|
+
const offset = intFlag(args, 'offset');
|
|
238
|
+
if (typeof offset === 'object')
|
|
239
|
+
return badFlag(offset.error);
|
|
240
|
+
const budgetMs = intFlag(args, 'budget-ms');
|
|
241
|
+
if (typeof budgetMs === 'object')
|
|
242
|
+
return badFlag(budgetMs.error);
|
|
243
|
+
const cwd = resolveCwd(args);
|
|
244
|
+
const scope = flagString(args, 'scope');
|
|
245
|
+
const changedOnly = flagBool(args, 'changed-only');
|
|
246
|
+
const since = flagString(args, 'since');
|
|
247
|
+
// `--changed-only` scopes the scan to the diff (tracked + untracked), so it
|
|
248
|
+
// runs inline in seconds; the full-tree walk is bounded by the budget.
|
|
249
|
+
let files;
|
|
250
|
+
if (changedOnly || since) {
|
|
251
|
+
const changed = resolveChangedFiles({
|
|
252
|
+
projectRoot: cwd,
|
|
253
|
+
...(since ? { since } : {}),
|
|
254
|
+
...(changedOnly && !since ? { includeWorktree: true } : {}),
|
|
255
|
+
});
|
|
256
|
+
files = changed.files;
|
|
257
|
+
}
|
|
258
|
+
// The full-tree walk honours the project's skip-dir config (skipDirsAdd
|
|
259
|
+
// extends the defaults; skipDirs replaces them and is warned about).
|
|
260
|
+
let skipDirs;
|
|
261
|
+
let skipDirsAdd;
|
|
262
|
+
let configLoadError;
|
|
263
|
+
if (files === undefined) {
|
|
264
|
+
const loaded = await resolveProjectConfig(cwd);
|
|
265
|
+
if (loaded.ok) {
|
|
266
|
+
skipDirs = loaded.value.config.registryLifecycle?.skipDirs;
|
|
267
|
+
skipDirsAdd = loaded.value.config.registryLifecycle?.skipDirsAdd;
|
|
268
|
+
}
|
|
269
|
+
else if (loaded.error.code !== ERROR_CODES.SHARKCRAFT_FOLDER_NOT_FOUND) {
|
|
270
|
+
// A config that EXISTS but failed to load is not "no config": the
|
|
271
|
+
// configured skip set was never applied. The engine records it as a
|
|
272
|
+
// coverage shortfall, so the run can never settle to 0 over a scope the
|
|
273
|
+
// project did not ask for.
|
|
274
|
+
const fullPath = loaded.error.details?.['fullPath'];
|
|
275
|
+
configLoadError = { file: typeof fullPath === 'string' ? fullPath : null, message: loaded.error.message };
|
|
276
|
+
}
|
|
277
|
+
// Only the slow full-tree path needs the heartbeat (JSON keeps stdout clean).
|
|
278
|
+
if (!json) {
|
|
279
|
+
process.stderr.write('⏳ Scanning source for register*/remove* symmetry (bounded by a wall-clock budget)…\n');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const controller = new AbortController();
|
|
283
|
+
const forward = () => controller.abort();
|
|
284
|
+
if (options.signal?.aborted)
|
|
285
|
+
controller.abort();
|
|
286
|
+
else
|
|
287
|
+
options.signal?.addEventListener('abort', forward, { once: true });
|
|
288
|
+
const release = trapSignals(controller);
|
|
289
|
+
let report;
|
|
290
|
+
try {
|
|
291
|
+
report = await runRegistryLifecycleScan({
|
|
292
|
+
projectRoot: cwd,
|
|
293
|
+
...(files !== undefined ? { files } : {}),
|
|
294
|
+
...(scope ? { scope } : {}),
|
|
295
|
+
...(skipDirs ? { skipDirs } : {}),
|
|
296
|
+
...(skipDirsAdd ? { skipDirsAdd } : {}),
|
|
297
|
+
...(limit !== undefined ? { limit } : {}),
|
|
298
|
+
...(offset !== undefined ? { offset } : {}),
|
|
299
|
+
...(budgetMs !== undefined ? { budgetMs } : {}),
|
|
300
|
+
...(configLoadError ? { configLoadError } : {}),
|
|
301
|
+
}, { signal: controller.signal });
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
release();
|
|
305
|
+
options.signal?.removeEventListener('abort', forward);
|
|
306
|
+
}
|
|
307
|
+
// An offset past the last candidate is a typo'd continuation, not an empty
|
|
308
|
+
// scope: refusing it keeps `--allow-empty` from printing ✓ over "candidates
|
|
309
|
+
// 2103–2102 of 2102". Only once the walk completed — before that,
|
|
310
|
+
// `totalFiles` is a lower bound.
|
|
311
|
+
if (offset !== undefined && offset > 0 && report.walkComplete && offset >= report.totalFiles) {
|
|
312
|
+
return badFlag(`--offset ${offset} is past the last candidate (${report.totalFiles} candidate(s) in scope)`);
|
|
313
|
+
}
|
|
314
|
+
const env = settle(verb, report, args);
|
|
315
|
+
const exit = env.exit;
|
|
316
|
+
if (json) {
|
|
317
|
+
process.stdout.write(asJson({
|
|
318
|
+
...report,
|
|
319
|
+
verdict: planeVerdictForExit(exit),
|
|
320
|
+
// The reason for the SETTLED verdict (omitted when there is none) —
|
|
321
|
+
// never the engine's pre-settlement one.
|
|
322
|
+
verdictReason: settledReason(env, report),
|
|
323
|
+
exitCode: exit,
|
|
324
|
+
gate: env,
|
|
325
|
+
}) + '\n');
|
|
326
|
+
return exit;
|
|
327
|
+
}
|
|
328
|
+
process.stdout.write(renderRegistryLifecycleReportText(report, { command: continuationCommand(verb, args) }));
|
|
329
|
+
const lead = exit === ExitCode.NotVerified && onlyEmptyShortfalls(report)
|
|
330
|
+
? 'Nothing to judge in scope. Pass --allow-empty to accept an empty scope explicitly.'
|
|
331
|
+
: undefined;
|
|
332
|
+
const line = verdictLine(env, cleanSentence(report), lead);
|
|
333
|
+
if (line)
|
|
334
|
+
process.stdout.write(`\n${line}\n`);
|
|
335
|
+
return exit;
|
|
336
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.command.d.ts","sourceRoot":"","sources":["../../src/commands/registry.command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.command.d.ts","sourceRoot":"","sources":["../../src/commands/registry.command.ts"],"names":[],"mappings":"AAwCA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAgBhC,eAAO,MAAM,wBAAwB,EAAE,eAUtC,CAAC;AA+ZF,eAAO,MAAM,eAAe,EAAE,eA6D7B,CAAC"}
|