@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/task-packet.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { buildContext } from '@shrkcrft/context';
|
|
2
2
|
import { aggregateActionHints, } from '@shrkcrft/knowledge';
|
|
3
|
+
import { PipelineStepType } from '@shrkcrft/pipelines';
|
|
4
|
+
import { commandSafetyLevel } from "./command-safety-level.js";
|
|
5
|
+
import { classifyQueryIntent, intentAdmitsSourceWrites, intentIsRepairOrDiagnosis } from "./query-intent.js";
|
|
3
6
|
import { rankAll } from "./task-ranker.js";
|
|
4
7
|
import { listSearchTuning } from "./search-tuning-registry.js";
|
|
5
8
|
import { contextTuningBoostFor } from "./context-tuning.js";
|
|
@@ -59,6 +62,21 @@ function pickPipelines(pipelines, task) {
|
|
|
59
62
|
}
|
|
60
63
|
return out.slice(0, 3);
|
|
61
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Does following this pipeline write source? A `generation` tag, a step that
|
|
67
|
+
* produces or applies a generation plan, a step whose CLI command writes source
|
|
68
|
+
* (`commandSafetyLevel`, the classifier the recommender reads), or a step that
|
|
69
|
+
* references a template. A diagnose / repair task is never offered one.
|
|
70
|
+
*/
|
|
71
|
+
function pipelineWritesSource(pipeline, templateIds) {
|
|
72
|
+
if ((pipeline.tags ?? []).some((t) => t.toLowerCase() === 'generation'))
|
|
73
|
+
return true;
|
|
74
|
+
return pipeline.steps.some((s) => s.type === PipelineStepType.GenerationPlan ||
|
|
75
|
+
s.type === PipelineStepType.ApplyPlan ||
|
|
76
|
+
s.type === 'generate' ||
|
|
77
|
+
(s.cliCommands ?? []).some((c) => commandSafetyLevel(c) === 'writes-source') ||
|
|
78
|
+
(s.references ?? []).some((r) => templateIds.has(r)));
|
|
79
|
+
}
|
|
62
80
|
/**
|
|
63
81
|
* Build a deterministic, AI-ready bundle for a single task. Pure orchestration
|
|
64
82
|
* over the existing inspector services — no AI calls, no writes.
|
|
@@ -87,9 +105,26 @@ export function buildTaskPacket(inspection, task, options = {}) {
|
|
|
87
105
|
const relevantPaths = compact
|
|
88
106
|
? ranking.paths.slice(0, COMPACT_CAPS.paths).map((r) => r.item)
|
|
89
107
|
: ranking.paths.map((r) => r.item);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
108
|
+
// THE query-intent classifier and eligibility rule the recommender reads
|
|
109
|
+
// (spec 2.3, round 11 review R11-GAP-6): a diagnose / repair task ("fix the
|
|
110
|
+
// broken build") is offered no create/scaffold pipeline, no template and no
|
|
111
|
+
// source-writing command, and a suggested generation needs a CREATE query.
|
|
112
|
+
// `recommend.scaffoldRequiresCreateIntent: false` opts out, as it does there.
|
|
113
|
+
const intent = classifyQueryIntent(task);
|
|
114
|
+
const scaffoldGate = inspection.config?.recommend?.scaffoldRequiresCreateIntent ?? true;
|
|
115
|
+
const repairLike = scaffoldGate && intentIsRepairOrDiagnosis(intent);
|
|
116
|
+
const templateIds = new Set(inspection.templates.map((t) => t.id));
|
|
117
|
+
const eligiblePipeline = (id) => {
|
|
118
|
+
if (!repairLike)
|
|
119
|
+
return true;
|
|
120
|
+
const p = inspection.pipelineRegistry.get(id);
|
|
121
|
+
return !p || !pipelineWritesSource(p, templateIds);
|
|
122
|
+
};
|
|
123
|
+
const relevantTemplates = repairLike
|
|
124
|
+
? []
|
|
125
|
+
: compact
|
|
126
|
+
? ranking.templates.slice(0, COMPACT_CAPS.templates).map((r) => r.item)
|
|
127
|
+
: ranking.templates.map((r) => r.item);
|
|
93
128
|
// Aggregate hints from the *ranked* knowledge so unrelated entries don't
|
|
94
129
|
// leak into the action-hints surface.
|
|
95
130
|
const hintCorpus = [
|
|
@@ -114,11 +149,16 @@ export function buildTaskPacket(inspection, task, options = {}) {
|
|
|
114
149
|
}
|
|
115
150
|
: actionHintsRaw;
|
|
116
151
|
// Pipelines: prefer ranker output, then verb fallback for context-only.
|
|
117
|
-
const rankedPipelines = ranking.pipelines
|
|
152
|
+
const rankedPipelines = ranking.pipelines
|
|
153
|
+
.filter((p) => eligiblePipeline(p.item.id))
|
|
154
|
+
.slice(0, 3)
|
|
155
|
+
.map((p) => ({
|
|
118
156
|
pipelineId: p.item.id,
|
|
119
157
|
reason: p.reasons.join('; ') || 'ranked match',
|
|
120
158
|
}));
|
|
121
|
-
const fallback = rankedPipelines.length > 0
|
|
159
|
+
const fallback = rankedPipelines.length > 0
|
|
160
|
+
? rankedPipelines
|
|
161
|
+
: pickPipelines(inspection.pipelineRegistry.list(), task).filter((p) => eligiblePipeline(p.pipelineId));
|
|
122
162
|
const recommendedPipelines = fallback;
|
|
123
163
|
const humanReviewPoints = [];
|
|
124
164
|
for (const r of recommendedPipelines) {
|
|
@@ -155,9 +195,10 @@ export function buildTaskPacket(inspection, task, options = {}) {
|
|
|
155
195
|
let suggestedGen;
|
|
156
196
|
const top = ranking.templates[0];
|
|
157
197
|
const runnerUp = ranking.templates[1];
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
(
|
|
198
|
+
const createWork = scaffoldGate
|
|
199
|
+
? intentAdmitsSourceWrites(intent)
|
|
200
|
+
: /\b(create|add|implement|generate|new|build)\b/i.test(task);
|
|
201
|
+
if (top && createWork && (!runnerUp || top.score - runnerUp.score >= 4)) {
|
|
161
202
|
const tpl = top.item;
|
|
162
203
|
const required = (tpl.variables ?? [])
|
|
163
204
|
.filter((v) => v.required)
|
|
@@ -200,7 +241,9 @@ export function buildTaskPacket(inspection, task, options = {}) {
|
|
|
200
241
|
relevantTemplates,
|
|
201
242
|
actionHints,
|
|
202
243
|
recommendedMcpTools: actionHints.mcpTools.map((t) => t.tool),
|
|
203
|
-
recommendedCliCommands: actionHints.commands
|
|
244
|
+
recommendedCliCommands: actionHints.commands
|
|
245
|
+
.map((c) => (typeof c === 'string' ? c : c.command))
|
|
246
|
+
.filter((c) => !repairLike || commandSafetyLevel(c) !== 'writes-source'),
|
|
204
247
|
forbiddenActions: actionHints.forbiddenActions,
|
|
205
248
|
verificationCommands,
|
|
206
249
|
humanReviewPoints,
|
package/dist/task-ranker.d.ts
CHANGED
|
@@ -16,6 +16,14 @@ export interface IRankedItem<T> {
|
|
|
16
16
|
item: T;
|
|
17
17
|
score: number;
|
|
18
18
|
reasons: string[];
|
|
19
|
+
/**
|
|
20
|
+
* The DISTINCT query content terms found in the item's id / name|title /
|
|
21
|
+
* description / tags (templates and pipelines). `score` counts repeats and
|
|
22
|
+
* verb-only / cross-link points, so one incidental token can reach double
|
|
23
|
+
* digits; this is the evidence count a caller gates on (the recommender
|
|
24
|
+
* needs ≥ 2 before a scaffold may headline). Raw scores are unchanged.
|
|
25
|
+
*/
|
|
26
|
+
matchedTerms?: readonly string[];
|
|
19
27
|
}
|
|
20
28
|
export declare function rankKnowledgeEntries(entries: readonly IKnowledgeEntry[], task: string): IRankedItem<IKnowledgeEntry>[];
|
|
21
29
|
export declare function rankTemplates(templates: readonly ITemplateDefinition[], task: string): IRankedItem<ITemplateDefinition>[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-ranker.d.ts","sourceRoot":"","sources":["../src/task-ranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"task-ranker.d.ts","sourceRoot":"","sources":["../src/task-ranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAMtF;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAmOD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,IAAI,EAAE,MAAM,GACX,WAAW,CAAC,eAAe,CAAC,EAAE,CAqBhC;AAGD,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,mBAAmB,EAAE,EACzC,IAAI,EAAE,MAAM,GACX,WAAW,CAAC,mBAAmB,CAAC,EAAE,CAqBpC;AAGD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,IAAI,EAAE,MAAM,GACX,WAAW,CAAC,eAAe,CAAC,EAAE,CAEhC;AAGD,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,mBAAmB,EAAE,EACzC,IAAI,EAAE,MAAM,GACX,WAAW,CAAC,mBAAmB,CAAC,EAAE,CAsCpC;AAGD,wBAAgB,WAAW,CACzB,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAClC,WAAW,CAAC,OAAO,CAAC,EAAE,CAgCxB;AAGD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;IACtC,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;IACtC,SAAS,EAAE,WAAW,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC9C,SAAS,EAAE,WAAW,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC9C,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;CACjC;AAgCD,wBAAgB,OAAO,CACrB,UAAU,EAAE;IACV,gBAAgB,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,SAAS,OAAO,EAAE,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE;QAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3C,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,SAAS,eAAe,EAAE,CAAA;KAAE,CAAC;IACxD,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,SAAS,eAAe,EAAE,CAAA;KAAE,CAAC;CACzD,EACD,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,SAAS,kBAAkB,EAAO,GACzC,cAAc,CAuEhB;AAGD,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,EAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC7B,KAAK,GAAE,MAAU,GAChB,MAAM,CAKR;AAED,uFAAuF;AACvF,YAAY,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/task-ranker.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { tuningBoostFor } from "./search-tuning-registry.js";
|
|
2
|
+
import { searchDocumentId, searchKindForPrefix } from "./search-document-id.js";
|
|
3
|
+
import { tuningQueryTokens } from "./tuning-query-tokens.js";
|
|
4
|
+
import { contentTerms, matchedQueryTerms } from "./match-terms.js";
|
|
2
5
|
// ── Verb hints (what kind of work) ──────────────────────────────────────
|
|
3
6
|
const VERB_HINTS = [
|
|
4
7
|
{
|
|
@@ -212,6 +215,7 @@ export function rankKnowledgeEntries(entries, task) {
|
|
|
212
215
|
// ── Templates ───────────────────────────────────────────────────────────
|
|
213
216
|
export function rankTemplates(templates, task) {
|
|
214
217
|
const ctx = deriveContext(task);
|
|
218
|
+
const queryTerms = contentTerms(task);
|
|
215
219
|
const out = [];
|
|
216
220
|
for (const t of templates) {
|
|
217
221
|
const reasons = [];
|
|
@@ -224,8 +228,10 @@ export function rankTemplates(templates, task) {
|
|
|
224
228
|
const hits = tokenHits(ctx.taskTokens, t.id, t.name, t.description, (t.tags ?? []).join(' '));
|
|
225
229
|
if (hits)
|
|
226
230
|
s += score(reasons, Math.min(8, hits * 2), `token hits: ${hits}`);
|
|
227
|
-
if (s > 0)
|
|
228
|
-
|
|
231
|
+
if (s > 0) {
|
|
232
|
+
const matchedTerms = matchedQueryTerms(queryTerms, [t.id, t.name, t.description, ...(t.tags ?? [])]);
|
|
233
|
+
out.push({ item: t, score: s, reasons, matchedTerms });
|
|
234
|
+
}
|
|
229
235
|
}
|
|
230
236
|
out.sort((a, b) => b.score - a.score);
|
|
231
237
|
return out;
|
|
@@ -237,6 +243,7 @@ export function rankPathConventions(paths, task) {
|
|
|
237
243
|
// ── Pipelines ───────────────────────────────────────────────────────────
|
|
238
244
|
export function rankPipelines(pipelines, task) {
|
|
239
245
|
const ctx = deriveContext(task);
|
|
246
|
+
const queryTerms = contentTerms(task);
|
|
240
247
|
const out = [];
|
|
241
248
|
for (const p of pipelines) {
|
|
242
249
|
const reasons = [];
|
|
@@ -267,8 +274,10 @@ export function rankPipelines(pipelines, task) {
|
|
|
267
274
|
const titleHits = tokenHits(ctx.taskTokens, p.title, p.description);
|
|
268
275
|
if (titleHits)
|
|
269
276
|
s += score(reasons, Math.min(8, titleHits * 2), `title/description hits: ${titleHits}`);
|
|
270
|
-
if (s > 0)
|
|
271
|
-
|
|
277
|
+
if (s > 0) {
|
|
278
|
+
const matchedTerms = matchedQueryTerms(queryTerms, [p.id, p.title, p.description, ...(p.tags ?? [])]);
|
|
279
|
+
out.push({ item: p, score: s, reasons, matchedTerms });
|
|
280
|
+
}
|
|
272
281
|
}
|
|
273
282
|
out.sort((a, b) => b.score - a.score);
|
|
274
283
|
return out;
|
|
@@ -316,15 +325,18 @@ export function rankPresets(presets, task, detectedProfiles) {
|
|
|
316
325
|
* task ranker and the search ranker honor the same pack tuning. Re-sorts so a
|
|
317
326
|
* boosted item can cross the top-N slice.
|
|
318
327
|
*/
|
|
319
|
-
function applyTuningToRanked(ranked,
|
|
328
|
+
function applyTuningToRanked(ranked, prefix, tuningTokens, tuning) {
|
|
320
329
|
if (tuning.length === 0)
|
|
321
330
|
return ranked.slice();
|
|
331
|
+
// The document id and kind come from THE search-document codec, so a boost
|
|
332
|
+
// key that fires in `shrk search` fires here — never a hand-written prefix.
|
|
333
|
+
const kind = searchKindForPrefix(prefix) ?? prefix;
|
|
322
334
|
const out = ranked.map((r) => {
|
|
323
335
|
const tags = r.item.tags;
|
|
324
|
-
const boost = tuningBoostFor({ id:
|
|
336
|
+
const boost = tuningBoostFor({ id: searchDocumentId(prefix, r.item.id), kind, ...(tags ? { tags } : {}), source: 'local' }, tuningTokens, tuning);
|
|
325
337
|
if (boost.delta === 0)
|
|
326
338
|
return r;
|
|
327
|
-
return {
|
|
339
|
+
return { ...r, score: r.score + boost.delta, reasons: [...r.reasons, ...boost.reasons] };
|
|
328
340
|
});
|
|
329
341
|
out.sort((a, b) => b.score - a.score);
|
|
330
342
|
return out;
|
|
@@ -377,17 +389,17 @@ export function rankAll(inspection, task, limit = 10, tuning = []) {
|
|
|
377
389
|
if (!referencedFromTopPipeline.has(r.item.id))
|
|
378
390
|
return r;
|
|
379
391
|
return {
|
|
380
|
-
|
|
392
|
+
...r,
|
|
381
393
|
score: r.score + 3,
|
|
382
394
|
reasons: [...r.reasons, `referenced by top pipeline ${topPipeline?.id}`],
|
|
383
395
|
};
|
|
384
396
|
});
|
|
385
397
|
templates.sort((a, b) => b.score - a.score);
|
|
386
|
-
const tuningTokens = task
|
|
387
|
-
const tunedRules = applyTuningToRanked(rules, 'rule',
|
|
388
|
-
const tunedPaths = applyTuningToRanked(initialPaths, 'path',
|
|
389
|
-
const tunedTemplates = applyTuningToRanked(templates, 'template',
|
|
390
|
-
const tunedPipelines = applyTuningToRanked(initialPipelines, 'pipeline',
|
|
398
|
+
const tuningTokens = tuningQueryTokens(task);
|
|
399
|
+
const tunedRules = applyTuningToRanked(rules, 'rule', tuningTokens, tuning);
|
|
400
|
+
const tunedPaths = applyTuningToRanked(initialPaths, 'path', tuningTokens, tuning);
|
|
401
|
+
const tunedTemplates = applyTuningToRanked(templates, 'template', tuningTokens, tuning);
|
|
402
|
+
const tunedPipelines = applyTuningToRanked(initialPipelines, 'pipeline', tuningTokens, tuning);
|
|
391
403
|
return {
|
|
392
404
|
rules: tunedRules.slice(0, limit),
|
|
393
405
|
paths: tunedPaths.slice(0, limit),
|
package/dist/task-risk.js
CHANGED
|
@@ -589,7 +589,7 @@ export async function buildTaskRiskReport(task, inspection, options = {}) {
|
|
|
589
589
|
'shrk policy run --explain-overrides',
|
|
590
590
|
];
|
|
591
591
|
if (publicApiTouch)
|
|
592
|
-
recommendedReviewCommands.push('shrk api
|
|
592
|
+
recommendedReviewCommands.push('shrk api-diff .sharkcraft/api-baseline.json --fail-on-breaking');
|
|
593
593
|
if (ownershipGaps.length > 0)
|
|
594
594
|
recommendedReviewCommands.push('shrk owners impact');
|
|
595
595
|
if (testGaps.length > 0)
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
import { type ITaskRoutingHint } from '@shrkcrft/plugin-api';
|
|
1
|
+
import { TermMatchMode, type ITaskRoutingHint } from '@shrkcrft/plugin-api';
|
|
2
2
|
import type { ISharkcraftInspection } from './sharkcraft-inspector.js';
|
|
3
|
+
import { type IRejectedEntry } from '@shrkcrft/core';
|
|
4
|
+
/** The hint's keyword/phrase match mode — `tokens` unless it opts into `substring`. */
|
|
5
|
+
export declare function routingMatchMode(hint: ITaskRoutingHint): TermMatchMode;
|
|
6
|
+
/**
|
|
7
|
+
* Can this hint EVER match a task? True when it declares a keyword or phrase
|
|
8
|
+
* (an empty one matches everything — the load lint errors on it) or a regex
|
|
9
|
+
* that compiles. A hint declaring only unscored criteria (`fileGlobs`,
|
|
10
|
+
* `languages`, `constructKinds`) or only a broken regex is dead on arrival.
|
|
11
|
+
*/
|
|
12
|
+
export declare function routingHintCanMatch(hint: ITaskRoutingHint): boolean;
|
|
3
13
|
export declare const TASK_ROUTING_HINT_REGISTRY_SCHEMA = "sharkcraft.task-routing-hint-registry/v1";
|
|
4
14
|
export declare enum TaskRoutingHintSource {
|
|
5
15
|
Local = "local",
|
|
@@ -19,9 +29,18 @@ export interface ITaskRoutingHintDoctorIssue {
|
|
|
19
29
|
readonly hintId?: string;
|
|
20
30
|
readonly source?: string;
|
|
21
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* THE routing-hint acceptance predicate (round 12, 12.1): every issue of
|
|
34
|
+
* `validateTaskRoutingHint`, `<field>: <message>` — `[]` means accepted.
|
|
35
|
+
*/
|
|
36
|
+
export declare function routingHintRejectionReasons(raw: unknown): readonly string[];
|
|
22
37
|
export declare function loadTaskRoutingHints(inspection: ISharkcraftInspection): Promise<{
|
|
23
38
|
entries: readonly ITaskRoutingHintEntry[];
|
|
24
39
|
issues: readonly ITaskRoutingHintDoctorIssue[];
|
|
40
|
+
/** Hint files the loader tried (local + pack-declared) — the doctor's file coverage. */
|
|
41
|
+
files: number;
|
|
42
|
+
/** Every declared hint the loader refused — invalid or a duplicate id (round 12, 12.1). */
|
|
43
|
+
rejected: readonly IRejectedEntry[];
|
|
25
44
|
}>;
|
|
26
45
|
export declare function listTaskRoutingHints(inspection: ISharkcraftInspection): Promise<readonly ITaskRoutingHintEntry[]>;
|
|
27
46
|
export declare function listTaskRoutingHintIssues(inspection: ISharkcraftInspection): Promise<readonly ITaskRoutingHintDoctorIssue[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-routing-hint-registry.d.ts","sourceRoot":"","sources":["../src/task-routing-hint-registry.ts"],"names":[],"mappings":"AASA,OAAO,
|
|
1
|
+
{"version":3,"file":"task-routing-hint-registry.d.ts","sourceRoot":"","sources":["../src/task-routing-hint-registry.ts"],"names":[],"mappings":"AASA,OAAO,EACL,aAAa,EAEb,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAiBxB,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,aAAa,CAEtE;AAWD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAInE;AAqFD,eAAO,MAAM,iCAAiC,6CAA6C,CAAC;AAE5F,oBAAY,qBAAqB;IAC/B,KAAK,UAAU;IACf,IAAI,SAAS;IACb,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAK3E;AAgBD,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC;IACT,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC1C,MAAM,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC/C,wFAAwF;IACxF,KAAK,EAAE,MAAM,CAAC;IACd,2FAA2F;IAC3F,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CACrC,CAAC,CAgID;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,SAAS,qBAAqB,EAAE,CAAC,CAG3C;AAED,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC,SAAS,2BAA2B,EAAE,CAAC,CAGjD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CA8C7C"}
|
|
@@ -7,8 +7,110 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync } from 'node:fs';
|
|
9
9
|
import * as nodePath from 'node:path';
|
|
10
|
-
import { validateTaskRoutingHint, } from '@shrkcrft/plugin-api';
|
|
11
|
-
import { importModuleViaLoader } from '@shrkcrft/core';
|
|
10
|
+
import { TermMatchMode, validateTaskRoutingHint, } from '@shrkcrft/plugin-api';
|
|
11
|
+
import { importModuleViaLoader, readContributionExport, RejectionCause, } from '@shrkcrft/core';
|
|
12
|
+
import { matchTerm, prepareTermQuery } from "./match-terms.js";
|
|
13
|
+
import { nearestIds } from "./nearest-id.js";
|
|
14
|
+
import { isRoutingRecommendsChannel, ROUTING_RECOMMENDS_CHANNEL_KEYS, } from "./routing-recommends-channels.js";
|
|
15
|
+
/** Criteria the matcher reads — keywords (+2), phrases (+3), regexes (+2). */
|
|
16
|
+
const UNSCORED_MATCH_FIELDS = ['languages', 'fileGlobs', 'constructKinds'];
|
|
17
|
+
/**
|
|
18
|
+
* In substring mode a needle shorter than this fires inside unrelated words
|
|
19
|
+
* (`ci` in "pricing", `gate` in "investigate") — the load lint warns.
|
|
20
|
+
*/
|
|
21
|
+
const SHORT_SUBSTRING_LIMIT = 4;
|
|
22
|
+
/** The hint's keyword/phrase match mode — `tokens` unless it opts into `substring`. */
|
|
23
|
+
export function routingMatchMode(hint) {
|
|
24
|
+
return hint.match?.mode === TermMatchMode.Substring ? TermMatchMode.Substring : TermMatchMode.Tokens;
|
|
25
|
+
}
|
|
26
|
+
function regexCompiles(source) {
|
|
27
|
+
try {
|
|
28
|
+
new RegExp(source, 'i');
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Can this hint EVER match a task? True when it declares a keyword or phrase
|
|
37
|
+
* (an empty one matches everything — the load lint errors on it) or a regex
|
|
38
|
+
* that compiles. A hint declaring only unscored criteria (`fileGlobs`,
|
|
39
|
+
* `languages`, `constructKinds`) or only a broken regex is dead on arrival.
|
|
40
|
+
*/
|
|
41
|
+
export function routingHintCanMatch(hint) {
|
|
42
|
+
const m = hint.match ?? {};
|
|
43
|
+
if ((m.keywords ?? []).length > 0 || (m.phrases ?? []).length > 0)
|
|
44
|
+
return true;
|
|
45
|
+
return (m.regexes ?? []).some((r) => typeof r === 'string' && regexCompiles(r));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Load-time lints over one VALID hint: what the matcher will silently get
|
|
49
|
+
* wrong. The matcher swallowed an invalid regex at match time and scored a
|
|
50
|
+
* hint of only `fileGlobs` at zero, with no diagnostic anywhere.
|
|
51
|
+
*/
|
|
52
|
+
function lintRoutingHint(hint, sourceFile, issues) {
|
|
53
|
+
const push = (severity, code, message) => {
|
|
54
|
+
issues.push({ severity, code, message, hintId: hint.id, source: sourceFile });
|
|
55
|
+
};
|
|
56
|
+
const m = hint.match ?? {};
|
|
57
|
+
for (const r of m.regexes ?? []) {
|
|
58
|
+
try {
|
|
59
|
+
new RegExp(r, 'i');
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
push('error', 'invalid-regex', `Routing hint "${hint.id}" regex /${r}/ does not compile (${e.message}), so it never matches.`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const empties = [...(m.keywords ?? []), ...(m.phrases ?? [])].filter((t) => typeof t !== 'string' || t.trim().length === 0);
|
|
66
|
+
if (empties.length > 0) {
|
|
67
|
+
push('error', 'empty-trigger', routingMatchMode(hint) === TermMatchMode.Substring
|
|
68
|
+
? `Routing hint "${hint.id}" declares an empty keyword/phrase — every task contains it, so the hint matches everything.`
|
|
69
|
+
: `Routing hint "${hint.id}" declares an empty keyword/phrase — it can never match (and in substring mode it would match every task).`);
|
|
70
|
+
}
|
|
71
|
+
if (routingMatchMode(hint) === TermMatchMode.Substring) {
|
|
72
|
+
for (const t of [...(m.keywords ?? []), ...(m.phrases ?? [])]) {
|
|
73
|
+
if (typeof t !== 'string')
|
|
74
|
+
continue;
|
|
75
|
+
const needle = t.trim();
|
|
76
|
+
if (needle.length === 0 || needle.length >= SHORT_SUBSTRING_LIMIT)
|
|
77
|
+
continue;
|
|
78
|
+
push('warning', 'short-substring-keyword', `Routing hint "${hint.id}": "${needle}" (${needle.length} chars) matches inside unrelated words in substring mode — use mode: 'tokens' or a regex with \\b.`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const unscored = UNSCORED_MATCH_FIELDS.filter((f) => (m[f] ?? []).length > 0);
|
|
82
|
+
if (!routingHintCanMatch(hint)) {
|
|
83
|
+
push('warning', unscored.length > 0 ? 'unscored-match-criteria' : 'no-match-criteria', unscored.length > 0
|
|
84
|
+
? `Routing hint "${hint.id}" declares only ${unscored.join(' / ')}, which the matcher does not score (it reads keywords, phrases and regexes), so it can never match.`
|
|
85
|
+
: `Routing hint "${hint.id}" declares no keyword, phrase or compiling regex, so it can never match.`);
|
|
86
|
+
}
|
|
87
|
+
else if (unscored.length > 0) {
|
|
88
|
+
push('info', 'ignored-match-criteria', `Routing hint "${hint.id}" declares ${unscored.join(' / ')}, which the matcher does not score today; only its keywords / phrases / regexes decide a match.`);
|
|
89
|
+
}
|
|
90
|
+
for (const key of Object.keys(hint.recommends ?? {})) {
|
|
91
|
+
if (isRoutingRecommendsChannel(key))
|
|
92
|
+
continue;
|
|
93
|
+
const near = nearestIds(key, ROUTING_RECOMMENDS_CHANNEL_KEYS, 1)[0];
|
|
94
|
+
push('warning', 'unknown-recommends-key', `Routing hint "${hint.id}" recommends.${key} is not a channel (${ROUTING_RECOMMENDS_CHANNEL_KEYS.join(', ')}), so nothing reads it.${near ? ` Did you mean "${near.id}"?` : ''}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** The normalized trigger set: two hints with the same one always match together. */
|
|
98
|
+
function triggerSignature(hint) {
|
|
99
|
+
const m = hint.match ?? {};
|
|
100
|
+
const parts = new Set();
|
|
101
|
+
for (const k of m.keywords ?? [])
|
|
102
|
+
if (typeof k === 'string' && k.trim())
|
|
103
|
+
parts.add(`k:${k.trim().toLowerCase()}`);
|
|
104
|
+
for (const p of m.phrases ?? [])
|
|
105
|
+
if (typeof p === 'string' && p.trim())
|
|
106
|
+
parts.add(`p:${p.trim().toLowerCase()}`);
|
|
107
|
+
for (const r of m.regexes ?? [])
|
|
108
|
+
if (typeof r === 'string' && r)
|
|
109
|
+
parts.add(`r:${r}`);
|
|
110
|
+
if (parts.size > 0 && routingMatchMode(hint) === TermMatchMode.Substring)
|
|
111
|
+
parts.add('m:substring');
|
|
112
|
+
return [...parts].sort().join('\n');
|
|
113
|
+
}
|
|
12
114
|
export const TASK_ROUTING_HINT_REGISTRY_SCHEMA = 'sharkcraft.task-routing-hint-registry/v1';
|
|
13
115
|
export var TaskRoutingHintSource;
|
|
14
116
|
(function (TaskRoutingHintSource) {
|
|
@@ -16,15 +118,20 @@ export var TaskRoutingHintSource;
|
|
|
16
118
|
TaskRoutingHintSource["Pack"] = "pack";
|
|
17
119
|
TaskRoutingHintSource["Fixture"] = "fixture";
|
|
18
120
|
})(TaskRoutingHintSource || (TaskRoutingHintSource = {}));
|
|
19
|
-
async function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
121
|
+
async function importHints(file) {
|
|
122
|
+
return readContributionExport(await importModuleViaLoader(file), { namedKeys: ['taskRoutingHints'] });
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* THE routing-hint acceptance predicate (round 12, 12.1): every issue of
|
|
126
|
+
* `validateTaskRoutingHint`, `<field>: <message>` — `[]` means accepted.
|
|
127
|
+
*/
|
|
128
|
+
export function routingHintRejectionReasons(raw) {
|
|
129
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
130
|
+
return ['(entry): must be an object'];
|
|
131
|
+
const v = validateTaskRoutingHint(raw);
|
|
132
|
+
if (v.valid)
|
|
133
|
+
return [];
|
|
134
|
+
return v.issues.length > 0 ? v.issues.map((i) => `${i.field}: ${i.message}`) : ['(entry): failed validation'];
|
|
28
135
|
}
|
|
29
136
|
function localFiles(inspection) {
|
|
30
137
|
const out = [];
|
|
@@ -36,8 +143,7 @@ function localFiles(inspection) {
|
|
|
36
143
|
if (existsSync(abs))
|
|
37
144
|
out.push(abs);
|
|
38
145
|
}
|
|
39
|
-
const
|
|
40
|
-
for (const rel of cfg?.taskRoutingHintFiles ?? []) {
|
|
146
|
+
for (const rel of inspection.config?.taskRoutingHintFiles ?? []) {
|
|
41
147
|
out.push(nodePath.isAbsolute(rel) ? rel : nodePath.join(dir, rel));
|
|
42
148
|
}
|
|
43
149
|
return out;
|
|
@@ -45,45 +151,60 @@ function localFiles(inspection) {
|
|
|
45
151
|
export async function loadTaskRoutingHints(inspection) {
|
|
46
152
|
const entries = [];
|
|
47
153
|
const issues = [];
|
|
48
|
-
const
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
source: sourceFile,
|
|
59
|
-
});
|
|
154
|
+
const rejected = [];
|
|
155
|
+
const seen = new Map();
|
|
156
|
+
let files = 0;
|
|
157
|
+
const ingest = (raw, source, packageName, sourceFile, at) => {
|
|
158
|
+
const rawId = raw && typeof raw === 'object' ? raw.id : undefined;
|
|
159
|
+
const hintId = typeof rawId === 'string' ? rawId : undefined;
|
|
160
|
+
const reasons = routingHintRejectionReasons(raw);
|
|
161
|
+
if (reasons.length > 0) {
|
|
162
|
+
for (const r of reasons) {
|
|
163
|
+
issues.push({ severity: 'error', code: 'invalid-hint', message: r, hintId, source: sourceFile });
|
|
60
164
|
}
|
|
165
|
+
rejected.push({ ...at, ...(hintId !== undefined ? { entryId: hintId } : {}), reasons, cause: RejectionCause.Invalid });
|
|
61
166
|
return;
|
|
62
167
|
}
|
|
63
|
-
|
|
168
|
+
const hint = raw;
|
|
169
|
+
const prev = seen.get(hint.id);
|
|
170
|
+
if (prev !== undefined) {
|
|
64
171
|
issues.push({
|
|
65
172
|
severity: 'error',
|
|
66
173
|
code: 'duplicate-id',
|
|
67
|
-
message: `Task routing hint "${
|
|
68
|
-
hintId:
|
|
174
|
+
message: `Task routing hint "${hint.id}" already loaded; skipping ${sourceFile}.`,
|
|
175
|
+
hintId: hint.id,
|
|
69
176
|
source: sourceFile,
|
|
70
177
|
});
|
|
178
|
+
rejected.push({
|
|
179
|
+
...at,
|
|
180
|
+
entryId: hint.id,
|
|
181
|
+
reasons: [`id: "${hint.id}" is already declared in ${prev}`],
|
|
182
|
+
cause: RejectionCause.DuplicateId,
|
|
183
|
+
});
|
|
71
184
|
return;
|
|
72
185
|
}
|
|
73
|
-
seen.
|
|
186
|
+
seen.set(hint.id, sourceFile);
|
|
187
|
+
lintRoutingHint(hint, sourceFile, issues);
|
|
74
188
|
entries.push({
|
|
75
|
-
hint
|
|
189
|
+
hint,
|
|
76
190
|
source,
|
|
77
191
|
...(packageName ? { packageName } : {}),
|
|
78
192
|
sourceFile,
|
|
79
193
|
});
|
|
80
194
|
};
|
|
195
|
+
const ingestAll = (exp, file, source, packageName, sourceFile) => {
|
|
196
|
+
exp.items.forEach((h, i) => ingest(h, source, packageName, sourceFile, {
|
|
197
|
+
file,
|
|
198
|
+
index: exp.single ? -1 : i,
|
|
199
|
+
...(exp.exportName ? { exportName: exp.exportName } : {}),
|
|
200
|
+
}));
|
|
201
|
+
};
|
|
81
202
|
for (const file of localFiles(inspection)) {
|
|
203
|
+
files += 1;
|
|
82
204
|
try {
|
|
83
|
-
const
|
|
205
|
+
const exp = await importHints(file);
|
|
84
206
|
const rel = nodePath.relative(inspection.projectRoot, file) || file;
|
|
85
|
-
|
|
86
|
-
ingest(h, TaskRoutingHintSource.Local, undefined, rel);
|
|
207
|
+
ingestAll(exp, file, TaskRoutingHintSource.Local, undefined, rel);
|
|
87
208
|
}
|
|
88
209
|
catch (e) {
|
|
89
210
|
issues.push({
|
|
@@ -98,6 +219,7 @@ export async function loadTaskRoutingHints(inspection) {
|
|
|
98
219
|
const contributions = (pack.manifest?.contributions ?? {});
|
|
99
220
|
for (const rel of contributions.taskRoutingHintFiles ?? []) {
|
|
100
221
|
const file = nodePath.resolve(pack.packageRoot, rel);
|
|
222
|
+
files += 1;
|
|
101
223
|
if (!existsSync(file)) {
|
|
102
224
|
issues.push({
|
|
103
225
|
severity: 'warning',
|
|
@@ -108,9 +230,7 @@ export async function loadTaskRoutingHints(inspection) {
|
|
|
108
230
|
continue;
|
|
109
231
|
}
|
|
110
232
|
try {
|
|
111
|
-
|
|
112
|
-
for (const h of list)
|
|
113
|
-
ingest(h, TaskRoutingHintSource.Pack, pack.packageName, rel);
|
|
233
|
+
ingestAll(await importHints(file), file, TaskRoutingHintSource.Pack, pack.packageName, rel);
|
|
114
234
|
}
|
|
115
235
|
catch (e) {
|
|
116
236
|
issues.push({
|
|
@@ -122,7 +242,27 @@ export async function loadTaskRoutingHints(inspection) {
|
|
|
122
242
|
}
|
|
123
243
|
}
|
|
124
244
|
}
|
|
125
|
-
|
|
245
|
+
// Identical trigger sets: both hints match the same tasks with the same score,
|
|
246
|
+
// so neither can outrank the other — almost always a copy-paste.
|
|
247
|
+
const firstWith = new Map();
|
|
248
|
+
for (const e of entries) {
|
|
249
|
+
const signature = triggerSignature(e.hint);
|
|
250
|
+
if (!signature)
|
|
251
|
+
continue;
|
|
252
|
+
const first = firstWith.get(signature);
|
|
253
|
+
if (!first) {
|
|
254
|
+
firstWith.set(signature, e);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
issues.push({
|
|
258
|
+
severity: 'warning',
|
|
259
|
+
code: 'duplicate-trigger',
|
|
260
|
+
message: `Routing hints "${first.hint.id}" and "${e.hint.id}" declare the same match criteria, so they always match the same tasks with the same score.`,
|
|
261
|
+
hintId: e.hint.id,
|
|
262
|
+
source: e.sourceFile,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
return { entries, issues, files, rejected };
|
|
126
266
|
}
|
|
127
267
|
export async function listTaskRoutingHints(inspection) {
|
|
128
268
|
const { entries } = await loadTaskRoutingHints(inspection);
|
|
@@ -134,21 +274,25 @@ export async function listTaskRoutingHintIssues(inspection) {
|
|
|
134
274
|
}
|
|
135
275
|
export async function explainTaskRouting(inspection, task) {
|
|
136
276
|
const entries = await listTaskRoutingHints(inspection);
|
|
137
|
-
|
|
277
|
+
// THE term matcher: tokens mode by default, so `ci` no longer fires inside
|
|
278
|
+
// "pricing" and `capability-pack` matches "capability pack".
|
|
279
|
+
const query = prepareTermQuery(task);
|
|
138
280
|
const out = [];
|
|
139
281
|
for (const e of entries) {
|
|
140
282
|
let score = 0;
|
|
141
283
|
const reasons = [];
|
|
284
|
+
const mode = routingMatchMode(e.hint);
|
|
285
|
+
const tag = mode === TermMatchMode.Substring ? ' (substring)' : '';
|
|
142
286
|
for (const kw of e.hint.match.keywords ?? []) {
|
|
143
|
-
if (
|
|
287
|
+
if (matchTerm(query, kw, mode)) {
|
|
144
288
|
score += 2;
|
|
145
|
-
reasons.push(`keyword: ${kw}`);
|
|
289
|
+
reasons.push(`keyword: ${kw}${tag}`);
|
|
146
290
|
}
|
|
147
291
|
}
|
|
148
292
|
for (const p of e.hint.match.phrases ?? []) {
|
|
149
|
-
if (
|
|
293
|
+
if (matchTerm(query, p, mode)) {
|
|
150
294
|
score += 3;
|
|
151
|
-
reasons.push(`phrase: ${p}`);
|
|
295
|
+
reasons.push(`phrase: ${p}${tag}`);
|
|
152
296
|
}
|
|
153
297
|
}
|
|
154
298
|
for (const r of e.hint.match.regexes ?? []) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-drift.d.ts","sourceRoot":"","sources":["../src/template-drift.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"template-drift.d.ts","sourceRoot":"","sources":["../src/template-drift.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAEpE,oBAAY,mBAAmB;IAC7B,IAAI,SAAS;IACb,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,qBAAqB,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IACzC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAoFD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAET;AAgOD,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CAmEtB"}
|