@shrkcrft/cli 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +15 -0
- package/dist/asset-preview/apply-action-hint-stub.d.ts +28 -0
- package/dist/asset-preview/apply-action-hint-stub.d.ts.map +1 -0
- package/dist/asset-preview/apply-action-hint-stub.js +170 -0
- package/dist/asset-preview/apply-asset-preview.d.ts +31 -0
- package/dist/asset-preview/apply-asset-preview.d.ts.map +1 -0
- package/dist/asset-preview/apply-asset-preview.js +210 -0
- package/dist/asset-preview/apply-knowledge-stale-fix.d.ts +37 -0
- package/dist/asset-preview/apply-knowledge-stale-fix.d.ts.map +1 -0
- package/dist/asset-preview/apply-knowledge-stale-fix.js +344 -0
- package/dist/asset-preview/apply-missing-barrel.d.ts +15 -0
- package/dist/asset-preview/apply-missing-barrel.d.ts.map +1 -0
- package/dist/asset-preview/apply-missing-barrel.js +65 -0
- package/dist/asset-preview/apply-template-drift-fix.d.ts +21 -0
- package/dist/asset-preview/apply-template-drift-fix.d.ts.map +1 -0
- package/dist/asset-preview/apply-template-drift-fix.js +125 -0
- package/dist/asset-preview/apply-template-update.d.ts +43 -0
- package/dist/asset-preview/apply-template-update.d.ts.map +1 -0
- package/dist/asset-preview/apply-template-update.js +257 -0
- package/dist/asset-preview/entry-mutator.d.ts +106 -0
- package/dist/asset-preview/entry-mutator.d.ts.map +1 -0
- package/dist/asset-preview/entry-mutator.js +428 -0
- package/dist/authoring/authoring-kit.d.ts +36 -0
- package/dist/authoring/authoring-kit.d.ts.map +1 -0
- package/dist/authoring/authoring-kit.js +106 -0
- package/dist/command-registry.d.ts +158 -0
- package/dist/command-registry.d.ts.map +1 -0
- package/dist/command-registry.js +348 -0
- package/dist/commands/apply.command.d.ts +3 -0
- package/dist/commands/apply.command.d.ts.map +1 -0
- package/dist/commands/apply.command.js +879 -0
- package/dist/commands/architecture.command.d.ts +5 -0
- package/dist/commands/architecture.command.d.ts.map +1 -0
- package/dist/commands/architecture.command.js +141 -0
- package/dist/commands/ask.command.d.ts +3 -0
- package/dist/commands/ask.command.d.ts.map +1 -0
- package/dist/commands/ask.command.js +58 -0
- package/dist/commands/audit.command.d.ts +3 -0
- package/dist/commands/audit.command.d.ts.map +1 -0
- package/dist/commands/audit.command.js +141 -0
- package/dist/commands/biome.command.d.ts +7 -0
- package/dist/commands/biome.command.d.ts.map +1 -0
- package/dist/commands/biome.command.js +350 -0
- package/dist/commands/boundaries.command.d.ts +9 -0
- package/dist/commands/boundaries.command.d.ts.map +1 -0
- package/dist/commands/boundaries.command.js +314 -0
- package/dist/commands/brief.command.d.ts +3 -0
- package/dist/commands/brief.command.d.ts.map +1 -0
- package/dist/commands/brief.command.js +206 -0
- package/dist/commands/bundle.command.d.ts +3 -0
- package/dist/commands/bundle.command.d.ts.map +1 -0
- package/dist/commands/bundle.command.js +1183 -0
- package/dist/commands/changes.command.d.ts +3 -0
- package/dist/commands/changes.command.d.ts.map +1 -0
- package/dist/commands/changes.command.js +155 -0
- package/dist/commands/check.command.d.ts +3 -0
- package/dist/commands/check.command.d.ts.map +1 -0
- package/dist/commands/check.command.js +553 -0
- package/dist/commands/checks.command.d.ts +29 -0
- package/dist/commands/checks.command.d.ts.map +1 -0
- package/dist/commands/checks.command.js +521 -0
- package/dist/commands/ci.command.d.ts +3 -0
- package/dist/commands/ci.command.d.ts.map +1 -0
- package/dist/commands/ci.command.js +680 -0
- package/dist/commands/codemod.command.d.ts +3 -0
- package/dist/commands/codemod.command.d.ts.map +1 -0
- package/dist/commands/codemod.command.js +130 -0
- package/dist/commands/command-catalog.d.ts +265 -0
- package/dist/commands/command-catalog.d.ts.map +1 -0
- package/dist/commands/command-catalog.js +3242 -0
- package/dist/commands/commands.command.d.ts +92 -0
- package/dist/commands/commands.command.d.ts.map +1 -0
- package/dist/commands/commands.command.js +1208 -0
- package/dist/commands/constructs.command.d.ts +15 -0
- package/dist/commands/constructs.command.d.ts.map +1 -0
- package/dist/commands/constructs.command.js +669 -0
- package/dist/commands/context.command.d.ts +3 -0
- package/dist/commands/context.command.d.ts.map +1 -0
- package/dist/commands/context.command.js +120 -0
- package/dist/commands/contract-gate.command.d.ts +5 -0
- package/dist/commands/contract-gate.command.d.ts.map +1 -0
- package/dist/commands/contract-gate.command.js +208 -0
- package/dist/commands/contract-templates.command.d.ts +8 -0
- package/dist/commands/contract-templates.command.d.ts.map +1 -0
- package/dist/commands/contract-templates.command.js +151 -0
- package/dist/commands/contract.command.d.ts +3 -0
- package/dist/commands/contract.command.d.ts.map +1 -0
- package/dist/commands/contract.command.js +105 -0
- package/dist/commands/conventions.command.d.ts +8 -0
- package/dist/commands/conventions.command.d.ts.map +1 -0
- package/dist/commands/conventions.command.js +169 -0
- package/dist/commands/coverage.command.d.ts +3 -0
- package/dist/commands/coverage.command.d.ts.map +1 -0
- package/dist/commands/coverage.command.js +56 -0
- package/dist/commands/daily.commands.d.ts +5 -0
- package/dist/commands/daily.commands.d.ts.map +1 -0
- package/dist/commands/daily.commands.js +224 -0
- package/dist/commands/dashboard-export.command.d.ts +4 -0
- package/dist/commands/dashboard-export.command.d.ts.map +1 -0
- package/dist/commands/dashboard-export.command.js +86 -0
- package/dist/commands/dashboard.command.d.ts +3 -0
- package/dist/commands/dashboard.command.d.ts.map +1 -0
- package/dist/commands/dashboard.command.js +106 -0
- package/dist/commands/dev.command.d.ts +3 -0
- package/dist/commands/dev.command.d.ts.map +1 -0
- package/dist/commands/dev.command.js +1392 -0
- package/dist/commands/diagnostics.command.d.ts +5 -0
- package/dist/commands/diagnostics.command.d.ts.map +1 -0
- package/dist/commands/diagnostics.command.js +97 -0
- package/dist/commands/docs.command.d.ts +4 -0
- package/dist/commands/docs.command.d.ts.map +1 -0
- package/dist/commands/docs.command.js +34 -0
- package/dist/commands/doctor.command.d.ts +7 -0
- package/dist/commands/doctor.command.d.ts.map +1 -0
- package/dist/commands/doctor.command.js +681 -0
- package/dist/commands/drift.command.d.ts +3 -0
- package/dist/commands/drift.command.d.ts.map +1 -0
- package/dist/commands/drift.command.js +124 -0
- package/dist/commands/eslint.command.d.ts +7 -0
- package/dist/commands/eslint.command.d.ts.map +1 -0
- package/dist/commands/eslint.command.js +423 -0
- package/dist/commands/explore.command.d.ts +3 -0
- package/dist/commands/explore.command.d.ts.map +1 -0
- package/dist/commands/explore.command.js +65 -0
- package/dist/commands/export-bundle.command.d.ts +6 -0
- package/dist/commands/export-bundle.command.d.ts.map +1 -0
- package/dist/commands/export-bundle.command.js +96 -0
- package/dist/commands/export.command.d.ts +3 -0
- package/dist/commands/export.command.d.ts.map +1 -0
- package/dist/commands/export.command.js +83 -0
- package/dist/commands/feedback-dispatch.command.d.ts +12 -0
- package/dist/commands/feedback-dispatch.command.d.ts.map +1 -0
- package/dist/commands/feedback-dispatch.command.js +63 -0
- package/dist/commands/feedback.command.d.ts +11 -0
- package/dist/commands/feedback.command.d.ts.map +1 -0
- package/dist/commands/feedback.command.js +336 -0
- package/dist/commands/fix.command.d.ts +3 -0
- package/dist/commands/fix.command.d.ts.map +1 -0
- package/dist/commands/fix.command.js +776 -0
- package/dist/commands/gen.command.d.ts +3 -0
- package/dist/commands/gen.command.d.ts.map +1 -0
- package/dist/commands/gen.command.js +136 -0
- package/dist/commands/git.command.d.ts +6 -0
- package/dist/commands/git.command.d.ts.map +1 -0
- package/dist/commands/git.command.js +81 -0
- package/dist/commands/graph.command.d.ts +3 -0
- package/dist/commands/graph.command.d.ts.map +1 -0
- package/dist/commands/graph.command.js +287 -0
- package/dist/commands/grounding.command.d.ts +7 -0
- package/dist/commands/grounding.command.d.ts.map +1 -0
- package/dist/commands/grounding.command.js +54 -0
- package/dist/commands/help.command.d.ts +20 -0
- package/dist/commands/help.command.d.ts.map +1 -0
- package/dist/commands/help.command.js +127 -0
- package/dist/commands/helper.command.d.ts +6 -0
- package/dist/commands/helper.command.d.ts.map +1 -0
- package/dist/commands/helper.command.js +170 -0
- package/dist/commands/ide.command.d.ts +6 -0
- package/dist/commands/ide.command.d.ts.map +1 -0
- package/dist/commands/ide.command.js +340 -0
- package/dist/commands/impact.command.d.ts +3 -0
- package/dist/commands/impact.command.d.ts.map +1 -0
- package/dist/commands/impact.command.js +819 -0
- package/dist/commands/import.command.d.ts +3 -0
- package/dist/commands/import.command.d.ts.map +1 -0
- package/dist/commands/import.command.js +115 -0
- package/dist/commands/infer.command.d.ts +3 -0
- package/dist/commands/infer.command.d.ts.map +1 -0
- package/dist/commands/infer.command.js +227 -0
- package/dist/commands/ingest.command.d.ts +6 -0
- package/dist/commands/ingest.command.d.ts.map +1 -0
- package/dist/commands/ingest.command.js +532 -0
- package/dist/commands/init.command.d.ts +3 -0
- package/dist/commands/init.command.d.ts.map +1 -0
- package/dist/commands/init.command.js +301 -0
- package/dist/commands/inspect.command.d.ts +3 -0
- package/dist/commands/inspect.command.d.ts.map +1 -0
- package/dist/commands/inspect.command.js +122 -0
- package/dist/commands/knowledge-author.command.d.ts +22 -0
- package/dist/commands/knowledge-author.command.d.ts.map +1 -0
- package/dist/commands/knowledge-author.command.js +366 -0
- package/dist/commands/knowledge-propose.command.d.ts +3 -0
- package/dist/commands/knowledge-propose.command.d.ts.map +1 -0
- package/dist/commands/knowledge-propose.command.js +125 -0
- package/dist/commands/knowledge.command.d.ts +18 -0
- package/dist/commands/knowledge.command.d.ts.map +1 -0
- package/dist/commands/knowledge.command.js +538 -0
- package/dist/commands/languages.command.d.ts +3 -0
- package/dist/commands/languages.command.d.ts.map +1 -0
- package/dist/commands/languages.command.js +300 -0
- package/dist/commands/lint.command.d.ts +15 -0
- package/dist/commands/lint.command.d.ts.map +1 -0
- package/dist/commands/lint.command.js +194 -0
- package/dist/commands/mcp.command.d.ts +3 -0
- package/dist/commands/mcp.command.d.ts.map +1 -0
- package/dist/commands/mcp.command.js +74 -0
- package/dist/commands/memory.command.d.ts +11 -0
- package/dist/commands/memory.command.d.ts.map +1 -0
- package/dist/commands/memory.command.js +264 -0
- package/dist/commands/onboard.command.d.ts +3 -0
- package/dist/commands/onboard.command.d.ts.map +1 -0
- package/dist/commands/onboard.command.js +650 -0
- package/dist/commands/orchestrate.command.d.ts +3 -0
- package/dist/commands/orchestrate.command.d.ts.map +1 -0
- package/dist/commands/orchestrate.command.js +49 -0
- package/dist/commands/owners.command.d.ts +5 -0
- package/dist/commands/owners.command.d.ts.map +1 -0
- package/dist/commands/owners.command.js +113 -0
- package/dist/commands/ownership.command.d.ts +5 -0
- package/dist/commands/ownership.command.d.ts.map +1 -0
- package/dist/commands/ownership.command.js +117 -0
- package/dist/commands/pack-author.command.d.ts +30 -0
- package/dist/commands/pack-author.command.d.ts.map +1 -0
- package/dist/commands/pack-author.command.js +242 -0
- package/dist/commands/packs-new.d.ts +27 -0
- package/dist/commands/packs-new.d.ts.map +1 -0
- package/dist/commands/packs-new.js +805 -0
- package/dist/commands/packs.command.d.ts +15 -0
- package/dist/commands/packs.command.d.ts.map +1 -0
- package/dist/commands/packs.command.js +958 -0
- package/dist/commands/paths.command.d.ts +6 -0
- package/dist/commands/paths.command.d.ts.map +1 -0
- package/dist/commands/paths.command.js +97 -0
- package/dist/commands/pipelines.command.d.ts +9 -0
- package/dist/commands/pipelines.command.d.ts.map +1 -0
- package/dist/commands/pipelines.command.js +308 -0
- package/dist/commands/plan-check.command.d.ts +27 -0
- package/dist/commands/plan-check.command.d.ts.map +1 -0
- package/dist/commands/plan-check.command.js +150 -0
- package/dist/commands/plan-simulate.command.d.ts +3 -0
- package/dist/commands/plan-simulate.command.d.ts.map +1 -0
- package/dist/commands/plan-simulate.command.js +60 -0
- package/dist/commands/plan.command.d.ts +8 -0
- package/dist/commands/plan.command.d.ts.map +1 -0
- package/dist/commands/plan.command.js +139 -0
- package/dist/commands/playbooks.command.d.ts +10 -0
- package/dist/commands/playbooks.command.d.ts.map +1 -0
- package/dist/commands/playbooks.command.js +296 -0
- package/dist/commands/plugin.command.d.ts +11 -0
- package/dist/commands/plugin.command.d.ts.map +1 -0
- package/dist/commands/plugin.command.js +394 -0
- package/dist/commands/policy.command.d.ts +8 -0
- package/dist/commands/policy.command.d.ts.map +1 -0
- package/dist/commands/policy.command.js +451 -0
- package/dist/commands/pr.command.d.ts +3 -0
- package/dist/commands/pr.command.d.ts.map +1 -0
- package/dist/commands/pr.command.js +132 -0
- package/dist/commands/preflight.command.d.ts +3 -0
- package/dist/commands/preflight.command.d.ts.map +1 -0
- package/dist/commands/preflight.command.js +102 -0
- package/dist/commands/presets.command.d.ts +17 -0
- package/dist/commands/presets.command.d.ts.map +1 -0
- package/dist/commands/presets.command.js +647 -0
- package/dist/commands/profiles.command.d.ts +7 -0
- package/dist/commands/profiles.command.d.ts.map +1 -0
- package/dist/commands/profiles.command.js +151 -0
- package/dist/commands/provenance.command.d.ts +26 -0
- package/dist/commands/provenance.command.d.ts.map +1 -0
- package/dist/commands/provenance.command.js +237 -0
- package/dist/commands/quality.command.d.ts +5 -0
- package/dist/commands/quality.command.d.ts.map +1 -0
- package/dist/commands/quality.command.js +69 -0
- package/dist/commands/recommend.command.d.ts +4 -0
- package/dist/commands/recommend.command.d.ts.map +1 -0
- package/dist/commands/recommend.command.js +270 -0
- package/dist/commands/registrations.command.d.ts +3 -0
- package/dist/commands/registrations.command.d.ts.map +1 -0
- package/dist/commands/registrations.command.js +300 -0
- package/dist/commands/registry.command.d.ts +4 -0
- package/dist/commands/registry.command.d.ts.map +1 -0
- package/dist/commands/registry.command.js +37 -0
- package/dist/commands/release.command.d.ts +4 -0
- package/dist/commands/release.command.d.ts.map +1 -0
- package/dist/commands/release.command.js +639 -0
- package/dist/commands/repo.command.d.ts +3 -0
- package/dist/commands/repo.command.d.ts.map +1 -0
- package/dist/commands/repo.command.js +24 -0
- package/dist/commands/report.command.d.ts +3 -0
- package/dist/commands/report.command.d.ts.map +1 -0
- package/dist/commands/report.command.js +511 -0
- package/dist/commands/reposet.command.d.ts +6 -0
- package/dist/commands/reposet.command.d.ts.map +1 -0
- package/dist/commands/reposet.command.js +120 -0
- package/dist/commands/review.command.d.ts +3 -0
- package/dist/commands/review.command.d.ts.map +1 -0
- package/dist/commands/review.command.js +354 -0
- package/dist/commands/risk.command.d.ts +3 -0
- package/dist/commands/risk.command.d.ts.map +1 -0
- package/dist/commands/risk.command.js +56 -0
- package/dist/commands/rounds.command.d.ts +8 -0
- package/dist/commands/rounds.command.d.ts.map +1 -0
- package/dist/commands/rounds.command.js +180 -0
- package/dist/commands/rules.command.d.ts +49 -0
- package/dist/commands/rules.command.d.ts.map +1 -0
- package/dist/commands/rules.command.js +435 -0
- package/dist/commands/runtime.command.d.ts +3 -0
- package/dist/commands/runtime.command.d.ts.map +1 -0
- package/dist/commands/runtime.command.js +56 -0
- package/dist/commands/safety.command.d.ts +3 -0
- package/dist/commands/safety.command.d.ts.map +1 -0
- package/dist/commands/safety.command.js +117 -0
- package/dist/commands/scaffolds.command.d.ts +5 -0
- package/dist/commands/scaffolds.command.d.ts.map +1 -0
- package/dist/commands/scaffolds.command.js +122 -0
- package/dist/commands/schemas.command.d.ts +21 -0
- package/dist/commands/schemas.command.d.ts.map +1 -0
- package/dist/commands/schemas.command.js +296 -0
- package/dist/commands/search.command.d.ts +12 -0
- package/dist/commands/search.command.d.ts.map +1 -0
- package/dist/commands/search.command.js +275 -0
- package/dist/commands/self-config.command.d.ts +7 -0
- package/dist/commands/self-config.command.d.ts.map +1 -0
- package/dist/commands/self-config.command.js +156 -0
- package/dist/commands/self.command.d.ts +3 -0
- package/dist/commands/self.command.d.ts.map +1 -0
- package/dist/commands/self.command.js +117 -0
- package/dist/commands/simulate.command.d.ts +3 -0
- package/dist/commands/simulate.command.d.ts.map +1 -0
- package/dist/commands/simulate.command.js +54 -0
- package/dist/commands/spec.command.d.ts +29 -0
- package/dist/commands/spec.command.d.ts.map +1 -0
- package/dist/commands/spec.command.js +985 -0
- package/dist/commands/start-here.command.d.ts +3 -0
- package/dist/commands/start-here.command.d.ts.map +1 -0
- package/dist/commands/start-here.command.js +35 -0
- package/dist/commands/stats.command.d.ts +3 -0
- package/dist/commands/stats.command.d.ts.map +1 -0
- package/dist/commands/stats.command.js +88 -0
- package/dist/commands/surface.command.d.ts +15 -0
- package/dist/commands/surface.command.d.ts.map +1 -0
- package/dist/commands/surface.command.js +328 -0
- package/dist/commands/task-context.command.d.ts +7 -0
- package/dist/commands/task-context.command.d.ts.map +1 -0
- package/dist/commands/task-context.command.js +646 -0
- package/dist/commands/task.command.d.ts +3 -0
- package/dist/commands/task.command.d.ts.map +1 -0
- package/dist/commands/task.command.js +301 -0
- package/dist/commands/template-quality.command.d.ts +5 -0
- package/dist/commands/template-quality.command.d.ts.map +1 -0
- package/dist/commands/template-quality.command.js +128 -0
- package/dist/commands/templates.command.d.ts +26 -0
- package/dist/commands/templates.command.d.ts.map +1 -0
- package/dist/commands/templates.command.js +964 -0
- package/dist/commands/test.command.d.ts +3 -0
- package/dist/commands/test.command.d.ts.map +1 -0
- package/dist/commands/test.command.js +262 -0
- package/dist/commands/tests.command.d.ts +5 -0
- package/dist/commands/tests.command.d.ts.map +1 -0
- package/dist/commands/tests.command.js +97 -0
- package/dist/commands/trace.command.d.ts +3 -0
- package/dist/commands/trace.command.d.ts.map +1 -0
- package/dist/commands/trace.command.js +121 -0
- package/dist/commands/upgrade.command.d.ts +4 -0
- package/dist/commands/upgrade.command.d.ts.map +1 -0
- package/dist/commands/upgrade.command.js +43 -0
- package/dist/commands/version.command.d.ts +3 -0
- package/dist/commands/version.command.d.ts.map +1 -0
- package/dist/commands/version.command.js +10 -0
- package/dist/commands/why.command.d.ts +24 -0
- package/dist/commands/why.command.d.ts.map +1 -0
- package/dist/commands/why.command.js +119 -0
- package/dist/dashboard/dashboard-api-server.d.ts +21 -0
- package/dist/dashboard/dashboard-api-server.d.ts.map +1 -0
- package/dist/dashboard/dashboard-api-server.js +410 -0
- package/dist/dashboard/live-session-server.d.ts +18 -0
- package/dist/dashboard/live-session-server.d.ts.map +1 -0
- package/dist/dashboard/live-session-server.js +133 -0
- package/dist/diff/collect-changed-paths.d.ts +27 -0
- package/dist/diff/collect-changed-paths.d.ts.map +1 -0
- package/dist/diff/collect-changed-paths.js +68 -0
- package/dist/doctor/doctor-tags.d.ts +63 -0
- package/dist/doctor/doctor-tags.d.ts.map +1 -0
- package/dist/doctor/doctor-tags.js +146 -0
- package/dist/export/export-formats.d.ts +22 -0
- package/dist/export/export-formats.d.ts.map +1 -0
- package/dist/export/export-formats.js +135 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/init/detected-block.d.ts +57 -0
- package/dist/init/detected-block.d.ts.map +1 -0
- package/dist/init/detected-block.js +197 -0
- package/dist/init/gitignore.d.ts +30 -0
- package/dist/init/gitignore.d.ts.map +1 -0
- package/dist/init/gitignore.js +110 -0
- package/dist/init/init-templates.d.ts +6 -0
- package/dist/init/init-templates.d.ts.map +1 -0
- package/dist/init/init-templates.js +413 -0
- package/dist/main.d.ts +18 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +699 -0
- package/dist/output/failure-hints.d.ts +55 -0
- package/dist/output/failure-hints.d.ts.map +1 -0
- package/dist/output/failure-hints.js +159 -0
- package/dist/output/format-output.d.ts +9 -0
- package/dist/output/format-output.d.ts.map +1 -0
- package/dist/output/format-output.js +26 -0
- package/dist/output/print-error.d.ts +3 -0
- package/dist/output/print-error.d.ts.map +1 -0
- package/dist/output/print-error.js +14 -0
- package/dist/output/watch-loop.d.ts +37 -0
- package/dist/output/watch-loop.d.ts.map +1 -0
- package/dist/output/watch-loop.js +115 -0
- package/dist/schemas/json-schemas.d.ts +1630 -0
- package/dist/schemas/json-schemas.d.ts.map +1 -0
- package/dist/schemas/json-schemas.js +811 -0
- package/dist/surface/about.d.ts +10 -0
- package/dist/surface/about.d.ts.map +1 -0
- package/dist/surface/about.js +53 -0
- package/dist/surface/load-surface-context.d.ts +34 -0
- package/dist/surface/load-surface-context.d.ts.map +1 -0
- package/dist/surface/load-surface-context.js +100 -0
- package/dist/surface/no-args-landing.d.ts +7 -0
- package/dist/surface/no-args-landing.d.ts.map +1 -0
- package/dist/surface/no-args-landing.js +36 -0
- package/dist/surface/not-enabled-error.d.ts +24 -0
- package/dist/surface/not-enabled-error.d.ts.map +1 -0
- package/dist/surface/not-enabled-error.js +36 -0
- package/dist/surface/profiles.d.ts +37 -0
- package/dist/surface/profiles.d.ts.map +1 -0
- package/dist/surface/profiles.js +151 -0
- package/dist/surface/shape-defaults.d.ts +21 -0
- package/dist/surface/shape-defaults.d.ts.map +1 -0
- package/dist/surface/shape-defaults.js +50 -0
- package/dist/surface/spine-extractor.d.ts +38 -0
- package/dist/surface/spine-extractor.d.ts.map +1 -0
- package/dist/surface/spine-extractor.js +100 -0
- package/dist/surface/surface-config-writer.d.ts +59 -0
- package/dist/surface/surface-config-writer.d.ts.map +1 -0
- package/dist/surface/surface-config-writer.js +135 -0
- package/dist/surface/surface-summary.d.ts +66 -0
- package/dist/surface/surface-summary.d.ts.map +1 -0
- package/dist/surface/surface-summary.js +162 -0
- package/dist/surface/tier.d.ts +100 -0
- package/dist/surface/tier.d.ts.map +1 -0
- package/dist/surface/tier.js +172 -0
- package/dist/task-next/apply-batch-runner.d.ts +42 -0
- package/dist/task-next/apply-batch-runner.d.ts.map +1 -0
- package/dist/task-next/apply-batch-runner.js +192 -0
- package/dist/task-next/task-next-ranker.d.ts +75 -0
- package/dist/task-next/task-next-ranker.d.ts.map +1 -0
- package/dist/task-next/task-next-ranker.js +179 -0
- package/dist/usage/usage-log.d.ts +54 -0
- package/dist/usage/usage-log.d.ts.map +1 -0
- package/dist/usage/usage-log.js +105 -0
- package/dist/validation/run-validation-loop.d.ts +38 -0
- package/dist/validation/run-validation-loop.d.ts.map +1 -0
- package/dist/validation/run-validation-loop.js +100 -0
- package/package.json +73 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.command.d.ts","sourceRoot":"","sources":["../../src/commands/drift.command.ts"],"names":[],"mappings":"AAUA,OAAO,EAKL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAOhC,eAAO,MAAM,YAAY,EAAE,eA4E1B,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { buildDriftReport, classifyChangedScope, classifyRuleDrift, inspectSharkcraft, resolveChangedFiles, RuleEnforcementState, summariseChangedScope, } from '@shrkcrft/inspector';
|
|
2
|
+
import { flagBool, flagString, flagList, resolveCwd, } from "../command-registry.js";
|
|
3
|
+
import { asJson, header, kv } from "../output/format-output.js";
|
|
4
|
+
// `drift baseline {create|compare|update}` removed.
|
|
5
|
+
// The baseline machinery was hidden / unused; `drift rules` and the
|
|
6
|
+
// core `drift` report cover the actionable cases.
|
|
7
|
+
export const driftCommand = {
|
|
8
|
+
name: 'drift',
|
|
9
|
+
description: 'Detect architecture drift: boundary violations, broken preset references, pipeline/template links, missing pack assets. Also: `shrk drift rules` — classify each rule as ENFORCED/PARTIAL/MANUAL/ASPIRATIONAL/STALE.',
|
|
10
|
+
usage: 'shrk [--cwd <dir>] drift [--skip-boundaries] [--json] | shrk drift rules [--strict] [--json]',
|
|
11
|
+
async run(args) {
|
|
12
|
+
if (args.positional[0] === 'rules') {
|
|
13
|
+
const sub = { ...args, positional: args.positional.slice(1) };
|
|
14
|
+
return runDriftRules(sub);
|
|
15
|
+
}
|
|
16
|
+
const cwd = resolveCwd(args);
|
|
17
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
18
|
+
const report = buildDriftReport(inspection, {
|
|
19
|
+
runBoundaries: !flagBool(args, 'skip-boundaries'),
|
|
20
|
+
});
|
|
21
|
+
const changedOnly = flagBool(args, 'changed-only');
|
|
22
|
+
const since = flagString(args, 'since');
|
|
23
|
+
const staged = flagBool(args, 'staged');
|
|
24
|
+
const files = flagList(args, 'files');
|
|
25
|
+
const changedScopeOpts = changedOnly || since || staged || files.length > 0
|
|
26
|
+
? {
|
|
27
|
+
projectRoot: cwd,
|
|
28
|
+
...(since ? { since } : {}),
|
|
29
|
+
...(staged ? { staged: true } : {}),
|
|
30
|
+
...(files.length > 0 ? { files } : {}),
|
|
31
|
+
includeWorktree: changedOnly || !since,
|
|
32
|
+
}
|
|
33
|
+
: null;
|
|
34
|
+
const classification = changedScopeOpts
|
|
35
|
+
? (() => {
|
|
36
|
+
const resolved = resolveChangedFiles(changedScopeOpts);
|
|
37
|
+
return classifyChangedScope({
|
|
38
|
+
projectRoot: cwd,
|
|
39
|
+
current: report.findings.map((f) => {
|
|
40
|
+
const file = f.evidence?.file;
|
|
41
|
+
return {
|
|
42
|
+
key: `${f.category}:${f.message}:${file ?? ''}`,
|
|
43
|
+
code: f.category,
|
|
44
|
+
severity: f.severity,
|
|
45
|
+
message: f.message,
|
|
46
|
+
...(file ? { file } : {}),
|
|
47
|
+
};
|
|
48
|
+
}),
|
|
49
|
+
changedFiles: resolved.files,
|
|
50
|
+
});
|
|
51
|
+
})()
|
|
52
|
+
: null;
|
|
53
|
+
if (flagBool(args, 'json')) {
|
|
54
|
+
process.stdout.write(asJson({ ...report, ...(classification ? { changedScope: classification } : {}) }) + '\n');
|
|
55
|
+
return report.counts.error > 0 ? 1 : 0;
|
|
56
|
+
}
|
|
57
|
+
process.stdout.write(header('Drift report'));
|
|
58
|
+
process.stdout.write(kv('totals', `${report.counts.error} errors, ${report.counts.warning} warnings, ${report.counts.info} info`) + '\n\n');
|
|
59
|
+
if (classification) {
|
|
60
|
+
process.stdout.write(`changed-scope: ${summariseChangedScope(classification)}\n\n`);
|
|
61
|
+
}
|
|
62
|
+
if (report.findings.length === 0) {
|
|
63
|
+
process.stdout.write('No drift detected.\n');
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
66
|
+
for (const f of report.findings) {
|
|
67
|
+
const tag = f.severity.toUpperCase().padEnd(8);
|
|
68
|
+
process.stdout.write(` ${tag} ${f.category.padEnd(22)} ${f.message}\n`);
|
|
69
|
+
if (f.suggestedFix)
|
|
70
|
+
process.stdout.write(` ↳ ${f.suggestedFix}\n`);
|
|
71
|
+
}
|
|
72
|
+
return report.counts.error > 0 ? 1 : 0;
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* `shrk drift rules`. Classifies every rule into ENFORCED /
|
|
77
|
+
* PARTIALLY_ENFORCED / MANUAL_ONLY / ASPIRATIONAL / STALE / UNKNOWN so a
|
|
78
|
+
* maintainer can see whether the rule system is real or ceremonial.
|
|
79
|
+
*
|
|
80
|
+
* `--strict` fails when ASPIRATIONAL or STALE rules exist.
|
|
81
|
+
* `--json` emits the structured report.
|
|
82
|
+
*/
|
|
83
|
+
async function runDriftRules(args) {
|
|
84
|
+
const cwd = resolveCwd(args);
|
|
85
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
86
|
+
const report = classifyRuleDrift(inspection);
|
|
87
|
+
const strict = flagBool(args, 'strict');
|
|
88
|
+
if (flagBool(args, 'json')) {
|
|
89
|
+
process.stdout.write(asJson(report) + '\n');
|
|
90
|
+
return strict &&
|
|
91
|
+
(report.summary[RuleEnforcementState.Aspirational] > 0 ||
|
|
92
|
+
report.summary[RuleEnforcementState.Stale] > 0)
|
|
93
|
+
? 1
|
|
94
|
+
: 0;
|
|
95
|
+
}
|
|
96
|
+
process.stdout.write(header('Rule enforcement drift'));
|
|
97
|
+
process.stdout.write(kv('totals', Object.entries(report.summary)
|
|
98
|
+
.filter(([, n]) => n > 0)
|
|
99
|
+
.map(([k, n]) => `${k}: ${n}`)
|
|
100
|
+
.join(', ') || 'no rules') + '\n\n');
|
|
101
|
+
if (report.entries.length === 0) {
|
|
102
|
+
process.stdout.write('No rules registered.\n');
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
for (const e of report.entries) {
|
|
106
|
+
const tag = e.state.toUpperCase().padEnd(20);
|
|
107
|
+
const src = e.source.type === 'pack' ? `[${e.source.packageName ?? 'pack'}]` : '[local]';
|
|
108
|
+
process.stdout.write(` ${tag} ${e.id.padEnd(36)} ${src} — ${e.reason}\n`);
|
|
109
|
+
}
|
|
110
|
+
if (report.nextCommands.length > 0) {
|
|
111
|
+
process.stdout.write('\nNext:\n');
|
|
112
|
+
for (const c of report.nextCommands)
|
|
113
|
+
process.stdout.write(` ${c}\n`);
|
|
114
|
+
}
|
|
115
|
+
if (strict) {
|
|
116
|
+
const failing = report.summary[RuleEnforcementState.Aspirational] +
|
|
117
|
+
report.summary[RuleEnforcementState.Stale];
|
|
118
|
+
if (failing > 0) {
|
|
119
|
+
process.stdout.write(`\nStrict mode: failing because ${failing} rule(s) are aspirational or stale.\n`);
|
|
120
|
+
return 1;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ICommandHandler } from '../command-registry.js';
|
|
2
|
+
export declare const eslintScaffoldCommand: ICommandHandler;
|
|
3
|
+
export declare const eslintReportCommand: ICommandHandler;
|
|
4
|
+
export declare const eslintRulesCommand: ICommandHandler;
|
|
5
|
+
export declare const eslintExplainLimitationsCommand: ICommandHandler;
|
|
6
|
+
export declare const eslintCommand: ICommandHandler;
|
|
7
|
+
//# sourceMappingURL=eslint.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint.command.d.ts","sourceRoot":"","sources":["../../src/commands/eslint.command.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AA2DhC,eAAO,MAAM,qBAAqB,EAAE,eA8DnC,CAAC;AAiCF,eAAO,MAAM,mBAAmB,EAAE,eAiFjC,CAAC;AAgFF,eAAO,MAAM,kBAAkB,EAAE,eAsDhC,CAAC;AAkCF,eAAO,MAAM,+BAA+B,EAAE,eAyC7C,CAAC;AAmBF,eAAO,MAAM,aAAa,EAAE,eAuC3B,CAAC"}
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import * as nodePath from 'node:path';
|
|
3
|
+
import { inspectSharkcraft } from '@shrkcrft/inspector';
|
|
4
|
+
import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
|
|
5
|
+
import { asJson, bullet, header } from "../output/format-output.js";
|
|
6
|
+
/**
|
|
7
|
+
* ESLint bridge. NOT a full ESLint plugin: a thin adapter that
|
|
8
|
+
* (a) scaffolds a minimal flat-config snippet for repos that want to
|
|
9
|
+
* keep their existing ESLint setup but co-exist cleanly with
|
|
10
|
+
* SharkCraft (mainly: don't lint the generated paths SharkCraft
|
|
11
|
+
* tracks);
|
|
12
|
+
* (b) re-emits `shrk check boundaries` JSON in the ESLint result format
|
|
13
|
+
* so ESLint-result-consuming tooling (annotators, reviewdog,
|
|
14
|
+
* etc.) can surface SharkCraft boundary violations on PRs without
|
|
15
|
+
* adopting the SharkCraft CLI directly.
|
|
16
|
+
*
|
|
17
|
+
* Both subcommands default to dry-run. The scaffold is intentionally
|
|
18
|
+
* small — the goal is integration, not opinion imposition.
|
|
19
|
+
*/
|
|
20
|
+
const SCAFFOLD_BANNER = "// Generated by `shrk eslint scaffold`. Edit freely — re-running with --force overwrites.";
|
|
21
|
+
const SCAFFOLD_DEFAULT_RELPATH = 'eslint.sharkcraft.config.mjs';
|
|
22
|
+
function renderEslintFlatConfigSnippet(generatedPathGlobs, paths) {
|
|
23
|
+
const globs = generatedPathGlobs.length
|
|
24
|
+
? generatedPathGlobs.map((g) => ` '${g}',`).join('\n')
|
|
25
|
+
: " // No generated paths declared in sharkcraft/paths.ts — add globs here as you adopt SharkCraft path conventions.";
|
|
26
|
+
const pathDocs = paths.length
|
|
27
|
+
? paths.map((p) => `// - ${p.id}${p.description ? ` — ${p.description}` : ''}`).join('\n')
|
|
28
|
+
: '// (no SharkCraft path conventions declared yet — run `shrk paths list` after `shrk init --zero-config`)';
|
|
29
|
+
return `${SCAFFOLD_BANNER}
|
|
30
|
+
//
|
|
31
|
+
// This file is a starter snippet — import or merge it from your top-level
|
|
32
|
+
// eslint.config.mjs. It does NOT replace your existing rules. It adds:
|
|
33
|
+
// - "ignores" for paths SharkCraft tracks as generated.
|
|
34
|
+
// - a comment block linking to the SharkCraft boundary check, which
|
|
35
|
+
// enforces cross-layer / cross-package discipline that ESLint cannot
|
|
36
|
+
// express.
|
|
37
|
+
//
|
|
38
|
+
// Known SharkCraft path conventions:
|
|
39
|
+
${pathDocs}
|
|
40
|
+
//
|
|
41
|
+
// For cross-layer boundary enforcement run:
|
|
42
|
+
// $ shrk check boundaries --changed-only --json
|
|
43
|
+
//
|
|
44
|
+
export default [
|
|
45
|
+
{
|
|
46
|
+
ignores: [
|
|
47
|
+
${globs}
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
export const eslintScaffoldCommand = {
|
|
54
|
+
name: 'scaffold',
|
|
55
|
+
description: 'Scaffold a minimal ESLint flat-config snippet that co-exists with SharkCraft (ignores generated paths + links to `shrk check boundaries`). Dry-run by default; `--write` persists.',
|
|
56
|
+
usage: 'shrk eslint scaffold [--output <path>] [--preset auto] [--write] [--force] [--json]',
|
|
57
|
+
async run(args) {
|
|
58
|
+
const cwd = resolveCwd(args);
|
|
59
|
+
const presetMode = flagString(args, 'preset');
|
|
60
|
+
if (presetMode && presetMode !== 'auto') {
|
|
61
|
+
process.stderr.write(`Unknown --preset value "${presetMode}" (only "auto" is supported).\n`);
|
|
62
|
+
return 2;
|
|
63
|
+
}
|
|
64
|
+
// Pull path conventions + generated-dir globs from the live SharkCraft
|
|
65
|
+
// inspection. We tolerate missing config — small repos may not have
|
|
66
|
+
// adopted sharkcraft/ yet.
|
|
67
|
+
let pathDescriptors = [];
|
|
68
|
+
let generatedGlobs = [];
|
|
69
|
+
try {
|
|
70
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
71
|
+
const pathList = inspection.pathService.list();
|
|
72
|
+
pathDescriptors = pathList.map((p) => ({
|
|
73
|
+
id: p.id,
|
|
74
|
+
description: typeof p.metadata?.description === 'string' ? p.metadata.description : undefined,
|
|
75
|
+
}));
|
|
76
|
+
generatedGlobs = pathList
|
|
77
|
+
.filter((p) => p.tags?.some((t) => /generated|build|dist|output/i.test(t)))
|
|
78
|
+
.map((p) => (typeof p.metadata?.path === 'string' ? p.metadata.path : null))
|
|
79
|
+
.filter((g) => typeof g === 'string' && g.length > 0);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// best-effort — the scaffold still works without sharkcraft/.
|
|
83
|
+
}
|
|
84
|
+
const body = renderEslintFlatConfigSnippet(generatedGlobs, pathDescriptors);
|
|
85
|
+
const outputRel = flagString(args, 'output') ?? SCAFFOLD_DEFAULT_RELPATH;
|
|
86
|
+
const outputAbs = nodePath.isAbsolute(outputRel) ? outputRel : nodePath.join(cwd, outputRel);
|
|
87
|
+
if (flagBool(args, 'json')) {
|
|
88
|
+
const mode = flagBool(args, 'write') ? 'write' : 'dry-run';
|
|
89
|
+
process.stdout.write(asJson({ mode, output: outputAbs, bytes: body.length, body }) + '\n');
|
|
90
|
+
if (mode !== 'write')
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
if (!flagBool(args, 'write')) {
|
|
94
|
+
process.stdout.write(header('ESLint scaffold — dry-run'));
|
|
95
|
+
process.stdout.write(`output: ${outputAbs}\n`);
|
|
96
|
+
process.stdout.write(`bytes: ${body.length}\n\n`);
|
|
97
|
+
process.stdout.write(body);
|
|
98
|
+
process.stdout.write('\nRun with --write to persist.\n');
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
if (existsSync(outputAbs) && !flagBool(args, 'force')) {
|
|
102
|
+
process.stderr.write(`Refusing to overwrite existing file: ${outputAbs}. Pass --force.\n`);
|
|
103
|
+
return 1;
|
|
104
|
+
}
|
|
105
|
+
mkdirSync(nodePath.dirname(outputAbs), { recursive: true });
|
|
106
|
+
writeFileSync(outputAbs, body, 'utf8');
|
|
107
|
+
process.stdout.write(`Wrote ${outputAbs}\n`);
|
|
108
|
+
return 0;
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
export const eslintReportCommand = {
|
|
112
|
+
name: 'report',
|
|
113
|
+
description: 'Re-emit `shrk check boundaries --json` output in the ESLint result format (array of { filePath, messages[] }) so ESLint-aware tooling can consume SharkCraft boundary violations.',
|
|
114
|
+
usage: 'shrk eslint report [--from <path>] [--output <path>] [--json]',
|
|
115
|
+
async run(args) {
|
|
116
|
+
const cwd = resolveCwd(args);
|
|
117
|
+
const from = flagString(args, 'from');
|
|
118
|
+
const fromAbs = from
|
|
119
|
+
? nodePath.isAbsolute(from)
|
|
120
|
+
? from
|
|
121
|
+
: nodePath.join(cwd, from)
|
|
122
|
+
: null;
|
|
123
|
+
if (fromAbs && !existsSync(fromAbs)) {
|
|
124
|
+
process.stderr.write(`--from file not found: ${fromAbs}\n`);
|
|
125
|
+
return 1;
|
|
126
|
+
}
|
|
127
|
+
let report;
|
|
128
|
+
if (fromAbs) {
|
|
129
|
+
const raw = readFileSync(fromAbs, 'utf8');
|
|
130
|
+
try {
|
|
131
|
+
report = JSON.parse(raw);
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
process.stderr.write(`Failed to parse boundary report JSON: ${e.message}\n`);
|
|
135
|
+
return 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// No --from: tell the user the canonical pipeline.
|
|
140
|
+
process.stderr.write('No --from <boundary-report.json> passed. Generate one first:\n' +
|
|
141
|
+
' $ shrk check boundaries --json > boundaries.json\n' +
|
|
142
|
+
' $ shrk eslint report --from boundaries.json > eslint-results.json\n');
|
|
143
|
+
return 2;
|
|
144
|
+
}
|
|
145
|
+
const byFile = new Map();
|
|
146
|
+
for (const v of report.violations ?? []) {
|
|
147
|
+
const file = v.file ?? '<unknown>';
|
|
148
|
+
if (!byFile.has(file)) {
|
|
149
|
+
byFile.set(file, {
|
|
150
|
+
filePath: nodePath.isAbsolute(file) ? file : nodePath.join(cwd, file),
|
|
151
|
+
messages: [],
|
|
152
|
+
errorCount: 0,
|
|
153
|
+
warningCount: 0,
|
|
154
|
+
fixableErrorCount: 0,
|
|
155
|
+
fixableWarningCount: 0,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
const entry = byFile.get(file);
|
|
159
|
+
const msg = {
|
|
160
|
+
ruleId: 'sharkcraft/boundary-violation',
|
|
161
|
+
severity: 2,
|
|
162
|
+
message: (v.reason ?? 'SharkCraft boundary violation') +
|
|
163
|
+
(v.source && v.target ? ` (${v.source} → ${v.target})` : ''),
|
|
164
|
+
line: v.line ?? 1,
|
|
165
|
+
column: v.column ?? 1,
|
|
166
|
+
};
|
|
167
|
+
entry.messages.push(msg);
|
|
168
|
+
entry.errorCount += 1;
|
|
169
|
+
}
|
|
170
|
+
const out = Array.from(byFile.values());
|
|
171
|
+
const wantJson = flagBool(args, 'json') || !!flagString(args, 'output');
|
|
172
|
+
const outputRel = flagString(args, 'output');
|
|
173
|
+
const text = wantJson ? asJson(out) + '\n' : renderEslintReportText(out);
|
|
174
|
+
if (outputRel) {
|
|
175
|
+
const outputAbs = nodePath.isAbsolute(outputRel) ? outputRel : nodePath.join(cwd, outputRel);
|
|
176
|
+
mkdirSync(nodePath.dirname(outputAbs), { recursive: true });
|
|
177
|
+
writeFileSync(outputAbs, text, 'utf8');
|
|
178
|
+
process.stdout.write(`Wrote ${outputAbs}\n`);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
process.stdout.write(text);
|
|
182
|
+
}
|
|
183
|
+
return out.length > 0 ? 1 : 0;
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
function buildBridgeInventory(rules, paths) {
|
|
187
|
+
const rows = [];
|
|
188
|
+
for (const r of rules) {
|
|
189
|
+
const tagText = (r.tags ?? []).join(' ').toLowerCase();
|
|
190
|
+
const id = r.id.toLowerCase();
|
|
191
|
+
let status = 'not-bridgeable';
|
|
192
|
+
let notes = 'SharkCraft-only enforcement.';
|
|
193
|
+
if (tagText.includes('import') || tagText.includes('boundary') || id.includes('layer') || id.includes('import')) {
|
|
194
|
+
status = 'bridgeable';
|
|
195
|
+
notes = 'Representable via no-restricted-imports / boundary plugin.';
|
|
196
|
+
}
|
|
197
|
+
else if (tagText.includes('naming') || tagText.includes('file-shape')) {
|
|
198
|
+
status = 'bridgeable';
|
|
199
|
+
notes = 'Representable via @typescript-eslint naming or filename plugin.';
|
|
200
|
+
}
|
|
201
|
+
else if (tagText.includes('safety') || tagText.includes('signing') || tagText.includes('plan')) {
|
|
202
|
+
status = 'not-bridgeable';
|
|
203
|
+
notes = 'Plan / signing / safety semantics — keep in `shrk safety audit`.';
|
|
204
|
+
}
|
|
205
|
+
else if (tagText.includes('pack')) {
|
|
206
|
+
status = 'not-bridgeable';
|
|
207
|
+
notes = 'Pack-level — enforce with `shrk packs doctor`.';
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
status = 'adjacent';
|
|
211
|
+
notes = '`shrk eslint report` re-emits findings in the ESLint result format.';
|
|
212
|
+
}
|
|
213
|
+
rows.push({ kind: 'rule', id: r.id, status, notes });
|
|
214
|
+
}
|
|
215
|
+
for (const p of paths) {
|
|
216
|
+
const tagText = (p.tags ?? []).join(' ').toLowerCase();
|
|
217
|
+
const isGenerated = /generated|build|dist|output/.test(tagText);
|
|
218
|
+
rows.push({
|
|
219
|
+
kind: 'path',
|
|
220
|
+
id: p.id,
|
|
221
|
+
status: isGenerated ? 'bridgeable' : 'adjacent',
|
|
222
|
+
notes: isGenerated
|
|
223
|
+
? 'Goes in ESLint `ignores`.'
|
|
224
|
+
: 'Adjacent: surfaced for context; not directly enforceable by ESLint.',
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
rows.push({
|
|
228
|
+
kind: 'boundary',
|
|
229
|
+
id: 'check-boundaries',
|
|
230
|
+
status: 'adjacent',
|
|
231
|
+
notes: '`shrk eslint report` emits boundary violations in ESLint result format.',
|
|
232
|
+
});
|
|
233
|
+
rows.push({
|
|
234
|
+
kind: 'check',
|
|
235
|
+
id: 'custom-checks (sharkcraft.custom-check/v1)',
|
|
236
|
+
status: 'adjacent',
|
|
237
|
+
notes: '`shrk checks convert eslint <file>` round-trips ESLint into the SharkCraft protocol.',
|
|
238
|
+
});
|
|
239
|
+
rows.push({
|
|
240
|
+
kind: 'safety',
|
|
241
|
+
id: 'plan-signing / pack-signatures / knowledge-stale / template-drift',
|
|
242
|
+
status: 'not-bridgeable',
|
|
243
|
+
notes: 'CI gate only. ESLint has no semantic for any of these.',
|
|
244
|
+
});
|
|
245
|
+
return rows;
|
|
246
|
+
}
|
|
247
|
+
export const eslintRulesCommand = {
|
|
248
|
+
name: 'rules',
|
|
249
|
+
description: 'Inventory which SharkCraft constructs can be bridged to ESLint (bridgeable / adjacent / not-bridgeable). Read-only.',
|
|
250
|
+
usage: 'shrk eslint rules [--json] [--filter bridgeable|adjacent|not-bridgeable]',
|
|
251
|
+
async run(args) {
|
|
252
|
+
const cwd = resolveCwd(args);
|
|
253
|
+
let rules = [];
|
|
254
|
+
let paths = [];
|
|
255
|
+
try {
|
|
256
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
257
|
+
rules = inspection.ruleService.list().map((r) => ({
|
|
258
|
+
id: r.id,
|
|
259
|
+
description: typeof r.metadata?.description === 'string' ? r.metadata.description : undefined,
|
|
260
|
+
tags: r.tags ?? [],
|
|
261
|
+
}));
|
|
262
|
+
paths = inspection.pathService.list().map((p) => ({
|
|
263
|
+
id: p.id,
|
|
264
|
+
description: typeof p.metadata?.description === 'string' ? p.metadata.description : undefined,
|
|
265
|
+
tags: p.tags ?? [],
|
|
266
|
+
}));
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// best-effort
|
|
270
|
+
}
|
|
271
|
+
const inventory = buildBridgeInventory(rules, paths);
|
|
272
|
+
const filter = flagString(args, 'filter');
|
|
273
|
+
const filtered = filter
|
|
274
|
+
? inventory.filter((r) => r.status === filter)
|
|
275
|
+
: inventory;
|
|
276
|
+
if (flagBool(args, 'json')) {
|
|
277
|
+
process.stdout.write(asJson({ total: inventory.length, rows: filtered }) + '\n');
|
|
278
|
+
return 0;
|
|
279
|
+
}
|
|
280
|
+
process.stdout.write(header(`ESLint bridge inventory (${filtered.length} of ${inventory.length})`));
|
|
281
|
+
const buckets = {
|
|
282
|
+
bridgeable: [],
|
|
283
|
+
adjacent: [],
|
|
284
|
+
'not-bridgeable': [],
|
|
285
|
+
};
|
|
286
|
+
for (const r of filtered)
|
|
287
|
+
buckets[r.status].push(r);
|
|
288
|
+
for (const status of ['bridgeable', 'adjacent', 'not-bridgeable']) {
|
|
289
|
+
const rows = buckets[status];
|
|
290
|
+
if (!rows.length)
|
|
291
|
+
continue;
|
|
292
|
+
process.stdout.write(`\n[${status}] ${rows.length}\n`);
|
|
293
|
+
for (const r of rows) {
|
|
294
|
+
process.stdout.write(` ${r.kind.padEnd(9)} ${r.id}\n`);
|
|
295
|
+
process.stdout.write(` ${r.notes}\n`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
process.stdout.write('\nKeep in CI: `shrk check boundaries`, `shrk safety audit`, `shrk packs doctor`, `shrk knowledge stale-check`, `shrk templates drift`.\n');
|
|
299
|
+
return 0;
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
const ESLINT_LIMITATIONS = `\
|
|
303
|
+
# ESLint bridge — limitations
|
|
304
|
+
|
|
305
|
+
What the bridge **can** do today:
|
|
306
|
+
|
|
307
|
+
• \`shrk eslint scaffold\` — emit a flat-config snippet that ignores
|
|
308
|
+
SharkCraft generated paths and points at \`shrk check boundaries\`.
|
|
309
|
+
• \`shrk eslint report\` — re-emit \`shrk check boundaries --json\` in
|
|
310
|
+
the ESLint result format so existing ESLint-aware tooling
|
|
311
|
+
(reviewdog, GitHub annotations, …) shows SharkCraft violations.
|
|
312
|
+
• \`shrk eslint rules\` — inventory which SharkCraft constructs are
|
|
313
|
+
bridgeable, which are adjacent, which are not.
|
|
314
|
+
|
|
315
|
+
What the bridge **cannot** express in ESLint:
|
|
316
|
+
|
|
317
|
+
• Plan safety (signing, divergence, \`--verify-signature\`). These
|
|
318
|
+
are write-path checks and belong in the SharkCraft CLI / CI.
|
|
319
|
+
• Pack signatures and \`shrk packs signature-status\`. ESLint has
|
|
320
|
+
no notion of distributed signed assets.
|
|
321
|
+
• Knowledge stale-check and template drift. They depend on the
|
|
322
|
+
SharkCraft registry, not on the source tree alone.
|
|
323
|
+
• Self-config doctor and the deep safety audit. These reason over
|
|
324
|
+
the whole config tree, not single source files.
|
|
325
|
+
|
|
326
|
+
Recommendation: keep \`shrk doctor\`, \`shrk check boundaries\`,
|
|
327
|
+
\`shrk safety audit\`, and (if you ship packs) \`shrk packs doctor\`
|
|
328
|
+
in CI. Use ESLint for source-file linting only.
|
|
329
|
+
|
|
330
|
+
Integration over competition: SharkCraft does not aim to replace
|
|
331
|
+
ESLint. It rides alongside.
|
|
332
|
+
`;
|
|
333
|
+
export const eslintExplainLimitationsCommand = {
|
|
334
|
+
name: 'explain-limitations',
|
|
335
|
+
description: 'Print the honest list of what cannot be bridged from SharkCraft to ESLint and what to keep in CI.',
|
|
336
|
+
usage: 'shrk eslint explain-limitations [--json]',
|
|
337
|
+
async run(args) {
|
|
338
|
+
if (flagBool(args, 'json')) {
|
|
339
|
+
process.stdout.write(asJson({
|
|
340
|
+
bridgeable: [
|
|
341
|
+
'no-restricted-imports (forbidden imports / layer boundaries)',
|
|
342
|
+
'generated path ignores',
|
|
343
|
+
'naming / file-shape rules (via @typescript-eslint)',
|
|
344
|
+
],
|
|
345
|
+
adjacent: [
|
|
346
|
+
'shrk check boundaries (re-emitted in ESLint result format)',
|
|
347
|
+
'custom-check reports (round-trip via `shrk checks convert eslint`)',
|
|
348
|
+
],
|
|
349
|
+
notBridgeable: [
|
|
350
|
+
'plan signing / --verify-signature',
|
|
351
|
+
'pack signatures',
|
|
352
|
+
'knowledge stale-check',
|
|
353
|
+
'template drift',
|
|
354
|
+
'self-config doctor',
|
|
355
|
+
'safety audit --deep',
|
|
356
|
+
],
|
|
357
|
+
keepInCi: [
|
|
358
|
+
'shrk doctor',
|
|
359
|
+
'shrk check boundaries',
|
|
360
|
+
'shrk safety audit',
|
|
361
|
+
'shrk packs doctor',
|
|
362
|
+
'shrk knowledge stale-check',
|
|
363
|
+
'shrk templates drift',
|
|
364
|
+
],
|
|
365
|
+
}) + '\n');
|
|
366
|
+
return 0;
|
|
367
|
+
}
|
|
368
|
+
process.stdout.write(ESLINT_LIMITATIONS);
|
|
369
|
+
return 0;
|
|
370
|
+
},
|
|
371
|
+
};
|
|
372
|
+
function renderEslintReportText(files) {
|
|
373
|
+
if (files.length === 0) {
|
|
374
|
+
return 'SharkCraft boundary report contained no violations.\n';
|
|
375
|
+
}
|
|
376
|
+
const lines = [];
|
|
377
|
+
lines.push(header('SharkCraft → ESLint result format'));
|
|
378
|
+
for (const f of files) {
|
|
379
|
+
lines.push(f.filePath);
|
|
380
|
+
for (const m of f.messages) {
|
|
381
|
+
lines.push(` ${m.line}:${m.column} ${m.ruleId} ${m.message}`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
lines.push('');
|
|
385
|
+
lines.push(bullet(`${files.length} file(s) with violations`));
|
|
386
|
+
return lines.join('\n') + '\n';
|
|
387
|
+
}
|
|
388
|
+
export const eslintCommand = {
|
|
389
|
+
name: 'eslint',
|
|
390
|
+
description: 'ESLint bridge. `scaffold` emits a flat-config snippet that ignores SharkCraft generated paths; `report` re-emits boundary violations in the ESLint result format; `rules` inventories what is bridgeable; `explain-limitations` documents what cannot be bridged. `config` is an alias for `scaffold`.',
|
|
391
|
+
usage: 'shrk eslint <scaffold|config|report|rules|explain-limitations> [...flags]',
|
|
392
|
+
async run(args) {
|
|
393
|
+
const verb = args.positional[0];
|
|
394
|
+
if (verb === 'scaffold' || verb === 'config') {
|
|
395
|
+
// `eslint config --preset auto` is the preferred shape;
|
|
396
|
+
// it routes to `scaffold` which already accepts `--preset auto`.
|
|
397
|
+
return eslintScaffoldCommand.run({
|
|
398
|
+
...args,
|
|
399
|
+
positional: args.positional.slice(1),
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
if (verb === 'report') {
|
|
403
|
+
return eslintReportCommand.run({
|
|
404
|
+
...args,
|
|
405
|
+
positional: args.positional.slice(1),
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
if (verb === 'rules') {
|
|
409
|
+
return eslintRulesCommand.run({
|
|
410
|
+
...args,
|
|
411
|
+
positional: args.positional.slice(1),
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
if (verb === 'explain-limitations') {
|
|
415
|
+
return eslintExplainLimitationsCommand.run({
|
|
416
|
+
...args,
|
|
417
|
+
positional: args.positional.slice(1),
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
process.stderr.write('Usage: shrk eslint <scaffold|config|report|rules|explain-limitations> [...flags]\n');
|
|
421
|
+
return 2;
|
|
422
|
+
},
|
|
423
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explore.command.d.ts","sourceRoot":"","sources":["../../src/commands/explore.command.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAqBhC,eAAO,MAAM,cAAc,EAAE,eA6C5B,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { exploreArea, inspectSharkcraft, renderAreaExploreMarkdown, renderAreaExploreText, } from '@shrkcrft/inspector';
|
|
2
|
+
import { flagBool, flagString, resolveCwd, } from "../command-registry.js";
|
|
3
|
+
import { asJson } from "../output/format-output.js";
|
|
4
|
+
import { COMMAND_CATALOG } from "./command-catalog.js";
|
|
5
|
+
const ALL_MCP_TOOL_NAMES = [];
|
|
6
|
+
async function getMcpToolNames() {
|
|
7
|
+
if (ALL_MCP_TOOL_NAMES.length > 0)
|
|
8
|
+
return ALL_MCP_TOOL_NAMES;
|
|
9
|
+
try {
|
|
10
|
+
const mod = (await import('@shrkcrft/mcp-server'));
|
|
11
|
+
if (mod?.ALL_TOOLS) {
|
|
12
|
+
for (const t of mod.ALL_TOOLS)
|
|
13
|
+
ALL_MCP_TOOL_NAMES.push(t.name);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// mcp-server not loadable from this entry — leave the list empty.
|
|
18
|
+
}
|
|
19
|
+
return ALL_MCP_TOOL_NAMES;
|
|
20
|
+
}
|
|
21
|
+
export const exploreCommand = {
|
|
22
|
+
name: 'explore',
|
|
23
|
+
description: 'Explore a directory: area kind, key modules, related commands/MCP tools, tests, conventions, risks. Read-only.',
|
|
24
|
+
usage: 'shrk explore <path> [--format text|markdown|json] [--top N]',
|
|
25
|
+
async run(args) {
|
|
26
|
+
const rawPath = args.positional[0];
|
|
27
|
+
if (!rawPath) {
|
|
28
|
+
process.stderr.write('Usage: shrk explore <path> [--format text|markdown|json]\n');
|
|
29
|
+
return 2;
|
|
30
|
+
}
|
|
31
|
+
const cwd = resolveCwd(args);
|
|
32
|
+
const inspection = await inspectSharkcraft({ cwd });
|
|
33
|
+
const mcpToolNames = await getMcpToolNames();
|
|
34
|
+
const pathConventions = inspection.pathService.list().map((p) => ({
|
|
35
|
+
id: p.id,
|
|
36
|
+
pattern: p.metadata?.path,
|
|
37
|
+
}));
|
|
38
|
+
const top = (() => {
|
|
39
|
+
const n = flagString(args, 'top');
|
|
40
|
+
if (!n)
|
|
41
|
+
return undefined;
|
|
42
|
+
const v = Number(n);
|
|
43
|
+
return Number.isFinite(v) && v > 0 ? v : undefined;
|
|
44
|
+
})();
|
|
45
|
+
const report = exploreArea({
|
|
46
|
+
inspection,
|
|
47
|
+
path: rawPath,
|
|
48
|
+
commandCatalog: COMMAND_CATALOG,
|
|
49
|
+
mcpToolNames,
|
|
50
|
+
pathConventions,
|
|
51
|
+
...(top ? { topFiles: top } : {}),
|
|
52
|
+
});
|
|
53
|
+
const format = flagString(args, 'format') ?? (flagBool(args, 'json') ? 'json' : 'text');
|
|
54
|
+
if (format === 'json') {
|
|
55
|
+
process.stdout.write(asJson(report) + '\n');
|
|
56
|
+
return report.exists ? 0 : 1;
|
|
57
|
+
}
|
|
58
|
+
if (format === 'markdown') {
|
|
59
|
+
process.stdout.write(renderAreaExploreMarkdown(report));
|
|
60
|
+
return report.exists ? 0 : 1;
|
|
61
|
+
}
|
|
62
|
+
process.stdout.write(renderAreaExploreText(report));
|
|
63
|
+
return report.exists ? 0 : 1;
|
|
64
|
+
},
|
|
65
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ICommandHandler } from '../command-registry.js';
|
|
2
|
+
export declare const exportBundleCommand: ICommandHandler;
|
|
3
|
+
export declare const exportSessionCommand: ICommandHandler;
|
|
4
|
+
export declare const exportQualityCommand: ICommandHandler;
|
|
5
|
+
export declare const exportReviewCommand: ICommandHandler;
|
|
6
|
+
//# sourceMappingURL=export-bundle.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-bundle.command.d.ts","sourceRoot":"","sources":["../../src/commands/export-bundle.command.ts"],"names":[],"mappings":"AASA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAOhC,eAAO,MAAM,mBAAmB,EAAE,eAqBjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAqBlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAclC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAqBjC,CAAC"}
|