@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.
Files changed (693) hide show
  1. package/dist/acceptance-replay.js +1 -1
  2. package/dist/agent-contract-templates.js +6 -6
  3. package/dist/agent-contract.d.ts.map +1 -1
  4. package/dist/agent-contract.js +13 -8
  5. package/dist/agent-orchestration.js +2 -2
  6. package/dist/agent-task-prep.d.ts +16 -0
  7. package/dist/agent-task-prep.d.ts.map +1 -1
  8. package/dist/agent-task-prep.js +51 -4
  9. package/dist/ai-readiness.d.ts.map +1 -1
  10. package/dist/ai-readiness.js +21 -3
  11. package/dist/architecture-map.d.ts +16 -0
  12. package/dist/architecture-map.d.ts.map +1 -1
  13. package/dist/architecture-map.js +42 -26
  14. package/dist/area-explore.d.ts +2 -2
  15. package/dist/area-explore.d.ts.map +1 -1
  16. package/dist/area-explore.js +36 -16
  17. package/dist/area-map.d.ts +56 -11
  18. package/dist/area-map.d.ts.map +1 -1
  19. package/dist/area-map.js +106 -25
  20. package/dist/asset-doctor-proposed-exit.d.ts +21 -0
  21. package/dist/asset-doctor-proposed-exit.d.ts.map +1 -0
  22. package/dist/asset-doctor-proposed-exit.js +22 -0
  23. package/dist/asset-provenance.js +1 -1
  24. package/dist/boundaries-changed-only.d.ts +24 -1
  25. package/dist/boundaries-changed-only.d.ts.map +1 -1
  26. package/dist/boundaries-changed-only.js +12 -2
  27. package/dist/boundary-check-options.model.d.ts +40 -0
  28. package/dist/boundary-check-options.model.d.ts.map +1 -0
  29. package/dist/boundary-check-options.model.js +1 -0
  30. package/dist/boundary-check-result.model.d.ts +89 -0
  31. package/dist/boundary-check-result.model.d.ts.map +1 -0
  32. package/dist/boundary-check-result.model.js +1 -0
  33. package/dist/boundary-configuration-status.d.ts +38 -0
  34. package/dist/boundary-configuration-status.d.ts.map +1 -0
  35. package/dist/boundary-configuration-status.js +118 -0
  36. package/dist/boundary-configuration-status.model.d.ts +37 -0
  37. package/dist/boundary-configuration-status.model.d.ts.map +1 -0
  38. package/dist/boundary-configuration-status.model.js +1 -0
  39. package/dist/boundary-load-issue.model.d.ts +30 -0
  40. package/dist/boundary-load-issue.model.d.ts.map +1 -0
  41. package/dist/boundary-load-issue.model.js +1 -0
  42. package/dist/boundary-rule-check.model.d.ts +44 -0
  43. package/dist/boundary-rule-check.model.d.ts.map +1 -0
  44. package/dist/boundary-rule-check.model.js +1 -0
  45. package/dist/boundary-rule-invalidation.model.d.ts +31 -0
  46. package/dist/boundary-rule-invalidation.model.d.ts.map +1 -0
  47. package/dist/boundary-rule-invalidation.model.js +1 -0
  48. package/dist/boundary-rule-set-diff.model.d.ts +75 -0
  49. package/dist/boundary-rule-set-diff.model.d.ts.map +1 -0
  50. package/dist/boundary-rule-set-diff.model.js +1 -0
  51. package/dist/boundary-rule-sources.d.ts +28 -0
  52. package/dist/boundary-rule-sources.d.ts.map +1 -0
  53. package/dist/boundary-rule-sources.js +110 -0
  54. package/dist/boundary-stale-exception-finding.model.d.ts +12 -0
  55. package/dist/boundary-stale-exception-finding.model.d.ts.map +1 -0
  56. package/dist/boundary-stale-exception-finding.model.js +1 -0
  57. package/dist/boundary-unit-liveness.d.ts +35 -0
  58. package/dist/boundary-unit-liveness.d.ts.map +1 -0
  59. package/dist/boundary-unit-liveness.js +71 -0
  60. package/dist/change-intent.d.ts +3 -0
  61. package/dist/change-intent.d.ts.map +1 -1
  62. package/dist/change-intent.js +61 -27
  63. package/dist/changes-summary.d.ts.map +1 -1
  64. package/dist/changes-summary.js +19 -9
  65. package/dist/ci-integrity-report.js +1 -1
  66. package/dist/ci-predict.d.ts.map +1 -1
  67. package/dist/ci-predict.js +38 -5
  68. package/dist/code-intelligence-doctor.d.ts +6 -0
  69. package/dist/code-intelligence-doctor.d.ts.map +1 -1
  70. package/dist/code-intelligence-doctor.js +22 -7
  71. package/dist/command-recommender.d.ts +45 -2
  72. package/dist/command-recommender.d.ts.map +1 -1
  73. package/dist/command-recommender.js +41 -263
  74. package/dist/command-resolution-status.d.ts +44 -0
  75. package/dist/command-resolution-status.d.ts.map +1 -0
  76. package/dist/command-resolution-status.js +44 -0
  77. package/dist/command-safety-level.d.ts +15 -0
  78. package/dist/command-safety-level.d.ts.map +1 -0
  79. package/dist/command-safety-level.js +43 -0
  80. package/dist/command-taxonomy.js +1 -1
  81. package/dist/compliance-evidence.js +1 -1
  82. package/dist/compliance-profiles.js +1 -1
  83. package/dist/construct-registry.d.ts +40 -0
  84. package/dist/construct-registry.d.ts.map +1 -1
  85. package/dist/construct-registry.js +186 -82
  86. package/dist/context-tuning.d.ts +4 -0
  87. package/dist/context-tuning.d.ts.map +1 -1
  88. package/dist/context-tuning.js +10 -7
  89. package/dist/contract-template-registry.d.ts +10 -0
  90. package/dist/contract-template-registry.d.ts.map +1 -1
  91. package/dist/contract-template-registry.js +59 -33
  92. package/dist/contribution-kind.d.ts +52 -0
  93. package/dist/contribution-kind.d.ts.map +1 -0
  94. package/dist/contribution-kind.js +52 -0
  95. package/dist/contribution-load-failures.d.ts +106 -0
  96. package/dist/contribution-load-failures.d.ts.map +1 -0
  97. package/dist/contribution-load-failures.js +575 -0
  98. package/dist/contributions-report.d.ts +28 -0
  99. package/dist/contributions-report.d.ts.map +1 -0
  100. package/dist/contributions-report.js +242 -0
  101. package/dist/convention-registry.d.ts +22 -0
  102. package/dist/convention-registry.d.ts.map +1 -1
  103. package/dist/convention-registry.js +79 -39
  104. package/dist/coverage-report.d.ts.map +1 -1
  105. package/dist/coverage-report.js +6 -6
  106. package/dist/custom-checks.d.ts +60 -1
  107. package/dist/custom-checks.d.ts.map +1 -1
  108. package/dist/custom-checks.js +159 -6
  109. package/dist/dashboard/dashboard-data.d.ts +6 -0
  110. package/dist/dashboard/dashboard-data.d.ts.map +1 -1
  111. package/dist/dashboard/dashboard-data.js +99 -8
  112. package/dist/dashboard/dashboard-knowledge.d.ts.map +1 -1
  113. package/dist/dashboard/dashboard-knowledge.js +14 -2
  114. package/dist/decision-records.d.ts +20 -0
  115. package/dist/decision-records.d.ts.map +1 -1
  116. package/dist/decision-records.js +68 -20
  117. package/dist/declared-cross-references.d.ts +61 -0
  118. package/dist/declared-cross-references.d.ts.map +1 -0
  119. package/dist/declared-cross-references.js +550 -0
  120. package/dist/declared-gate-plane-rules.d.ts +24 -0
  121. package/dist/declared-gate-plane-rules.d.ts.map +1 -0
  122. package/dist/declared-gate-plane-rules.js +39 -0
  123. package/dist/declared-reference-coverage.d.ts +27 -0
  124. package/dist/declared-reference-coverage.d.ts.map +1 -0
  125. package/dist/declared-reference-coverage.js +50 -0
  126. package/dist/declared-xref-status.d.ts +19 -0
  127. package/dist/declared-xref-status.d.ts.map +1 -0
  128. package/dist/declared-xref-status.js +19 -0
  129. package/dist/delegate-pack-recipes.d.ts +13 -2
  130. package/dist/delegate-pack-recipes.d.ts.map +1 -1
  131. package/dist/delegate-pack-recipes.js +45 -14
  132. package/dist/demo-package.js +2 -2
  133. package/dist/demo-script.js +2 -2
  134. package/dist/demo-workflow.js +3 -3
  135. package/dist/dev-cycle.js +1 -1
  136. package/dist/dev-session.js +1 -1
  137. package/dist/doc-references.d.ts +23 -2
  138. package/dist/doc-references.d.ts.map +1 -1
  139. package/dist/doc-references.js +96 -17
  140. package/dist/doctor-result.d.ts +8 -0
  141. package/dist/doctor-result.d.ts.map +1 -1
  142. package/dist/doctor-verdict-kind.d.ts +19 -0
  143. package/dist/doctor-verdict-kind.d.ts.map +1 -0
  144. package/dist/doctor-verdict-kind.js +19 -0
  145. package/dist/doctor-verdict.d.ts +18 -0
  146. package/dist/doctor-verdict.d.ts.map +1 -0
  147. package/dist/doctor-verdict.js +28 -0
  148. package/dist/drift.d.ts +17 -0
  149. package/dist/drift.d.ts.map +1 -1
  150. package/dist/drift.js +40 -10
  151. package/dist/entrypoint-matrix.d.ts.map +1 -1
  152. package/dist/entrypoint-matrix.js +4 -1
  153. package/dist/feedback-ingestion.d.ts +28 -2
  154. package/dist/feedback-ingestion.d.ts.map +1 -1
  155. package/dist/feedback-ingestion.js +68 -19
  156. package/dist/fix-preview.d.ts.map +1 -1
  157. package/dist/fix-preview.js +9 -5
  158. package/dist/framework-extractor-outcomes.d.ts +27 -0
  159. package/dist/framework-extractor-outcomes.d.ts.map +1 -0
  160. package/dist/framework-extractor-outcomes.js +83 -0
  161. package/dist/fuzzy-impact.js +1 -1
  162. package/dist/healing-plan.d.ts.map +1 -1
  163. package/dist/healing-plan.js +3 -4
  164. package/dist/helper-catalog.d.ts +25 -0
  165. package/dist/helper-catalog.d.ts.map +1 -0
  166. package/dist/helper-catalog.js +91 -0
  167. package/dist/helper-registry.d.ts.map +1 -1
  168. package/dist/helper-registry.js +17 -1
  169. package/dist/helper-view.d.ts +33 -0
  170. package/dist/helper-view.d.ts.map +1 -0
  171. package/dist/helper-view.js +1 -0
  172. package/dist/i-asset-doctor-flags.d.ts +16 -0
  173. package/dist/i-asset-doctor-flags.d.ts.map +1 -0
  174. package/dist/i-asset-doctor-flags.js +1 -0
  175. package/dist/i-command-resolution.d.ts +22 -0
  176. package/dist/i-command-resolution.d.ts.map +1 -0
  177. package/dist/i-command-resolution.js +1 -0
  178. package/dist/i-command-resolve-options.d.ts +24 -0
  179. package/dist/i-command-resolve-options.d.ts.map +1 -0
  180. package/dist/i-command-resolve-options.js +1 -0
  181. package/dist/i-command-safety.d.ts +13 -0
  182. package/dist/i-command-safety.d.ts.map +1 -0
  183. package/dist/i-command-safety.js +1 -0
  184. package/dist/i-contribution-accepted-entry.d.ts +18 -0
  185. package/dist/i-contribution-accepted-entry.d.ts.map +1 -0
  186. package/dist/i-contribution-accepted-entry.js +1 -0
  187. package/dist/i-contribution-entry-rejection.d.ts +21 -0
  188. package/dist/i-contribution-entry-rejection.d.ts.map +1 -0
  189. package/dist/i-contribution-entry-rejection.js +1 -0
  190. package/dist/i-contribution-file-issue.d.ts +18 -0
  191. package/dist/i-contribution-file-issue.d.ts.map +1 -0
  192. package/dist/i-contribution-file-issue.js +1 -0
  193. package/dist/i-contribution-file-report.d.ts +40 -0
  194. package/dist/i-contribution-file-report.d.ts.map +1 -0
  195. package/dist/i-contribution-file-report.js +1 -0
  196. package/dist/i-contribution-file-validation.d.ts +24 -0
  197. package/dist/i-contribution-file-validation.d.ts.map +1 -0
  198. package/dist/i-contribution-file-validation.js +1 -0
  199. package/dist/i-contributions-report.d.ts +31 -0
  200. package/dist/i-contributions-report.d.ts.map +1 -0
  201. package/dist/i-contributions-report.js +1 -0
  202. package/dist/i-declared-xref-field.d.ts +25 -0
  203. package/dist/i-declared-xref-field.d.ts.map +1 -0
  204. package/dist/i-declared-xref-field.js +1 -0
  205. package/dist/i-declared-xref-issue.d.ts +25 -0
  206. package/dist/i-declared-xref-issue.d.ts.map +1 -0
  207. package/dist/i-declared-xref-issue.js +1 -0
  208. package/dist/i-declared-xref-report.d.ts +48 -0
  209. package/dist/i-declared-xref-report.d.ts.map +1 -0
  210. package/dist/i-declared-xref-report.js +1 -0
  211. package/dist/i-declared-xref-row.d.ts +29 -0
  212. package/dist/i-declared-xref-row.d.ts.map +1 -0
  213. package/dist/i-declared-xref-row.js +1 -0
  214. package/dist/i-doctor-verdict.d.ts +10 -0
  215. package/dist/i-doctor-verdict.d.ts.map +1 -0
  216. package/dist/i-doctor-verdict.js +1 -0
  217. package/dist/i-kind-outcomes.d.ts +13 -0
  218. package/dist/i-kind-outcomes.d.ts.map +1 -0
  219. package/dist/i-kind-outcomes.js +1 -0
  220. package/dist/i-pack-doctor-verdict.d.ts +15 -0
  221. package/dist/i-pack-doctor-verdict.d.ts.map +1 -0
  222. package/dist/i-pack-doctor-verdict.js +1 -0
  223. package/dist/i-probed-id-field.d.ts +17 -0
  224. package/dist/i-probed-id-field.d.ts.map +1 -0
  225. package/dist/i-probed-id-field.js +1 -0
  226. package/dist/i-reference-kind-declaration.d.ts +38 -0
  227. package/dist/i-reference-kind-declaration.d.ts.map +1 -0
  228. package/dist/i-reference-kind-declaration.js +1 -0
  229. package/dist/i-reference-warm-options.d.ts +21 -0
  230. package/dist/i-reference-warm-options.d.ts.map +1 -0
  231. package/dist/i-reference-warm-options.js +1 -0
  232. package/dist/i-registry-outcomes.d.ts +16 -0
  233. package/dist/i-registry-outcomes.d.ts.map +1 -0
  234. package/dist/i-registry-outcomes.js +1 -0
  235. package/dist/i-scaffold-pattern-doctor-report.d.ts +35 -0
  236. package/dist/i-scaffold-pattern-doctor-report.d.ts.map +1 -0
  237. package/dist/i-scaffold-pattern-doctor-report.js +1 -0
  238. package/dist/i-search-tuning-key-probe.d.ts +30 -0
  239. package/dist/i-search-tuning-key-probe.d.ts.map +1 -0
  240. package/dist/i-search-tuning-key-probe.js +1 -0
  241. package/dist/i-search-tuning-lint-issue.d.ts +61 -0
  242. package/dist/i-search-tuning-lint-issue.d.ts.map +1 -0
  243. package/dist/i-search-tuning-lint-issue.js +1 -0
  244. package/dist/i-search-tuning-lint-report.d.ts +38 -0
  245. package/dist/i-search-tuning-lint-report.d.ts.map +1 -0
  246. package/dist/i-search-tuning-lint-report.js +1 -0
  247. package/dist/i-unresolvable-reference-scan.d.ts +14 -0
  248. package/dist/i-unresolvable-reference-scan.d.ts.map +1 -0
  249. package/dist/i-unresolvable-reference-scan.js +1 -0
  250. package/dist/i-unresolvable-reference.d.ts +29 -0
  251. package/dist/i-unresolvable-reference.d.ts.map +1 -0
  252. package/dist/i-unresolvable-reference.js +1 -0
  253. package/dist/i-workspace-profile-payload.d.ts +12 -0
  254. package/dist/i-workspace-profile-payload.d.ts.map +1 -0
  255. package/dist/i-workspace-profile-payload.js +1 -0
  256. package/dist/impact-analysis.d.ts +15 -0
  257. package/dist/impact-analysis.d.ts.map +1 -1
  258. package/dist/impact-analysis.js +58 -13
  259. package/dist/impact-render.d.ts.map +1 -1
  260. package/dist/impact-render.js +22 -0
  261. package/dist/import-hygiene.d.ts +35 -1
  262. package/dist/import-hygiene.d.ts.map +1 -1
  263. package/dist/import-hygiene.js +107 -13
  264. package/dist/index.d.ts +141 -0
  265. package/dist/index.d.ts.map +1 -1
  266. package/dist/index.js +172 -0
  267. package/dist/inspection-discovery.d.ts +45 -0
  268. package/dist/inspection-discovery.d.ts.map +1 -0
  269. package/dist/inspection-discovery.js +70 -0
  270. package/dist/knowledge-advisory-code.d.ts +17 -0
  271. package/dist/knowledge-advisory-code.d.ts.map +1 -0
  272. package/dist/knowledge-advisory-code.js +17 -0
  273. package/dist/knowledge-aged-entry.d.ts +10 -0
  274. package/dist/knowledge-aged-entry.d.ts.map +1 -0
  275. package/dist/knowledge-aged-entry.js +1 -0
  276. package/dist/knowledge-authoring.d.ts +24 -1
  277. package/dist/knowledge-authoring.d.ts.map +1 -1
  278. package/dist/knowledge-authoring.js +46 -7
  279. package/dist/knowledge-entry-verdict-record.d.ts +22 -0
  280. package/dist/knowledge-entry-verdict-record.d.ts.map +1 -0
  281. package/dist/knowledge-entry-verdict-record.js +1 -0
  282. package/dist/knowledge-entry-verdict.d.ts +17 -0
  283. package/dist/knowledge-entry-verdict.d.ts.map +1 -0
  284. package/dist/knowledge-entry-verdict.js +17 -0
  285. package/dist/knowledge-graph.d.ts +6 -0
  286. package/dist/knowledge-graph.d.ts.map +1 -1
  287. package/dist/knowledge-graph.js +18 -7
  288. package/dist/knowledge-kind-bucket.d.ts +19 -0
  289. package/dist/knowledge-kind-bucket.d.ts.map +1 -0
  290. package/dist/knowledge-kind-bucket.js +1 -0
  291. package/dist/knowledge-load-failure.d.ts +23 -0
  292. package/dist/knowledge-load-failure.d.ts.map +1 -0
  293. package/dist/knowledge-load-failure.js +1 -0
  294. package/dist/knowledge-reference-kind-bucket.d.ts +11 -0
  295. package/dist/knowledge-reference-kind-bucket.d.ts.map +1 -0
  296. package/dist/knowledge-reference-kind-bucket.js +1 -0
  297. package/dist/knowledge-stale-advisory.d.ts +14 -0
  298. package/dist/knowledge-stale-advisory.d.ts.map +1 -0
  299. package/dist/knowledge-stale-advisory.js +1 -0
  300. package/dist/knowledge-stale-coverage.d.ts +19 -0
  301. package/dist/knowledge-stale-coverage.d.ts.map +1 -0
  302. package/dist/knowledge-stale-coverage.js +1 -0
  303. package/dist/knowledge-stale-gate-flags.d.ts +33 -0
  304. package/dist/knowledge-stale-gate-flags.d.ts.map +1 -0
  305. package/dist/knowledge-stale-gate-flags.js +1 -0
  306. package/dist/knowledge-stale-gate-input.d.ts +46 -0
  307. package/dist/knowledge-stale-gate-input.d.ts.map +1 -0
  308. package/dist/knowledge-stale-gate-input.js +1 -0
  309. package/dist/knowledge-stale-gate-result.d.ts +33 -0
  310. package/dist/knowledge-stale-gate-result.d.ts.map +1 -0
  311. package/dist/knowledge-stale-gate-result.js +1 -0
  312. package/dist/knowledge-stale-gate-rule.d.ts +33 -0
  313. package/dist/knowledge-stale-gate-rule.d.ts.map +1 -0
  314. package/dist/knowledge-stale-gate-rule.js +1 -0
  315. package/dist/knowledge-stale-gate-violation.d.ts +13 -0
  316. package/dist/knowledge-stale-gate-violation.d.ts.map +1 -0
  317. package/dist/knowledge-stale-gate-violation.js +1 -0
  318. package/dist/knowledge-stale-gate.d.ts +83 -0
  319. package/dist/knowledge-stale-gate.d.ts.map +1 -0
  320. package/dist/knowledge-stale-gate.js +429 -0
  321. package/dist/knowledge-stale-quality-gate.d.ts +26 -0
  322. package/dist/knowledge-stale-quality-gate.d.ts.map +1 -0
  323. package/dist/knowledge-stale-quality-gate.js +110 -0
  324. package/dist/knowledge-stale.d.ts +122 -9
  325. package/dist/knowledge-stale.d.ts.map +1 -1
  326. package/dist/knowledge-stale.js +996 -291
  327. package/dist/knowledge-unverifiable-reason.d.ts +12 -0
  328. package/dist/knowledge-unverifiable-reason.d.ts.map +1 -0
  329. package/dist/knowledge-unverifiable-reason.js +12 -0
  330. package/dist/loader-diagnostics.d.ts +14 -2
  331. package/dist/loader-diagnostics.d.ts.map +1 -1
  332. package/dist/match-terms.d.ts +48 -0
  333. package/dist/match-terms.d.ts.map +1 -0
  334. package/dist/match-terms.js +155 -0
  335. package/dist/migration-profile-registry.d.ts +10 -0
  336. package/dist/migration-profile-registry.d.ts.map +1 -1
  337. package/dist/migration-profile-registry.js +57 -34
  338. package/dist/migration-readiness.d.ts.map +1 -1
  339. package/dist/migration-readiness.js +1 -3
  340. package/dist/nearest-id.d.ts +10 -26
  341. package/dist/nearest-id.d.ts.map +1 -1
  342. package/dist/nearest-id.js +9 -59
  343. package/dist/pack-asset-freshness.d.ts +65 -0
  344. package/dist/pack-asset-freshness.d.ts.map +1 -0
  345. package/dist/pack-asset-freshness.js +340 -0
  346. package/dist/pack-author-ux.d.ts +24 -3
  347. package/dist/pack-author-ux.d.ts.map +1 -1
  348. package/dist/pack-author-ux.js +87 -93
  349. package/dist/pack-contributions-inventory.d.ts +79 -39
  350. package/dist/pack-contributions-inventory.d.ts.map +1 -1
  351. package/dist/pack-contributions-inventory.js +443 -286
  352. package/dist/pack-doctor-verdict.d.ts +29 -0
  353. package/dist/pack-doctor-verdict.d.ts.map +1 -0
  354. package/dist/pack-doctor-verdict.js +45 -0
  355. package/dist/pack-doctor.d.ts +74 -1
  356. package/dist/pack-doctor.d.ts.map +1 -1
  357. package/dist/pack-doctor.js +281 -1
  358. package/dist/pack-helper-plan.d.ts +24 -0
  359. package/dist/pack-helper-plan.d.ts.map +1 -0
  360. package/dist/pack-helper-plan.js +77 -0
  361. package/dist/pack-helper-registry.d.ts +14 -0
  362. package/dist/pack-helper-registry.d.ts.map +1 -1
  363. package/dist/pack-helper-registry.js +76 -37
  364. package/dist/pack-manifest-reader.d.ts +8 -0
  365. package/dist/pack-manifest-reader.d.ts.map +1 -0
  366. package/dist/pack-manifest-reader.js +79 -0
  367. package/dist/pack-release-check.d.ts +14 -1
  368. package/dist/pack-release-check.d.ts.map +1 -1
  369. package/dist/pack-release-check.js +23 -1
  370. package/dist/pack-signature-status.d.ts +18 -6
  371. package/dist/pack-signature-status.d.ts.map +1 -1
  372. package/dist/pack-signature-status.js +59 -105
  373. package/dist/pack-test-runner.d.ts +27 -5
  374. package/dist/pack-test-runner.d.ts.map +1 -1
  375. package/dist/pack-test-runner.js +91 -35
  376. package/dist/pack-typecheck.d.ts +8 -0
  377. package/dist/pack-typecheck.d.ts.map +1 -0
  378. package/dist/pack-typecheck.js +76 -0
  379. package/dist/plan-review.d.ts +2 -0
  380. package/dist/plan-review.d.ts.map +1 -1
  381. package/dist/plan-review.js +17 -5
  382. package/dist/plan-simulation.d.ts.map +1 -1
  383. package/dist/plan-simulation.js +16 -5
  384. package/dist/playbook-load-issue.d.ts +16 -0
  385. package/dist/playbook-load-issue.d.ts.map +1 -0
  386. package/dist/playbook-load-issue.js +1 -0
  387. package/dist/playbook-registry.d.ts +32 -1
  388. package/dist/playbook-registry.d.ts.map +1 -1
  389. package/dist/playbook-registry.js +144 -55
  390. package/dist/policy-declaration.d.ts +18 -0
  391. package/dist/policy-declaration.d.ts.map +1 -0
  392. package/dist/policy-declaration.js +1 -0
  393. package/dist/policy-engine.d.ts +8 -0
  394. package/dist/policy-engine.d.ts.map +1 -1
  395. package/dist/policy-engine.js +26 -9
  396. package/dist/policy-overrides.d.ts.map +1 -1
  397. package/dist/policy-overrides.js +4 -4
  398. package/dist/policy-registry.d.ts +27 -0
  399. package/dist/policy-registry.d.ts.map +1 -1
  400. package/dist/policy-registry.js +87 -20
  401. package/dist/probed-id-fields.d.ts +21 -0
  402. package/dist/probed-id-fields.d.ts.map +1 -0
  403. package/dist/probed-id-fields.js +25 -0
  404. package/dist/probed-id-source.d.ts +11 -0
  405. package/dist/probed-id-source.d.ts.map +1 -0
  406. package/dist/probed-id-source.js +11 -0
  407. package/dist/profile-registry.d.ts +25 -2
  408. package/dist/profile-registry.d.ts.map +1 -1
  409. package/dist/profile-registry.js +59 -6
  410. package/dist/quality-gate-examination.d.ts +15 -0
  411. package/dist/quality-gate-examination.d.ts.map +1 -0
  412. package/dist/quality-gate-examination.js +15 -0
  413. package/dist/quality-gate-row-status.d.ts +19 -0
  414. package/dist/quality-gate-row-status.d.ts.map +1 -0
  415. package/dist/quality-gate-row-status.js +28 -0
  416. package/dist/quality-gate-status.d.ts +16 -0
  417. package/dist/quality-gate-status.d.ts.map +1 -0
  418. package/dist/quality-gate-status.js +16 -0
  419. package/dist/quality-html.d.ts.map +1 -1
  420. package/dist/quality-html.js +14 -3
  421. package/dist/quality-report-coverage.d.ts +26 -0
  422. package/dist/quality-report-coverage.d.ts.map +1 -0
  423. package/dist/quality-report-coverage.js +48 -0
  424. package/dist/quality-report.d.ts +28 -1
  425. package/dist/quality-report.d.ts.map +1 -1
  426. package/dist/quality-report.js +263 -35
  427. package/dist/query-intent-kind.d.ts +18 -0
  428. package/dist/query-intent-kind.d.ts.map +1 -0
  429. package/dist/query-intent-kind.js +18 -0
  430. package/dist/query-intent-result.d.ts +23 -0
  431. package/dist/query-intent-result.d.ts.map +1 -0
  432. package/dist/query-intent-result.js +1 -0
  433. package/dist/query-intent.d.ts +18 -0
  434. package/dist/query-intent.d.ts.map +1 -0
  435. package/dist/query-intent.js +336 -0
  436. package/dist/query-resolver.d.ts +18 -0
  437. package/dist/query-resolver.d.ts.map +1 -1
  438. package/dist/query-resolver.js +7 -4
  439. package/dist/ranked-recommendations.d.ts +36 -0
  440. package/dist/ranked-recommendations.d.ts.map +1 -0
  441. package/dist/ranked-recommendations.js +1 -0
  442. package/dist/ranker-explainability.d.ts.map +1 -1
  443. package/dist/ranker-explainability.js +38 -10
  444. package/dist/recommend-recipe.d.ts +17 -0
  445. package/dist/recommend-recipe.d.ts.map +1 -0
  446. package/dist/recommend-recipe.js +1 -0
  447. package/dist/recommend-recipes.d.ts +9 -0
  448. package/dist/recommend-recipes.d.ts.map +1 -0
  449. package/dist/recommend-recipes.js +106 -0
  450. package/dist/recommendation-candidate.d.ts +30 -0
  451. package/dist/recommendation-candidate.d.ts.map +1 -0
  452. package/dist/recommendation-candidate.js +1 -0
  453. package/dist/recommendation-confidence.d.ts +27 -0
  454. package/dist/recommendation-confidence.d.ts.map +1 -0
  455. package/dist/recommendation-confidence.js +1 -0
  456. package/dist/recommendation-ranking-options.d.ts +24 -0
  457. package/dist/recommendation-ranking-options.d.ts.map +1 -0
  458. package/dist/recommendation-ranking-options.js +1 -0
  459. package/dist/recommendation-ranking.d.ts +50 -0
  460. package/dist/recommendation-ranking.d.ts.map +1 -0
  461. package/dist/recommendation-ranking.js +527 -0
  462. package/dist/recommendation-source.d.ts +23 -0
  463. package/dist/recommendation-source.d.ts.map +1 -0
  464. package/dist/recommendation-source.js +23 -0
  465. package/dist/recommendation-suppression.d.ts +14 -0
  466. package/dist/recommendation-suppression.d.ts.map +1 -0
  467. package/dist/recommendation-suppression.js +14 -0
  468. package/dist/reference-asset-kind.d.ts +14 -0
  469. package/dist/reference-asset-kind.d.ts.map +1 -0
  470. package/dist/reference-asset-kind.js +14 -0
  471. package/dist/reference-content-check.d.ts +32 -0
  472. package/dist/reference-content-check.d.ts.map +1 -0
  473. package/dist/reference-content-check.js +143 -0
  474. package/dist/reference-failure.d.ts +31 -0
  475. package/dist/reference-failure.d.ts.map +1 -0
  476. package/dist/reference-failure.js +31 -0
  477. package/dist/reference-id-status.d.ts +15 -0
  478. package/dist/reference-id-status.d.ts.map +1 -0
  479. package/dist/reference-id-status.js +15 -0
  480. package/dist/reference-kind-declarations.d.ts +42 -0
  481. package/dist/reference-kind-declarations.d.ts.map +1 -0
  482. package/dist/reference-kind-declarations.js +142 -0
  483. package/dist/reference-lookup.d.ts +6 -0
  484. package/dist/reference-lookup.d.ts.map +1 -1
  485. package/dist/reference-lookup.js +13 -5
  486. package/dist/reference-registry.d.ts +109 -11
  487. package/dist/reference-registry.d.ts.map +1 -1
  488. package/dist/reference-registry.js +186 -30
  489. package/dist/reference-subject.d.ts +20 -0
  490. package/dist/reference-subject.d.ts.map +1 -0
  491. package/dist/reference-subject.js +1 -0
  492. package/dist/registration-hint-discovery-status.d.ts +25 -0
  493. package/dist/registration-hint-discovery-status.d.ts.map +1 -0
  494. package/dist/registration-hint-discovery-status.js +25 -0
  495. package/dist/registration-hint-registry.d.ts +80 -0
  496. package/dist/registration-hint-registry.d.ts.map +1 -1
  497. package/dist/registration-hint-registry.js +356 -138
  498. package/dist/registry-lifecycle.d.ts +200 -19
  499. package/dist/registry-lifecycle.d.ts.map +1 -1
  500. package/dist/registry-lifecycle.js +526 -136
  501. package/dist/release-readiness.d.ts.map +1 -1
  502. package/dist/release-readiness.js +10 -7
  503. package/dist/release-smoke.d.ts.map +1 -1
  504. package/dist/release-smoke.js +11 -7
  505. package/dist/report-site.d.ts.map +1 -1
  506. package/dist/report-site.js +25 -7
  507. package/dist/repository-intelligence.d.ts.map +1 -1
  508. package/dist/repository-intelligence.js +3 -2
  509. package/dist/repository-knowledge-model.d.ts.map +1 -1
  510. package/dist/repository-knowledge-model.js +18 -5
  511. package/dist/resolve-project-config.d.ts +64 -0
  512. package/dist/resolve-project-config.d.ts.map +1 -1
  513. package/dist/resolve-project-config.js +240 -32
  514. package/dist/reuse/compute-reuse-coverage.d.ts +29 -0
  515. package/dist/reuse/compute-reuse-coverage.d.ts.map +1 -0
  516. package/dist/reuse/compute-reuse-coverage.js +198 -0
  517. package/dist/reuse/rank-reuse-candidates.d.ts +38 -0
  518. package/dist/reuse/rank-reuse-candidates.d.ts.map +1 -0
  519. package/dist/reuse/rank-reuse-candidates.js +212 -0
  520. package/dist/reuse/rank-reuse-options.d.ts +20 -0
  521. package/dist/reuse/rank-reuse-options.d.ts.map +1 -0
  522. package/dist/reuse/rank-reuse-options.js +1 -0
  523. package/dist/reuse/rank-reuse-suggestions.d.ts +15 -0
  524. package/dist/reuse/rank-reuse-suggestions.d.ts.map +1 -0
  525. package/dist/reuse/rank-reuse-suggestions.js +31 -0
  526. package/dist/reuse/resolve-curated-reuse.d.ts +43 -0
  527. package/dist/reuse/resolve-curated-reuse.d.ts.map +1 -0
  528. package/dist/reuse/resolve-curated-reuse.js +115 -0
  529. package/dist/reuse/reuse-candidate.d.ts +29 -0
  530. package/dist/reuse/reuse-candidate.d.ts.map +1 -0
  531. package/dist/reuse/reuse-candidate.js +1 -0
  532. package/dist/reuse/reuse-coverage-report.d.ts +74 -0
  533. package/dist/reuse/reuse-coverage-report.d.ts.map +1 -0
  534. package/dist/reuse/reuse-coverage-report.js +1 -0
  535. package/dist/reuse/reuse-curated-coverage.d.ts +36 -0
  536. package/dist/reuse/reuse-curated-coverage.d.ts.map +1 -0
  537. package/dist/reuse/reuse-curated-coverage.js +1 -0
  538. package/dist/reuse/reuse-curated-resolution.d.ts +36 -0
  539. package/dist/reuse/reuse-curated-resolution.d.ts.map +1 -0
  540. package/dist/reuse/reuse-curated-resolution.js +1 -0
  541. package/dist/reuse/reuse-curated-status.d.ts +21 -0
  542. package/dist/reuse/reuse-curated-status.d.ts.map +1 -0
  543. package/dist/reuse/reuse-curated-status.js +21 -0
  544. package/dist/reuse/reuse-match-detail.d.ts +15 -0
  545. package/dist/reuse/reuse-match-detail.d.ts.map +1 -0
  546. package/dist/reuse/reuse-match-detail.js +1 -0
  547. package/dist/reuse/reuse-ranking.d.ts +37 -0
  548. package/dist/reuse/reuse-ranking.d.ts.map +1 -0
  549. package/dist/reuse/reuse-ranking.js +1 -0
  550. package/dist/reuse/reuse-suggestion.d.ts +19 -0
  551. package/dist/reuse/reuse-suggestion.d.ts.map +1 -0
  552. package/dist/reuse/reuse-suggestion.js +1 -0
  553. package/dist/reuse/reuse-symbol-lookup.d.ts +28 -0
  554. package/dist/reuse/reuse-symbol-lookup.d.ts.map +1 -0
  555. package/dist/reuse/reuse-symbol-lookup.js +1 -0
  556. package/dist/reuse/reuse-tokenize.d.ts +11 -0
  557. package/dist/reuse/reuse-tokenize.d.ts.map +1 -0
  558. package/dist/reuse/reuse-tokenize.js +26 -0
  559. package/dist/reuse/score-reuse-name.d.ts +16 -0
  560. package/dist/reuse/score-reuse-name.d.ts.map +1 -0
  561. package/dist/reuse/score-reuse-name.js +35 -0
  562. package/dist/reuse/score-reuse-primitive.d.ts +33 -0
  563. package/dist/reuse/score-reuse-primitive.d.ts.map +1 -0
  564. package/dist/reuse/score-reuse-primitive.js +92 -0
  565. package/dist/review-packet.d.ts +2 -0
  566. package/dist/review-packet.d.ts.map +1 -1
  567. package/dist/review-packet.js +13 -6
  568. package/dist/role-views.d.ts.map +1 -1
  569. package/dist/role-views.js +16 -16
  570. package/dist/routing-recommends-channels.d.ts +24 -0
  571. package/dist/routing-recommends-channels.d.ts.map +1 -0
  572. package/dist/routing-recommends-channels.js +19 -0
  573. package/dist/run-boundary-check.d.ts +118 -0
  574. package/dist/run-boundary-check.d.ts.map +1 -0
  575. package/dist/run-boundary-check.js +592 -0
  576. package/dist/safety-audit.js +1 -1
  577. package/dist/scaffold-coverage.js +1 -1
  578. package/dist/scaffold-pattern-doctor-report.d.ts +19 -0
  579. package/dist/scaffold-pattern-doctor-report.d.ts.map +1 -0
  580. package/dist/scaffold-pattern-doctor-report.js +54 -0
  581. package/dist/scaffold-patterns.d.ts +75 -1
  582. package/dist/scaffold-patterns.d.ts.map +1 -1
  583. package/dist/scaffold-patterns.js +375 -84
  584. package/dist/schema-inventory.d.ts.map +1 -1
  585. package/dist/schema-inventory.js +4 -3
  586. package/dist/search-document-id.d.ts +52 -0
  587. package/dist/search-document-id.d.ts.map +1 -0
  588. package/dist/search-document-id.js +72 -0
  589. package/dist/search-document-prefix.d.ts +7 -0
  590. package/dist/search-document-prefix.d.ts.map +1 -0
  591. package/dist/search-document-prefix.js +1 -0
  592. package/dist/search-index.d.ts.map +1 -1
  593. package/dist/search-index.js +20 -23
  594. package/dist/search-tuning-explain.d.ts +6 -0
  595. package/dist/search-tuning-explain.d.ts.map +1 -1
  596. package/dist/search-tuning-explain.js +19 -17
  597. package/dist/search-tuning-key-probes.d.ts +16 -0
  598. package/dist/search-tuning-key-probes.d.ts.map +1 -0
  599. package/dist/search-tuning-key-probes.js +65 -0
  600. package/dist/search-tuning-key-resolution.d.ts +25 -0
  601. package/dist/search-tuning-key-resolution.d.ts.map +1 -0
  602. package/dist/search-tuning-key-resolution.js +1 -0
  603. package/dist/search-tuning-key-resolver.d.ts +4 -0
  604. package/dist/search-tuning-key-resolver.d.ts.map +1 -0
  605. package/dist/search-tuning-key-resolver.js +107 -0
  606. package/dist/search-tuning-key-status.d.ts +24 -0
  607. package/dist/search-tuning-key-status.d.ts.map +1 -0
  608. package/dist/search-tuning-key-status.js +24 -0
  609. package/dist/search-tuning-lint.d.ts +9 -0
  610. package/dist/search-tuning-lint.d.ts.map +1 -0
  611. package/dist/search-tuning-lint.js +468 -0
  612. package/dist/search-tuning-registry.d.ts +43 -0
  613. package/dist/search-tuning-registry.d.ts.map +1 -1
  614. package/dist/search-tuning-registry.js +214 -49
  615. package/dist/self-audit.d.ts +12 -0
  616. package/dist/self-audit.d.ts.map +1 -1
  617. package/dist/self-audit.js +36 -10
  618. package/dist/self-config-doctor-v2.d.ts +145 -3
  619. package/dist/self-config-doctor-v2.d.ts.map +1 -1
  620. package/dist/self-config-doctor-v2.js +1304 -181
  621. package/dist/self-config-doctor.d.ts +20 -1
  622. package/dist/self-config-doctor.d.ts.map +1 -1
  623. package/dist/self-config-doctor.js +53 -280
  624. package/dist/settled-unit-states.d.ts +9 -0
  625. package/dist/settled-unit-states.d.ts.map +1 -0
  626. package/dist/settled-unit-states.js +14 -0
  627. package/dist/sharkcraft-inspector.d.ts +34 -0
  628. package/dist/sharkcraft-inspector.d.ts.map +1 -1
  629. package/dist/sharkcraft-inspector.js +273 -26
  630. package/dist/spec/spec-evidence.d.ts.map +1 -1
  631. package/dist/spec/spec-evidence.js +14 -20
  632. package/dist/split-identifier.d.ts +21 -0
  633. package/dist/split-identifier.d.ts.map +1 -0
  634. package/dist/split-identifier.js +27 -0
  635. package/dist/start-here.d.ts.map +1 -1
  636. package/dist/start-here.js +1 -2
  637. package/dist/substitute-placeholders.d.ts +8 -0
  638. package/dist/substitute-placeholders.d.ts.map +1 -0
  639. package/dist/substitute-placeholders.js +9 -0
  640. package/dist/symbol-index.d.ts +33 -0
  641. package/dist/symbol-index.d.ts.map +1 -1
  642. package/dist/symbol-index.js +241 -3
  643. package/dist/symbol-member-entry.d.ts +26 -0
  644. package/dist/symbol-member-entry.d.ts.map +1 -0
  645. package/dist/symbol-member-entry.js +1 -0
  646. package/dist/symbol-member-kind.d.ts +14 -0
  647. package/dist/symbol-member-kind.d.ts.map +1 -0
  648. package/dist/symbol-member-kind.js +14 -0
  649. package/dist/task-packet.d.ts.map +1 -1
  650. package/dist/task-packet.js +52 -9
  651. package/dist/task-ranker.d.ts +8 -0
  652. package/dist/task-ranker.d.ts.map +1 -1
  653. package/dist/task-ranker.js +25 -13
  654. package/dist/task-risk.js +1 -1
  655. package/dist/task-routing-hint-registry.d.ts +20 -1
  656. package/dist/task-routing-hint-registry.d.ts.map +1 -1
  657. package/dist/task-routing-hint-registry.js +186 -42
  658. package/dist/template-drift.d.ts.map +1 -1
  659. package/dist/template-drift.js +30 -9
  660. package/dist/template-lint.d.ts.map +1 -1
  661. package/dist/template-lint.js +160 -2
  662. package/dist/term-query.d.ts +10 -0
  663. package/dist/term-query.d.ts.map +1 -0
  664. package/dist/term-query.js +1 -0
  665. package/dist/test-definitions.d.ts +6 -3
  666. package/dist/test-definitions.d.ts.map +1 -1
  667. package/dist/test-runner.d.ts +95 -10
  668. package/dist/test-runner.d.ts.map +1 -1
  669. package/dist/test-runner.js +309 -308
  670. package/dist/tuning-query-tokens.d.ts +29 -0
  671. package/dist/tuning-query-tokens.d.ts.map +1 -0
  672. package/dist/tuning-query-tokens.js +51 -0
  673. package/dist/typecheck-files.d.ts +36 -0
  674. package/dist/typecheck-files.d.ts.map +1 -0
  675. package/dist/typecheck-files.js +158 -0
  676. package/dist/uncertainty.js +1 -1
  677. package/dist/universal-search.d.ts.map +1 -1
  678. package/dist/universal-search.js +5 -3
  679. package/dist/unregistered-exports.d.ts +19 -0
  680. package/dist/unregistered-exports.d.ts.map +1 -0
  681. package/dist/unregistered-exports.js +141 -0
  682. package/dist/unresolvable-reason.d.ts +11 -0
  683. package/dist/unresolvable-reason.d.ts.map +1 -0
  684. package/dist/unresolvable-reason.js +11 -0
  685. package/dist/upgrade-advisor.d.ts.map +1 -1
  686. package/dist/upgrade-advisor.js +16 -9
  687. package/dist/validate-contribution-file.d.ts +4 -0
  688. package/dist/validate-contribution-file.d.ts.map +1 -0
  689. package/dist/validate-contribution-file.js +228 -0
  690. package/dist/why-file.d.ts +3 -0
  691. package/dist/why-file.d.ts.map +1 -1
  692. package/dist/why-file.js +7 -3
  693. package/package.json +17 -17
@@ -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
- const relevantTemplates = compact
91
- ? ranking.templates.slice(0, COMPACT_CAPS.templates).map((r) => r.item)
92
- : ranking.templates.map((r) => r.item);
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.slice(0, 3).map((p) => ({
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 ? rankedPipelines : pickPipelines(inspection.pipelineRegistry.list(), task);
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
- if (top &&
159
- /\b(create|add|implement|generate|new|build)\b/i.test(task) &&
160
- (!runnerUp || top.score - runnerUp.score >= 4)) {
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.map((c) => typeof c === 'string' ? c : c.command),
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,
@@ -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;AAEtF;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;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,CAiBpC;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,CAkCpC;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;AA8BD,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"}
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"}
@@ -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
- out.push({ item: t, score: s, reasons });
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
- out.push({ item: p, score: s, reasons });
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, kind, idPrefix, tuningTokens, tuning) {
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: `${idPrefix}${r.item.id}`, kind, ...(tags ? { tags } : {}), source: 'local' }, tuningTokens, tuning);
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 { item: r.item, score: r.score + boost.delta, reasons: [...r.reasons, ...boost.reasons] };
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
- item: r.item,
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.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length > 1);
387
- const tunedRules = applyTuningToRanked(rules, 'rule', 'rule:', tuningTokens, tuning);
388
- const tunedPaths = applyTuningToRanked(initialPaths, 'path', 'path:', tuningTokens, tuning);
389
- const tunedTemplates = applyTuningToRanked(templates, 'template', 'template:', tuningTokens, tuning);
390
- const tunedPipelines = applyTuningToRanked(initialPipelines, 'pipeline', 'pipeline:', tuningTokens, tuning);
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 report --all --public-only');
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,EAEL,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGvE,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;AA4BD,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAAC,MAAM,EAAE,SAAS,2BAA2B,EAAE,CAAA;CAAE,CAAC,CAoFxG;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,CA0C7C"}
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 importDefault(file) {
20
- const mod = (await importModuleViaLoader(file));
21
- if (Array.isArray(mod.default))
22
- return mod.default;
23
- if (mod.default && typeof mod.default === 'object')
24
- return [mod.default];
25
- if (Array.isArray(mod.taskRoutingHints))
26
- return mod.taskRoutingHints;
27
- return [];
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 cfg = inspection.config;
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 seen = new Set();
49
- const ingest = (raw, source, packageName, sourceFile) => {
50
- const v = validateTaskRoutingHint(raw);
51
- if (!v.valid) {
52
- for (const i of v.issues) {
53
- issues.push({
54
- severity: 'error',
55
- code: 'invalid-hint',
56
- message: `${i.field}: ${i.message}`,
57
- hintId: typeof raw.id === 'string' ? raw.id : undefined,
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
- if (seen.has(raw.id)) {
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 "${raw.id}" already loaded; skipping ${sourceFile}.`,
68
- hintId: raw.id,
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.add(raw.id);
186
+ seen.set(hint.id, sourceFile);
187
+ lintRoutingHint(hint, sourceFile, issues);
74
188
  entries.push({
75
- hint: raw,
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 list = await importDefault(file);
205
+ const exp = await importHints(file);
84
206
  const rel = nodePath.relative(inspection.projectRoot, file) || file;
85
- for (const h of list)
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
- const list = await importDefault(file);
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
- return { entries, issues };
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
- const lower = task.toLowerCase();
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 (lower.includes(kw.toLowerCase())) {
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 (lower.includes(p.toLowerCase())) {
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":"AAqBA,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;AAoND,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CA8DtB"}
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"}