@shrkcrft/cli 0.1.0-alpha.2
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/LICENSE +21 -0
- package/README.md +15 -0
- package/dist/asset-preview/apply-action-hint-stub.d.ts +28 -0
- package/dist/asset-preview/apply-action-hint-stub.d.ts.map +1 -0
- package/dist/asset-preview/apply-action-hint-stub.js +170 -0
- package/dist/asset-preview/apply-asset-preview.d.ts +31 -0
- package/dist/asset-preview/apply-asset-preview.d.ts.map +1 -0
- package/dist/asset-preview/apply-asset-preview.js +210 -0
- package/dist/asset-preview/apply-knowledge-stale-fix.d.ts +37 -0
- package/dist/asset-preview/apply-knowledge-stale-fix.d.ts.map +1 -0
- package/dist/asset-preview/apply-knowledge-stale-fix.js +344 -0
- package/dist/asset-preview/apply-missing-barrel.d.ts +15 -0
- package/dist/asset-preview/apply-missing-barrel.d.ts.map +1 -0
- package/dist/asset-preview/apply-missing-barrel.js +65 -0
- package/dist/asset-preview/apply-template-drift-fix.d.ts +21 -0
- package/dist/asset-preview/apply-template-drift-fix.d.ts.map +1 -0
- package/dist/asset-preview/apply-template-drift-fix.js +125 -0
- package/dist/asset-preview/apply-template-update.d.ts +43 -0
- package/dist/asset-preview/apply-template-update.d.ts.map +1 -0
- package/dist/asset-preview/apply-template-update.js +257 -0
- package/dist/asset-preview/entry-mutator.d.ts +106 -0
- package/dist/asset-preview/entry-mutator.d.ts.map +1 -0
- package/dist/asset-preview/entry-mutator.js +428 -0
- package/dist/authoring/authoring-kit.d.ts +36 -0
- package/dist/authoring/authoring-kit.d.ts.map +1 -0
- package/dist/authoring/authoring-kit.js +106 -0
- package/dist/command-registry.d.ts +158 -0
- package/dist/command-registry.d.ts.map +1 -0
- package/dist/command-registry.js +348 -0
- package/dist/commands/apply.command.d.ts +3 -0
- package/dist/commands/apply.command.d.ts.map +1 -0
- package/dist/commands/apply.command.js +879 -0
- package/dist/commands/architecture.command.d.ts +5 -0
- package/dist/commands/architecture.command.d.ts.map +1 -0
- package/dist/commands/architecture.command.js +141 -0
- package/dist/commands/ask.command.d.ts +3 -0
- package/dist/commands/ask.command.d.ts.map +1 -0
- package/dist/commands/ask.command.js +58 -0
- package/dist/commands/audit.command.d.ts +3 -0
- package/dist/commands/audit.command.d.ts.map +1 -0
- package/dist/commands/audit.command.js +141 -0
- package/dist/commands/biome.command.d.ts +7 -0
- package/dist/commands/biome.command.d.ts.map +1 -0
- package/dist/commands/biome.command.js +350 -0
- package/dist/commands/boundaries.command.d.ts +9 -0
- package/dist/commands/boundaries.command.d.ts.map +1 -0
- package/dist/commands/boundaries.command.js +314 -0
- package/dist/commands/brief.command.d.ts +3 -0
- package/dist/commands/brief.command.d.ts.map +1 -0
- package/dist/commands/brief.command.js +206 -0
- package/dist/commands/bundle.command.d.ts +3 -0
- package/dist/commands/bundle.command.d.ts.map +1 -0
- package/dist/commands/bundle.command.js +1183 -0
- package/dist/commands/changes.command.d.ts +3 -0
- package/dist/commands/changes.command.d.ts.map +1 -0
- package/dist/commands/changes.command.js +155 -0
- package/dist/commands/check.command.d.ts +3 -0
- package/dist/commands/check.command.d.ts.map +1 -0
- package/dist/commands/check.command.js +553 -0
- package/dist/commands/checks.command.d.ts +29 -0
- package/dist/commands/checks.command.d.ts.map +1 -0
- package/dist/commands/checks.command.js +521 -0
- package/dist/commands/ci.command.d.ts +3 -0
- package/dist/commands/ci.command.d.ts.map +1 -0
- package/dist/commands/ci.command.js +680 -0
- package/dist/commands/codemod.command.d.ts +3 -0
- package/dist/commands/codemod.command.d.ts.map +1 -0
- package/dist/commands/codemod.command.js +130 -0
- package/dist/commands/command-catalog.d.ts +265 -0
- package/dist/commands/command-catalog.d.ts.map +1 -0
- package/dist/commands/command-catalog.js +3242 -0
- package/dist/commands/commands.command.d.ts +92 -0
- package/dist/commands/commands.command.d.ts.map +1 -0
- package/dist/commands/commands.command.js +1208 -0
- package/dist/commands/constructs.command.d.ts +15 -0
- package/dist/commands/constructs.command.d.ts.map +1 -0
- package/dist/commands/constructs.command.js +669 -0
- package/dist/commands/context.command.d.ts +3 -0
- package/dist/commands/context.command.d.ts.map +1 -0
- package/dist/commands/context.command.js +120 -0
- package/dist/commands/contract-gate.command.d.ts +5 -0
- package/dist/commands/contract-gate.command.d.ts.map +1 -0
- package/dist/commands/contract-gate.command.js +208 -0
- package/dist/commands/contract-templates.command.d.ts +8 -0
- package/dist/commands/contract-templates.command.d.ts.map +1 -0
- package/dist/commands/contract-templates.command.js +151 -0
- package/dist/commands/contract.command.d.ts +3 -0
- package/dist/commands/contract.command.d.ts.map +1 -0
- package/dist/commands/contract.command.js +105 -0
- package/dist/commands/conventions.command.d.ts +8 -0
- package/dist/commands/conventions.command.d.ts.map +1 -0
- package/dist/commands/conventions.command.js +169 -0
- package/dist/commands/coverage.command.d.ts +3 -0
- package/dist/commands/coverage.command.d.ts.map +1 -0
- package/dist/commands/coverage.command.js +56 -0
- package/dist/commands/daily.commands.d.ts +5 -0
- package/dist/commands/daily.commands.d.ts.map +1 -0
- package/dist/commands/daily.commands.js +224 -0
- package/dist/commands/dashboard-export.command.d.ts +4 -0
- package/dist/commands/dashboard-export.command.d.ts.map +1 -0
- package/dist/commands/dashboard-export.command.js +86 -0
- package/dist/commands/dashboard.command.d.ts +3 -0
- package/dist/commands/dashboard.command.d.ts.map +1 -0
- package/dist/commands/dashboard.command.js +106 -0
- package/dist/commands/dev.command.d.ts +3 -0
- package/dist/commands/dev.command.d.ts.map +1 -0
- package/dist/commands/dev.command.js +1392 -0
- package/dist/commands/diagnostics.command.d.ts +5 -0
- package/dist/commands/diagnostics.command.d.ts.map +1 -0
- package/dist/commands/diagnostics.command.js +97 -0
- package/dist/commands/docs.command.d.ts +4 -0
- package/dist/commands/docs.command.d.ts.map +1 -0
- package/dist/commands/docs.command.js +34 -0
- package/dist/commands/doctor.command.d.ts +7 -0
- package/dist/commands/doctor.command.d.ts.map +1 -0
- package/dist/commands/doctor.command.js +681 -0
- package/dist/commands/drift.command.d.ts +3 -0
- package/dist/commands/drift.command.d.ts.map +1 -0
- package/dist/commands/drift.command.js +124 -0
- package/dist/commands/eslint.command.d.ts +7 -0
- package/dist/commands/eslint.command.d.ts.map +1 -0
- package/dist/commands/eslint.command.js +423 -0
- package/dist/commands/explore.command.d.ts +3 -0
- package/dist/commands/explore.command.d.ts.map +1 -0
- package/dist/commands/explore.command.js +65 -0
- package/dist/commands/export-bundle.command.d.ts +6 -0
- package/dist/commands/export-bundle.command.d.ts.map +1 -0
- package/dist/commands/export-bundle.command.js +96 -0
- package/dist/commands/export.command.d.ts +3 -0
- package/dist/commands/export.command.d.ts.map +1 -0
- package/dist/commands/export.command.js +83 -0
- package/dist/commands/feedback-dispatch.command.d.ts +12 -0
- package/dist/commands/feedback-dispatch.command.d.ts.map +1 -0
- package/dist/commands/feedback-dispatch.command.js +63 -0
- package/dist/commands/feedback.command.d.ts +11 -0
- package/dist/commands/feedback.command.d.ts.map +1 -0
- package/dist/commands/feedback.command.js +336 -0
- package/dist/commands/fix.command.d.ts +3 -0
- package/dist/commands/fix.command.d.ts.map +1 -0
- package/dist/commands/fix.command.js +776 -0
- package/dist/commands/gen.command.d.ts +3 -0
- package/dist/commands/gen.command.d.ts.map +1 -0
- package/dist/commands/gen.command.js +136 -0
- package/dist/commands/git.command.d.ts +6 -0
- package/dist/commands/git.command.d.ts.map +1 -0
- package/dist/commands/git.command.js +81 -0
- package/dist/commands/graph.command.d.ts +3 -0
- package/dist/commands/graph.command.d.ts.map +1 -0
- package/dist/commands/graph.command.js +287 -0
- package/dist/commands/grounding.command.d.ts +7 -0
- package/dist/commands/grounding.command.d.ts.map +1 -0
- package/dist/commands/grounding.command.js +54 -0
- package/dist/commands/help.command.d.ts +20 -0
- package/dist/commands/help.command.d.ts.map +1 -0
- package/dist/commands/help.command.js +127 -0
- package/dist/commands/helper.command.d.ts +6 -0
- package/dist/commands/helper.command.d.ts.map +1 -0
- package/dist/commands/helper.command.js +170 -0
- package/dist/commands/ide.command.d.ts +6 -0
- package/dist/commands/ide.command.d.ts.map +1 -0
- package/dist/commands/ide.command.js +340 -0
- package/dist/commands/impact.command.d.ts +3 -0
- package/dist/commands/impact.command.d.ts.map +1 -0
- package/dist/commands/impact.command.js +819 -0
- package/dist/commands/import.command.d.ts +3 -0
- package/dist/commands/import.command.d.ts.map +1 -0
- package/dist/commands/import.command.js +115 -0
- package/dist/commands/infer.command.d.ts +3 -0
- package/dist/commands/infer.command.d.ts.map +1 -0
- package/dist/commands/infer.command.js +227 -0
- package/dist/commands/ingest.command.d.ts +6 -0
- package/dist/commands/ingest.command.d.ts.map +1 -0
- package/dist/commands/ingest.command.js +532 -0
- package/dist/commands/init.command.d.ts +3 -0
- package/dist/commands/init.command.d.ts.map +1 -0
- package/dist/commands/init.command.js +301 -0
- package/dist/commands/inspect.command.d.ts +3 -0
- package/dist/commands/inspect.command.d.ts.map +1 -0
- package/dist/commands/inspect.command.js +122 -0
- package/dist/commands/knowledge-author.command.d.ts +22 -0
- package/dist/commands/knowledge-author.command.d.ts.map +1 -0
- package/dist/commands/knowledge-author.command.js +366 -0
- package/dist/commands/knowledge-propose.command.d.ts +3 -0
- package/dist/commands/knowledge-propose.command.d.ts.map +1 -0
- package/dist/commands/knowledge-propose.command.js +125 -0
- package/dist/commands/knowledge.command.d.ts +18 -0
- package/dist/commands/knowledge.command.d.ts.map +1 -0
- package/dist/commands/knowledge.command.js +538 -0
- package/dist/commands/languages.command.d.ts +3 -0
- package/dist/commands/languages.command.d.ts.map +1 -0
- package/dist/commands/languages.command.js +300 -0
- package/dist/commands/lint.command.d.ts +15 -0
- package/dist/commands/lint.command.d.ts.map +1 -0
- package/dist/commands/lint.command.js +194 -0
- package/dist/commands/mcp.command.d.ts +3 -0
- package/dist/commands/mcp.command.d.ts.map +1 -0
- package/dist/commands/mcp.command.js +74 -0
- package/dist/commands/memory.command.d.ts +11 -0
- package/dist/commands/memory.command.d.ts.map +1 -0
- package/dist/commands/memory.command.js +264 -0
- package/dist/commands/onboard.command.d.ts +3 -0
- package/dist/commands/onboard.command.d.ts.map +1 -0
- package/dist/commands/onboard.command.js +650 -0
- package/dist/commands/orchestrate.command.d.ts +3 -0
- package/dist/commands/orchestrate.command.d.ts.map +1 -0
- package/dist/commands/orchestrate.command.js +49 -0
- package/dist/commands/owners.command.d.ts +5 -0
- package/dist/commands/owners.command.d.ts.map +1 -0
- package/dist/commands/owners.command.js +113 -0
- package/dist/commands/ownership.command.d.ts +5 -0
- package/dist/commands/ownership.command.d.ts.map +1 -0
- package/dist/commands/ownership.command.js +117 -0
- package/dist/commands/pack-author.command.d.ts +30 -0
- package/dist/commands/pack-author.command.d.ts.map +1 -0
- package/dist/commands/pack-author.command.js +242 -0
- package/dist/commands/packs-new.d.ts +27 -0
- package/dist/commands/packs-new.d.ts.map +1 -0
- package/dist/commands/packs-new.js +805 -0
- package/dist/commands/packs.command.d.ts +15 -0
- package/dist/commands/packs.command.d.ts.map +1 -0
- package/dist/commands/packs.command.js +958 -0
- package/dist/commands/paths.command.d.ts +6 -0
- package/dist/commands/paths.command.d.ts.map +1 -0
- package/dist/commands/paths.command.js +97 -0
- package/dist/commands/pipelines.command.d.ts +9 -0
- package/dist/commands/pipelines.command.d.ts.map +1 -0
- package/dist/commands/pipelines.command.js +308 -0
- package/dist/commands/plan-check.command.d.ts +27 -0
- package/dist/commands/plan-check.command.d.ts.map +1 -0
- package/dist/commands/plan-check.command.js +150 -0
- package/dist/commands/plan-simulate.command.d.ts +3 -0
- package/dist/commands/plan-simulate.command.d.ts.map +1 -0
- package/dist/commands/plan-simulate.command.js +60 -0
- package/dist/commands/plan.command.d.ts +8 -0
- package/dist/commands/plan.command.d.ts.map +1 -0
- package/dist/commands/plan.command.js +139 -0
- package/dist/commands/playbooks.command.d.ts +10 -0
- package/dist/commands/playbooks.command.d.ts.map +1 -0
- package/dist/commands/playbooks.command.js +296 -0
- package/dist/commands/plugin.command.d.ts +11 -0
- package/dist/commands/plugin.command.d.ts.map +1 -0
- package/dist/commands/plugin.command.js +394 -0
- package/dist/commands/policy.command.d.ts +8 -0
- package/dist/commands/policy.command.d.ts.map +1 -0
- package/dist/commands/policy.command.js +451 -0
- package/dist/commands/pr.command.d.ts +3 -0
- package/dist/commands/pr.command.d.ts.map +1 -0
- package/dist/commands/pr.command.js +132 -0
- package/dist/commands/preflight.command.d.ts +3 -0
- package/dist/commands/preflight.command.d.ts.map +1 -0
- package/dist/commands/preflight.command.js +102 -0
- package/dist/commands/presets.command.d.ts +17 -0
- package/dist/commands/presets.command.d.ts.map +1 -0
- package/dist/commands/presets.command.js +647 -0
- package/dist/commands/profiles.command.d.ts +7 -0
- package/dist/commands/profiles.command.d.ts.map +1 -0
- package/dist/commands/profiles.command.js +151 -0
- package/dist/commands/provenance.command.d.ts +26 -0
- package/dist/commands/provenance.command.d.ts.map +1 -0
- package/dist/commands/provenance.command.js +237 -0
- package/dist/commands/quality.command.d.ts +5 -0
- package/dist/commands/quality.command.d.ts.map +1 -0
- package/dist/commands/quality.command.js +69 -0
- package/dist/commands/recommend.command.d.ts +4 -0
- package/dist/commands/recommend.command.d.ts.map +1 -0
- package/dist/commands/recommend.command.js +270 -0
- package/dist/commands/registrations.command.d.ts +3 -0
- package/dist/commands/registrations.command.d.ts.map +1 -0
- package/dist/commands/registrations.command.js +300 -0
- package/dist/commands/registry.command.d.ts +4 -0
- package/dist/commands/registry.command.d.ts.map +1 -0
- package/dist/commands/registry.command.js +37 -0
- package/dist/commands/release.command.d.ts +4 -0
- package/dist/commands/release.command.d.ts.map +1 -0
- package/dist/commands/release.command.js +639 -0
- package/dist/commands/repo.command.d.ts +3 -0
- package/dist/commands/repo.command.d.ts.map +1 -0
- package/dist/commands/repo.command.js +24 -0
- package/dist/commands/report.command.d.ts +3 -0
- package/dist/commands/report.command.d.ts.map +1 -0
- package/dist/commands/report.command.js +511 -0
- package/dist/commands/reposet.command.d.ts +6 -0
- package/dist/commands/reposet.command.d.ts.map +1 -0
- package/dist/commands/reposet.command.js +120 -0
- package/dist/commands/review.command.d.ts +3 -0
- package/dist/commands/review.command.d.ts.map +1 -0
- package/dist/commands/review.command.js +354 -0
- package/dist/commands/risk.command.d.ts +3 -0
- package/dist/commands/risk.command.d.ts.map +1 -0
- package/dist/commands/risk.command.js +56 -0
- package/dist/commands/rounds.command.d.ts +8 -0
- package/dist/commands/rounds.command.d.ts.map +1 -0
- package/dist/commands/rounds.command.js +180 -0
- package/dist/commands/rules.command.d.ts +49 -0
- package/dist/commands/rules.command.d.ts.map +1 -0
- package/dist/commands/rules.command.js +435 -0
- package/dist/commands/runtime.command.d.ts +3 -0
- package/dist/commands/runtime.command.d.ts.map +1 -0
- package/dist/commands/runtime.command.js +56 -0
- package/dist/commands/safety.command.d.ts +3 -0
- package/dist/commands/safety.command.d.ts.map +1 -0
- package/dist/commands/safety.command.js +117 -0
- package/dist/commands/scaffolds.command.d.ts +5 -0
- package/dist/commands/scaffolds.command.d.ts.map +1 -0
- package/dist/commands/scaffolds.command.js +122 -0
- package/dist/commands/schemas.command.d.ts +21 -0
- package/dist/commands/schemas.command.d.ts.map +1 -0
- package/dist/commands/schemas.command.js +296 -0
- package/dist/commands/search.command.d.ts +12 -0
- package/dist/commands/search.command.d.ts.map +1 -0
- package/dist/commands/search.command.js +275 -0
- package/dist/commands/self-config.command.d.ts +7 -0
- package/dist/commands/self-config.command.d.ts.map +1 -0
- package/dist/commands/self-config.command.js +156 -0
- package/dist/commands/self.command.d.ts +3 -0
- package/dist/commands/self.command.d.ts.map +1 -0
- package/dist/commands/self.command.js +117 -0
- package/dist/commands/simulate.command.d.ts +3 -0
- package/dist/commands/simulate.command.d.ts.map +1 -0
- package/dist/commands/simulate.command.js +54 -0
- package/dist/commands/spec.command.d.ts +29 -0
- package/dist/commands/spec.command.d.ts.map +1 -0
- package/dist/commands/spec.command.js +985 -0
- package/dist/commands/start-here.command.d.ts +3 -0
- package/dist/commands/start-here.command.d.ts.map +1 -0
- package/dist/commands/start-here.command.js +35 -0
- package/dist/commands/stats.command.d.ts +3 -0
- package/dist/commands/stats.command.d.ts.map +1 -0
- package/dist/commands/stats.command.js +88 -0
- package/dist/commands/surface.command.d.ts +15 -0
- package/dist/commands/surface.command.d.ts.map +1 -0
- package/dist/commands/surface.command.js +328 -0
- package/dist/commands/task-context.command.d.ts +7 -0
- package/dist/commands/task-context.command.d.ts.map +1 -0
- package/dist/commands/task-context.command.js +646 -0
- package/dist/commands/task.command.d.ts +3 -0
- package/dist/commands/task.command.d.ts.map +1 -0
- package/dist/commands/task.command.js +301 -0
- package/dist/commands/template-quality.command.d.ts +5 -0
- package/dist/commands/template-quality.command.d.ts.map +1 -0
- package/dist/commands/template-quality.command.js +128 -0
- package/dist/commands/templates.command.d.ts +26 -0
- package/dist/commands/templates.command.d.ts.map +1 -0
- package/dist/commands/templates.command.js +964 -0
- package/dist/commands/test.command.d.ts +3 -0
- package/dist/commands/test.command.d.ts.map +1 -0
- package/dist/commands/test.command.js +262 -0
- package/dist/commands/tests.command.d.ts +5 -0
- package/dist/commands/tests.command.d.ts.map +1 -0
- package/dist/commands/tests.command.js +97 -0
- package/dist/commands/trace.command.d.ts +3 -0
- package/dist/commands/trace.command.d.ts.map +1 -0
- package/dist/commands/trace.command.js +121 -0
- package/dist/commands/upgrade.command.d.ts +4 -0
- package/dist/commands/upgrade.command.d.ts.map +1 -0
- package/dist/commands/upgrade.command.js +43 -0
- package/dist/commands/version.command.d.ts +3 -0
- package/dist/commands/version.command.d.ts.map +1 -0
- package/dist/commands/version.command.js +10 -0
- package/dist/commands/why.command.d.ts +24 -0
- package/dist/commands/why.command.d.ts.map +1 -0
- package/dist/commands/why.command.js +119 -0
- package/dist/dashboard/dashboard-api-server.d.ts +21 -0
- package/dist/dashboard/dashboard-api-server.d.ts.map +1 -0
- package/dist/dashboard/dashboard-api-server.js +410 -0
- package/dist/dashboard/live-session-server.d.ts +18 -0
- package/dist/dashboard/live-session-server.d.ts.map +1 -0
- package/dist/dashboard/live-session-server.js +133 -0
- package/dist/diff/collect-changed-paths.d.ts +27 -0
- package/dist/diff/collect-changed-paths.d.ts.map +1 -0
- package/dist/diff/collect-changed-paths.js +68 -0
- package/dist/doctor/doctor-tags.d.ts +63 -0
- package/dist/doctor/doctor-tags.d.ts.map +1 -0
- package/dist/doctor/doctor-tags.js +146 -0
- package/dist/export/export-formats.d.ts +22 -0
- package/dist/export/export-formats.d.ts.map +1 -0
- package/dist/export/export-formats.js +135 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/init/detected-block.d.ts +57 -0
- package/dist/init/detected-block.d.ts.map +1 -0
- package/dist/init/detected-block.js +197 -0
- package/dist/init/gitignore.d.ts +30 -0
- package/dist/init/gitignore.d.ts.map +1 -0
- package/dist/init/gitignore.js +110 -0
- package/dist/init/init-templates.d.ts +6 -0
- package/dist/init/init-templates.d.ts.map +1 -0
- package/dist/init/init-templates.js +413 -0
- package/dist/main.d.ts +18 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +699 -0
- package/dist/output/failure-hints.d.ts +55 -0
- package/dist/output/failure-hints.d.ts.map +1 -0
- package/dist/output/failure-hints.js +159 -0
- package/dist/output/format-output.d.ts +9 -0
- package/dist/output/format-output.d.ts.map +1 -0
- package/dist/output/format-output.js +26 -0
- package/dist/output/print-error.d.ts +3 -0
- package/dist/output/print-error.d.ts.map +1 -0
- package/dist/output/print-error.js +14 -0
- package/dist/output/watch-loop.d.ts +37 -0
- package/dist/output/watch-loop.d.ts.map +1 -0
- package/dist/output/watch-loop.js +115 -0
- package/dist/schemas/json-schemas.d.ts +1630 -0
- package/dist/schemas/json-schemas.d.ts.map +1 -0
- package/dist/schemas/json-schemas.js +811 -0
- package/dist/surface/about.d.ts +10 -0
- package/dist/surface/about.d.ts.map +1 -0
- package/dist/surface/about.js +53 -0
- package/dist/surface/load-surface-context.d.ts +34 -0
- package/dist/surface/load-surface-context.d.ts.map +1 -0
- package/dist/surface/load-surface-context.js +100 -0
- package/dist/surface/no-args-landing.d.ts +7 -0
- package/dist/surface/no-args-landing.d.ts.map +1 -0
- package/dist/surface/no-args-landing.js +36 -0
- package/dist/surface/not-enabled-error.d.ts +24 -0
- package/dist/surface/not-enabled-error.d.ts.map +1 -0
- package/dist/surface/not-enabled-error.js +36 -0
- package/dist/surface/profiles.d.ts +37 -0
- package/dist/surface/profiles.d.ts.map +1 -0
- package/dist/surface/profiles.js +151 -0
- package/dist/surface/shape-defaults.d.ts +21 -0
- package/dist/surface/shape-defaults.d.ts.map +1 -0
- package/dist/surface/shape-defaults.js +50 -0
- package/dist/surface/spine-extractor.d.ts +38 -0
- package/dist/surface/spine-extractor.d.ts.map +1 -0
- package/dist/surface/spine-extractor.js +100 -0
- package/dist/surface/surface-config-writer.d.ts +59 -0
- package/dist/surface/surface-config-writer.d.ts.map +1 -0
- package/dist/surface/surface-config-writer.js +135 -0
- package/dist/surface/surface-summary.d.ts +66 -0
- package/dist/surface/surface-summary.d.ts.map +1 -0
- package/dist/surface/surface-summary.js +162 -0
- package/dist/surface/tier.d.ts +100 -0
- package/dist/surface/tier.d.ts.map +1 -0
- package/dist/surface/tier.js +172 -0
- package/dist/task-next/apply-batch-runner.d.ts +42 -0
- package/dist/task-next/apply-batch-runner.d.ts.map +1 -0
- package/dist/task-next/apply-batch-runner.js +192 -0
- package/dist/task-next/task-next-ranker.d.ts +75 -0
- package/dist/task-next/task-next-ranker.d.ts.map +1 -0
- package/dist/task-next/task-next-ranker.js +179 -0
- package/dist/usage/usage-log.d.ts +54 -0
- package/dist/usage/usage-log.d.ts.map +1 -0
- package/dist/usage/usage-log.js +105 -0
- package/dist/validation/run-validation-loop.d.ts +38 -0
- package/dist/validation/run-validation-loop.d.ts.map +1 -0
- package/dist/validation/run-validation-loop.js +100 -0
- package/package.json +73 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import * as nodePath from 'node:path';
|
|
3
|
+
import { AssetKind, AssetProvenanceOperation, AssetProvenanceSource, buildRuleScaffold, diagnoseRuleQuality, inspectSharkcraft, recordProvenance, renderRuleQualityText, RuleScaffoldKind, } from '@shrkcrft/inspector';
|
|
4
|
+
import { formatRuleCompact, formatRuleFull, formatRulesForAi } from '@shrkcrft/rules';
|
|
5
|
+
import { flagBool, flagNumber, flagString, flagList, resolveCwd, } from "../command-registry.js";
|
|
6
|
+
import { asJson, header } from "../output/format-output.js";
|
|
7
|
+
import { knowledgeAddCommand, knowledgeRemoveCommand, knowledgeUpdateCommand, } from "./knowledge-author.command.js";
|
|
8
|
+
export const rulesListCommand = {
|
|
9
|
+
name: 'list',
|
|
10
|
+
description: 'List all rules.',
|
|
11
|
+
usage: 'shrk rules list [--json]',
|
|
12
|
+
async run(args) {
|
|
13
|
+
const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
|
|
14
|
+
const rules = inspection.ruleService.list();
|
|
15
|
+
if (flagBool(args, 'json')) {
|
|
16
|
+
process.stdout.write(asJson(rules) + '\n');
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
process.stdout.write(header(`Rules (${rules.length})`));
|
|
20
|
+
for (const r of rules)
|
|
21
|
+
process.stdout.write(formatRuleCompact(r) + '\n');
|
|
22
|
+
return 0;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
export const rulesGetCommand = {
|
|
26
|
+
name: 'get',
|
|
27
|
+
description: 'Show full content of one rule.',
|
|
28
|
+
usage: 'shrk rules get <id> [--json]',
|
|
29
|
+
async run(args) {
|
|
30
|
+
const id = args.positional[0];
|
|
31
|
+
if (!id) {
|
|
32
|
+
process.stderr.write('Usage: shrk rules get <id>\n');
|
|
33
|
+
return 2;
|
|
34
|
+
}
|
|
35
|
+
const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
|
|
36
|
+
const rule = inspection.ruleService.get(id);
|
|
37
|
+
if (!rule) {
|
|
38
|
+
process.stderr.write(`No rule with id "${id}".\n`);
|
|
39
|
+
return 1;
|
|
40
|
+
}
|
|
41
|
+
if (flagBool(args, 'json')) {
|
|
42
|
+
process.stdout.write(asJson(rule) + '\n');
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
process.stdout.write(formatRuleFull(rule) + '\n');
|
|
46
|
+
return 0;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
export const rulesRelevantCommand = {
|
|
50
|
+
name: 'relevant',
|
|
51
|
+
description: 'Return rules relevant to a task.',
|
|
52
|
+
usage: 'shrk rules relevant --task "<task>" [--scope x,y] [--limit 10] [--ai] [--json]',
|
|
53
|
+
async run(args) {
|
|
54
|
+
const task = flagString(args, 'task');
|
|
55
|
+
if (!task) {
|
|
56
|
+
process.stderr.write('Missing --task\n');
|
|
57
|
+
return 2;
|
|
58
|
+
}
|
|
59
|
+
const scope = flagList(args, 'scope');
|
|
60
|
+
const tags = flagList(args, 'tag');
|
|
61
|
+
const appliesWhen = flagList(args, 'appliesWhen');
|
|
62
|
+
const limit = flagNumber(args, 'limit') ?? 10;
|
|
63
|
+
const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
|
|
64
|
+
const rules = inspection.ruleService.getRelevant(task, {
|
|
65
|
+
scope: scope.length ? scope : undefined,
|
|
66
|
+
tags: tags.length ? tags : undefined,
|
|
67
|
+
appliesWhen: appliesWhen.length ? appliesWhen : undefined,
|
|
68
|
+
limit,
|
|
69
|
+
});
|
|
70
|
+
if (flagBool(args, 'json')) {
|
|
71
|
+
process.stdout.write(asJson(rules) + '\n');
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
if (flagBool(args, 'ai')) {
|
|
75
|
+
process.stdout.write(formatRulesForAi(rules) + '\n');
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
process.stdout.write(header(`Relevant rules for: ${task}`));
|
|
79
|
+
for (const r of rules)
|
|
80
|
+
process.stdout.write(formatRuleCompact(r) + '\n');
|
|
81
|
+
return 0;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
function parseRuleScaffoldKind(value) {
|
|
85
|
+
switch ((value ?? '').toLowerCase()) {
|
|
86
|
+
case 'safety':
|
|
87
|
+
return RuleScaffoldKind.Safety;
|
|
88
|
+
case 'architecture':
|
|
89
|
+
return RuleScaffoldKind.Architecture;
|
|
90
|
+
case 'style':
|
|
91
|
+
return RuleScaffoldKind.Style;
|
|
92
|
+
case 'governance':
|
|
93
|
+
return RuleScaffoldKind.Governance;
|
|
94
|
+
case 'migration':
|
|
95
|
+
return RuleScaffoldKind.Migration;
|
|
96
|
+
case 'testing':
|
|
97
|
+
return RuleScaffoldKind.Testing;
|
|
98
|
+
case 'advisory':
|
|
99
|
+
return RuleScaffoldKind.Advisory;
|
|
100
|
+
default:
|
|
101
|
+
return RuleScaffoldKind.Architecture;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export const rulesScaffoldCommand = {
|
|
105
|
+
name: 'scaffold',
|
|
106
|
+
description: 'Scaffold a new rule. Preview-only by default — writes nothing. Pass --write-preview to materialise the scaffold under .sharkcraft/fixes/.',
|
|
107
|
+
usage: 'shrk rules scaffold --id <id> [--kind architecture|safety|style|governance|migration|testing|advisory] [--title <t>] [--rationale <text>] [--owner <name>] [--good <code>] [--bad <code>] [--verification "<cmd>"] [--forbidden "<text>"] [--write-preview] [--json]',
|
|
108
|
+
async run(args) {
|
|
109
|
+
const id = flagString(args, 'id');
|
|
110
|
+
if (!id) {
|
|
111
|
+
process.stderr.write('Usage: shrk rules scaffold --id <id> [--kind <k>] [--write-preview]\n');
|
|
112
|
+
return 2;
|
|
113
|
+
}
|
|
114
|
+
const kind = parseRuleScaffoldKind(flagString(args, 'kind'));
|
|
115
|
+
const verification = flagList(args, 'verification');
|
|
116
|
+
const forbidden = flagList(args, 'forbidden');
|
|
117
|
+
const result = buildRuleScaffold({
|
|
118
|
+
id,
|
|
119
|
+
kind,
|
|
120
|
+
title: flagString(args, 'title') ?? undefined,
|
|
121
|
+
rationale: flagString(args, 'rationale') ?? undefined,
|
|
122
|
+
owner: flagString(args, 'owner') ?? undefined,
|
|
123
|
+
goodExample: flagString(args, 'good') ?? undefined,
|
|
124
|
+
badExample: flagString(args, 'bad') ?? undefined,
|
|
125
|
+
verificationCommands: verification.length > 0 ? verification : undefined,
|
|
126
|
+
forbiddenActions: forbidden.length > 0 ? forbidden : undefined,
|
|
127
|
+
});
|
|
128
|
+
if (flagBool(args, 'json')) {
|
|
129
|
+
process.stdout.write(asJson(result) + '\n');
|
|
130
|
+
// Continue to write-preview side effect even in json mode for parity.
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
process.stdout.write(header(`Rule scaffold preview: ${id}`));
|
|
134
|
+
process.stdout.write(` kind: ${result.kind}\n`);
|
|
135
|
+
process.stdout.write(` generated: ${result.generatedAt}\n`);
|
|
136
|
+
process.stdout.write(` files:\n`);
|
|
137
|
+
process.stdout.write(` ${result.tsScaffold.path}\n`);
|
|
138
|
+
process.stdout.write(` ${result.jsonManifest.path}\n`);
|
|
139
|
+
process.stdout.write(` ${result.explainer.path}\n`);
|
|
140
|
+
if (result.warnings.length > 0) {
|
|
141
|
+
process.stdout.write('\n warnings:\n');
|
|
142
|
+
for (const w of result.warnings)
|
|
143
|
+
process.stdout.write(` • ${w}\n`);
|
|
144
|
+
}
|
|
145
|
+
process.stdout.write('\n--- TypeScript scaffold ---\n');
|
|
146
|
+
process.stdout.write(result.tsScaffold.body);
|
|
147
|
+
process.stdout.write('\n--- Next commands ---\n');
|
|
148
|
+
for (const c of result.nextCommands)
|
|
149
|
+
process.stdout.write(` $ ${c}\n`);
|
|
150
|
+
if (!flagBool(args, 'write-preview')) {
|
|
151
|
+
process.stdout.write('\n (preview only — pass --write-preview to materialise under .sharkcraft/fixes/)\n');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (flagBool(args, 'write-preview')) {
|
|
155
|
+
const cwd = resolveCwd(args);
|
|
156
|
+
const dir = nodePath.join(cwd, '.sharkcraft', 'fixes');
|
|
157
|
+
if (!existsSync(dir))
|
|
158
|
+
mkdirSync(dir, { recursive: true });
|
|
159
|
+
for (const file of [result.tsScaffold, result.jsonManifest, result.explainer]) {
|
|
160
|
+
const abs = nodePath.join(cwd, file.path);
|
|
161
|
+
writeFileSync(abs, file.body, 'utf8');
|
|
162
|
+
}
|
|
163
|
+
process.stdout.write(`\nWrote 3 files under ${nodePath.join(cwd, '.sharkcraft', 'fixes')}\n`);
|
|
164
|
+
// Record provenance for the scaffold.
|
|
165
|
+
try {
|
|
166
|
+
const isAgent = Boolean(process.env['SHARKCRAFT_AGENT']) ||
|
|
167
|
+
Boolean(process.env['CLAUDE_CODE_SESSION']);
|
|
168
|
+
recordProvenance({
|
|
169
|
+
projectRoot: cwd,
|
|
170
|
+
entry: {
|
|
171
|
+
operation: AssetProvenanceOperation.Add,
|
|
172
|
+
assetKind: AssetKind.Rule,
|
|
173
|
+
assetId: id,
|
|
174
|
+
source: isAgent ? AssetProvenanceSource.Agent : AssetProvenanceSource.Cli,
|
|
175
|
+
previewPath: result.tsScaffold.path,
|
|
176
|
+
...(flagString(args, 'reason') ? { reason: flagString(args, 'reason') } : {}),
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// best-effort — failing to record provenance must not break the scaffold.
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return 0;
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* Clone ParsedArgs with a flag override. Used by the rules add/
|
|
189
|
+
* remove wrappers to force `type='rule'` before delegating to the
|
|
190
|
+
* knowledge authoring path.
|
|
191
|
+
*/
|
|
192
|
+
function withFlagOverride(args, key, value) {
|
|
193
|
+
const flags = new Map(args.flags);
|
|
194
|
+
flags.set(key, value);
|
|
195
|
+
return {
|
|
196
|
+
positional: [...args.positional],
|
|
197
|
+
flags,
|
|
198
|
+
multiFlags: args.multiFlags,
|
|
199
|
+
...(args.globalCwd ? { globalCwd: args.globalCwd } : {}),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* `shrk rules add`.
|
|
204
|
+
*
|
|
205
|
+
* Mirror of `shrk knowledge add` with `type='rule'` forced. Rules in
|
|
206
|
+
* SharkCraft are knowledge entries with `type='rule'`, so we reuse the
|
|
207
|
+
* canonical `knowledge add` flow (preview, draft path, provenance) and
|
|
208
|
+
* just enforce the type at the wrapper. Refuses if `--type` was passed
|
|
209
|
+
* with a non-rule value.
|
|
210
|
+
*/
|
|
211
|
+
export const rulesAddCommand = {
|
|
212
|
+
name: 'add',
|
|
213
|
+
description: 'Preview adding a new rule. Mirror of `knowledge add` with `type=rule` forced. Preview-only — pass --write-preview to materialise under .sharkcraft/authoring/.',
|
|
214
|
+
usage: 'shrk rules add --id <id> [--title <t>] [--priority critical|high|medium|low] [--summary <s>] [--content <text>] [--scope x,y] [--tag x,y] [--applies-when x,y] [--related a,b] [--reference kind:value[:required]] [--reason <text>] [--allow-overwrite] [--write-preview] [--json]',
|
|
215
|
+
async run(args) {
|
|
216
|
+
const id = flagString(args, 'id') ?? args.positional[0];
|
|
217
|
+
if (!id) {
|
|
218
|
+
process.stderr.write('Usage: shrk rules add --id <id> [...]\n');
|
|
219
|
+
return 2;
|
|
220
|
+
}
|
|
221
|
+
const requestedType = flagString(args, 'type');
|
|
222
|
+
if (requestedType && requestedType !== 'rule') {
|
|
223
|
+
process.stderr.write(`Refused: \`shrk rules add\` forces type='rule'. Got --type ${requestedType}. Use \`shrk knowledge add\` for non-rule types.\n`);
|
|
224
|
+
return 2;
|
|
225
|
+
}
|
|
226
|
+
const next = withFlagOverride(args, 'type', 'rule');
|
|
227
|
+
return knowledgeAddCommand.run(next);
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
/**
|
|
231
|
+
* `shrk rules remove <id>`.
|
|
232
|
+
*
|
|
233
|
+
* Mirror of `shrk knowledge remove` that first asserts the target id is
|
|
234
|
+
* a rule (so an accidental `shrk rules remove some-knowledge-id` becomes
|
|
235
|
+
* a hard refusal instead of silently removing a documentation entry).
|
|
236
|
+
* Reference-checking is identical to `knowledge remove` — reverse
|
|
237
|
+
* references refuse the preview unless `--force-preview` is set.
|
|
238
|
+
*/
|
|
239
|
+
export const rulesRemoveCommand = {
|
|
240
|
+
name: 'remove',
|
|
241
|
+
description: 'Preview removal of a rule. Asserts type=rule then delegates to `knowledge remove` — same reference-check, same preview path, same provenance.',
|
|
242
|
+
usage: 'shrk rules remove <id> [--force-preview] [--reason <text>] [--write-preview] [--json]',
|
|
243
|
+
async run(args) {
|
|
244
|
+
const id = args.positional[0] ?? flagString(args, 'id');
|
|
245
|
+
if (!id) {
|
|
246
|
+
process.stderr.write('Usage: shrk rules remove <id> [--force-preview]\n');
|
|
247
|
+
return 2;
|
|
248
|
+
}
|
|
249
|
+
const cwd = resolveCwd(args);
|
|
250
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
251
|
+
const entry = inspection.knowledgeEntries.find((e) => e.id === id);
|
|
252
|
+
if (!entry) {
|
|
253
|
+
process.stderr.write(`Unknown id: ${id}. Use \`shrk rules list\` or \`shrk knowledge list\` to find one.\n`);
|
|
254
|
+
return 1;
|
|
255
|
+
}
|
|
256
|
+
if (entry.type !== 'rule') {
|
|
257
|
+
process.stderr.write(`Entry "${id}" exists but type=${entry.type}, not "rule". Use \`shrk knowledge remove ${id}\` instead.\n`);
|
|
258
|
+
return 1;
|
|
259
|
+
}
|
|
260
|
+
return knowledgeRemoveCommand.run(args);
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* `shrk rules update <id>`.
|
|
265
|
+
*
|
|
266
|
+
* Rules in SharkCraft are stored as knowledge entries with `type='rule'`.
|
|
267
|
+
* The dedicated `rules update` verb exists so the authoring surface for
|
|
268
|
+
* rules feels first-class. It asserts the target id is a rule and then
|
|
269
|
+
* delegates to the knowledge-update flow — same flags, same preview
|
|
270
|
+
* location (`.sharkcraft/authoring/`), same provenance ledger.
|
|
271
|
+
*
|
|
272
|
+
* Provenance: written under `AssetKind.Knowledge` (the underlying data
|
|
273
|
+
* model). The dedicated `rules scaffold` flow writes under
|
|
274
|
+
* `AssetKind.Rule` for new rules; updates piggy-back on knowledge.
|
|
275
|
+
*/
|
|
276
|
+
export const rulesUpdateCommand = {
|
|
277
|
+
name: 'update',
|
|
278
|
+
description: 'Preview an update to an existing rule. Thin wrapper over `knowledge update` (rules are knowledge entries with type="rule") — same flags, preview-first, provenance recorded.',
|
|
279
|
+
usage: 'shrk rules update <id> [--summary <s>] [--content <text>] [--priority critical|high|medium|low] [--add-related a,b] [--remove-related a,b] [--reference kind:value[:required]] [--remove-reference kind:value] [--mark-deprecated] [--unmark-deprecated] [--reason <text>] [--write-preview] [--json]',
|
|
280
|
+
async run(args) {
|
|
281
|
+
const id = args.positional[0] ?? flagString(args, 'id');
|
|
282
|
+
if (!id) {
|
|
283
|
+
process.stderr.write('Usage: shrk rules update <id> [...]\n');
|
|
284
|
+
return 2;
|
|
285
|
+
}
|
|
286
|
+
const cwd = resolveCwd(args);
|
|
287
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
288
|
+
const entry = inspection.knowledgeEntries.find((e) => e.id === id);
|
|
289
|
+
if (!entry) {
|
|
290
|
+
process.stderr.write(`Unknown id: ${id}. Use \`shrk rules list\` or \`shrk knowledge list\` to find one.\n`);
|
|
291
|
+
return 1;
|
|
292
|
+
}
|
|
293
|
+
if (entry.type !== 'rule') {
|
|
294
|
+
process.stderr.write(`Entry "${id}" exists but type=${entry.type}, not "rule". Use \`shrk knowledge update ${id}\` instead.\n`);
|
|
295
|
+
return 1;
|
|
296
|
+
}
|
|
297
|
+
return knowledgeUpdateCommand.run(args);
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
/**
|
|
301
|
+
* `shrk rules lint` is the lint-style alias of `rules doctor`. It
|
|
302
|
+
* defaults to strict (warnings + errors fail), supports `--fix-preview`
|
|
303
|
+
* which materialises a smallest-change patch under
|
|
304
|
+
* `.sharkcraft/fixes/rules-lint/<rule-id>.patch.md` per finding, and
|
|
305
|
+
* never mutates source.
|
|
306
|
+
*/
|
|
307
|
+
export const rulesLintCommand = {
|
|
308
|
+
name: 'lint',
|
|
309
|
+
description: 'Lint rules — alias of `rules doctor` with lint-style defaults. `--fix-preview` materialises smallest-change patches under .sharkcraft/fixes/rules-lint/ (preview only).',
|
|
310
|
+
usage: 'shrk rules lint [--id <ruleId>] [--advisory <ruleId,...>] [--fix-preview] [--write-preview] [--json]',
|
|
311
|
+
async run(args) {
|
|
312
|
+
const cwd = resolveCwd(args);
|
|
313
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
314
|
+
const rules = inspection.ruleService.list();
|
|
315
|
+
const knownVerificationIds = new Set((inspection.config?.verificationCommands ?? []).map((c) => c.id));
|
|
316
|
+
const advisoryFlag = flagList(args, 'advisory');
|
|
317
|
+
const id = flagString(args, 'id');
|
|
318
|
+
const report = diagnoseRuleQuality(rules, {
|
|
319
|
+
ruleId: id ?? undefined,
|
|
320
|
+
advisoryRuleIds: advisoryFlag.length > 0 ? advisoryFlag : undefined,
|
|
321
|
+
}, { knownVerificationIds });
|
|
322
|
+
const wantJson = flagBool(args, 'json');
|
|
323
|
+
const wantFixPreview = flagBool(args, 'fix-preview');
|
|
324
|
+
const wantWritePreview = flagBool(args, 'write-preview');
|
|
325
|
+
const suggestions = [];
|
|
326
|
+
if (wantFixPreview) {
|
|
327
|
+
for (const f of report.findings) {
|
|
328
|
+
const ruleId = f.ruleId ?? 'unknown';
|
|
329
|
+
const suggestion = buildSmallestRuleFix(f);
|
|
330
|
+
if (suggestion) {
|
|
331
|
+
suggestions.push({ ruleId, finding: f.code, suggestion });
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (wantJson) {
|
|
336
|
+
process.stdout.write(asJson({ report, suggestions }) + '\n');
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
process.stdout.write(header('Rules lint'));
|
|
340
|
+
process.stdout.write(renderRuleQualityText(report));
|
|
341
|
+
if (wantFixPreview) {
|
|
342
|
+
process.stdout.write('\n--- Fix-preview suggestions ---\n');
|
|
343
|
+
if (suggestions.length === 0) {
|
|
344
|
+
process.stdout.write(' (no automatable fixes — review findings manually)\n');
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
for (const s of suggestions) {
|
|
348
|
+
process.stdout.write(`\n ${s.ruleId} — ${s.finding}\n`);
|
|
349
|
+
for (const line of s.suggestion.split('\n')) {
|
|
350
|
+
process.stdout.write(` ${line}\n`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
if (!wantWritePreview) {
|
|
355
|
+
process.stdout.write('\n (preview only — pass --write-preview to materialise under .sharkcraft/fixes/rules-lint/)\n');
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (wantFixPreview && wantWritePreview && suggestions.length > 0) {
|
|
360
|
+
const dir = nodePath.join(cwd, '.sharkcraft', 'fixes', 'rules-lint');
|
|
361
|
+
if (!existsSync(dir))
|
|
362
|
+
mkdirSync(dir, { recursive: true });
|
|
363
|
+
for (const s of suggestions) {
|
|
364
|
+
const safeId = s.ruleId.replace(/[^a-z0-9._-]/gi, '_');
|
|
365
|
+
const out = nodePath.join(dir, `${safeId}.${s.finding}.patch.md`);
|
|
366
|
+
const body = `# Rules-lint fix preview\n\n` +
|
|
367
|
+
`- rule: ${s.ruleId}\n` +
|
|
368
|
+
`- finding: ${s.finding}\n\n` +
|
|
369
|
+
`${s.suggestion}\n`;
|
|
370
|
+
writeFileSync(out, body, 'utf8');
|
|
371
|
+
}
|
|
372
|
+
process.stdout.write(`\nWrote ${suggestions.length} preview file(s) under ${nodePath.join(cwd, '.sharkcraft', 'fixes', 'rules-lint')}\n`);
|
|
373
|
+
}
|
|
374
|
+
// Lint defaults to strict — warnings and errors both fail.
|
|
375
|
+
return report.summary.errors + report.summary.warnings > 0 ? 1 : 0;
|
|
376
|
+
},
|
|
377
|
+
};
|
|
378
|
+
function buildSmallestRuleFix(finding) {
|
|
379
|
+
// Deterministic, opinionated smallest-change suggestions. We never invent
|
|
380
|
+
// semantic content — the agent fills it in. The preview shows the shape.
|
|
381
|
+
switch (finding.code) {
|
|
382
|
+
case 'missing-owner':
|
|
383
|
+
return `Add an \`owner\` to this rule:\n\n owner: 'team-name@example.com'`;
|
|
384
|
+
case 'missing-verification':
|
|
385
|
+
return `Add at least one verificationCommand id from sharkcraft.config.ts:\n\n actionHints: { verificationCommands: ['<id-from-config>'] }`;
|
|
386
|
+
case 'missing-hints':
|
|
387
|
+
case 'missing-action-hints':
|
|
388
|
+
return `Add an \`actionHints\` block:\n\n actionHints: {\n commands: [{ command: 'shrk <cmd>' }],\n verificationCommands: [],\n forbiddenActions: [],\n }`;
|
|
389
|
+
case 'missing-commands-or-mcp':
|
|
390
|
+
return `Add either \`actionHints.commands\` or \`actionHints.mcpTools\` so agents know which command to run.`;
|
|
391
|
+
case 'missing-forbidden-actions':
|
|
392
|
+
return `Add \`actionHints.forbiddenActions: ['<plain-language description>']\` so agents know what NOT to do.`;
|
|
393
|
+
case 'missing-write-policy':
|
|
394
|
+
return `Set \`actionHints.writePolicy\` to 'cli-only' | 'plan-first' | 'preview-only'.`;
|
|
395
|
+
case 'missing-examples':
|
|
396
|
+
return `Add a paired example to the rule's \`examples\` array:\n\n examples: [\n { kind: 'good', code: '<canonical correct sample>' },\n { kind: 'bad', code: '<typical mistake>' },\n ]`;
|
|
397
|
+
case 'vague-rule':
|
|
398
|
+
return `Rewrite the rationale as a single, falsifiable sentence ("X must Y because Z").`;
|
|
399
|
+
case 'advisory-not-marked':
|
|
400
|
+
return `Either set \`advisory: true\` on the rule, or remove it from the \`--advisory\` list passed to \`rules lint\`.`;
|
|
401
|
+
case 'advisory-has-unused-verification':
|
|
402
|
+
return `Advisory rules don't enforce — drop \`actionHints.verificationCommands\`, or unmark advisory if the verification really should run.`;
|
|
403
|
+
case 'verification-references-unknown-script':
|
|
404
|
+
return `Either declare this command in \`sharkcraft.config.ts > verificationCommands[]\`, or change the rule to reference an existing one.`;
|
|
405
|
+
default:
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
export const rulesDoctorCommand = {
|
|
410
|
+
name: 'doctor',
|
|
411
|
+
description: 'Rule quality doctor. Surfaces missing actionHints / verificationCommands / examples / owner, vague rules, advisory mismatch.',
|
|
412
|
+
usage: 'shrk rules doctor [--id <ruleId>] [--advisory <ruleId,...>] [--strict] [--json]',
|
|
413
|
+
async run(args) {
|
|
414
|
+
const cwd = resolveCwd(args);
|
|
415
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
416
|
+
const rules = inspection.ruleService.list();
|
|
417
|
+
const knownVerificationIds = new Set((inspection.config?.verificationCommands ?? []).map((c) => c.id));
|
|
418
|
+
const advisoryFlag = flagList(args, 'advisory');
|
|
419
|
+
const id = flagString(args, 'id');
|
|
420
|
+
const report = diagnoseRuleQuality(rules, {
|
|
421
|
+
ruleId: id ?? undefined,
|
|
422
|
+
advisoryRuleIds: advisoryFlag.length > 0 ? advisoryFlag : undefined,
|
|
423
|
+
}, { knownVerificationIds });
|
|
424
|
+
if (flagBool(args, 'json')) {
|
|
425
|
+
process.stdout.write(asJson(report) + '\n');
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
process.stdout.write(renderRuleQualityText(report));
|
|
429
|
+
}
|
|
430
|
+
if (flagBool(args, 'strict')) {
|
|
431
|
+
return report.summary.errors + report.summary.warnings > 0 ? 1 : 0;
|
|
432
|
+
}
|
|
433
|
+
return report.summary.errors > 0 ? 1 : 0;
|
|
434
|
+
},
|
|
435
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.command.d.ts","sourceRoot":"","sources":["../../src/commands/runtime.command.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAKhC,eAAO,MAAM,oBAAoB,EAAE,eAiDlC,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import * as nodePath from 'node:path';
|
|
3
|
+
import { flagBool, resolveCwd, } from "../command-registry.js";
|
|
4
|
+
import { asJson, header, kv } from "../output/format-output.js";
|
|
5
|
+
const REPORT_FILE = '.sharkcraft/reports/compat-node-report.json';
|
|
6
|
+
export const runtimeDoctorCommand = {
|
|
7
|
+
name: 'doctor',
|
|
8
|
+
description: 'Report runtime info + latest Node-compatibility audit. Read-only; no shell.',
|
|
9
|
+
usage: 'shrk runtime doctor [--json]',
|
|
10
|
+
run(args) {
|
|
11
|
+
const cwd = resolveCwd(args);
|
|
12
|
+
const reportPath = nodePath.join(cwd, REPORT_FILE);
|
|
13
|
+
const reportExists = existsSync(reportPath);
|
|
14
|
+
let report = null;
|
|
15
|
+
if (reportExists) {
|
|
16
|
+
try {
|
|
17
|
+
report = JSON.parse(readFileSync(reportPath, 'utf8'));
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
report = null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Avoid a direct `Bun.<x>` reference so the compat:node scanner stays
|
|
24
|
+
// green when this file ships to a pure-Node runtime; read via globalThis
|
|
25
|
+
// instead. The audit script flags `Bun.<id>` shaped tokens outside
|
|
26
|
+
// string literals.
|
|
27
|
+
const g = globalThis;
|
|
28
|
+
const runtime = {
|
|
29
|
+
bun: g.Bun?.version ?? null,
|
|
30
|
+
node: typeof process !== 'undefined' ? process.version : null,
|
|
31
|
+
platform: process.platform,
|
|
32
|
+
arch: process.arch,
|
|
33
|
+
};
|
|
34
|
+
if (flagBool(args, 'json')) {
|
|
35
|
+
process.stdout.write(asJson({ runtime, reportFile: reportExists ? reportPath : null, report }) + '\n');
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
process.stdout.write(header('Runtime doctor'));
|
|
39
|
+
process.stdout.write(kv('bun', String(runtime['bun'] ?? '(node)')) + '\n');
|
|
40
|
+
process.stdout.write(kv('node', String(runtime['node'])) + '\n');
|
|
41
|
+
process.stdout.write(kv('platform', `${runtime['platform']}-${runtime['arch']}`) + '\n');
|
|
42
|
+
if (reportExists) {
|
|
43
|
+
const r = report;
|
|
44
|
+
process.stdout.write(kv('compat:node report', reportPath) + '\n');
|
|
45
|
+
if (r) {
|
|
46
|
+
process.stdout.write(kv(' passed', String(r.passed)) + '\n');
|
|
47
|
+
process.stdout.write(kv(' bun.* usages', String((r.bunUsage ?? []).length)) + '\n');
|
|
48
|
+
process.stdout.write(kv(' runtime probes', String((r.runtimeProbes ?? []).length)) + '\n');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
process.stdout.write('compat:node report: (none — run `bun run compat:node --runtime --build`)\n');
|
|
53
|
+
}
|
|
54
|
+
return 0;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.command.d.ts","sourceRoot":"","sources":["../../src/commands/safety.command.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAMhC,eAAO,MAAM,aAAa,EAAE,eAmE3B,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { buildSafetyAudit, buildSafetyAuditDeep, inspectSharkcraft, } from '@shrkcrft/inspector';
|
|
2
|
+
import { flagBool, resolveCwd, } from "../command-registry.js";
|
|
3
|
+
import { asJson, header, kv } from "../output/format-output.js";
|
|
4
|
+
import { COMMAND_CATALOG } from "./command-catalog.js";
|
|
5
|
+
const PLAN_SECRET_ENV = 'SHARKCRAFT_PLAN_SECRET';
|
|
6
|
+
export const safetyCommand = {
|
|
7
|
+
name: 'safety',
|
|
8
|
+
description: 'Audit the SharkCraft safety model: which commands write source, which run shell, MCP read-only invariant, pack signature status, plan-signing status. Read-only.',
|
|
9
|
+
usage: 'shrk safety audit [--json]',
|
|
10
|
+
async run(args) {
|
|
11
|
+
const sub = args.positional[0];
|
|
12
|
+
if (sub !== 'audit') {
|
|
13
|
+
process.stderr.write('Usage: shrk safety audit [--json]\n');
|
|
14
|
+
return 2;
|
|
15
|
+
}
|
|
16
|
+
const cwd = resolveCwd(args);
|
|
17
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
18
|
+
// Lazy-load the MCP tool list to avoid a static import dependency.
|
|
19
|
+
const mcpToolList = await listMcpTools();
|
|
20
|
+
const report = buildSafetyAudit({
|
|
21
|
+
inspection,
|
|
22
|
+
catalog: COMMAND_CATALOG,
|
|
23
|
+
mcpTools: mcpToolList,
|
|
24
|
+
planSecretEnv: PLAN_SECRET_ENV,
|
|
25
|
+
planSecretConfigured: typeof process.env[PLAN_SECRET_ENV] === 'string',
|
|
26
|
+
});
|
|
27
|
+
let deep = null;
|
|
28
|
+
if (flagBool(args, 'deep')) {
|
|
29
|
+
deep = await buildSafetyAuditDeep(inspection);
|
|
30
|
+
}
|
|
31
|
+
if (flagBool(args, 'json')) {
|
|
32
|
+
const merged = deep ? { ...report, deep } : report;
|
|
33
|
+
process.stdout.write(asJson(merged) + '\n');
|
|
34
|
+
const failed = report.mcp.anyWritable || (deep ? !deep.passed : false);
|
|
35
|
+
return failed ? 1 : 0;
|
|
36
|
+
}
|
|
37
|
+
printSafetyAudit(report);
|
|
38
|
+
if (deep) {
|
|
39
|
+
process.stdout.write('\n=== Deep audit ===\n');
|
|
40
|
+
process.stdout.write(` passed: ${deep.passed ? 'yes' : 'no'}\n`);
|
|
41
|
+
process.stdout.write(` info-only findings: ${deep.infoOnlyFindings}\n`);
|
|
42
|
+
process.stdout.write(` report-site external JS: ${deep.reportSiteExternalJs.length}\n`);
|
|
43
|
+
process.stdout.write(` demo destructive lines: ${deep.demoDestructiveLines.length}\n`);
|
|
44
|
+
process.stdout.write(` CI workflows scanned: ${deep.ciGeneratedWorkflowPermissions.length}\n`);
|
|
45
|
+
// Dev-signed packs surface as a top-level deep-audit line so it
|
|
46
|
+
// doesn't get lost in the per-check list.
|
|
47
|
+
if (deep.devSignedPacks && deep.devSignedPacks.length > 0) {
|
|
48
|
+
process.stdout.write(` dev-signed packs: ${deep.devSignedPacks.length}\n`);
|
|
49
|
+
for (const p of deep.devSignedPacks) {
|
|
50
|
+
process.stdout.write(` • ${p.packageName}@${p.packageVersion}${p.signedAt ? ` (signed-at ${p.signedAt})` : ''}\n`);
|
|
51
|
+
}
|
|
52
|
+
// Dev-signed pack findings are info-level by design. The
|
|
53
|
+
// deep-audit verdict ignores them; release readiness is enforced
|
|
54
|
+
// elsewhere. Spell that out so `passed: yes` next to a non-empty
|
|
55
|
+
// dev-signed list stops reading contradictory.
|
|
56
|
+
process.stdout.write('\n Dev-signed packs are info-level findings — the deep-audit verdict ignores them.\n' +
|
|
57
|
+
' Release readiness is gated by `shrk packs signature-status --release-readiness`.\n');
|
|
58
|
+
}
|
|
59
|
+
if (deep.checks.length > 0) {
|
|
60
|
+
process.stdout.write(' checks:\n');
|
|
61
|
+
for (const c of deep.checks)
|
|
62
|
+
process.stdout.write(` [${c.severity}] ${c.id} — ${c.message}\n`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const failed = report.mcp.anyWritable || (deep ? !deep.passed : false);
|
|
66
|
+
return failed ? 1 : 0;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
async function listMcpTools() {
|
|
70
|
+
try {
|
|
71
|
+
const mod = (await import('@shrkcrft/mcp-server'));
|
|
72
|
+
return [...(mod.ALL_TOOLS ?? [])].map((t) => ({ name: t.name, description: t.description }));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function printSafetyAudit(r) {
|
|
79
|
+
process.stdout.write(header('SharkCraft safety audit'));
|
|
80
|
+
process.stdout.write(kv('MCP tools', String(r.mcp.tools.length)) + '\n');
|
|
81
|
+
process.stdout.write(kv('MCP writable', r.mcp.anyWritable ? 'YES — INVARIANT VIOLATED' : 'no (read-only ✓)') + '\n');
|
|
82
|
+
process.stdout.write(kv('packs', String(r.packs.discovered)) + '\n');
|
|
83
|
+
process.stdout.write(kv('pack signatures', `verified=${r.packs.signedAndVerified} not-checked=${r.packs.signedNotVerified} unsigned=${r.packs.unsigned} invalid=${r.packs.invalid}`) + '\n');
|
|
84
|
+
process.stdout.write(kv('plan signing', r.planSigning.secretConfigured
|
|
85
|
+
? `${r.planSigning.secretEnv} configured`
|
|
86
|
+
: `${r.planSigning.secretEnv} not set`) + '\n');
|
|
87
|
+
process.stdout.write('\nCommand safety by level:\n');
|
|
88
|
+
process.stdout.write(` read-only: ${r.commands.readOnly.length}\n`);
|
|
89
|
+
process.stdout.write(` writes-session: ${r.commands.writesSession.length}\n`);
|
|
90
|
+
process.stdout.write(` writes-drafts: ${r.commands.writesDrafts.length}\n`);
|
|
91
|
+
process.stdout.write(` writes-source: ${r.commands.writesSource.length}\n`);
|
|
92
|
+
process.stdout.write(` runs-shell: ${r.commands.runsShell.length}\n`);
|
|
93
|
+
if (r.commands.writesSource.length > 0) {
|
|
94
|
+
process.stdout.write('\nCommands that write source (require human approval):\n');
|
|
95
|
+
for (const c of r.commands.writesSource) {
|
|
96
|
+
process.stdout.write(` • ${c.command.padEnd(34)} ${c.description}\n`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (r.verifications.untrusted.length > 0) {
|
|
100
|
+
process.stdout.write('\nLocal verification commands NOT marked trusted:\n');
|
|
101
|
+
for (const v of r.verifications.untrusted) {
|
|
102
|
+
process.stdout.write(` • ${v.id.padEnd(20)} ${v.command}\n`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (r.verifications.pack.length > 0) {
|
|
106
|
+
process.stdout.write('\nPack-contributed verification commands (NOT auto-run):\n');
|
|
107
|
+
for (const v of r.verifications.pack) {
|
|
108
|
+
process.stdout.write(` • ${v.id.padEnd(20)} (${v.packPackageName ?? '?'})\n`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (r.recommendations.length > 0) {
|
|
112
|
+
process.stdout.write('\nRecommendations:\n');
|
|
113
|
+
for (const rec of r.recommendations)
|
|
114
|
+
process.stdout.write(` • ${rec}\n`);
|
|
115
|
+
}
|
|
116
|
+
process.stdout.write(`\nVerdict: ${r.mcp.anyWritable ? 'MCP INVARIANT VIOLATED' : 'safety model intact ✓'}\n`);
|
|
117
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ICommandHandler } from '../command-registry.js';
|
|
2
|
+
export declare const scaffoldsListCommand: ICommandHandler;
|
|
3
|
+
export declare const scaffoldsGetCommand: ICommandHandler;
|
|
4
|
+
export declare const scaffoldsDoctorCommand: ICommandHandler;
|
|
5
|
+
//# sourceMappingURL=scaffolds.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffolds.command.d.ts","sourceRoot":"","sources":["../../src/commands/scaffolds.command.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAGhC,eAAO,MAAM,oBAAoB,EAAE,eA0ClC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAmCjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAwCpC,CAAC"}
|