@shrkcrft/inspector 0.1.0-alpha.30 → 0.1.0-alpha.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acceptance-replay.js +1 -1
- package/dist/agent-contract-templates.js +6 -6
- package/dist/agent-contract.d.ts.map +1 -1
- package/dist/agent-contract.js +13 -8
- package/dist/agent-orchestration.js +2 -2
- package/dist/agent-task-prep.d.ts +16 -0
- package/dist/agent-task-prep.d.ts.map +1 -1
- package/dist/agent-task-prep.js +51 -4
- package/dist/ai-readiness.d.ts.map +1 -1
- package/dist/ai-readiness.js +21 -3
- package/dist/architecture-map.d.ts +16 -0
- package/dist/architecture-map.d.ts.map +1 -1
- package/dist/architecture-map.js +42 -26
- package/dist/area-explore.d.ts +2 -2
- package/dist/area-explore.d.ts.map +1 -1
- package/dist/area-explore.js +36 -16
- package/dist/area-map.d.ts +56 -11
- package/dist/area-map.d.ts.map +1 -1
- package/dist/area-map.js +106 -25
- package/dist/asset-doctor-proposed-exit.d.ts +21 -0
- package/dist/asset-doctor-proposed-exit.d.ts.map +1 -0
- package/dist/asset-doctor-proposed-exit.js +22 -0
- package/dist/asset-provenance.js +1 -1
- package/dist/boundaries-changed-only.d.ts +24 -1
- package/dist/boundaries-changed-only.d.ts.map +1 -1
- package/dist/boundaries-changed-only.js +12 -2
- package/dist/boundary-check-options.model.d.ts +40 -0
- package/dist/boundary-check-options.model.d.ts.map +1 -0
- package/dist/boundary-check-options.model.js +1 -0
- package/dist/boundary-check-result.model.d.ts +89 -0
- package/dist/boundary-check-result.model.d.ts.map +1 -0
- package/dist/boundary-check-result.model.js +1 -0
- package/dist/boundary-configuration-status.d.ts +38 -0
- package/dist/boundary-configuration-status.d.ts.map +1 -0
- package/dist/boundary-configuration-status.js +118 -0
- package/dist/boundary-configuration-status.model.d.ts +37 -0
- package/dist/boundary-configuration-status.model.d.ts.map +1 -0
- package/dist/boundary-configuration-status.model.js +1 -0
- package/dist/boundary-load-issue.model.d.ts +30 -0
- package/dist/boundary-load-issue.model.d.ts.map +1 -0
- package/dist/boundary-load-issue.model.js +1 -0
- package/dist/boundary-rule-check.model.d.ts +44 -0
- package/dist/boundary-rule-check.model.d.ts.map +1 -0
- package/dist/boundary-rule-check.model.js +1 -0
- package/dist/boundary-rule-invalidation.model.d.ts +31 -0
- package/dist/boundary-rule-invalidation.model.d.ts.map +1 -0
- package/dist/boundary-rule-invalidation.model.js +1 -0
- package/dist/boundary-rule-set-diff.model.d.ts +75 -0
- package/dist/boundary-rule-set-diff.model.d.ts.map +1 -0
- package/dist/boundary-rule-set-diff.model.js +1 -0
- package/dist/boundary-rule-sources.d.ts +28 -0
- package/dist/boundary-rule-sources.d.ts.map +1 -0
- package/dist/boundary-rule-sources.js +110 -0
- package/dist/boundary-stale-exception-finding.model.d.ts +12 -0
- package/dist/boundary-stale-exception-finding.model.d.ts.map +1 -0
- package/dist/boundary-stale-exception-finding.model.js +1 -0
- package/dist/boundary-unit-liveness.d.ts +35 -0
- package/dist/boundary-unit-liveness.d.ts.map +1 -0
- package/dist/boundary-unit-liveness.js +71 -0
- package/dist/change-intent.d.ts +3 -0
- package/dist/change-intent.d.ts.map +1 -1
- package/dist/change-intent.js +61 -27
- package/dist/changes-summary.d.ts.map +1 -1
- package/dist/changes-summary.js +19 -9
- package/dist/ci-integrity-report.js +1 -1
- package/dist/ci-predict.d.ts.map +1 -1
- package/dist/ci-predict.js +38 -5
- package/dist/code-intelligence-doctor.d.ts +6 -0
- package/dist/code-intelligence-doctor.d.ts.map +1 -1
- package/dist/code-intelligence-doctor.js +22 -7
- package/dist/command-recommender.d.ts +45 -2
- package/dist/command-recommender.d.ts.map +1 -1
- package/dist/command-recommender.js +41 -263
- package/dist/command-resolution-status.d.ts +44 -0
- package/dist/command-resolution-status.d.ts.map +1 -0
- package/dist/command-resolution-status.js +44 -0
- package/dist/command-safety-level.d.ts +15 -0
- package/dist/command-safety-level.d.ts.map +1 -0
- package/dist/command-safety-level.js +43 -0
- package/dist/command-taxonomy.js +1 -1
- package/dist/compliance-evidence.js +1 -1
- package/dist/compliance-profiles.js +1 -1
- package/dist/construct-registry.d.ts +40 -0
- package/dist/construct-registry.d.ts.map +1 -1
- package/dist/construct-registry.js +186 -82
- package/dist/context-tuning.d.ts +4 -0
- package/dist/context-tuning.d.ts.map +1 -1
- package/dist/context-tuning.js +10 -7
- package/dist/contract-template-registry.d.ts +10 -0
- package/dist/contract-template-registry.d.ts.map +1 -1
- package/dist/contract-template-registry.js +59 -33
- package/dist/contribution-kind.d.ts +52 -0
- package/dist/contribution-kind.d.ts.map +1 -0
- package/dist/contribution-kind.js +52 -0
- package/dist/contribution-load-failures.d.ts +106 -0
- package/dist/contribution-load-failures.d.ts.map +1 -0
- package/dist/contribution-load-failures.js +575 -0
- package/dist/contributions-report.d.ts +28 -0
- package/dist/contributions-report.d.ts.map +1 -0
- package/dist/contributions-report.js +242 -0
- package/dist/convention-registry.d.ts +22 -0
- package/dist/convention-registry.d.ts.map +1 -1
- package/dist/convention-registry.js +79 -39
- package/dist/coverage-report.d.ts.map +1 -1
- package/dist/coverage-report.js +6 -6
- package/dist/custom-checks.d.ts +60 -1
- package/dist/custom-checks.d.ts.map +1 -1
- package/dist/custom-checks.js +159 -6
- package/dist/dashboard/dashboard-data.d.ts +6 -0
- package/dist/dashboard/dashboard-data.d.ts.map +1 -1
- package/dist/dashboard/dashboard-data.js +99 -8
- package/dist/dashboard/dashboard-knowledge.d.ts.map +1 -1
- package/dist/dashboard/dashboard-knowledge.js +14 -2
- package/dist/decision-records.d.ts +20 -0
- package/dist/decision-records.d.ts.map +1 -1
- package/dist/decision-records.js +68 -20
- package/dist/declared-cross-references.d.ts +61 -0
- package/dist/declared-cross-references.d.ts.map +1 -0
- package/dist/declared-cross-references.js +550 -0
- package/dist/declared-gate-plane-rules.d.ts +24 -0
- package/dist/declared-gate-plane-rules.d.ts.map +1 -0
- package/dist/declared-gate-plane-rules.js +39 -0
- package/dist/declared-reference-coverage.d.ts +27 -0
- package/dist/declared-reference-coverage.d.ts.map +1 -0
- package/dist/declared-reference-coverage.js +50 -0
- package/dist/declared-xref-status.d.ts +19 -0
- package/dist/declared-xref-status.d.ts.map +1 -0
- package/dist/declared-xref-status.js +19 -0
- package/dist/delegate-pack-recipes.d.ts +13 -2
- package/dist/delegate-pack-recipes.d.ts.map +1 -1
- package/dist/delegate-pack-recipes.js +45 -14
- package/dist/demo-package.js +2 -2
- package/dist/demo-script.js +2 -2
- package/dist/demo-workflow.js +3 -3
- package/dist/dev-cycle.js +1 -1
- package/dist/dev-session.js +1 -1
- package/dist/doc-references.d.ts +23 -2
- package/dist/doc-references.d.ts.map +1 -1
- package/dist/doc-references.js +96 -17
- package/dist/doctor-result.d.ts +8 -0
- package/dist/doctor-result.d.ts.map +1 -1
- package/dist/doctor-verdict-kind.d.ts +19 -0
- package/dist/doctor-verdict-kind.d.ts.map +1 -0
- package/dist/doctor-verdict-kind.js +19 -0
- package/dist/doctor-verdict.d.ts +18 -0
- package/dist/doctor-verdict.d.ts.map +1 -0
- package/dist/doctor-verdict.js +28 -0
- package/dist/drift.d.ts +17 -0
- package/dist/drift.d.ts.map +1 -1
- package/dist/drift.js +40 -10
- package/dist/entrypoint-matrix.d.ts.map +1 -1
- package/dist/entrypoint-matrix.js +4 -1
- package/dist/feedback-ingestion.d.ts +28 -2
- package/dist/feedback-ingestion.d.ts.map +1 -1
- package/dist/feedback-ingestion.js +68 -19
- package/dist/fix-preview.d.ts.map +1 -1
- package/dist/fix-preview.js +9 -5
- package/dist/framework-extractor-outcomes.d.ts +27 -0
- package/dist/framework-extractor-outcomes.d.ts.map +1 -0
- package/dist/framework-extractor-outcomes.js +83 -0
- package/dist/fuzzy-impact.js +1 -1
- package/dist/healing-plan.d.ts.map +1 -1
- package/dist/healing-plan.js +3 -4
- package/dist/helper-catalog.d.ts +25 -0
- package/dist/helper-catalog.d.ts.map +1 -0
- package/dist/helper-catalog.js +91 -0
- package/dist/helper-registry.d.ts.map +1 -1
- package/dist/helper-registry.js +17 -1
- package/dist/helper-view.d.ts +33 -0
- package/dist/helper-view.d.ts.map +1 -0
- package/dist/helper-view.js +1 -0
- package/dist/i-asset-doctor-flags.d.ts +16 -0
- package/dist/i-asset-doctor-flags.d.ts.map +1 -0
- package/dist/i-asset-doctor-flags.js +1 -0
- package/dist/i-command-resolution.d.ts +22 -0
- package/dist/i-command-resolution.d.ts.map +1 -0
- package/dist/i-command-resolution.js +1 -0
- package/dist/i-command-resolve-options.d.ts +24 -0
- package/dist/i-command-resolve-options.d.ts.map +1 -0
- package/dist/i-command-resolve-options.js +1 -0
- package/dist/i-command-safety.d.ts +13 -0
- package/dist/i-command-safety.d.ts.map +1 -0
- package/dist/i-command-safety.js +1 -0
- package/dist/i-contribution-accepted-entry.d.ts +18 -0
- package/dist/i-contribution-accepted-entry.d.ts.map +1 -0
- package/dist/i-contribution-accepted-entry.js +1 -0
- package/dist/i-contribution-entry-rejection.d.ts +21 -0
- package/dist/i-contribution-entry-rejection.d.ts.map +1 -0
- package/dist/i-contribution-entry-rejection.js +1 -0
- package/dist/i-contribution-file-issue.d.ts +18 -0
- package/dist/i-contribution-file-issue.d.ts.map +1 -0
- package/dist/i-contribution-file-issue.js +1 -0
- package/dist/i-contribution-file-report.d.ts +40 -0
- package/dist/i-contribution-file-report.d.ts.map +1 -0
- package/dist/i-contribution-file-report.js +1 -0
- package/dist/i-contribution-file-validation.d.ts +24 -0
- package/dist/i-contribution-file-validation.d.ts.map +1 -0
- package/dist/i-contribution-file-validation.js +1 -0
- package/dist/i-contributions-report.d.ts +31 -0
- package/dist/i-contributions-report.d.ts.map +1 -0
- package/dist/i-contributions-report.js +1 -0
- package/dist/i-declared-xref-field.d.ts +25 -0
- package/dist/i-declared-xref-field.d.ts.map +1 -0
- package/dist/i-declared-xref-field.js +1 -0
- package/dist/i-declared-xref-issue.d.ts +25 -0
- package/dist/i-declared-xref-issue.d.ts.map +1 -0
- package/dist/i-declared-xref-issue.js +1 -0
- package/dist/i-declared-xref-report.d.ts +48 -0
- package/dist/i-declared-xref-report.d.ts.map +1 -0
- package/dist/i-declared-xref-report.js +1 -0
- package/dist/i-declared-xref-row.d.ts +29 -0
- package/dist/i-declared-xref-row.d.ts.map +1 -0
- package/dist/i-declared-xref-row.js +1 -0
- package/dist/i-doctor-verdict.d.ts +10 -0
- package/dist/i-doctor-verdict.d.ts.map +1 -0
- package/dist/i-doctor-verdict.js +1 -0
- package/dist/i-kind-outcomes.d.ts +13 -0
- package/dist/i-kind-outcomes.d.ts.map +1 -0
- package/dist/i-kind-outcomes.js +1 -0
- package/dist/i-pack-doctor-verdict.d.ts +15 -0
- package/dist/i-pack-doctor-verdict.d.ts.map +1 -0
- package/dist/i-pack-doctor-verdict.js +1 -0
- package/dist/i-probed-id-field.d.ts +17 -0
- package/dist/i-probed-id-field.d.ts.map +1 -0
- package/dist/i-probed-id-field.js +1 -0
- package/dist/i-reference-kind-declaration.d.ts +38 -0
- package/dist/i-reference-kind-declaration.d.ts.map +1 -0
- package/dist/i-reference-kind-declaration.js +1 -0
- package/dist/i-reference-warm-options.d.ts +21 -0
- package/dist/i-reference-warm-options.d.ts.map +1 -0
- package/dist/i-reference-warm-options.js +1 -0
- package/dist/i-registry-outcomes.d.ts +16 -0
- package/dist/i-registry-outcomes.d.ts.map +1 -0
- package/dist/i-registry-outcomes.js +1 -0
- package/dist/i-scaffold-pattern-doctor-report.d.ts +35 -0
- package/dist/i-scaffold-pattern-doctor-report.d.ts.map +1 -0
- package/dist/i-scaffold-pattern-doctor-report.js +1 -0
- package/dist/i-search-tuning-key-probe.d.ts +30 -0
- package/dist/i-search-tuning-key-probe.d.ts.map +1 -0
- package/dist/i-search-tuning-key-probe.js +1 -0
- package/dist/i-search-tuning-lint-issue.d.ts +61 -0
- package/dist/i-search-tuning-lint-issue.d.ts.map +1 -0
- package/dist/i-search-tuning-lint-issue.js +1 -0
- package/dist/i-search-tuning-lint-report.d.ts +38 -0
- package/dist/i-search-tuning-lint-report.d.ts.map +1 -0
- package/dist/i-search-tuning-lint-report.js +1 -0
- package/dist/i-unresolvable-reference-scan.d.ts +14 -0
- package/dist/i-unresolvable-reference-scan.d.ts.map +1 -0
- package/dist/i-unresolvable-reference-scan.js +1 -0
- package/dist/i-unresolvable-reference.d.ts +29 -0
- package/dist/i-unresolvable-reference.d.ts.map +1 -0
- package/dist/i-unresolvable-reference.js +1 -0
- package/dist/i-workspace-profile-payload.d.ts +12 -0
- package/dist/i-workspace-profile-payload.d.ts.map +1 -0
- package/dist/i-workspace-profile-payload.js +1 -0
- package/dist/impact-analysis.d.ts +15 -0
- package/dist/impact-analysis.d.ts.map +1 -1
- package/dist/impact-analysis.js +58 -13
- package/dist/impact-render.d.ts.map +1 -1
- package/dist/impact-render.js +22 -0
- package/dist/import-hygiene.d.ts +35 -1
- package/dist/import-hygiene.d.ts.map +1 -1
- package/dist/import-hygiene.js +107 -13
- package/dist/index.d.ts +141 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +172 -0
- package/dist/inspection-discovery.d.ts +45 -0
- package/dist/inspection-discovery.d.ts.map +1 -0
- package/dist/inspection-discovery.js +70 -0
- package/dist/knowledge-advisory-code.d.ts +17 -0
- package/dist/knowledge-advisory-code.d.ts.map +1 -0
- package/dist/knowledge-advisory-code.js +17 -0
- package/dist/knowledge-aged-entry.d.ts +10 -0
- package/dist/knowledge-aged-entry.d.ts.map +1 -0
- package/dist/knowledge-aged-entry.js +1 -0
- package/dist/knowledge-authoring.d.ts +24 -1
- package/dist/knowledge-authoring.d.ts.map +1 -1
- package/dist/knowledge-authoring.js +46 -7
- package/dist/knowledge-entry-verdict-record.d.ts +22 -0
- package/dist/knowledge-entry-verdict-record.d.ts.map +1 -0
- package/dist/knowledge-entry-verdict-record.js +1 -0
- package/dist/knowledge-entry-verdict.d.ts +17 -0
- package/dist/knowledge-entry-verdict.d.ts.map +1 -0
- package/dist/knowledge-entry-verdict.js +17 -0
- package/dist/knowledge-graph.d.ts +6 -0
- package/dist/knowledge-graph.d.ts.map +1 -1
- package/dist/knowledge-graph.js +18 -7
- package/dist/knowledge-kind-bucket.d.ts +19 -0
- package/dist/knowledge-kind-bucket.d.ts.map +1 -0
- package/dist/knowledge-kind-bucket.js +1 -0
- package/dist/knowledge-load-failure.d.ts +23 -0
- package/dist/knowledge-load-failure.d.ts.map +1 -0
- package/dist/knowledge-load-failure.js +1 -0
- package/dist/knowledge-reference-kind-bucket.d.ts +11 -0
- package/dist/knowledge-reference-kind-bucket.d.ts.map +1 -0
- package/dist/knowledge-reference-kind-bucket.js +1 -0
- package/dist/knowledge-stale-advisory.d.ts +14 -0
- package/dist/knowledge-stale-advisory.d.ts.map +1 -0
- package/dist/knowledge-stale-advisory.js +1 -0
- package/dist/knowledge-stale-coverage.d.ts +19 -0
- package/dist/knowledge-stale-coverage.d.ts.map +1 -0
- package/dist/knowledge-stale-coverage.js +1 -0
- package/dist/knowledge-stale-gate-flags.d.ts +33 -0
- package/dist/knowledge-stale-gate-flags.d.ts.map +1 -0
- package/dist/knowledge-stale-gate-flags.js +1 -0
- package/dist/knowledge-stale-gate-input.d.ts +46 -0
- package/dist/knowledge-stale-gate-input.d.ts.map +1 -0
- package/dist/knowledge-stale-gate-input.js +1 -0
- package/dist/knowledge-stale-gate-result.d.ts +33 -0
- package/dist/knowledge-stale-gate-result.d.ts.map +1 -0
- package/dist/knowledge-stale-gate-result.js +1 -0
- package/dist/knowledge-stale-gate-rule.d.ts +33 -0
- package/dist/knowledge-stale-gate-rule.d.ts.map +1 -0
- package/dist/knowledge-stale-gate-rule.js +1 -0
- package/dist/knowledge-stale-gate-violation.d.ts +13 -0
- package/dist/knowledge-stale-gate-violation.d.ts.map +1 -0
- package/dist/knowledge-stale-gate-violation.js +1 -0
- package/dist/knowledge-stale-gate.d.ts +83 -0
- package/dist/knowledge-stale-gate.d.ts.map +1 -0
- package/dist/knowledge-stale-gate.js +429 -0
- package/dist/knowledge-stale-quality-gate.d.ts +26 -0
- package/dist/knowledge-stale-quality-gate.d.ts.map +1 -0
- package/dist/knowledge-stale-quality-gate.js +110 -0
- package/dist/knowledge-stale.d.ts +122 -9
- package/dist/knowledge-stale.d.ts.map +1 -1
- package/dist/knowledge-stale.js +996 -291
- package/dist/knowledge-unverifiable-reason.d.ts +12 -0
- package/dist/knowledge-unverifiable-reason.d.ts.map +1 -0
- package/dist/knowledge-unverifiable-reason.js +12 -0
- package/dist/loader-diagnostics.d.ts +14 -2
- package/dist/loader-diagnostics.d.ts.map +1 -1
- package/dist/match-terms.d.ts +48 -0
- package/dist/match-terms.d.ts.map +1 -0
- package/dist/match-terms.js +155 -0
- package/dist/migration-profile-registry.d.ts +10 -0
- package/dist/migration-profile-registry.d.ts.map +1 -1
- package/dist/migration-profile-registry.js +57 -34
- package/dist/migration-readiness.d.ts.map +1 -1
- package/dist/migration-readiness.js +1 -3
- package/dist/nearest-id.d.ts +10 -26
- package/dist/nearest-id.d.ts.map +1 -1
- package/dist/nearest-id.js +9 -59
- package/dist/pack-asset-freshness.d.ts +65 -0
- package/dist/pack-asset-freshness.d.ts.map +1 -0
- package/dist/pack-asset-freshness.js +340 -0
- package/dist/pack-author-ux.d.ts +24 -3
- package/dist/pack-author-ux.d.ts.map +1 -1
- package/dist/pack-author-ux.js +87 -93
- package/dist/pack-contributions-inventory.d.ts +79 -39
- package/dist/pack-contributions-inventory.d.ts.map +1 -1
- package/dist/pack-contributions-inventory.js +443 -286
- package/dist/pack-doctor-verdict.d.ts +29 -0
- package/dist/pack-doctor-verdict.d.ts.map +1 -0
- package/dist/pack-doctor-verdict.js +45 -0
- package/dist/pack-doctor.d.ts +74 -1
- package/dist/pack-doctor.d.ts.map +1 -1
- package/dist/pack-doctor.js +281 -1
- package/dist/pack-helper-plan.d.ts +24 -0
- package/dist/pack-helper-plan.d.ts.map +1 -0
- package/dist/pack-helper-plan.js +77 -0
- package/dist/pack-helper-registry.d.ts +14 -0
- package/dist/pack-helper-registry.d.ts.map +1 -1
- package/dist/pack-helper-registry.js +76 -37
- package/dist/pack-manifest-reader.d.ts +8 -0
- package/dist/pack-manifest-reader.d.ts.map +1 -0
- package/dist/pack-manifest-reader.js +79 -0
- package/dist/pack-release-check.d.ts +14 -1
- package/dist/pack-release-check.d.ts.map +1 -1
- package/dist/pack-release-check.js +23 -1
- package/dist/pack-signature-status.d.ts +18 -6
- package/dist/pack-signature-status.d.ts.map +1 -1
- package/dist/pack-signature-status.js +59 -105
- package/dist/pack-test-runner.d.ts +27 -5
- package/dist/pack-test-runner.d.ts.map +1 -1
- package/dist/pack-test-runner.js +91 -35
- package/dist/pack-typecheck.d.ts +8 -0
- package/dist/pack-typecheck.d.ts.map +1 -0
- package/dist/pack-typecheck.js +76 -0
- package/dist/plan-review.d.ts +2 -0
- package/dist/plan-review.d.ts.map +1 -1
- package/dist/plan-review.js +17 -5
- package/dist/plan-simulation.d.ts.map +1 -1
- package/dist/plan-simulation.js +16 -5
- package/dist/playbook-load-issue.d.ts +16 -0
- package/dist/playbook-load-issue.d.ts.map +1 -0
- package/dist/playbook-load-issue.js +1 -0
- package/dist/playbook-registry.d.ts +32 -1
- package/dist/playbook-registry.d.ts.map +1 -1
- package/dist/playbook-registry.js +144 -55
- package/dist/policy-declaration.d.ts +18 -0
- package/dist/policy-declaration.d.ts.map +1 -0
- package/dist/policy-declaration.js +1 -0
- package/dist/policy-engine.d.ts +8 -0
- package/dist/policy-engine.d.ts.map +1 -1
- package/dist/policy-engine.js +26 -9
- package/dist/policy-overrides.d.ts.map +1 -1
- package/dist/policy-overrides.js +4 -4
- package/dist/policy-registry.d.ts +27 -0
- package/dist/policy-registry.d.ts.map +1 -1
- package/dist/policy-registry.js +87 -20
- package/dist/probed-id-fields.d.ts +21 -0
- package/dist/probed-id-fields.d.ts.map +1 -0
- package/dist/probed-id-fields.js +25 -0
- package/dist/probed-id-source.d.ts +11 -0
- package/dist/probed-id-source.d.ts.map +1 -0
- package/dist/probed-id-source.js +11 -0
- package/dist/profile-registry.d.ts +25 -2
- package/dist/profile-registry.d.ts.map +1 -1
- package/dist/profile-registry.js +59 -6
- package/dist/quality-gate-examination.d.ts +15 -0
- package/dist/quality-gate-examination.d.ts.map +1 -0
- package/dist/quality-gate-examination.js +15 -0
- package/dist/quality-gate-row-status.d.ts +19 -0
- package/dist/quality-gate-row-status.d.ts.map +1 -0
- package/dist/quality-gate-row-status.js +28 -0
- package/dist/quality-gate-status.d.ts +16 -0
- package/dist/quality-gate-status.d.ts.map +1 -0
- package/dist/quality-gate-status.js +16 -0
- package/dist/quality-html.d.ts.map +1 -1
- package/dist/quality-html.js +14 -3
- package/dist/quality-report-coverage.d.ts +26 -0
- package/dist/quality-report-coverage.d.ts.map +1 -0
- package/dist/quality-report-coverage.js +48 -0
- package/dist/quality-report.d.ts +28 -1
- package/dist/quality-report.d.ts.map +1 -1
- package/dist/quality-report.js +263 -35
- package/dist/query-intent-kind.d.ts +18 -0
- package/dist/query-intent-kind.d.ts.map +1 -0
- package/dist/query-intent-kind.js +18 -0
- package/dist/query-intent-result.d.ts +23 -0
- package/dist/query-intent-result.d.ts.map +1 -0
- package/dist/query-intent-result.js +1 -0
- package/dist/query-intent.d.ts +18 -0
- package/dist/query-intent.d.ts.map +1 -0
- package/dist/query-intent.js +336 -0
- package/dist/query-resolver.d.ts +18 -0
- package/dist/query-resolver.d.ts.map +1 -1
- package/dist/query-resolver.js +7 -4
- package/dist/ranked-recommendations.d.ts +36 -0
- package/dist/ranked-recommendations.d.ts.map +1 -0
- package/dist/ranked-recommendations.js +1 -0
- package/dist/ranker-explainability.d.ts.map +1 -1
- package/dist/ranker-explainability.js +38 -10
- package/dist/recommend-recipe.d.ts +17 -0
- package/dist/recommend-recipe.d.ts.map +1 -0
- package/dist/recommend-recipe.js +1 -0
- package/dist/recommend-recipes.d.ts +9 -0
- package/dist/recommend-recipes.d.ts.map +1 -0
- package/dist/recommend-recipes.js +106 -0
- package/dist/recommendation-candidate.d.ts +30 -0
- package/dist/recommendation-candidate.d.ts.map +1 -0
- package/dist/recommendation-candidate.js +1 -0
- package/dist/recommendation-confidence.d.ts +27 -0
- package/dist/recommendation-confidence.d.ts.map +1 -0
- package/dist/recommendation-confidence.js +1 -0
- package/dist/recommendation-ranking-options.d.ts +24 -0
- package/dist/recommendation-ranking-options.d.ts.map +1 -0
- package/dist/recommendation-ranking-options.js +1 -0
- package/dist/recommendation-ranking.d.ts +50 -0
- package/dist/recommendation-ranking.d.ts.map +1 -0
- package/dist/recommendation-ranking.js +527 -0
- package/dist/recommendation-source.d.ts +23 -0
- package/dist/recommendation-source.d.ts.map +1 -0
- package/dist/recommendation-source.js +23 -0
- package/dist/recommendation-suppression.d.ts +14 -0
- package/dist/recommendation-suppression.d.ts.map +1 -0
- package/dist/recommendation-suppression.js +14 -0
- package/dist/reference-asset-kind.d.ts +14 -0
- package/dist/reference-asset-kind.d.ts.map +1 -0
- package/dist/reference-asset-kind.js +14 -0
- package/dist/reference-content-check.d.ts +32 -0
- package/dist/reference-content-check.d.ts.map +1 -0
- package/dist/reference-content-check.js +143 -0
- package/dist/reference-failure.d.ts +31 -0
- package/dist/reference-failure.d.ts.map +1 -0
- package/dist/reference-failure.js +31 -0
- package/dist/reference-id-status.d.ts +15 -0
- package/dist/reference-id-status.d.ts.map +1 -0
- package/dist/reference-id-status.js +15 -0
- package/dist/reference-kind-declarations.d.ts +42 -0
- package/dist/reference-kind-declarations.d.ts.map +1 -0
- package/dist/reference-kind-declarations.js +142 -0
- package/dist/reference-lookup.d.ts +6 -0
- package/dist/reference-lookup.d.ts.map +1 -1
- package/dist/reference-lookup.js +13 -5
- package/dist/reference-registry.d.ts +109 -11
- package/dist/reference-registry.d.ts.map +1 -1
- package/dist/reference-registry.js +186 -30
- package/dist/reference-subject.d.ts +20 -0
- package/dist/reference-subject.d.ts.map +1 -0
- package/dist/reference-subject.js +1 -0
- package/dist/registration-hint-discovery-status.d.ts +25 -0
- package/dist/registration-hint-discovery-status.d.ts.map +1 -0
- package/dist/registration-hint-discovery-status.js +25 -0
- package/dist/registration-hint-registry.d.ts +80 -0
- package/dist/registration-hint-registry.d.ts.map +1 -1
- package/dist/registration-hint-registry.js +356 -138
- package/dist/registry-lifecycle.d.ts +200 -19
- package/dist/registry-lifecycle.d.ts.map +1 -1
- package/dist/registry-lifecycle.js +526 -136
- package/dist/release-readiness.d.ts.map +1 -1
- package/dist/release-readiness.js +10 -7
- package/dist/release-smoke.d.ts.map +1 -1
- package/dist/release-smoke.js +11 -7
- package/dist/report-site.d.ts.map +1 -1
- package/dist/report-site.js +25 -7
- package/dist/repository-intelligence.d.ts.map +1 -1
- package/dist/repository-intelligence.js +3 -2
- package/dist/repository-knowledge-model.d.ts.map +1 -1
- package/dist/repository-knowledge-model.js +18 -5
- package/dist/resolve-project-config.d.ts +64 -0
- package/dist/resolve-project-config.d.ts.map +1 -1
- package/dist/resolve-project-config.js +240 -32
- package/dist/reuse/compute-reuse-coverage.d.ts +29 -0
- package/dist/reuse/compute-reuse-coverage.d.ts.map +1 -0
- package/dist/reuse/compute-reuse-coverage.js +198 -0
- package/dist/reuse/rank-reuse-candidates.d.ts +38 -0
- package/dist/reuse/rank-reuse-candidates.d.ts.map +1 -0
- package/dist/reuse/rank-reuse-candidates.js +212 -0
- package/dist/reuse/rank-reuse-options.d.ts +20 -0
- package/dist/reuse/rank-reuse-options.d.ts.map +1 -0
- package/dist/reuse/rank-reuse-options.js +1 -0
- package/dist/reuse/rank-reuse-suggestions.d.ts +15 -0
- package/dist/reuse/rank-reuse-suggestions.d.ts.map +1 -0
- package/dist/reuse/rank-reuse-suggestions.js +31 -0
- package/dist/reuse/resolve-curated-reuse.d.ts +43 -0
- package/dist/reuse/resolve-curated-reuse.d.ts.map +1 -0
- package/dist/reuse/resolve-curated-reuse.js +115 -0
- package/dist/reuse/reuse-candidate.d.ts +29 -0
- package/dist/reuse/reuse-candidate.d.ts.map +1 -0
- package/dist/reuse/reuse-candidate.js +1 -0
- package/dist/reuse/reuse-coverage-report.d.ts +74 -0
- package/dist/reuse/reuse-coverage-report.d.ts.map +1 -0
- package/dist/reuse/reuse-coverage-report.js +1 -0
- package/dist/reuse/reuse-curated-coverage.d.ts +36 -0
- package/dist/reuse/reuse-curated-coverage.d.ts.map +1 -0
- package/dist/reuse/reuse-curated-coverage.js +1 -0
- package/dist/reuse/reuse-curated-resolution.d.ts +36 -0
- package/dist/reuse/reuse-curated-resolution.d.ts.map +1 -0
- package/dist/reuse/reuse-curated-resolution.js +1 -0
- package/dist/reuse/reuse-curated-status.d.ts +21 -0
- package/dist/reuse/reuse-curated-status.d.ts.map +1 -0
- package/dist/reuse/reuse-curated-status.js +21 -0
- package/dist/reuse/reuse-match-detail.d.ts +15 -0
- package/dist/reuse/reuse-match-detail.d.ts.map +1 -0
- package/dist/reuse/reuse-match-detail.js +1 -0
- package/dist/reuse/reuse-ranking.d.ts +37 -0
- package/dist/reuse/reuse-ranking.d.ts.map +1 -0
- package/dist/reuse/reuse-ranking.js +1 -0
- package/dist/reuse/reuse-suggestion.d.ts +19 -0
- package/dist/reuse/reuse-suggestion.d.ts.map +1 -0
- package/dist/reuse/reuse-suggestion.js +1 -0
- package/dist/reuse/reuse-symbol-lookup.d.ts +28 -0
- package/dist/reuse/reuse-symbol-lookup.d.ts.map +1 -0
- package/dist/reuse/reuse-symbol-lookup.js +1 -0
- package/dist/reuse/reuse-tokenize.d.ts +11 -0
- package/dist/reuse/reuse-tokenize.d.ts.map +1 -0
- package/dist/reuse/reuse-tokenize.js +26 -0
- package/dist/reuse/score-reuse-name.d.ts +16 -0
- package/dist/reuse/score-reuse-name.d.ts.map +1 -0
- package/dist/reuse/score-reuse-name.js +35 -0
- package/dist/reuse/score-reuse-primitive.d.ts +33 -0
- package/dist/reuse/score-reuse-primitive.d.ts.map +1 -0
- package/dist/reuse/score-reuse-primitive.js +92 -0
- package/dist/review-packet.d.ts +2 -0
- package/dist/review-packet.d.ts.map +1 -1
- package/dist/review-packet.js +13 -6
- package/dist/role-views.d.ts.map +1 -1
- package/dist/role-views.js +16 -16
- package/dist/routing-recommends-channels.d.ts +24 -0
- package/dist/routing-recommends-channels.d.ts.map +1 -0
- package/dist/routing-recommends-channels.js +19 -0
- package/dist/run-boundary-check.d.ts +118 -0
- package/dist/run-boundary-check.d.ts.map +1 -0
- package/dist/run-boundary-check.js +592 -0
- package/dist/safety-audit.js +1 -1
- package/dist/scaffold-coverage.js +1 -1
- package/dist/scaffold-pattern-doctor-report.d.ts +19 -0
- package/dist/scaffold-pattern-doctor-report.d.ts.map +1 -0
- package/dist/scaffold-pattern-doctor-report.js +54 -0
- package/dist/scaffold-patterns.d.ts +75 -1
- package/dist/scaffold-patterns.d.ts.map +1 -1
- package/dist/scaffold-patterns.js +375 -84
- package/dist/schema-inventory.d.ts.map +1 -1
- package/dist/schema-inventory.js +4 -3
- package/dist/search-document-id.d.ts +52 -0
- package/dist/search-document-id.d.ts.map +1 -0
- package/dist/search-document-id.js +72 -0
- package/dist/search-document-prefix.d.ts +7 -0
- package/dist/search-document-prefix.d.ts.map +1 -0
- package/dist/search-document-prefix.js +1 -0
- package/dist/search-index.d.ts.map +1 -1
- package/dist/search-index.js +20 -23
- package/dist/search-tuning-explain.d.ts +6 -0
- package/dist/search-tuning-explain.d.ts.map +1 -1
- package/dist/search-tuning-explain.js +19 -17
- package/dist/search-tuning-key-probes.d.ts +16 -0
- package/dist/search-tuning-key-probes.d.ts.map +1 -0
- package/dist/search-tuning-key-probes.js +65 -0
- package/dist/search-tuning-key-resolution.d.ts +25 -0
- package/dist/search-tuning-key-resolution.d.ts.map +1 -0
- package/dist/search-tuning-key-resolution.js +1 -0
- package/dist/search-tuning-key-resolver.d.ts +4 -0
- package/dist/search-tuning-key-resolver.d.ts.map +1 -0
- package/dist/search-tuning-key-resolver.js +107 -0
- package/dist/search-tuning-key-status.d.ts +24 -0
- package/dist/search-tuning-key-status.d.ts.map +1 -0
- package/dist/search-tuning-key-status.js +24 -0
- package/dist/search-tuning-lint.d.ts +9 -0
- package/dist/search-tuning-lint.d.ts.map +1 -0
- package/dist/search-tuning-lint.js +468 -0
- package/dist/search-tuning-registry.d.ts +43 -0
- package/dist/search-tuning-registry.d.ts.map +1 -1
- package/dist/search-tuning-registry.js +214 -49
- package/dist/self-audit.d.ts +12 -0
- package/dist/self-audit.d.ts.map +1 -1
- package/dist/self-audit.js +36 -10
- package/dist/self-config-doctor-v2.d.ts +145 -3
- package/dist/self-config-doctor-v2.d.ts.map +1 -1
- package/dist/self-config-doctor-v2.js +1304 -181
- package/dist/self-config-doctor.d.ts +20 -1
- package/dist/self-config-doctor.d.ts.map +1 -1
- package/dist/self-config-doctor.js +53 -280
- package/dist/settled-unit-states.d.ts +9 -0
- package/dist/settled-unit-states.d.ts.map +1 -0
- package/dist/settled-unit-states.js +14 -0
- package/dist/sharkcraft-inspector.d.ts +34 -0
- package/dist/sharkcraft-inspector.d.ts.map +1 -1
- package/dist/sharkcraft-inspector.js +273 -26
- package/dist/spec/spec-evidence.d.ts.map +1 -1
- package/dist/spec/spec-evidence.js +14 -20
- package/dist/split-identifier.d.ts +21 -0
- package/dist/split-identifier.d.ts.map +1 -0
- package/dist/split-identifier.js +27 -0
- package/dist/start-here.d.ts.map +1 -1
- package/dist/start-here.js +1 -2
- package/dist/substitute-placeholders.d.ts +8 -0
- package/dist/substitute-placeholders.d.ts.map +1 -0
- package/dist/substitute-placeholders.js +9 -0
- package/dist/symbol-index.d.ts +33 -0
- package/dist/symbol-index.d.ts.map +1 -1
- package/dist/symbol-index.js +241 -3
- package/dist/symbol-member-entry.d.ts +26 -0
- package/dist/symbol-member-entry.d.ts.map +1 -0
- package/dist/symbol-member-entry.js +1 -0
- package/dist/symbol-member-kind.d.ts +14 -0
- package/dist/symbol-member-kind.d.ts.map +1 -0
- package/dist/symbol-member-kind.js +14 -0
- package/dist/task-packet.d.ts.map +1 -1
- package/dist/task-packet.js +52 -9
- package/dist/task-ranker.d.ts +8 -0
- package/dist/task-ranker.d.ts.map +1 -1
- package/dist/task-ranker.js +25 -13
- package/dist/task-risk.js +1 -1
- package/dist/task-routing-hint-registry.d.ts +20 -1
- package/dist/task-routing-hint-registry.d.ts.map +1 -1
- package/dist/task-routing-hint-registry.js +186 -42
- package/dist/template-drift.d.ts.map +1 -1
- package/dist/template-drift.js +30 -9
- package/dist/template-lint.d.ts.map +1 -1
- package/dist/template-lint.js +160 -2
- package/dist/term-query.d.ts +10 -0
- package/dist/term-query.d.ts.map +1 -0
- package/dist/term-query.js +1 -0
- package/dist/test-definitions.d.ts +6 -3
- package/dist/test-definitions.d.ts.map +1 -1
- package/dist/test-runner.d.ts +95 -10
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +309 -308
- package/dist/tuning-query-tokens.d.ts +29 -0
- package/dist/tuning-query-tokens.d.ts.map +1 -0
- package/dist/tuning-query-tokens.js +51 -0
- package/dist/typecheck-files.d.ts +36 -0
- package/dist/typecheck-files.d.ts.map +1 -0
- package/dist/typecheck-files.js +158 -0
- package/dist/uncertainty.js +1 -1
- package/dist/universal-search.d.ts.map +1 -1
- package/dist/universal-search.js +5 -3
- package/dist/unregistered-exports.d.ts +19 -0
- package/dist/unregistered-exports.d.ts.map +1 -0
- package/dist/unregistered-exports.js +141 -0
- package/dist/unresolvable-reason.d.ts +11 -0
- package/dist/unresolvable-reason.d.ts.map +1 -0
- package/dist/unresolvable-reason.js +11 -0
- package/dist/upgrade-advisor.d.ts.map +1 -1
- package/dist/upgrade-advisor.js +16 -9
- package/dist/validate-contribution-file.d.ts +4 -0
- package/dist/validate-contribution-file.d.ts.map +1 -0
- package/dist/validate-contribution-file.js +228 -0
- package/dist/why-file.d.ts +3 -0
- package/dist/why-file.d.ts.map +1 -1
- package/dist/why-file.js +7 -3
- package/package.json +17 -17
package/dist/custom-checks.js
CHANGED
|
@@ -10,6 +10,15 @@
|
|
|
10
10
|
* `metadata.checks: ICustomCheckDescriptor[]`. The engine never invents
|
|
11
11
|
* a check; we only inventory what authors declare.
|
|
12
12
|
*
|
|
13
|
+
* WHAT IS SCANNED: `type: 'rule'` entries ({@link isRuleEntry} — the same set
|
|
14
|
+
* `shrk rules list` shows) loaded from TypeScript knowledge / rule files, local
|
|
15
|
+
* or pack. A declaration anywhere else is REPORTED, never silently skipped:
|
|
16
|
+
* - `metadata.checks` on a non-rule entry → `ignored`;
|
|
17
|
+
* - a Markdown rule whose frontmatter held `metadata` (the Markdown loader
|
|
18
|
+
* does not read it) → `ignored`;
|
|
19
|
+
* - a non-array `metadata.checks` on a rule → `invalid`.
|
|
20
|
+
* Each is a declared check that can never run — a doctor error.
|
|
21
|
+
*
|
|
13
22
|
* Hard rules:
|
|
14
23
|
* - No spawning a process by default.
|
|
15
24
|
* - Read-only inventory unless `--execute` is set explicitly.
|
|
@@ -19,7 +28,8 @@
|
|
|
19
28
|
import { spawnSync } from 'node:child_process';
|
|
20
29
|
import { existsSync, readFileSync } from 'node:fs';
|
|
21
30
|
import * as nodePath from 'node:path';
|
|
22
|
-
import {
|
|
31
|
+
import { unsupportedFrontmatterKeys } from '@shrkcrft/knowledge';
|
|
32
|
+
import { isRuleEntry } from '@shrkcrft/rules';
|
|
23
33
|
export const CUSTOM_CHECK_REPORT_SCHEMA = 'sharkcraft.custom-check/v1';
|
|
24
34
|
export const CUSTOM_CHECKS_REGISTRY_SCHEMA = 'sharkcraft.custom-checks-registry/v1';
|
|
25
35
|
export var CustomCheckScope;
|
|
@@ -56,6 +66,7 @@ export var CustomCheckStatus;
|
|
|
56
66
|
CustomCheckStatus["Skipped"] = "skipped";
|
|
57
67
|
})(CustomCheckStatus || (CustomCheckStatus = {}));
|
|
58
68
|
const ID_RE = /^[a-z][a-z0-9.-]+$/;
|
|
69
|
+
const TS_SOURCE_RE = /\.(?:ts|tsx|js|mjs|cjs)$/;
|
|
59
70
|
/** Read the descriptors a rule declares under `metadata.checks`. */
|
|
60
71
|
export function readDescriptorsFromRule(rule) {
|
|
61
72
|
const md = rule.metadata;
|
|
@@ -64,25 +75,99 @@ export function readDescriptorsFromRule(rule) {
|
|
|
64
75
|
return [];
|
|
65
76
|
return raw.map((r) => ({ ...r, ownerRuleId: rule.id }));
|
|
66
77
|
}
|
|
67
|
-
|
|
78
|
+
function describeType(value) {
|
|
79
|
+
if (value === null)
|
|
80
|
+
return 'null';
|
|
81
|
+
if (Array.isArray(value))
|
|
82
|
+
return 'array';
|
|
83
|
+
return typeof value;
|
|
84
|
+
}
|
|
85
|
+
/** The string ids of a declared `metadata.checks` value (whatever its shape). */
|
|
86
|
+
function declaredCheckIds(raw) {
|
|
87
|
+
if (!Array.isArray(raw)) {
|
|
88
|
+
const id = raw && typeof raw === 'object' ? raw.id : undefined;
|
|
89
|
+
return typeof id === 'string' ? [id] : [];
|
|
90
|
+
}
|
|
91
|
+
return raw
|
|
92
|
+
.map((d) => (d && typeof d === 'object' ? d.id : undefined))
|
|
93
|
+
.filter((id) => typeof id === 'string');
|
|
94
|
+
}
|
|
95
|
+
function relativeSource(origin, projectRoot) {
|
|
96
|
+
if (!origin)
|
|
97
|
+
return undefined;
|
|
98
|
+
if (!projectRoot || !nodePath.isAbsolute(origin))
|
|
99
|
+
return origin;
|
|
100
|
+
return nodePath.relative(projectRoot, origin).split(nodePath.sep).join('/');
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Did this Markdown file's frontmatter declare `metadata` holding `checks`?
|
|
104
|
+
* Read through the Markdown loader's own "what did I drop" authority.
|
|
105
|
+
*/
|
|
106
|
+
function markdownDroppedChecks(origin) {
|
|
107
|
+
if (!origin || !existsSync(origin))
|
|
108
|
+
return false;
|
|
109
|
+
let text;
|
|
110
|
+
try {
|
|
111
|
+
text = readFileSync(origin, 'utf8');
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
return unsupportedFrontmatterKeys(text).some((k) => k.key === 'metadata' && /\bchecks\b/.test(k.block));
|
|
117
|
+
}
|
|
118
|
+
export function buildCustomChecksRegistry(entries, options = {}) {
|
|
68
119
|
const out = [];
|
|
69
120
|
const idIndex = new Map();
|
|
70
121
|
const invalid = [];
|
|
122
|
+
const ignored = [];
|
|
123
|
+
let scannedRules = 0;
|
|
71
124
|
for (const e of entries) {
|
|
72
|
-
|
|
125
|
+
const source = relativeSource(e.source?.origin, options.projectRoot);
|
|
126
|
+
const at = source ? { source } : {};
|
|
127
|
+
const raw = e.metadata?.['checks'];
|
|
128
|
+
if (!isRuleEntry(e)) {
|
|
129
|
+
if (raw !== undefined) {
|
|
130
|
+
ignored.push({
|
|
131
|
+
entryId: e.id,
|
|
132
|
+
entryType: String(e.type),
|
|
133
|
+
...at,
|
|
134
|
+
reason: `metadata.checks on a type:'${String(e.type)}' entry is not scanned — only type:'rule' entries carry checks (set type: 'rule', or move the checks onto a rule)`,
|
|
135
|
+
checkIds: declaredCheckIds(raw),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
scannedRules += 1;
|
|
141
|
+
if (e.source?.loader === 'markdown') {
|
|
142
|
+
if (markdownDroppedChecks(e.source.origin)) {
|
|
143
|
+
ignored.push({
|
|
144
|
+
entryId: e.id,
|
|
145
|
+
entryType: String(e.type),
|
|
146
|
+
...at,
|
|
147
|
+
reason: 'Markdown rule — the Markdown loader does not support metadata, so its metadata.checks were dropped; declare the rule (with its checks) in a TypeScript rule file',
|
|
148
|
+
checkIds: [],
|
|
149
|
+
});
|
|
150
|
+
}
|
|
73
151
|
continue;
|
|
152
|
+
}
|
|
153
|
+
if (raw === undefined)
|
|
154
|
+
continue;
|
|
155
|
+
if (!Array.isArray(raw)) {
|
|
156
|
+
invalid.push({ ruleId: e.id, reason: `metadata.checks must be an array (got ${describeType(raw)})`, ...at });
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
74
159
|
const descriptors = readDescriptorsFromRule(e);
|
|
75
160
|
for (const d of descriptors) {
|
|
76
161
|
const warnings = [];
|
|
77
162
|
if (!d.id || typeof d.id !== 'string') {
|
|
78
|
-
invalid.push({ ruleId: e.id, reason: 'check entry missing string id' });
|
|
163
|
+
invalid.push({ ruleId: e.id, reason: 'check entry missing string id', ...at });
|
|
79
164
|
continue;
|
|
80
165
|
}
|
|
81
166
|
if (!ID_RE.test(d.id)) {
|
|
82
167
|
warnings.push(`id "${d.id}" should match ${ID_RE.source}`);
|
|
83
168
|
}
|
|
84
169
|
if (!d.command || typeof d.command !== 'string') {
|
|
85
|
-
invalid.push({ ruleId: e.id, reason: `check "${d.id}" missing command
|
|
170
|
+
invalid.push({ ruleId: e.id, reason: `check "${d.id}" missing command`, checkId: d.id, ...at });
|
|
86
171
|
continue;
|
|
87
172
|
}
|
|
88
173
|
if (d.output === CustomCheckOutput.Json && !d.reportPath) {
|
|
@@ -108,12 +193,77 @@ export function buildCustomChecksRegistry(entries) {
|
|
|
108
193
|
entries: out,
|
|
109
194
|
duplicates,
|
|
110
195
|
invalid,
|
|
196
|
+
ignored,
|
|
197
|
+
scannedRules,
|
|
111
198
|
};
|
|
112
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Every declaration the registry saw: registered + invalid + ignored (an
|
|
202
|
+
* ignored entry whose ids are unreadable still counts as one). The `expected`
|
|
203
|
+
* of the doctor's coverage — 0 means nothing was declared at all.
|
|
204
|
+
*/
|
|
205
|
+
export function declaredCustomCheckCount(registry) {
|
|
206
|
+
return (registry.entries.length +
|
|
207
|
+
registry.invalid.length +
|
|
208
|
+
registry.ignored.reduce((n, i) => n + Math.max(1, i.checkIds.length), 0));
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* The concrete surface the custom-checks registry scans: local `ruleFiles` /
|
|
212
|
+
* `knowledgeFiles` / `docsFiles` and every valid pack's `ruleFiles` /
|
|
213
|
+
* `knowledgeFiles` — split into TypeScript (scanned) and Markdown (cannot
|
|
214
|
+
* carry metadata).
|
|
215
|
+
*/
|
|
216
|
+
export function customCheckScanSurface(inspection) {
|
|
217
|
+
const files = [];
|
|
218
|
+
const markdownFiles = [];
|
|
219
|
+
const add = (abs, via) => {
|
|
220
|
+
// The loaders skip a configured file that does not exist (the config's
|
|
221
|
+
// default docsFiles, a stale entry) — so does the surface they read.
|
|
222
|
+
if (!existsSync(abs))
|
|
223
|
+
return;
|
|
224
|
+
const file = nodePath.relative(inspection.projectRoot, abs).split(nodePath.sep).join('/') || abs;
|
|
225
|
+
if (TS_SOURCE_RE.test(abs))
|
|
226
|
+
files.push({ file, via });
|
|
227
|
+
else if (abs.toLowerCase().endsWith('.md'))
|
|
228
|
+
markdownFiles.push(file);
|
|
229
|
+
};
|
|
230
|
+
const cfg = inspection.config;
|
|
231
|
+
if (cfg && inspection.sharkcraftDir) {
|
|
232
|
+
for (const key of ['ruleFiles', 'knowledgeFiles', 'docsFiles']) {
|
|
233
|
+
for (const rel of cfg[key] ?? [])
|
|
234
|
+
add(nodePath.resolve(inspection.sharkcraftDir, rel), key);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
for (const pack of inspection.packs.validPacks ?? []) {
|
|
238
|
+
const c = pack.manifest?.contributions;
|
|
239
|
+
for (const key of ['ruleFiles', 'knowledgeFiles']) {
|
|
240
|
+
for (const rel of c?.[key] ?? [])
|
|
241
|
+
add(nodePath.resolve(pack.packageRoot, rel), `pack ${pack.packageName} ${key}`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const markdownRules = inspection.knowledgeEntries.filter((e) => isRuleEntry(e) && e.source?.loader === 'markdown').length;
|
|
245
|
+
return { files, markdownFiles, markdownRules };
|
|
246
|
+
}
|
|
113
247
|
export function doctorCustomChecks(registry) {
|
|
114
248
|
const details = [];
|
|
115
249
|
for (const inv of registry.invalid) {
|
|
116
|
-
details.push({
|
|
250
|
+
details.push({
|
|
251
|
+
ruleId: inv.ruleId,
|
|
252
|
+
checkId: inv.checkId ?? '(invalid)',
|
|
253
|
+
severity: 'error',
|
|
254
|
+
message: inv.reason,
|
|
255
|
+
...(inv.source ? { source: inv.source } : {}),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
// A declared check that can never run is a defect, not a footnote.
|
|
259
|
+
for (const ig of registry.ignored) {
|
|
260
|
+
details.push({
|
|
261
|
+
ruleId: ig.entryId,
|
|
262
|
+
checkId: ig.checkIds.join(',') || '(ignored)',
|
|
263
|
+
severity: 'error',
|
|
264
|
+
message: ig.reason,
|
|
265
|
+
...(ig.source ? { source: ig.source } : {}),
|
|
266
|
+
});
|
|
117
267
|
}
|
|
118
268
|
for (const dup of registry.duplicates) {
|
|
119
269
|
details.push({
|
|
@@ -139,6 +289,9 @@ export function doctorCustomChecks(registry) {
|
|
|
139
289
|
totalChecks: registry.entries.length,
|
|
140
290
|
warnings: details.filter((d) => d.severity === 'warning').length,
|
|
141
291
|
errors: details.filter((d) => d.severity === 'error').length,
|
|
292
|
+
declaredChecks: declaredCustomCheckCount(registry),
|
|
293
|
+
ignored: registry.ignored.length,
|
|
294
|
+
scannedRules: registry.scannedRules,
|
|
142
295
|
details,
|
|
143
296
|
};
|
|
144
297
|
}
|
|
@@ -32,6 +32,12 @@ export declare function buildDashboardPipelines(inspection: ISharkcraftInspectio
|
|
|
32
32
|
export declare function buildDashboardSessions(projectRoot: string): IDashboardSessionsResponse;
|
|
33
33
|
export declare function buildDashboardSessionDetail(projectRoot: string, sessionId: string): IDashboardSessionDetailResponse;
|
|
34
34
|
export declare function buildDashboardArchitecture(inspection: ISharkcraftInspection): IDashboardArchitectureResponse;
|
|
35
|
+
/**
|
|
36
|
+
* The boundary panel (round 13, V1-U2): THE boundary orchestrator's verdict —
|
|
37
|
+
* the one `shrk check boundaries` prints. The panel used to return no
|
|
38
|
+
* violations unconditionally and render "No active violations." over any
|
|
39
|
+
* state, a failing gate included; `summary` now says what the check found.
|
|
40
|
+
*/
|
|
35
41
|
export declare function buildDashboardBoundaries(inspection: ISharkcraftInspection): IDashboardBoundaryResponse;
|
|
36
42
|
export declare function buildDashboardDrift(inspection: ISharkcraftInspection): IDashboardDriftResponse;
|
|
37
43
|
export declare function buildDashboardCoverage(inspection: ISharkcraftInspection): IDashboardCoverageResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-data.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-data.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,0BAA0B,EAC1B,8BAA8B,EAC9B,0BAA0B,EAC1B,8BAA8B,EAC9B,0BAA0B,EAC1B,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,2BAA2B,EAC3B,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,+BAA+B,EAC/B,0BAA0B,EAC1B,uBAAuB,EAIxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard-data.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,9 +13,13 @@ import { existsSync, statSync } from 'node:fs';
|
|
|
13
13
|
import * as nodePath from 'node:path';
|
|
14
14
|
import { buildAiReadinessReport } from "../ai-readiness.js";
|
|
15
15
|
import { runDoctor } from "../sharkcraft-inspector.js";
|
|
16
|
+
import { doctorVerdict } from "../doctor-verdict.js";
|
|
17
|
+
import { DoctorVerdictKind } from "../doctor-verdict-kind.js";
|
|
18
|
+
import { qualityGateStatus } from "../quality-gate-row-status.js";
|
|
16
19
|
import { DoctorSeverity } from "../doctor-result.js";
|
|
17
20
|
import { buildCoverageReport } from "../coverage-report.js";
|
|
18
21
|
import { buildDriftReport } from "../drift.js";
|
|
22
|
+
import { runBoundaryCheck } from "../run-boundary-check.js";
|
|
19
23
|
import { buildKnowledgeGraph, findGraphPath, getGraphNode } from "../knowledge-graph.js";
|
|
20
24
|
import { buildOnboardingPlan } from "../onboarding.js";
|
|
21
25
|
import { ADOPTION_STATE_SCHEMA, adoptionDir, computeAdoptionFreshness, readAdoptionState, } from "../adoption-state.js";
|
|
@@ -126,8 +130,17 @@ export function buildDashboardDoctor(inspection) {
|
|
|
126
130
|
...(c.fix ? { fix: c.fix } : {}),
|
|
127
131
|
};
|
|
128
132
|
});
|
|
133
|
+
// THE doctor settlement (`doctorVerdict`), the one `shrk doctor`, `shrk
|
|
134
|
+
// check` and MCP read: a setup the doctor could not fully verify (a compiled
|
|
135
|
+
// pack build with no build record) is `not-verified`, never `ready`.
|
|
136
|
+
const settled = doctorVerdict(doctor);
|
|
129
137
|
return {
|
|
130
|
-
verdict:
|
|
138
|
+
verdict: settled.verdict === DoctorVerdictKind.Ready
|
|
139
|
+
? 'ready'
|
|
140
|
+
: settled.verdict === DoctorVerdictKind.NotVerified
|
|
141
|
+
? 'not-verified'
|
|
142
|
+
: 'not-ready',
|
|
143
|
+
...(settled.shortfalls.length > 0 ? { shortfalls: settled.shortfalls } : {}),
|
|
131
144
|
readinessScore: buildAiReadinessReport(inspection).score,
|
|
132
145
|
checks,
|
|
133
146
|
summary: doctor.summary,
|
|
@@ -147,7 +160,9 @@ export async function buildDashboardQuality(inspection, options) {
|
|
|
147
160
|
readiness: report.overall,
|
|
148
161
|
gates: report.gates.map((g) => ({
|
|
149
162
|
id: g.id,
|
|
150
|
-
status
|
|
163
|
+
// THE row status (`qualityGateStatus`): never `pass` over a gate that
|
|
164
|
+
// passed over part of its scope, or could not run.
|
|
165
|
+
status: qualityGateStatus(g),
|
|
151
166
|
...(g.notes && g.notes.length > 0 ? { message: g.notes.join('; ') } : {}),
|
|
152
167
|
})),
|
|
153
168
|
blockers: report.gates.filter((g) => !g.passed && g.blocking).map((g) => g.label),
|
|
@@ -313,13 +328,89 @@ export function buildDashboardArchitecture(inspection) {
|
|
|
313
328
|
coverage: buildDashboardCoverage(inspection),
|
|
314
329
|
};
|
|
315
330
|
}
|
|
331
|
+
/**
|
|
332
|
+
* The boundary panel (round 13, V1-U2): THE boundary orchestrator's verdict —
|
|
333
|
+
* the one `shrk check boundaries` prints. The panel used to return no
|
|
334
|
+
* violations unconditionally and render "No active violations." over any
|
|
335
|
+
* state, a failing gate included; `summary` now says what the check found.
|
|
336
|
+
*/
|
|
316
337
|
export function buildDashboardBoundaries(inspection) {
|
|
317
338
|
const rules = inspection.boundaryRegistry.list();
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
339
|
+
const loadIssues = inspection.boundaryLoadIssues ?? [];
|
|
340
|
+
if (rules.length === 0 && loadIssues.length === 0) {
|
|
341
|
+
return {
|
|
342
|
+
available: false,
|
|
343
|
+
violations: [],
|
|
344
|
+
ruleCount: 0,
|
|
345
|
+
verdict: 'not-verified',
|
|
346
|
+
exitCode: 2,
|
|
347
|
+
summary: 'No boundary rules loaded — nothing was checked.',
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
try {
|
|
351
|
+
const r = runBoundaryCheck(inspection);
|
|
352
|
+
return {
|
|
353
|
+
available: true,
|
|
354
|
+
violations: r.violations.map((v, i) => ({
|
|
355
|
+
id: `${v.ruleId}:${v.file}:${v.line}:${i}`,
|
|
356
|
+
from: `${v.file}:${v.line}`,
|
|
357
|
+
to: v.importSpecifier,
|
|
358
|
+
rule: v.ruleId,
|
|
359
|
+
severity: v.severity,
|
|
360
|
+
message: v.message,
|
|
361
|
+
})),
|
|
362
|
+
ruleCount: rules.length,
|
|
363
|
+
verdict: r.verdict,
|
|
364
|
+
exitCode: r.exitCode,
|
|
365
|
+
summary: dashboardBoundarySummary(r),
|
|
366
|
+
deadUnitCount: r.deadUnits.length,
|
|
367
|
+
intendedEmptyCount: r.intendedEmpty.length,
|
|
368
|
+
wentLiveCount: r.wentLive.length,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
catch (e) {
|
|
372
|
+
return {
|
|
373
|
+
available: true,
|
|
374
|
+
violations: [],
|
|
375
|
+
ruleCount: rules.length,
|
|
376
|
+
verdict: 'not-verified',
|
|
377
|
+
exitCode: 2,
|
|
378
|
+
summary: `Boundary scan failed — nothing was checked: ${e.message}`,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/** One sentence for the boundary panel, from the settled verdict — never "no violations" over a failing or unverified run. */
|
|
383
|
+
function dashboardBoundarySummary(r) {
|
|
384
|
+
const notes = [];
|
|
385
|
+
if (r.deadUnits.length > 0)
|
|
386
|
+
notes.push(`${r.deadUnits.length} dead selector unit(s)`);
|
|
387
|
+
if (r.wentLive.length > 0)
|
|
388
|
+
notes.push(`${r.wentLive.length} expectEmpty marker(s) went live`);
|
|
389
|
+
// "accepted" only when the settle accepted them — an acceptance exists at exit
|
|
390
|
+
// 0 alone (`r.accepted`); a failing or unverified run holds the same units as
|
|
391
|
+
// intended empty, the word finish's boundaries sub-gate uses.
|
|
392
|
+
if (r.intendedEmpty.length > 0) {
|
|
393
|
+
notes.push(r.exitCode === 0 && r.accepted.length > 0
|
|
394
|
+
? `${r.intendedEmpty.length} expectEmpty unit(s) accepted`
|
|
395
|
+
: `${r.intendedEmpty.length} expectEmpty unit(s) intended empty`);
|
|
396
|
+
}
|
|
397
|
+
const tail = notes.length > 0 ? ` (${notes.join('; ')})` : '';
|
|
398
|
+
if (r.exitCode === 0)
|
|
399
|
+
return `No active violations — ${r.rules.length} rule(s) checked.${tail}`;
|
|
400
|
+
if (r.exitCode === 1) {
|
|
401
|
+
const parts = [];
|
|
402
|
+
if (r.violations.length > 0)
|
|
403
|
+
parts.push(`${r.violations.length} violation(s)`);
|
|
404
|
+
if (r.loadIssues.length > 0)
|
|
405
|
+
parts.push(`${r.loadIssues.length} errored rule(s)`);
|
|
406
|
+
if (r.staleExceptions.length > 0)
|
|
407
|
+
parts.push(`${r.staleExceptions.length} stale exception(s)`);
|
|
408
|
+
const onEmpty = r.rules.filter((x) => x.failedOnEmpty === true).length;
|
|
409
|
+
if (onEmpty > 0)
|
|
410
|
+
parts.push(`${onEmpty} rule(s) matched nothing (failOnEmpty)`);
|
|
411
|
+
return `Boundary check needs attention — ${parts.join(', ') || 'see `shrk check boundaries`'}.${tail}`;
|
|
412
|
+
}
|
|
413
|
+
return `NOT VERIFIED — ${r.shortfalls[0] ?? 'part of the boundary scope was never examined'}.${tail}`;
|
|
323
414
|
}
|
|
324
415
|
export function buildDashboardDrift(inspection) {
|
|
325
416
|
const drift = buildDriftReport(inspection);
|
|
@@ -508,7 +599,7 @@ export function buildDashboardReview(_inspection, options) {
|
|
|
508
599
|
suggestedChecks: [],
|
|
509
600
|
artifacts: [],
|
|
510
601
|
commandHints: [
|
|
511
|
-
commandHint('shrk review
|
|
602
|
+
commandHint('shrk review packet --since main', 'Generate a review packet from a diff', 'read-only'),
|
|
512
603
|
],
|
|
513
604
|
};
|
|
514
605
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-knowledge.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-knowledge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,gCAAgC,EAGhC,gCAAgC,EAEhC,+BAA+B,EAG/B,kCAAkC,EAGnC,MAAM,yBAAyB,CAAC;AAQjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAuHxE,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,qBAAqB,GAChC,+BAA+B,CAoBjC;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,qBAAqB,EACjC,EAAE,EAAE,MAAM,GACT,gCAAgC,CAkDlC;AAKD,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,qBAAqB,GAChC,gCAAgC,
|
|
1
|
+
{"version":3,"file":"dashboard-knowledge.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-knowledge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,gCAAgC,EAGhC,gCAAgC,EAEhC,+BAA+B,EAG/B,kCAAkC,EAGnC,MAAM,yBAAyB,CAAC;AAQjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAuHxE,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,qBAAqB,GAChC,+BAA+B,CAoBjC;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,qBAAqB,EACjC,EAAE,EAAE,MAAM,GACT,gCAAgC,CAkDlC;AAKD,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,qBAAqB,GAChC,gCAAgC,CAyDlC;AAED,gFAAgF;AAChF,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,qBAAqB,EACjC,EAAE,EAAE,MAAM,GACT,kCAAkC,CAqBpC"}
|
|
@@ -209,9 +209,15 @@ export function buildDashboardKnowledgeGraph(inspection) {
|
|
|
209
209
|
seen.add(key);
|
|
210
210
|
edges.push({ from, to, kind });
|
|
211
211
|
};
|
|
212
|
-
// Semantic edges: explicit cross-references.
|
|
212
|
+
// Semantic edges: explicit cross-references. One whose target is not an entry
|
|
213
|
+
// in the drawn set (a dangling id, a non-knowledge id, or an entry outside the
|
|
214
|
+
// node cap) is not drawn — but it is COUNTED, so the graph never reads as
|
|
215
|
+
// complete while it silently lost edges.
|
|
216
|
+
let droppedEdges = 0;
|
|
213
217
|
for (const e of entries) {
|
|
214
218
|
for (const t of [...(e.related ?? []), ...(e.actionHints?.relatedKnowledge ?? [])]) {
|
|
219
|
+
if (t !== e.id && !ids.has(t))
|
|
220
|
+
droppedEdges += 1;
|
|
215
221
|
addEdge(e.id, t, 'related');
|
|
216
222
|
}
|
|
217
223
|
}
|
|
@@ -230,7 +236,13 @@ export function buildDashboardKnowledgeGraph(inspection) {
|
|
|
230
236
|
addEdge(group[i - 1], group[i], 'scope');
|
|
231
237
|
}
|
|
232
238
|
}
|
|
233
|
-
return {
|
|
239
|
+
return {
|
|
240
|
+
available: entries.length > 0,
|
|
241
|
+
nodes,
|
|
242
|
+
edges,
|
|
243
|
+
truncated,
|
|
244
|
+
...(droppedEdges > 0 ? { droppedEdges } : {}),
|
|
245
|
+
};
|
|
234
246
|
}
|
|
235
247
|
/** Relevance-ranked "more like this" for one entry (lexical, deterministic). */
|
|
236
248
|
export function buildDashboardKnowledgeSimilar(inspection, id) {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { ISharkcraftInspection } from './sharkcraft-inspector.js';
|
|
2
|
+
import { type IRejectedEntry } from '@shrkcrft/core';
|
|
3
|
+
import type { IContributionFileIssue } from './i-contribution-file-issue.js';
|
|
2
4
|
export declare const DECISION_RECORD_SCHEMA = "sharkcraft.decision/v1";
|
|
3
5
|
export declare enum DecisionStatus {
|
|
4
6
|
Proposed = "proposed",
|
|
@@ -18,6 +20,8 @@ export interface IDecisionRecord {
|
|
|
18
20
|
relatedPolicies: readonly string[];
|
|
19
21
|
relatedConstructs: readonly string[];
|
|
20
22
|
relatedFiles: readonly string[];
|
|
23
|
+
/** Commands the decision relates to (TS decisions only) — probed by the self-config doctor. */
|
|
24
|
+
relatedCommands?: readonly string[];
|
|
21
25
|
date: string;
|
|
22
26
|
sourceFile?: string;
|
|
23
27
|
}
|
|
@@ -35,12 +39,28 @@ export interface IDecisionDraftInput {
|
|
|
35
39
|
date?: string;
|
|
36
40
|
}
|
|
37
41
|
export declare function listDecisions(inspection: ISharkcraftInspection): readonly IDecisionRecord[];
|
|
42
|
+
/**
|
|
43
|
+
* THE TS-decision acceptance predicate (round 12, 12.1): a non-empty string
|
|
44
|
+
* `id` — `[]` means accepted. An id-less decision used to be dropped with no
|
|
45
|
+
* signal (`if (!rec?.id) return`).
|
|
46
|
+
*/
|
|
47
|
+
export declare function decisionRejectionReasons(raw: unknown): readonly string[];
|
|
38
48
|
/**
|
|
39
49
|
* Async warm-up for `sharkcraft/decisions.ts` and pack-contributed
|
|
40
50
|
* decisions. Call this before `listDecisions` if you want TS decisions
|
|
41
51
|
* folded in.
|
|
42
52
|
*/
|
|
43
53
|
export declare function loadTsDecisions(inspection: ISharkcraftInspection): Promise<readonly IDecisionRecord[]>;
|
|
54
|
+
/**
|
|
55
|
+
* {@link loadTsDecisions} with what did not take effect (round 12, 12.1): a
|
|
56
|
+
* decision file that failed to import (it used to be swallowed to `[]`), and
|
|
57
|
+
* every declared decision the loader refused — invalid, or a duplicate id.
|
|
58
|
+
*/
|
|
59
|
+
export declare function loadTsDecisionsWithIssues(inspection: ISharkcraftInspection): Promise<{
|
|
60
|
+
readonly decisions: readonly IDecisionRecord[];
|
|
61
|
+
readonly issues: readonly IContributionFileIssue[];
|
|
62
|
+
readonly rejected: readonly IRejectedEntry[];
|
|
63
|
+
}>;
|
|
44
64
|
export declare function getDecision(inspection: ISharkcraftInspection, id: string): IDecisionRecord | undefined;
|
|
45
65
|
export declare function previewDecisionDraft(input: IDecisionDraftInput): string;
|
|
46
66
|
export declare function decisionDraftTargetPath(projectRoot: string, id: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-records.d.ts","sourceRoot":"","sources":["../src/decision-records.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"decision-records.d.ts","sourceRoot":"","sources":["../src/decision-records.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE7E,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D,oBAAY,cAAc;IACxB,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,sBAAsB,CAAC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,+FAA+F;IAC/F,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA8CD,wBAAgB,aAAa,CAAC,UAAU,EAAE,qBAAqB,GAAG,SAAS,eAAe,EAAE,CA2D3F;AA0BD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAIxE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAErC;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,UAAU,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAC1F,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CAC9C,CAAC,CAuED;AAaD,wBAAgB,WAAW,CAAC,UAAU,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEtG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CA0CvE;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/E"}
|
package/dist/decision-records.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
12
12
|
import * as nodePath from 'node:path';
|
|
13
|
-
import { importModuleViaLoader } from '@shrkcrft/core';
|
|
13
|
+
import { importModuleViaLoader, RejectionCause } from '@shrkcrft/core';
|
|
14
14
|
export const DECISION_RECORD_SCHEMA = 'sharkcraft.decision/v1';
|
|
15
15
|
export var DecisionStatus;
|
|
16
16
|
(function (DecisionStatus) {
|
|
@@ -135,18 +135,55 @@ const TS_DECISION_CACHE = new Map();
|
|
|
135
135
|
function getTsDecisionsCached(projectRoot) {
|
|
136
136
|
return TS_DECISION_CACHE.get(projectRoot) ?? [];
|
|
137
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* THE TS-decision acceptance predicate (round 12, 12.1): a non-empty string
|
|
140
|
+
* `id` — `[]` means accepted. An id-less decision used to be dropped with no
|
|
141
|
+
* signal (`if (!rec?.id) return`).
|
|
142
|
+
*/
|
|
143
|
+
export function decisionRejectionReasons(raw) {
|
|
144
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
145
|
+
return ['(entry): must be an object'];
|
|
146
|
+
const id = raw.id;
|
|
147
|
+
return typeof id === 'string' && id.length > 0 ? [] : ['id: must be a non-empty string'];
|
|
148
|
+
}
|
|
138
149
|
/**
|
|
139
150
|
* Async warm-up for `sharkcraft/decisions.ts` and pack-contributed
|
|
140
151
|
* decisions. Call this before `listDecisions` if you want TS decisions
|
|
141
152
|
* folded in.
|
|
142
153
|
*/
|
|
143
154
|
export async function loadTsDecisions(inspection) {
|
|
155
|
+
return (await loadTsDecisionsWithIssues(inspection)).decisions;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* {@link loadTsDecisions} with what did not take effect (round 12, 12.1): a
|
|
159
|
+
* decision file that failed to import (it used to be swallowed to `[]`), and
|
|
160
|
+
* every declared decision the loader refused — invalid, or a duplicate id.
|
|
161
|
+
*/
|
|
162
|
+
export async function loadTsDecisionsWithIssues(inspection) {
|
|
144
163
|
const out = [];
|
|
145
|
-
const
|
|
146
|
-
const
|
|
147
|
-
|
|
164
|
+
const issues = [];
|
|
165
|
+
const rejected = [];
|
|
166
|
+
const seen = new Map();
|
|
167
|
+
const addInput = (raw, source, index) => {
|
|
168
|
+
const reasons = decisionRejectionReasons(raw);
|
|
169
|
+
if (reasons.length > 0) {
|
|
170
|
+
rejected.push({ file: source, index, exportName: 'default', reasons, cause: RejectionCause.Invalid });
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const rec = raw;
|
|
174
|
+
const prev = seen.get(rec.id);
|
|
175
|
+
if (prev !== undefined) {
|
|
176
|
+
rejected.push({
|
|
177
|
+
file: source,
|
|
178
|
+
index,
|
|
179
|
+
exportName: 'default',
|
|
180
|
+
entryId: rec.id,
|
|
181
|
+
reasons: [`id: "${rec.id}" is already declared in ${prev}`],
|
|
182
|
+
cause: RejectionCause.DuplicateId,
|
|
183
|
+
});
|
|
148
184
|
return;
|
|
149
|
-
|
|
185
|
+
}
|
|
186
|
+
seen.set(rec.id, source);
|
|
150
187
|
out.push({
|
|
151
188
|
schema: DECISION_RECORD_SCHEMA,
|
|
152
189
|
id: rec.id,
|
|
@@ -159,40 +196,51 @@ export async function loadTsDecisions(inspection) {
|
|
|
159
196
|
relatedPolicies: rec.relatedPolicies ?? [],
|
|
160
197
|
relatedConstructs: rec.relatedConstructs ?? [],
|
|
161
198
|
relatedFiles: rec.relatedFiles ?? [],
|
|
199
|
+
...(rec.relatedCommands && rec.relatedCommands.length > 0
|
|
200
|
+
? { relatedCommands: rec.relatedCommands }
|
|
201
|
+
: {}),
|
|
162
202
|
date: rec.date ?? '',
|
|
163
203
|
sourceFile: source,
|
|
164
204
|
});
|
|
165
205
|
};
|
|
206
|
+
const readInto = async (file, packageName) => {
|
|
207
|
+
const r = await importDefaultArray(file);
|
|
208
|
+
if (r.error !== undefined) {
|
|
209
|
+
issues.push({
|
|
210
|
+
severity: 'warning',
|
|
211
|
+
code: 'load-failed',
|
|
212
|
+
message: `${packageName ? `Pack ${packageName} (${nodePath.relative(inspection.projectRoot, file) || file})` : `Failed to load ${nodePath.relative(inspection.projectRoot, file) || file}`}: ${r.error}`,
|
|
213
|
+
source: file,
|
|
214
|
+
...(packageName ? { packageName } : {}),
|
|
215
|
+
});
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
r.items.forEach((item, i) => addInput(item, file, i));
|
|
219
|
+
};
|
|
166
220
|
// Local file.
|
|
167
221
|
if (inspection.sharkcraftDir) {
|
|
168
|
-
|
|
169
|
-
const arr = await importDefaultArray(local);
|
|
170
|
-
for (const r of arr)
|
|
171
|
-
addInput(r, local);
|
|
222
|
+
await readInto(nodePath.join(inspection.sharkcraftDir, 'decisions.ts'));
|
|
172
223
|
}
|
|
173
224
|
// Pack contributions.
|
|
174
225
|
for (const pack of inspection.packs.validPacks) {
|
|
175
226
|
const c = (pack.manifest?.contributions ?? {});
|
|
176
227
|
for (const rel of c.decisionFiles ?? []) {
|
|
177
|
-
|
|
178
|
-
const arr = await importDefaultArray(full);
|
|
179
|
-
for (const r of arr)
|
|
180
|
-
addInput(r, full);
|
|
228
|
+
await readInto(nodePath.resolve(pack.packageRoot, rel), pack.packageName);
|
|
181
229
|
}
|
|
182
230
|
}
|
|
183
231
|
TS_DECISION_CACHE.set(inspection.projectRoot, out);
|
|
184
|
-
return out;
|
|
232
|
+
return { decisions: out, issues, rejected };
|
|
185
233
|
}
|
|
234
|
+
/** A decision file's default array; `error` (first line) when the import threw. A missing file is `[]`. */
|
|
186
235
|
async function importDefaultArray(absPath) {
|
|
236
|
+
if (!existsSync(absPath))
|
|
237
|
+
return { items: [] };
|
|
187
238
|
try {
|
|
188
|
-
if (!existsSync(absPath))
|
|
189
|
-
return [];
|
|
190
|
-
const { pathToFileURL } = await import('node:url');
|
|
191
239
|
const mod = (await importModuleViaLoader(absPath));
|
|
192
|
-
return Array.isArray(mod.default) ? mod.default : [];
|
|
240
|
+
return { items: Array.isArray(mod.default) ? mod.default : [] };
|
|
193
241
|
}
|
|
194
|
-
catch {
|
|
195
|
-
return [];
|
|
242
|
+
catch (e) {
|
|
243
|
+
return { items: [], error: (e.message ?? String(e)).split('\n')[0].trim() };
|
|
196
244
|
}
|
|
197
245
|
}
|
|
198
246
|
export function getDecision(inspection, id) {
|