@shrkcrft/cli 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +326 -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 +580 -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 +3255 -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 +682 -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 +129 -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 +300 -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 +203 -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 +662 -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 +964 -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 +380 -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 +721 -0
- package/dist/output/failure-hints.d.ts +63 -0
- package/dist/output/failure-hints.d.ts.map +1 -0
- package/dist/output/failure-hints.js +165 -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 +31 -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 +40 -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 +72 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import * as nodePath from 'node:path';
|
|
3
|
+
import { buildReviewPacket, buildReviewPacketV2, buildReviewPacketV3, inspectSharkcraft, renderReviewComment, renderReviewCommentV2, renderReviewCommentV3, REVIEW_PACKET_V2_SCHEMA, REVIEW_PACKET_V3_SCHEMA, } from '@shrkcrft/inspector';
|
|
4
|
+
import { flagBool, flagNumber, flagString, flagList, resolveCwd, } from "../command-registry.js";
|
|
5
|
+
import { asJson, header, kv } from "../output/format-output.js";
|
|
6
|
+
function renderGithubActionYaml(options) {
|
|
7
|
+
const steps = [];
|
|
8
|
+
const artifacts = [
|
|
9
|
+
{ name: 'sharkcraft-review-packet', path: 'review-packet.json' },
|
|
10
|
+
];
|
|
11
|
+
steps.push(' - name: Build review packet', ' run: bun run shrk review --since origin/main --json > review-packet.json');
|
|
12
|
+
if (options.withBoundaries) {
|
|
13
|
+
steps.push(' - name: Check boundaries', ' run: bun run shrk check boundaries --json > boundaries.json');
|
|
14
|
+
artifacts.push({ name: 'sharkcraft-boundaries', path: 'boundaries.json' });
|
|
15
|
+
}
|
|
16
|
+
if (options.withCoverage) {
|
|
17
|
+
steps.push(' - name: Coverage report', ' run: bun run shrk coverage --json > coverage.json');
|
|
18
|
+
artifacts.push({ name: 'sharkcraft-coverage', path: 'coverage.json' });
|
|
19
|
+
}
|
|
20
|
+
if (options.withDrift) {
|
|
21
|
+
steps.push(' - name: Drift report', ' run: bun run shrk drift --json > drift.json');
|
|
22
|
+
artifacts.push({ name: 'sharkcraft-drift', path: 'drift.json' });
|
|
23
|
+
}
|
|
24
|
+
for (const a of artifacts) {
|
|
25
|
+
steps.push(' - uses: actions/upload-artifact@v4', ' with:', ` name: ${a.name}`, ` path: ${a.path}`);
|
|
26
|
+
}
|
|
27
|
+
if (options.commentPlaceholder && !options.artifactOnly) {
|
|
28
|
+
steps.push(' - name: Render PR comment markdown', ' run: bun run shrk review render-comment review-packet.json --output review-comment.md', ' - name: PR comment placeholder', ' run: |', ' echo "Generated review-comment.md from review-packet.json."', ' echo "Post it via \\`gh pr comment --body-file review-comment.md\\` or actions/github-script."');
|
|
29
|
+
}
|
|
30
|
+
const commentNoteIncluded = options.commentPlaceholder && !options.artifactOnly;
|
|
31
|
+
const lines = [
|
|
32
|
+
'# .github/workflows/sharkcraft-review.yml',
|
|
33
|
+
'# Generated by `shrk review scaffold github-action`.',
|
|
34
|
+
'#',
|
|
35
|
+
'# On every pull request:',
|
|
36
|
+
'# 1. Check out the PR (with origin/main available so `shrk review --since` can diff).',
|
|
37
|
+
'# 2. Install Bun and workspace deps.',
|
|
38
|
+
'# 3. Run the selected SharkCraft checks and upload their JSON artifacts.',
|
|
39
|
+
'#',
|
|
40
|
+
commentNoteIncluded
|
|
41
|
+
? '# A comment-placeholder step is included so you can wire `actions/github-script`'
|
|
42
|
+
: '# Posting artifacts as a PR comment is left as a follow-up — wire it via',
|
|
43
|
+
commentNoteIncluded
|
|
44
|
+
? '# or `gh pr comment` later. The artifacts above contain the full payload.'
|
|
45
|
+
: '# `actions/github-script` or `gh pr comment` once you have a stable schema.',
|
|
46
|
+
'name: SharkCraft review packet',
|
|
47
|
+
'',
|
|
48
|
+
'on:',
|
|
49
|
+
' pull_request:',
|
|
50
|
+
' branches: [main]',
|
|
51
|
+
'',
|
|
52
|
+
'jobs:',
|
|
53
|
+
' review:',
|
|
54
|
+
' runs-on: ubuntu-latest',
|
|
55
|
+
' steps:',
|
|
56
|
+
' - uses: actions/checkout@v4',
|
|
57
|
+
' with:',
|
|
58
|
+
' fetch-depth: 0',
|
|
59
|
+
" - uses: oven-sh/setup-bun@v1",
|
|
60
|
+
' with:',
|
|
61
|
+
" bun-version: '1.1'",
|
|
62
|
+
' - run: bun install',
|
|
63
|
+
...steps,
|
|
64
|
+
'',
|
|
65
|
+
];
|
|
66
|
+
return lines.join('\n');
|
|
67
|
+
}
|
|
68
|
+
function scaffoldOptionsFromArgs(args) {
|
|
69
|
+
return {
|
|
70
|
+
withBoundaries: flagBool(args, 'with-boundaries'),
|
|
71
|
+
withCoverage: flagBool(args, 'with-coverage'),
|
|
72
|
+
withDrift: flagBool(args, 'with-drift'),
|
|
73
|
+
artifactOnly: flagBool(args, 'artifact-only'),
|
|
74
|
+
commentPlaceholder: flagBool(args, 'comment-placeholder'),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export const reviewCommand = {
|
|
78
|
+
name: 'review',
|
|
79
|
+
description: 'Build a PR-review packet: changed files (via git), affected path conventions, relevant rules/templates/pipelines, boundary violations on those files, missing-test heuristic, verification commands. Also: `shrk review scaffold github-action` prints a workflow template with optional `--with-boundaries / --with-coverage / --with-drift / --artifact-only / --comment-placeholder` flags. `shrk review render-comment <packet.json>` renders a Markdown PR comment from a saved packet.',
|
|
80
|
+
usage: 'shrk [--cwd <dir>] review [--since <ref>] [--staged] [--files a,b] [--json] | shrk review scaffold github-action [...] | shrk review render-comment <packet.json> [--output <file>]',
|
|
81
|
+
async run(args) {
|
|
82
|
+
if (args.positional[0] === 'scaffold') {
|
|
83
|
+
const which = args.positional[1] ?? 'github-action';
|
|
84
|
+
if (which !== 'github-action') {
|
|
85
|
+
process.stderr.write(`Unknown scaffold "${which}". Available: github-action\n`);
|
|
86
|
+
return 2;
|
|
87
|
+
}
|
|
88
|
+
const body = renderGithubActionYaml(scaffoldOptionsFromArgs(args));
|
|
89
|
+
process.stdout.write(body);
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
if (args.positional[0] === 'render-comment') {
|
|
93
|
+
return runRenderComment(args);
|
|
94
|
+
}
|
|
95
|
+
if (args.positional[0] === 'packet') {
|
|
96
|
+
return runPacket(args);
|
|
97
|
+
}
|
|
98
|
+
const cwd = resolveCwd(args);
|
|
99
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
100
|
+
const since = flagString(args, 'since');
|
|
101
|
+
if (since) {
|
|
102
|
+
const { verifyGitRef } = await import('@shrkcrft/inspector');
|
|
103
|
+
const verify = verifyGitRef(cwd, since);
|
|
104
|
+
if (!verify.valid) {
|
|
105
|
+
process.stderr.write(`error: --since ref "${since}" does not resolve to a commit in this repository.\n` +
|
|
106
|
+
(verify.suggestions && verify.suggestions.length > 0
|
|
107
|
+
? `\nDid you mean:\n${verify.suggestions.map((s) => ` --since ${s}`).join('\n')}\n`
|
|
108
|
+
: '') +
|
|
109
|
+
'\nUse `git branch -a` to list available refs.\n');
|
|
110
|
+
return 2;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const files = flagList(args, 'files');
|
|
114
|
+
const packet = buildReviewPacket(inspection, {
|
|
115
|
+
...(since ? { since } : {}),
|
|
116
|
+
...(flagBool(args, 'staged') ? { staged: true } : {}),
|
|
117
|
+
...(files.length ? { files } : {}),
|
|
118
|
+
});
|
|
119
|
+
if (flagBool(args, 'json')) {
|
|
120
|
+
process.stdout.write(asJson(packet) + '\n');
|
|
121
|
+
return 0;
|
|
122
|
+
}
|
|
123
|
+
process.stdout.write(header('Review packet'));
|
|
124
|
+
process.stdout.write(kv('changed files', String(packet.changedFiles.length)) + '\n');
|
|
125
|
+
process.stdout.write(kv('affected paths', String(packet.affectedPaths.length)) + '\n');
|
|
126
|
+
process.stdout.write(kv('boundary violations', String(packet.boundaryViolations.length)) + '\n\n');
|
|
127
|
+
if (packet.changedFiles.length === 0) {
|
|
128
|
+
process.stdout.write('No changed files detected. Try `--since HEAD~1` or `--staged`.\n');
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
process.stdout.write('Changed files:\n');
|
|
132
|
+
for (const f of packet.changedFiles.slice(0, 10))
|
|
133
|
+
process.stdout.write(` • ${f}\n`);
|
|
134
|
+
if (packet.changedFiles.length > 10) {
|
|
135
|
+
process.stdout.write(` … (${packet.changedFiles.length - 10} more)\n`);
|
|
136
|
+
}
|
|
137
|
+
if (packet.relevantRules.length) {
|
|
138
|
+
process.stdout.write('\nRelevant rules:\n');
|
|
139
|
+
for (const r of packet.relevantRules)
|
|
140
|
+
process.stdout.write(` • ${r.id} — ${r.title}\n`);
|
|
141
|
+
}
|
|
142
|
+
if (packet.relevantTemplates.length) {
|
|
143
|
+
process.stdout.write('\nRelevant templates:\n');
|
|
144
|
+
for (const t of packet.relevantTemplates)
|
|
145
|
+
process.stdout.write(` • ${t.id} ${t.name}\n`);
|
|
146
|
+
}
|
|
147
|
+
if (packet.boundaryViolations.length) {
|
|
148
|
+
process.stdout.write('\nBoundary violations in this change set:\n');
|
|
149
|
+
for (const v of packet.boundaryViolations) {
|
|
150
|
+
process.stdout.write(` ${v.severity.toUpperCase().padEnd(8)} ${v.file}:${v.line} ${v.importSpecifier} (${v.ruleId})\n`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (packet.missingTestsHeuristic.length) {
|
|
154
|
+
process.stdout.write('\nMissing tests heuristic:\n');
|
|
155
|
+
for (const m of packet.missingTestsHeuristic)
|
|
156
|
+
process.stdout.write(` • ${m}\n`);
|
|
157
|
+
}
|
|
158
|
+
if (packet.verificationCommands.length) {
|
|
159
|
+
process.stdout.write('\nVerification commands:\n');
|
|
160
|
+
for (const c of packet.verificationCommands)
|
|
161
|
+
process.stdout.write(` $ ${c}\n`);
|
|
162
|
+
}
|
|
163
|
+
process.stdout.write('\n' + packet.reviewerInstructions + '\n');
|
|
164
|
+
return 0;
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
async function runRenderComment(args) {
|
|
168
|
+
const inputPath = args.positional[1];
|
|
169
|
+
if (!inputPath) {
|
|
170
|
+
process.stderr.write('Usage: shrk review render-comment <packet.json> [--output <file>] [--title <title>]\n');
|
|
171
|
+
return 2;
|
|
172
|
+
}
|
|
173
|
+
const full = nodePath.isAbsolute(inputPath)
|
|
174
|
+
? inputPath
|
|
175
|
+
: nodePath.resolve(resolveCwd(args), inputPath);
|
|
176
|
+
if (!existsSync(full)) {
|
|
177
|
+
process.stderr.write(`Review packet not found: ${full}\n`);
|
|
178
|
+
return 2;
|
|
179
|
+
}
|
|
180
|
+
let parsed;
|
|
181
|
+
try {
|
|
182
|
+
parsed = JSON.parse(readFileSync(full, 'utf8'));
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
process.stderr.write(`Failed to parse review packet as JSON: ${err.message}\n`);
|
|
186
|
+
return 2;
|
|
187
|
+
}
|
|
188
|
+
// Auto-detect v3 first, then v2.
|
|
189
|
+
if (isReviewPacketV3Shape(parsed)) {
|
|
190
|
+
const format = (flagString(args, 'format') ?? 'markdown');
|
|
191
|
+
const maxFiles = flagNumber(args, 'max-files');
|
|
192
|
+
const maxItems = flagNumber(args, 'max-items');
|
|
193
|
+
const out = renderReviewCommentV3(parsed, {
|
|
194
|
+
format,
|
|
195
|
+
...(maxFiles !== undefined ? { maxFiles } : {}),
|
|
196
|
+
...(maxItems !== undefined ? { maxItems } : {}),
|
|
197
|
+
});
|
|
198
|
+
const output = flagString(args, 'output');
|
|
199
|
+
if (output) {
|
|
200
|
+
const outFull = nodePath.isAbsolute(output)
|
|
201
|
+
? output
|
|
202
|
+
: nodePath.resolve(resolveCwd(args), output);
|
|
203
|
+
writeFileSync(outFull, out, 'utf8');
|
|
204
|
+
process.stdout.write(`Wrote ${out.length} bytes to ${outFull}\n`);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
process.stdout.write(out);
|
|
208
|
+
}
|
|
209
|
+
return 0;
|
|
210
|
+
}
|
|
211
|
+
// Auto-detect v2 schema and use the v2 renderer.
|
|
212
|
+
if (isReviewPacketV2Shape(parsed)) {
|
|
213
|
+
const format = flagString(args, 'format');
|
|
214
|
+
const maxFiles = flagNumber(args, 'max-files');
|
|
215
|
+
const maxItems = flagNumber(args, 'max-items');
|
|
216
|
+
const md = renderReviewCommentV2(parsed, {
|
|
217
|
+
...(format ? { format } : {}),
|
|
218
|
+
...(maxFiles !== undefined ? { maxFiles } : {}),
|
|
219
|
+
...(maxItems !== undefined ? { maxItems } : {}),
|
|
220
|
+
});
|
|
221
|
+
const output = flagString(args, 'output');
|
|
222
|
+
if (output) {
|
|
223
|
+
const outFull = nodePath.isAbsolute(output)
|
|
224
|
+
? output
|
|
225
|
+
: nodePath.resolve(resolveCwd(args), output);
|
|
226
|
+
writeFileSync(outFull, md, 'utf8');
|
|
227
|
+
process.stdout.write(`Wrote ${md.length} bytes to ${outFull}\n`);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
process.stdout.write(md);
|
|
231
|
+
}
|
|
232
|
+
return 0;
|
|
233
|
+
}
|
|
234
|
+
if (!isReviewPacketShape(parsed)) {
|
|
235
|
+
process.stderr.write('Input does not look like a review packet (missing expected fields).\n');
|
|
236
|
+
return 2;
|
|
237
|
+
}
|
|
238
|
+
const title = flagString(args, 'title');
|
|
239
|
+
const format = flagString(args, 'format');
|
|
240
|
+
const maxFiles = flagNumber(args, 'max-files');
|
|
241
|
+
const maxRules = flagNumber(args, 'max-rules');
|
|
242
|
+
const includeBoundaries = flagBool(args, 'include-boundaries');
|
|
243
|
+
const includeCoverage = flagBool(args, 'include-coverage');
|
|
244
|
+
const includeDrift = flagBool(args, 'include-drift');
|
|
245
|
+
const collapseLong = flagBool(args, 'collapse-long-sections');
|
|
246
|
+
const boundariesArtifact = readArtifact(args, 'boundaries');
|
|
247
|
+
const coverageArtifact = readArtifact(args, 'coverage');
|
|
248
|
+
const driftArtifact = readArtifact(args, 'drift');
|
|
249
|
+
const md = renderReviewComment(parsed, {
|
|
250
|
+
...(title ? { title } : {}),
|
|
251
|
+
...(format ? { format } : {}),
|
|
252
|
+
...(maxFiles !== undefined ? { maxFiles } : {}),
|
|
253
|
+
...(maxRules !== undefined ? { maxRules } : {}),
|
|
254
|
+
includeBoundaries: includeBoundaries !== false ? true : false,
|
|
255
|
+
...(includeCoverage ? { includeCoverage: true } : {}),
|
|
256
|
+
...(includeDrift ? { includeDrift: true } : {}),
|
|
257
|
+
...(collapseLong ? { collapseLongSections: true } : {}),
|
|
258
|
+
...(boundariesArtifact ? { boundariesArtifact } : {}),
|
|
259
|
+
...(coverageArtifact ? { coverageArtifact } : {}),
|
|
260
|
+
...(driftArtifact ? { driftArtifact } : {}),
|
|
261
|
+
});
|
|
262
|
+
const output = flagString(args, 'output');
|
|
263
|
+
if (output) {
|
|
264
|
+
const outFull = nodePath.isAbsolute(output)
|
|
265
|
+
? output
|
|
266
|
+
: nodePath.resolve(resolveCwd(args), output);
|
|
267
|
+
writeFileSync(outFull, md, 'utf8');
|
|
268
|
+
process.stdout.write(`Wrote ${md.length} bytes to ${outFull}\n`);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
process.stdout.write(md);
|
|
272
|
+
}
|
|
273
|
+
return 0;
|
|
274
|
+
}
|
|
275
|
+
function readArtifact(args, name) {
|
|
276
|
+
const flag = flagString(args, name);
|
|
277
|
+
if (!flag)
|
|
278
|
+
return undefined;
|
|
279
|
+
const full = nodePath.isAbsolute(flag) ? flag : nodePath.resolve(resolveCwd(args), flag);
|
|
280
|
+
if (!existsSync(full)) {
|
|
281
|
+
process.stderr.write(`--${name} artifact not found: ${full}\n`);
|
|
282
|
+
return undefined;
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
return JSON.parse(readFileSync(full, 'utf8'));
|
|
286
|
+
}
|
|
287
|
+
catch (e) {
|
|
288
|
+
process.stderr.write(`Failed to parse --${name} artifact: ${e.message}\n`);
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function isReviewPacketShape(v) {
|
|
293
|
+
if (typeof v !== 'object' || v === null)
|
|
294
|
+
return false;
|
|
295
|
+
const p = v;
|
|
296
|
+
return (Array.isArray(p.changedFiles) &&
|
|
297
|
+
Array.isArray(p.boundaryViolations) &&
|
|
298
|
+
Array.isArray(p.verificationCommands));
|
|
299
|
+
}
|
|
300
|
+
function isReviewPacketV2Shape(v) {
|
|
301
|
+
if (typeof v !== 'object' || v === null)
|
|
302
|
+
return false;
|
|
303
|
+
return v.schema === REVIEW_PACKET_V2_SCHEMA;
|
|
304
|
+
}
|
|
305
|
+
function isReviewPacketV3Shape(v) {
|
|
306
|
+
if (typeof v !== 'object' || v === null)
|
|
307
|
+
return false;
|
|
308
|
+
return v.schema === REVIEW_PACKET_V3_SCHEMA;
|
|
309
|
+
}
|
|
310
|
+
async function runPacket(args) {
|
|
311
|
+
const cwd = resolveCwd(args);
|
|
312
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
313
|
+
const since = flagString(args, 'since');
|
|
314
|
+
if (since) {
|
|
315
|
+
const { verifyGitRef } = await import('@shrkcrft/inspector');
|
|
316
|
+
const verify = verifyGitRef(cwd, since);
|
|
317
|
+
if (!verify.valid) {
|
|
318
|
+
process.stderr.write(`error: --since ref "${since}" does not resolve to a commit in this repository.\n` +
|
|
319
|
+
(verify.suggestions && verify.suggestions.length > 0
|
|
320
|
+
? `\nDid you mean:\n${verify.suggestions.map((s) => ` --since ${s}`).join('\n')}\n`
|
|
321
|
+
: '') +
|
|
322
|
+
'\nUse `git branch -a` to list available refs.\n');
|
|
323
|
+
return 2;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const files = flagList(args, 'files');
|
|
327
|
+
const v2 = flagBool(args, 'v2');
|
|
328
|
+
const baselineFile = flagString(args, 'quality-baseline');
|
|
329
|
+
const fmt = flagString(args, 'format') ?? 'json';
|
|
330
|
+
if (flagBool(args, 'v3')) {
|
|
331
|
+
const bundleId = flagString(args, 'bundle');
|
|
332
|
+
const packet = await buildReviewPacketV3(inspection, {
|
|
333
|
+
...(since ? { since } : {}),
|
|
334
|
+
...(flagBool(args, 'staged') ? { staged: true } : {}),
|
|
335
|
+
...(files.length ? { files } : {}),
|
|
336
|
+
...(baselineFile ? { qualityBaselineFile: baselineFile } : {}),
|
|
337
|
+
...(bundleId ? { bundleId } : {}),
|
|
338
|
+
});
|
|
339
|
+
if (fmt === 'markdown') {
|
|
340
|
+
process.stdout.write(renderReviewCommentV3(packet, { format: 'markdown' }));
|
|
341
|
+
}
|
|
342
|
+
else if (fmt === 'html') {
|
|
343
|
+
process.stdout.write(renderReviewCommentV3(packet, { format: 'html' }));
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
process.stdout.write(asJson(packet) + '\n');
|
|
347
|
+
}
|
|
348
|
+
return 0;
|
|
349
|
+
}
|
|
350
|
+
if (v2) {
|
|
351
|
+
const packet = await buildReviewPacketV2(inspection, {
|
|
352
|
+
...(since ? { since } : {}),
|
|
353
|
+
...(flagBool(args, 'staged') ? { staged: true } : {}),
|
|
354
|
+
...(files.length ? { files } : {}),
|
|
355
|
+
...(baselineFile ? { qualityBaselineFile: baselineFile } : {}),
|
|
356
|
+
});
|
|
357
|
+
if (fmt === 'markdown') {
|
|
358
|
+
process.stdout.write(renderReviewCommentV2(packet, { format: 'markdown' }));
|
|
359
|
+
}
|
|
360
|
+
else if (fmt === 'html') {
|
|
361
|
+
process.stdout.write(renderReviewCommentV2(packet, { format: 'html' }));
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
process.stdout.write(asJson(packet) + '\n');
|
|
365
|
+
}
|
|
366
|
+
return 0;
|
|
367
|
+
}
|
|
368
|
+
const packet = buildReviewPacket(inspection, {
|
|
369
|
+
...(since ? { since } : {}),
|
|
370
|
+
...(flagBool(args, 'staged') ? { staged: true } : {}),
|
|
371
|
+
...(files.length ? { files } : {}),
|
|
372
|
+
});
|
|
373
|
+
if (fmt === 'markdown' || fmt === 'html') {
|
|
374
|
+
process.stdout.write(renderReviewComment(packet));
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
process.stdout.write(asJson(packet) + '\n');
|
|
378
|
+
}
|
|
379
|
+
return 0;
|
|
380
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.command.d.ts","sourceRoot":"","sources":["../../src/commands/risk.command.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAYhC,eAAO,MAAM,WAAW,EAAE,eA8CzB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { buildTaskRiskReport, inspectSharkcraft, renderTaskRiskMarkdown, renderTaskRiskText, } from '@shrkcrft/inspector';
|
|
2
|
+
import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
|
|
3
|
+
import { asJson } from "../output/format-output.js";
|
|
4
|
+
function parseFilesFlag(args) {
|
|
5
|
+
const raw = flagString(args, 'files');
|
|
6
|
+
if (!raw)
|
|
7
|
+
return [];
|
|
8
|
+
return raw
|
|
9
|
+
.split(',')
|
|
10
|
+
.map((f) => f.trim())
|
|
11
|
+
.filter((f) => f.length > 0);
|
|
12
|
+
}
|
|
13
|
+
export const riskCommand = {
|
|
14
|
+
name: 'risk',
|
|
15
|
+
description: 'Compute a per-task risk report (intent + impact + architecture + boundaries + ownership + tests).',
|
|
16
|
+
usage: 'shrk risk "<task>" [--files a,b,c] [--since <ref>] [--staged] [--json] [--explain] [--format text|markdown|json]',
|
|
17
|
+
async run(args) {
|
|
18
|
+
const task = args.positional.join(' ').trim();
|
|
19
|
+
if (!task) {
|
|
20
|
+
process.stderr.write('Usage: shrk risk "<task>"\n');
|
|
21
|
+
return 2;
|
|
22
|
+
}
|
|
23
|
+
const cwd = resolveCwd(args);
|
|
24
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
25
|
+
const files = parseFilesFlag(args);
|
|
26
|
+
const since = flagString(args, 'since');
|
|
27
|
+
const staged = flagBool(args, 'staged');
|
|
28
|
+
const includeMemory = flagBool(args, 'include-memory');
|
|
29
|
+
const report = await buildTaskRiskReport(task, inspection, {
|
|
30
|
+
...(files.length > 0 ? { files } : {}),
|
|
31
|
+
...(since ? { since } : {}),
|
|
32
|
+
...(staged ? { staged: true } : {}),
|
|
33
|
+
...(includeMemory ? { includeMemory: true } : {}),
|
|
34
|
+
});
|
|
35
|
+
const format = (flagString(args, 'format') ?? '').toLowerCase();
|
|
36
|
+
if (flagBool(args, 'json') || format === 'json') {
|
|
37
|
+
process.stdout.write(asJson(report) + '\n');
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
if (format === 'markdown') {
|
|
41
|
+
process.stdout.write(renderTaskRiskMarkdown(report));
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
process.stdout.write(renderTaskRiskText(report));
|
|
45
|
+
if (flagBool(args, 'explain')) {
|
|
46
|
+
process.stdout.write('\nExplanation:\n');
|
|
47
|
+
process.stdout.write(` Score ${report.score} → ${report.riskLevel}; ` +
|
|
48
|
+
(report.humanApprovalRequired ? 'human approval required.' : 'human approval optional.') +
|
|
49
|
+
'\n');
|
|
50
|
+
for (const r of report.reasons) {
|
|
51
|
+
process.stdout.write(` • ${r.code}: ${r.message} (+${r.weight})\n`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return 0;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ICommandHandler } from '../command-registry.js';
|
|
2
|
+
export declare const roundsCaptureCommand: ICommandHandler;
|
|
3
|
+
export declare const roundsListCommand: ICommandHandler;
|
|
4
|
+
export declare const roundsShowCommand: ICommandHandler;
|
|
5
|
+
export declare const diffParentCommand: ICommandHandler;
|
|
6
|
+
export declare const roundsParentCommand: ICommandHandler;
|
|
7
|
+
export declare const diffRoundsCommand: ICommandHandler;
|
|
8
|
+
//# sourceMappingURL=rounds.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rounds.command.d.ts","sourceRoot":"","sources":["../../src/commands/rounds.command.ts"],"names":[],"mappings":"AAsBA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAiBhC,eAAO,MAAM,oBAAoB,EAAE,eAgClC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAmB/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAiC/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAc/B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAajC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAoC/B,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `shrk rounds capture` and `shrk diff rounds`.
|
|
3
|
+
*
|
|
4
|
+
* The rounds verb captures a snapshot of the engine surface (commands,
|
|
5
|
+
* MCP tools, docs) at HEAD and persists it under
|
|
6
|
+
* `.sharkcraft/rounds/<id>/`. The diff verb compares two snapshots and
|
|
7
|
+
* answers the "what shipped in round X vs round Y?" question without
|
|
8
|
+
* scraping git logs.
|
|
9
|
+
*/
|
|
10
|
+
// DX#4 — `ALL_TOOLS_FOR_AUDIT` was deleted; project ALL_TOOLS inline.
|
|
11
|
+
import { ALL_TOOLS } from '@shrkcrft/mcp-server';
|
|
12
|
+
import { captureRoundSnapshot, diffRounds as diffRoundSnapshots, listRoundIds, loadRoundSnapshot, renderRoundsDiffMarkdown, writeRoundSnapshot, } from '@shrkcrft/inspector';
|
|
13
|
+
import { COMMAND_CATALOG } from "./command-catalog.js";
|
|
14
|
+
import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
|
|
15
|
+
import { asJson, header } from "../output/format-output.js";
|
|
16
|
+
function collectCommandsFromCatalog() {
|
|
17
|
+
return COMMAND_CATALOG.map((e) => ({
|
|
18
|
+
name: e.command,
|
|
19
|
+
description: e.description,
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
function collectMcpTools() {
|
|
23
|
+
return ALL_TOOLS.map((t) => ({
|
|
24
|
+
name: t.name,
|
|
25
|
+
description: t.description,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
export const roundsCaptureCommand = {
|
|
29
|
+
name: 'capture',
|
|
30
|
+
description: 'Capture a snapshot of the engine surface at HEAD under .sharkcraft/rounds/<id>/.',
|
|
31
|
+
usage: 'shrk rounds capture --id <id> [--title <text>] [--json]',
|
|
32
|
+
run(args) {
|
|
33
|
+
const id = flagString(args, 'id') ?? args.positional[0];
|
|
34
|
+
if (!id) {
|
|
35
|
+
process.stderr.write('Usage: shrk rounds capture --id <id> [--title <text>] [--json]\n');
|
|
36
|
+
return 2;
|
|
37
|
+
}
|
|
38
|
+
const cwd = resolveCwd(args);
|
|
39
|
+
const title = flagString(args, 'title') ?? undefined;
|
|
40
|
+
const snapshot = captureRoundSnapshot({
|
|
41
|
+
projectRoot: cwd,
|
|
42
|
+
id,
|
|
43
|
+
...(title ? { title } : {}),
|
|
44
|
+
commands: collectCommandsFromCatalog(),
|
|
45
|
+
mcpTools: collectMcpTools(),
|
|
46
|
+
});
|
|
47
|
+
const { snapshotFile, metaFile } = writeRoundSnapshot(cwd, snapshot);
|
|
48
|
+
if (flagBool(args, 'json')) {
|
|
49
|
+
process.stdout.write(asJson({ snapshot, files: { snapshotFile, metaFile } }) + '\n');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
process.stdout.write(header(`Round snapshot ${id}`));
|
|
53
|
+
process.stdout.write(` commands: ${snapshot.commands.length}\n`);
|
|
54
|
+
process.stdout.write(` mcp tools: ${snapshot.mcpTools.length}\n`);
|
|
55
|
+
process.stdout.write(` docs: ${snapshot.docs.length}\n`);
|
|
56
|
+
process.stdout.write(` files:\n ${snapshotFile}\n ${metaFile}\n`);
|
|
57
|
+
}
|
|
58
|
+
return 0;
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export const roundsListCommand = {
|
|
62
|
+
name: 'list',
|
|
63
|
+
description: 'List captured round snapshots.',
|
|
64
|
+
usage: 'shrk rounds list [--json]',
|
|
65
|
+
run(args) {
|
|
66
|
+
const cwd = resolveCwd(args);
|
|
67
|
+
const ids = listRoundIds(cwd);
|
|
68
|
+
if (flagBool(args, 'json')) {
|
|
69
|
+
process.stdout.write(asJson({ rounds: ids }) + '\n');
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
process.stdout.write(header(`Captured rounds (${ids.length})`));
|
|
73
|
+
if (ids.length === 0) {
|
|
74
|
+
process.stdout.write(' (none — run `shrk rounds capture --id <id>`)\n');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
for (const id of ids)
|
|
78
|
+
process.stdout.write(` • ${id}\n`);
|
|
79
|
+
}
|
|
80
|
+
return 0;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
export const roundsShowCommand = {
|
|
84
|
+
name: 'show',
|
|
85
|
+
description: 'Print one captured round snapshot.',
|
|
86
|
+
usage: 'shrk rounds show <id> [--json]',
|
|
87
|
+
run(args) {
|
|
88
|
+
const id = args.positional[0] ?? flagString(args, 'id');
|
|
89
|
+
if (!id) {
|
|
90
|
+
process.stderr.write('Usage: shrk rounds show <id> [--json]\n');
|
|
91
|
+
return 2;
|
|
92
|
+
}
|
|
93
|
+
const cwd = resolveCwd(args);
|
|
94
|
+
const snap = loadRoundSnapshot(cwd, id);
|
|
95
|
+
if (!snap) {
|
|
96
|
+
if (flagBool(args, 'json')) {
|
|
97
|
+
process.stdout.write(asJson({ ok: false, error: 'round-not-found', id }) + '\n');
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
process.stderr.write(`No snapshot found for round "${id}".\n`);
|
|
101
|
+
}
|
|
102
|
+
return 1;
|
|
103
|
+
}
|
|
104
|
+
if (flagBool(args, 'json')) {
|
|
105
|
+
process.stdout.write(asJson(snap) + '\n');
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
process.stdout.write(header(`Round ${snap.id}${snap.title ? ` — ${snap.title}` : ''}`));
|
|
109
|
+
process.stdout.write(` capturedAt: ${snap.capturedAt}\n`);
|
|
110
|
+
process.stdout.write(` commands: ${snap.commands.length}\n`);
|
|
111
|
+
process.stdout.write(` mcp tools: ${snap.mcpTools.length}\n`);
|
|
112
|
+
process.stdout.write(` docs: ${snap.docs.length}\n`);
|
|
113
|
+
return 0;
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
export const diffParentCommand = {
|
|
117
|
+
name: 'diff',
|
|
118
|
+
description: 'Diff two artifacts. Currently supports `diff rounds` for round-to-round snapshot diffs.',
|
|
119
|
+
usage: 'shrk diff rounds --from <id> --to <id> [--json]',
|
|
120
|
+
async run(args) {
|
|
121
|
+
const sub = args.positional[0];
|
|
122
|
+
if (sub === 'rounds') {
|
|
123
|
+
const rest = { ...args, positional: args.positional.slice(1) };
|
|
124
|
+
return diffRoundsCommand.run(rest);
|
|
125
|
+
}
|
|
126
|
+
process.stderr.write('Usage: shrk diff rounds --from <id> --to <id> [--json]\n');
|
|
127
|
+
return 2;
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
export const roundsParentCommand = {
|
|
131
|
+
name: 'rounds',
|
|
132
|
+
description: 'Capture / list / show round snapshots under .sharkcraft/rounds/.',
|
|
133
|
+
usage: 'shrk rounds [capture|list|show] [args]',
|
|
134
|
+
async run(args) {
|
|
135
|
+
const sub = args.positional[0];
|
|
136
|
+
const rest = { ...args, positional: args.positional.slice(1) };
|
|
137
|
+
if (sub === 'capture')
|
|
138
|
+
return roundsCaptureCommand.run(rest);
|
|
139
|
+
if (sub === 'list')
|
|
140
|
+
return roundsListCommand.run(rest);
|
|
141
|
+
if (sub === 'show')
|
|
142
|
+
return roundsShowCommand.run(rest);
|
|
143
|
+
process.stderr.write('Usage: shrk rounds [capture|list|show] [args]\n');
|
|
144
|
+
return 2;
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
export const diffRoundsCommand = {
|
|
148
|
+
name: 'rounds',
|
|
149
|
+
description: 'Diff two captured round snapshots — what shipped in the target round vs the baseline.',
|
|
150
|
+
usage: 'shrk diff rounds --from <id> --to <id> [--json]',
|
|
151
|
+
run(args) {
|
|
152
|
+
const fromId = flagString(args, 'from');
|
|
153
|
+
const toId = flagString(args, 'to');
|
|
154
|
+
if (!fromId || !toId) {
|
|
155
|
+
process.stderr.write('Usage: shrk diff rounds --from <id> --to <id> [--json]\n');
|
|
156
|
+
return 2;
|
|
157
|
+
}
|
|
158
|
+
const cwd = resolveCwd(args);
|
|
159
|
+
const fromSnap = loadRoundSnapshot(cwd, fromId);
|
|
160
|
+
const toSnap = loadRoundSnapshot(cwd, toId);
|
|
161
|
+
const wantJson = flagBool(args, 'json');
|
|
162
|
+
if (!fromSnap || !toSnap) {
|
|
163
|
+
const missing = !fromSnap ? fromId : toId;
|
|
164
|
+
if (wantJson) {
|
|
165
|
+
process.stdout.write(asJson({ ok: false, error: 'round-not-found', missing }) + '\n');
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
process.stderr.write(`No snapshot found for round "${missing}". Capture it with \`shrk rounds capture --id ${missing}\`.\n`);
|
|
169
|
+
}
|
|
170
|
+
return 1;
|
|
171
|
+
}
|
|
172
|
+
const diff = diffRoundSnapshots(fromSnap, toSnap);
|
|
173
|
+
if (wantJson) {
|
|
174
|
+
process.stdout.write(asJson(diff) + '\n');
|
|
175
|
+
return 0;
|
|
176
|
+
}
|
|
177
|
+
process.stdout.write(renderRoundsDiffMarkdown(diff));
|
|
178
|
+
return 0;
|
|
179
|
+
},
|
|
180
|
+
};
|