@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,326 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import * as nodePath from 'node:path';
|
|
3
|
+
import { buildOnboardingPlan, buildPolyglotBoundaryReport, inspectSharkcraft, renderPolyglotBoundaryReportMarkdown, renderPolyglotBoundaryReportText, suggestBoundaryFixes, } from '@shrkcrft/inspector';
|
|
4
|
+
import { evaluateBoundaries, loadTsconfigPaths, scanImports, } from '@shrkcrft/boundaries';
|
|
5
|
+
import { flagBool, flagString, resolveCwd } from "../command-registry.js";
|
|
6
|
+
import { asJson, header, kv } from "../output/format-output.js";
|
|
7
|
+
export const boundariesListCommand = {
|
|
8
|
+
name: 'list',
|
|
9
|
+
description: 'List all registered boundary rules (local + pack-contributed).',
|
|
10
|
+
usage: 'shrk [--cwd <dir>] boundaries list [--json]',
|
|
11
|
+
async run(args) {
|
|
12
|
+
const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
|
|
13
|
+
const rules = inspection.boundaryRegistry.list();
|
|
14
|
+
if (flagBool(args, 'json')) {
|
|
15
|
+
process.stdout.write(asJson(rules) + '\n');
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
process.stdout.write(header(`Boundary rules (${rules.length})`));
|
|
19
|
+
if (rules.length === 0) {
|
|
20
|
+
process.stdout.write(' (none registered)\n');
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
for (const r of rules) {
|
|
24
|
+
process.stdout.write(` ${(r.severity ?? 'warning').toUpperCase().padEnd(8)} ${r.id.padEnd(36)} ${r.title}\n`);
|
|
25
|
+
}
|
|
26
|
+
return 0;
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
export const boundariesGetCommand = {
|
|
30
|
+
name: 'get',
|
|
31
|
+
description: 'Show one boundary rule (by id) in full.',
|
|
32
|
+
usage: 'shrk [--cwd <dir>] boundaries get <ruleId> [--json]',
|
|
33
|
+
async run(args) {
|
|
34
|
+
const id = args.positional[0];
|
|
35
|
+
if (!id) {
|
|
36
|
+
process.stderr.write('Usage: shrk boundaries get <ruleId>\n');
|
|
37
|
+
return 2;
|
|
38
|
+
}
|
|
39
|
+
const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
|
|
40
|
+
const rule = inspection.boundaryRegistry.get(id);
|
|
41
|
+
if (!rule) {
|
|
42
|
+
process.stderr.write(`No boundary rule with id "${id}".\n`);
|
|
43
|
+
return 1;
|
|
44
|
+
}
|
|
45
|
+
if (flagBool(args, 'json')) {
|
|
46
|
+
process.stdout.write(asJson(rule) + '\n');
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
process.stdout.write(header(`Boundary rule: ${rule.id}`));
|
|
50
|
+
process.stdout.write(kv('title', rule.title) + '\n');
|
|
51
|
+
process.stdout.write(kv('severity', rule.severity ?? 'warning') + '\n');
|
|
52
|
+
if (rule.from && rule.from.length > 0) {
|
|
53
|
+
process.stdout.write(kv('from', rule.from.join(', ')) + '\n');
|
|
54
|
+
}
|
|
55
|
+
if (rule.forbiddenImports && rule.forbiddenImports.length > 0) {
|
|
56
|
+
process.stdout.write(kv('forbidden', rule.forbiddenImports.join(', ')) + '\n');
|
|
57
|
+
}
|
|
58
|
+
if (rule.allowedImports && rule.allowedImports.length > 0) {
|
|
59
|
+
process.stdout.write(kv('allowed', rule.allowedImports.join(', ')) + '\n');
|
|
60
|
+
}
|
|
61
|
+
if (rule.suggestedFix) {
|
|
62
|
+
process.stdout.write(kv('suggestedFix', rule.suggestedFix) + '\n');
|
|
63
|
+
}
|
|
64
|
+
return 0;
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
export const boundariesExplainCommand = {
|
|
68
|
+
name: 'explain',
|
|
69
|
+
description: 'Explain a boundary rule: where it came from (local vs pack), what it forbids, what to do about violations.',
|
|
70
|
+
usage: 'shrk [--cwd <dir>] boundaries explain <ruleId> [--json]',
|
|
71
|
+
async run(args) {
|
|
72
|
+
const id = args.positional[0];
|
|
73
|
+
if (!id) {
|
|
74
|
+
process.stderr.write('Usage: shrk boundaries explain <ruleId>\n');
|
|
75
|
+
return 2;
|
|
76
|
+
}
|
|
77
|
+
const inspection = await inspectSharkcraft({ cwd: resolveCwd(args) });
|
|
78
|
+
const rule = inspection.boundaryRegistry.get(id);
|
|
79
|
+
if (!rule) {
|
|
80
|
+
process.stderr.write(`No boundary rule with id "${id}".\n`);
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
const source = inspection.boundarySources.get(id);
|
|
84
|
+
const explanation = {
|
|
85
|
+
id: rule.id,
|
|
86
|
+
title: rule.title,
|
|
87
|
+
severity: rule.severity ?? 'warning',
|
|
88
|
+
origin: source ? (source.type === 'pack' ? `pack: ${source.packageName}` : 'local') : 'unknown',
|
|
89
|
+
from: rule.from ?? [],
|
|
90
|
+
forbiddenImports: rule.forbiddenImports ?? [],
|
|
91
|
+
allowedImports: rule.allowedImports ?? [],
|
|
92
|
+
suggestedFix: rule.suggestedFix,
|
|
93
|
+
howToFix: 'Adjust the offending import to either (a) drop the disallowed dependency, (b) use a public interface from the allowed list, or (c) move the importer into a layer where this dependency is permitted.',
|
|
94
|
+
};
|
|
95
|
+
if (flagBool(args, 'json')) {
|
|
96
|
+
process.stdout.write(asJson(explanation) + '\n');
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
process.stdout.write(header(`Boundary explain: ${rule.id}`));
|
|
100
|
+
process.stdout.write(kv('title', rule.title) + '\n');
|
|
101
|
+
process.stdout.write(kv('severity', rule.severity ?? 'warning') + '\n');
|
|
102
|
+
process.stdout.write(kv('origin', explanation.origin) + '\n');
|
|
103
|
+
if (explanation.from.length > 0) {
|
|
104
|
+
process.stdout.write(kv('applies to', explanation.from.join(', ')) + '\n');
|
|
105
|
+
}
|
|
106
|
+
if (explanation.forbiddenImports.length > 0) {
|
|
107
|
+
process.stdout.write(kv('forbidden', explanation.forbiddenImports.join(', ')) + '\n');
|
|
108
|
+
}
|
|
109
|
+
if (explanation.allowedImports.length > 0) {
|
|
110
|
+
process.stdout.write(kv('allowed', explanation.allowedImports.join(', ')) + '\n');
|
|
111
|
+
}
|
|
112
|
+
if (rule.suggestedFix)
|
|
113
|
+
process.stdout.write(`\nSuggested fix: ${rule.suggestedFix}\n`);
|
|
114
|
+
process.stdout.write(`\nHow to fix: ${explanation.howToFix}\n`);
|
|
115
|
+
return 0;
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
export const boundariesInferCommand = {
|
|
119
|
+
name: 'infer',
|
|
120
|
+
description: 'Infer candidate boundary rules from the current repo (monorepo structure, package boundaries, naming heuristics). Dry-run by default; --write-drafts writes to sharkcraft/boundary-drafts/boundaries.draft.ts. --language all|java|csharp|python|go|rust adds polyglot suggestions.',
|
|
121
|
+
usage: 'shrk [--cwd <dir>] boundaries infer [--write-drafts] [--language all|java|csharp|python|go|rust] [--json]',
|
|
122
|
+
async run(args) {
|
|
123
|
+
const cwd = resolveCwd(args);
|
|
124
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
125
|
+
const plan = buildOnboardingPlan(inspection, {});
|
|
126
|
+
const inferred = plan.inferredBoundaryRules;
|
|
127
|
+
const langFlag = flagString(args, 'language');
|
|
128
|
+
let languageSuggestions = null;
|
|
129
|
+
if (langFlag) {
|
|
130
|
+
const { suggestLanguageBoundaries } = await import('@shrkcrft/inspector');
|
|
131
|
+
const lang = langFlag.toLowerCase();
|
|
132
|
+
languageSuggestions = suggestLanguageBoundaries(cwd, lang === 'all' ? {} : { language: lang });
|
|
133
|
+
}
|
|
134
|
+
const wantJson = flagBool(args, 'json');
|
|
135
|
+
const writeDrafts = flagBool(args, 'write-drafts');
|
|
136
|
+
if (writeDrafts) {
|
|
137
|
+
const outDir = nodePath.join(cwd, 'sharkcraft', 'boundary-drafts');
|
|
138
|
+
mkdirSync(outDir, { recursive: true });
|
|
139
|
+
const outFile = nodePath.join(outDir, 'boundaries.draft.ts');
|
|
140
|
+
if (!outFile.startsWith(outDir + nodePath.sep)) {
|
|
141
|
+
process.stderr.write('Refusing to write outside boundary-drafts dir.\n');
|
|
142
|
+
return 1;
|
|
143
|
+
}
|
|
144
|
+
const body = renderInferredBoundariesDraft(inferred);
|
|
145
|
+
writeFileSync(outFile, body, 'utf8');
|
|
146
|
+
if (wantJson) {
|
|
147
|
+
process.stdout.write(asJson({ mode: 'write-drafts', outFile, bytes: body.length, count: inferred.length }) +
|
|
148
|
+
'\n');
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
process.stdout.write(header('Boundary inference (write-drafts)'));
|
|
152
|
+
process.stdout.write(kv('outFile', outFile) + '\n');
|
|
153
|
+
process.stdout.write(kv('count', String(inferred.length)) + '\n');
|
|
154
|
+
return 0;
|
|
155
|
+
}
|
|
156
|
+
if (wantJson) {
|
|
157
|
+
process.stdout.write(asJson({ inferred, ...(languageSuggestions ? { languageSuggestions } : {}) }) + '\n');
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
process.stdout.write(header(`Inferred boundary rules (${inferred.length})`));
|
|
161
|
+
if (inferred.length === 0) {
|
|
162
|
+
process.stdout.write(' (no candidates inferred)\n');
|
|
163
|
+
}
|
|
164
|
+
for (const r of inferred) {
|
|
165
|
+
process.stdout.write(` ${r.severity.toUpperCase().padEnd(8)} ${r.id.padEnd(36)} ${r.title}\n`);
|
|
166
|
+
process.stdout.write(` reason: ${r.reason}\n`);
|
|
167
|
+
}
|
|
168
|
+
if (languageSuggestions && languageSuggestions.suggestions.length > 0) {
|
|
169
|
+
process.stdout.write(`\nPolyglot suggestions (${languageSuggestions.suggestions.length}):\n`);
|
|
170
|
+
for (const s of languageSuggestions.suggestions) {
|
|
171
|
+
process.stdout.write(` ${s.severity.toUpperCase().padEnd(8)} [${s.language}] ${s.id.padEnd(48)} ${s.title}\n`);
|
|
172
|
+
process.stdout.write(` reason: ${s.reason}\n`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
process.stdout.write('\nDry-run only. Re-run with `--write-drafts` to write sharkcraft/boundary-drafts/boundaries.draft.ts.\n');
|
|
176
|
+
return 0;
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
function renderInferredBoundariesDraft(rules) {
|
|
180
|
+
const lines = [];
|
|
181
|
+
lines.push('// Boundary rules inferred by `shrk boundaries infer --write-drafts`.');
|
|
182
|
+
lines.push('// Review and copy keepers into sharkcraft/boundaries.ts.');
|
|
183
|
+
lines.push('export default [');
|
|
184
|
+
for (const r of rules) {
|
|
185
|
+
lines.push(` {`);
|
|
186
|
+
lines.push(` id: '${r.id}',`);
|
|
187
|
+
lines.push(` title: ${JSON.stringify(r.title)},`);
|
|
188
|
+
lines.push(` severity: '${r.severity}',`);
|
|
189
|
+
lines.push(` from: ${JSON.stringify(r.from)},`);
|
|
190
|
+
if (r.forbiddenImports && r.forbiddenImports.length > 0) {
|
|
191
|
+
lines.push(` forbiddenImports: ${JSON.stringify(r.forbiddenImports)},`);
|
|
192
|
+
}
|
|
193
|
+
if (r.allowedImports && r.allowedImports.length > 0) {
|
|
194
|
+
lines.push(` allowedImports: ${JSON.stringify(r.allowedImports)},`);
|
|
195
|
+
}
|
|
196
|
+
lines.push(` suggestedFix: ${JSON.stringify(r.suggestedFix)},`);
|
|
197
|
+
lines.push(` // reason: ${r.reason}`);
|
|
198
|
+
lines.push(` },`);
|
|
199
|
+
}
|
|
200
|
+
lines.push('];');
|
|
201
|
+
return lines.join('\n') + '\n';
|
|
202
|
+
}
|
|
203
|
+
/** Polyglot enforcement subcommand. */
|
|
204
|
+
export const boundariesEnforceCommand = {
|
|
205
|
+
name: 'enforce',
|
|
206
|
+
description: 'Polyglot boundary enforcement report. Read-only; CLI-only — never mutates source.',
|
|
207
|
+
usage: 'shrk [--cwd <dir>] boundaries enforce [--language all|java|csharp|python|go|rust|typescript] [--changed-only|--since <ref>|--staged|--files a,b,c] [--format text|markdown|json]',
|
|
208
|
+
async run(args) {
|
|
209
|
+
const cwd = resolveCwd(args);
|
|
210
|
+
const langFlag = (flagString(args, 'language') ?? 'all').toLowerCase();
|
|
211
|
+
const languages = langFlag === 'all' ? undefined : [langFlag];
|
|
212
|
+
const report = buildPolyglotBoundaryReport({ projectRoot: cwd, ...(languages ? { languages } : {}) });
|
|
213
|
+
// Changed-only filtering against the polyglot report.
|
|
214
|
+
const changedOnly = flagBool(args, 'changed-only');
|
|
215
|
+
const staged = flagBool(args, 'staged');
|
|
216
|
+
const since = flagString(args, 'since');
|
|
217
|
+
const filesRaw = flagString(args, 'files');
|
|
218
|
+
const fileList = filesRaw
|
|
219
|
+
? filesRaw.split(',').map((s) => s.trim()).filter(Boolean)
|
|
220
|
+
: [];
|
|
221
|
+
if (since) {
|
|
222
|
+
const { verifyGitRef } = await import('@shrkcrft/inspector');
|
|
223
|
+
const verify = verifyGitRef(cwd, since);
|
|
224
|
+
if (!verify.valid) {
|
|
225
|
+
process.stderr.write(`error: --since ref "${since}" does not resolve to a commit in this repository.\n` +
|
|
226
|
+
(verify.suggestions && verify.suggestions.length > 0
|
|
227
|
+
? `\nDid you mean:\n${verify.suggestions.map((s) => ` --since ${s}`).join('\n')}\n`
|
|
228
|
+
: '') +
|
|
229
|
+
'\nUse `git branch -a` to list available refs.\n');
|
|
230
|
+
return 2;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const wantChangedScope = changedOnly || staged || Boolean(since) || fileList.length > 0;
|
|
234
|
+
const { filterViolationsToChangedScope } = await import('@shrkcrft/inspector');
|
|
235
|
+
const filtered = wantChangedScope
|
|
236
|
+
? filterViolationsToChangedScope(report.violations, {
|
|
237
|
+
projectRoot: cwd,
|
|
238
|
+
...(fileList.length > 0 ? { files: fileList } : {}),
|
|
239
|
+
...(staged ? { staged: true } : {}),
|
|
240
|
+
...(since ? { since } : {}),
|
|
241
|
+
...(changedOnly && !staged && !since && fileList.length === 0
|
|
242
|
+
? { includeWorktree: true }
|
|
243
|
+
: {}),
|
|
244
|
+
})
|
|
245
|
+
: null;
|
|
246
|
+
const finalViolations = filtered ? filtered.includedViolations : report.violations;
|
|
247
|
+
const errors = finalViolations.filter((v) => v.severity === 'error').length;
|
|
248
|
+
const warnings = finalViolations.filter((v) => v.severity === 'warning').length;
|
|
249
|
+
const format = (flagString(args, 'format') ?? 'text').toLowerCase();
|
|
250
|
+
if (flagBool(args, 'json') || format === 'json') {
|
|
251
|
+
const payload = {
|
|
252
|
+
...report,
|
|
253
|
+
violations: finalViolations,
|
|
254
|
+
counts: { ...report.counts, errors, warnings },
|
|
255
|
+
...(filtered
|
|
256
|
+
? {
|
|
257
|
+
changedScope: {
|
|
258
|
+
mode: filtered.mode,
|
|
259
|
+
changedFiles: filtered.changedFiles,
|
|
260
|
+
ignoredLegacyCount: filtered.ignoredLegacyCount,
|
|
261
|
+
ignoredLegacyByRule: filtered.ignoredLegacyByRule,
|
|
262
|
+
},
|
|
263
|
+
}
|
|
264
|
+
: {}),
|
|
265
|
+
};
|
|
266
|
+
process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
|
|
267
|
+
return errors > 0 ? 1 : 0;
|
|
268
|
+
}
|
|
269
|
+
if (format === 'markdown' || format === 'md') {
|
|
270
|
+
process.stdout.write(renderPolyglotBoundaryReportMarkdown({ ...report, violations: finalViolations, counts: { ...report.counts, errors, warnings } }) + '\n');
|
|
271
|
+
return errors > 0 ? 1 : 0;
|
|
272
|
+
}
|
|
273
|
+
// Default text path: render via existing renderer and append changed-scope footer.
|
|
274
|
+
process.stdout.write(renderPolyglotBoundaryReportText({ ...report, violations: finalViolations, counts: { ...report.counts, errors, warnings } }));
|
|
275
|
+
if (filtered) {
|
|
276
|
+
process.stdout.write(`\nMode: ${filtered.mode}\n`);
|
|
277
|
+
process.stdout.write(`Changed files: ${filtered.changedFiles.length}\n`);
|
|
278
|
+
process.stdout.write(`Legacy ignored: ${filtered.ignoredLegacyCount}\n`);
|
|
279
|
+
if (finalViolations.length === 0) {
|
|
280
|
+
process.stdout.write('No polyglot boundary violations introduced by changed files.\n');
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return errors > 0 ? 1 : 0;
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
export const boundariesSuggestCommand = {
|
|
287
|
+
name: 'suggest',
|
|
288
|
+
description: 'Suggest fixes for boundary violations (by rule id, file, or all).',
|
|
289
|
+
usage: 'shrk boundaries suggest [<ruleId or file>] [--json]',
|
|
290
|
+
async run(args) {
|
|
291
|
+
const cwd = resolveCwd(args);
|
|
292
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
293
|
+
const rules = inspection.boundaryRegistry.list();
|
|
294
|
+
if (rules.length === 0) {
|
|
295
|
+
process.stderr.write('No boundary rules configured.\n');
|
|
296
|
+
return 0;
|
|
297
|
+
}
|
|
298
|
+
const scan = scanImports({ projectRoot: cwd });
|
|
299
|
+
const tsconfigPaths = loadTsconfigPaths(cwd);
|
|
300
|
+
const evalResult = evaluateBoundaries(scan, rules, {
|
|
301
|
+
...(tsconfigPaths.aliases.size > 0 ? { tsconfigPaths } : {}),
|
|
302
|
+
});
|
|
303
|
+
const filter = args.positional[0];
|
|
304
|
+
const filtered = filter
|
|
305
|
+
? evalResult.violations.filter((v) => v.ruleId === filter || v.file.includes(filter))
|
|
306
|
+
: evalResult.violations;
|
|
307
|
+
const suggestions = suggestBoundaryFixes(inspection, filtered.map((v) => ({
|
|
308
|
+
ruleId: v.ruleId,
|
|
309
|
+
file: v.file,
|
|
310
|
+
line: v.line,
|
|
311
|
+
importSpecifier: v.importSpecifier,
|
|
312
|
+
...(v.suggestedFix ? { suggestedFix: v.suggestedFix } : {}),
|
|
313
|
+
})));
|
|
314
|
+
if (flagBool(args, 'json')) {
|
|
315
|
+
process.stdout.write(asJson(suggestions) + '\n');
|
|
316
|
+
return 0;
|
|
317
|
+
}
|
|
318
|
+
process.stdout.write(header(`Boundary fix suggestions (${suggestions.length})`));
|
|
319
|
+
for (const s of suggestions) {
|
|
320
|
+
process.stdout.write(` ${s.ruleId} ${s.file}:${s.line}\n`);
|
|
321
|
+
for (const sug of s.suggestions)
|
|
322
|
+
process.stdout.write(` ↳ ${sug}\n`);
|
|
323
|
+
}
|
|
324
|
+
return 0;
|
|
325
|
+
},
|
|
326
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.command.d.ts","sourceRoot":"","sources":["../../src/commands/brief.command.ts"],"names":[],"mappings":"AAYA,OAAO,EAML,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAehC,eAAO,MAAM,YAAY,EAAE,eAmJ1B,CAAC"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import * as nodePath from 'node:path';
|
|
4
|
+
import { buildAgentBrief, BriefMode, getChangedFiles, inspectSharkcraft, setDevNextAction, writeDevSessionState, scanDevSession, } from '@shrkcrft/inspector';
|
|
5
|
+
import { flagBool, flagNumber, flagString, flagList, resolveCwd, } from "../command-registry.js";
|
|
6
|
+
import { asJson } from "../output/format-output.js";
|
|
7
|
+
const VALID_MODES = new Set(Object.values(BriefMode));
|
|
8
|
+
function resolveMode(args) {
|
|
9
|
+
const raw = flagString(args, 'mode');
|
|
10
|
+
if (!raw)
|
|
11
|
+
return undefined;
|
|
12
|
+
if (!VALID_MODES.has(raw)) {
|
|
13
|
+
process.stderr.write(`Unknown --mode "${raw}". Use ${[...VALID_MODES].join('|')}.\n`);
|
|
14
|
+
process.exit(2);
|
|
15
|
+
}
|
|
16
|
+
return raw;
|
|
17
|
+
}
|
|
18
|
+
export const briefCommand = {
|
|
19
|
+
name: 'brief',
|
|
20
|
+
description: 'Render a single Markdown / JSON brief for an AI agent before it starts work. Read-only.',
|
|
21
|
+
usage: 'shrk brief "<task>" [--mode compact|full|review|implementation|handoff] [--since ref] [--staged] [--files a,b] [--bundle id] [--session id] [--output file.md] [--chunk [--output-dir <dir>]] [--section-budget rules=N,impact=N] [--max-tokens N] [--json]',
|
|
22
|
+
async run(args) {
|
|
23
|
+
const task = args.positional.join(' ').trim();
|
|
24
|
+
const cwd = resolveCwd(args);
|
|
25
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
26
|
+
const mode = resolveMode(args);
|
|
27
|
+
const since = flagString(args, 'since');
|
|
28
|
+
const staged = flagBool(args, 'staged');
|
|
29
|
+
const files = flagList(args, 'files');
|
|
30
|
+
const bundleId = flagString(args, 'bundle');
|
|
31
|
+
const sessionId = flagString(args, 'session');
|
|
32
|
+
const maxTokens = flagNumber(args, 'max-tokens');
|
|
33
|
+
const fileSet = [...files];
|
|
34
|
+
if (since)
|
|
35
|
+
fileSet.push(...getChangedFiles(cwd, { since }));
|
|
36
|
+
if (staged)
|
|
37
|
+
fileSet.push(...getChangedFiles(cwd, { staged: true }));
|
|
38
|
+
const wantChunked = flagBool(args, 'chunk') || flagBool(args, 'chunked');
|
|
39
|
+
const outputDir = flagString(args, 'output-dir');
|
|
40
|
+
const sectionBudgetRaw = flagString(args, 'section-budget');
|
|
41
|
+
const sectionBudgets = {};
|
|
42
|
+
if (sectionBudgetRaw) {
|
|
43
|
+
for (const pair of sectionBudgetRaw.split(',')) {
|
|
44
|
+
const [k, v] = pair.split('=');
|
|
45
|
+
if (k && v && !Number.isNaN(Number(v)))
|
|
46
|
+
sectionBudgets[k.trim()] = Number(v);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const brief = await buildAgentBrief(inspection, {
|
|
50
|
+
...(task ? { task } : {}),
|
|
51
|
+
...(mode ? { mode } : {}),
|
|
52
|
+
files: [...new Set(fileSet)],
|
|
53
|
+
...(since ? { since } : {}),
|
|
54
|
+
staged,
|
|
55
|
+
...(bundleId ? { bundleId } : {}),
|
|
56
|
+
...(sessionId ? { sessionId } : {}),
|
|
57
|
+
...(maxTokens ? { maxTokens } : {}),
|
|
58
|
+
...(wantChunked ? { chunked: true } : {}),
|
|
59
|
+
...(Object.keys(sectionBudgets).length > 0 ? { sectionBudgets } : {}),
|
|
60
|
+
});
|
|
61
|
+
if (wantChunked) {
|
|
62
|
+
const dir = outputDir
|
|
63
|
+
? nodePath.isAbsolute(outputDir)
|
|
64
|
+
? outputDir
|
|
65
|
+
: nodePath.resolve(cwd, outputDir)
|
|
66
|
+
: null;
|
|
67
|
+
// Hashes for every section, used for cross-session delta detection.
|
|
68
|
+
const sectionHashes = {};
|
|
69
|
+
for (const c of brief.chunks ?? []) {
|
|
70
|
+
sectionHashes[c.sectionId] = createHash('sha256').update(c.body).digest('hex');
|
|
71
|
+
}
|
|
72
|
+
if (dir) {
|
|
73
|
+
mkdirSync(dir, { recursive: true });
|
|
74
|
+
for (const c of brief.chunks ?? []) {
|
|
75
|
+
writeFileSync(nodePath.join(dir, c.file), c.body, 'utf8');
|
|
76
|
+
}
|
|
77
|
+
writeFileSync(nodePath.join(dir, 'section-hashes.json'), JSON.stringify({ schema: 'sharkcraft.brief-section-hashes/v1', task: brief.task, sectionHashes }, null, 2) + '\n', 'utf8');
|
|
78
|
+
}
|
|
79
|
+
// Optional comparison against a previous brief chunk directory.
|
|
80
|
+
let compareReport = null;
|
|
81
|
+
const compareWith = flagString(args, 'compare-with');
|
|
82
|
+
if (compareWith) {
|
|
83
|
+
const otherAbs = nodePath.isAbsolute(compareWith)
|
|
84
|
+
? compareWith
|
|
85
|
+
: nodePath.resolve(cwd, compareWith);
|
|
86
|
+
compareReport = compareBriefDirs(brief.chunks ?? [], otherAbs);
|
|
87
|
+
}
|
|
88
|
+
if (flagBool(args, 'json')) {
|
|
89
|
+
process.stdout.write(asJson({ ...brief, outputDir: dir, sectionHashes, compare: compareReport }) + '\n');
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
if (dir) {
|
|
93
|
+
process.stdout.write(`Wrote ${brief.chunks?.length ?? 0} chunk(s) to ${dir}\n`);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
for (const c of brief.chunks ?? []) {
|
|
97
|
+
process.stdout.write(`\n--- ${c.file} (${c.tokenEstimate} toks) ---\n`);
|
|
98
|
+
process.stdout.write(c.body);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (compareReport) {
|
|
102
|
+
process.stdout.write(`\nCompare vs ${compareReport.otherDir}:\n` +
|
|
103
|
+
` unchanged=${compareReport.unchanged.length} changed=${compareReport.changed.length} new=${compareReport.added.length} removed=${compareReport.removed.length}\n`);
|
|
104
|
+
if (compareReport.changed.length > 0) {
|
|
105
|
+
process.stdout.write(' changed:\n');
|
|
106
|
+
for (const c of compareReport.changed.slice(0, 20))
|
|
107
|
+
process.stdout.write(` ~ ${c.sectionId} (${c.file})\n`);
|
|
108
|
+
}
|
|
109
|
+
if (compareReport.added.length > 0) {
|
|
110
|
+
process.stdout.write(' new:\n');
|
|
111
|
+
for (const c of compareReport.added.slice(0, 20))
|
|
112
|
+
process.stdout.write(` + ${c.sectionId} (${c.file})\n`);
|
|
113
|
+
}
|
|
114
|
+
if (compareReport.removed.length > 0) {
|
|
115
|
+
process.stdout.write(' removed:\n');
|
|
116
|
+
for (const c of compareReport.removed.slice(0, 20))
|
|
117
|
+
process.stdout.write(` - ${c.sectionId} (${c.file})\n`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return 0;
|
|
122
|
+
}
|
|
123
|
+
const output = flagString(args, 'output');
|
|
124
|
+
if (output) {
|
|
125
|
+
const abs = nodePath.isAbsolute(output) ? output : nodePath.resolve(cwd, output);
|
|
126
|
+
mkdirSync(nodePath.dirname(abs), { recursive: true });
|
|
127
|
+
writeFileSync(abs, brief.markdown, 'utf8');
|
|
128
|
+
// If --session was used and output went into the session dir, record the path.
|
|
129
|
+
if (sessionId) {
|
|
130
|
+
const load = scanDevSession(cwd, sessionId);
|
|
131
|
+
if (load?.state) {
|
|
132
|
+
const dir = load.dir;
|
|
133
|
+
if (abs.startsWith(dir + nodePath.sep)) {
|
|
134
|
+
const updated = setDevNextAction(load.state, load.state.nextAction);
|
|
135
|
+
// mutate session.json with brief path stored under nextAction-adjacent metadata via warnings is awkward;
|
|
136
|
+
// we just leave the path on disk.
|
|
137
|
+
writeDevSessionState(cwd, updated);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (flagBool(args, 'json')) {
|
|
142
|
+
process.stdout.write(asJson({ ...brief, outputPath: abs }) + '\n');
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
process.stdout.write(`Wrote ${abs}\n`);
|
|
146
|
+
}
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
if (flagBool(args, 'json')) {
|
|
150
|
+
process.stdout.write(asJson(brief) + '\n');
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
process.stdout.write(brief.markdown);
|
|
154
|
+
return 0;
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
function sectionIdFromFile(name) {
|
|
158
|
+
// Chunks are named NN-<sectionId>.md (e.g. 01-task.md). Strip the prefix.
|
|
159
|
+
const trimmed = name.replace(/\.md$/, '');
|
|
160
|
+
const m = /^\d+-(.+)$/.exec(trimmed);
|
|
161
|
+
return m ? m[1] : trimmed;
|
|
162
|
+
}
|
|
163
|
+
function compareBriefDirs(currentChunks, otherDir) {
|
|
164
|
+
const currentMap = new Map();
|
|
165
|
+
for (const c of currentChunks)
|
|
166
|
+
currentMap.set(c.sectionId, { file: c.file, body: c.body });
|
|
167
|
+
const otherMap = new Map();
|
|
168
|
+
if (existsSync(otherDir)) {
|
|
169
|
+
for (const f of readdirSync(otherDir)) {
|
|
170
|
+
if (!f.endsWith('.md'))
|
|
171
|
+
continue;
|
|
172
|
+
const full = nodePath.join(otherDir, f);
|
|
173
|
+
if (!statSync(full).isFile())
|
|
174
|
+
continue;
|
|
175
|
+
const id = sectionIdFromFile(f);
|
|
176
|
+
try {
|
|
177
|
+
otherMap.set(id, { file: f, body: readFileSync(full, 'utf8') });
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
/* skip */
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const unchanged = [];
|
|
185
|
+
const changed = [];
|
|
186
|
+
const added = [];
|
|
187
|
+
const removed = [];
|
|
188
|
+
for (const [id, cur] of currentMap) {
|
|
189
|
+
const other = otherMap.get(id);
|
|
190
|
+
if (!other) {
|
|
191
|
+
added.push({ sectionId: id, file: cur.file });
|
|
192
|
+
}
|
|
193
|
+
else if (other.body === cur.body) {
|
|
194
|
+
unchanged.push({ sectionId: id, file: cur.file });
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
changed.push({ sectionId: id, file: cur.file });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
for (const [id, other] of otherMap) {
|
|
201
|
+
if (!currentMap.has(id))
|
|
202
|
+
removed.push({ sectionId: id, file: other.file });
|
|
203
|
+
}
|
|
204
|
+
return { otherDir, unchanged, changed, added, removed };
|
|
205
|
+
}
|
|
206
|
+
void existsSync;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.command.d.ts","sourceRoot":"","sources":["../../src/commands/bundle.command.ts"],"names":[],"mappings":"AA0CA,OAAO,EAML,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AA+4BhC,eAAO,MAAM,aAAa,EAAE,eAkC3B,CAAC"}
|