@shrkcrft/inspector 0.1.0-alpha.29 → 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 (694) 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 +40 -0
  69. package/dist/code-intelligence-doctor.d.ts.map +1 -1
  70. package/dist/code-intelligence-doctor.js +86 -12
  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 +80 -0
  138. package/dist/doc-references.d.ts.map +1 -0
  139. package/dist/doc-references.js +269 -0
  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.d.ts.map +1 -1
  162. package/dist/fuzzy-impact.js +12 -21
  163. package/dist/healing-plan.d.ts.map +1 -1
  164. package/dist/healing-plan.js +3 -4
  165. package/dist/helper-catalog.d.ts +25 -0
  166. package/dist/helper-catalog.d.ts.map +1 -0
  167. package/dist/helper-catalog.js +91 -0
  168. package/dist/helper-registry.d.ts.map +1 -1
  169. package/dist/helper-registry.js +17 -1
  170. package/dist/helper-view.d.ts +33 -0
  171. package/dist/helper-view.d.ts.map +1 -0
  172. package/dist/helper-view.js +1 -0
  173. package/dist/i-asset-doctor-flags.d.ts +16 -0
  174. package/dist/i-asset-doctor-flags.d.ts.map +1 -0
  175. package/dist/i-asset-doctor-flags.js +1 -0
  176. package/dist/i-command-resolution.d.ts +22 -0
  177. package/dist/i-command-resolution.d.ts.map +1 -0
  178. package/dist/i-command-resolution.js +1 -0
  179. package/dist/i-command-resolve-options.d.ts +24 -0
  180. package/dist/i-command-resolve-options.d.ts.map +1 -0
  181. package/dist/i-command-resolve-options.js +1 -0
  182. package/dist/i-command-safety.d.ts +13 -0
  183. package/dist/i-command-safety.d.ts.map +1 -0
  184. package/dist/i-command-safety.js +1 -0
  185. package/dist/i-contribution-accepted-entry.d.ts +18 -0
  186. package/dist/i-contribution-accepted-entry.d.ts.map +1 -0
  187. package/dist/i-contribution-accepted-entry.js +1 -0
  188. package/dist/i-contribution-entry-rejection.d.ts +21 -0
  189. package/dist/i-contribution-entry-rejection.d.ts.map +1 -0
  190. package/dist/i-contribution-entry-rejection.js +1 -0
  191. package/dist/i-contribution-file-issue.d.ts +18 -0
  192. package/dist/i-contribution-file-issue.d.ts.map +1 -0
  193. package/dist/i-contribution-file-issue.js +1 -0
  194. package/dist/i-contribution-file-report.d.ts +40 -0
  195. package/dist/i-contribution-file-report.d.ts.map +1 -0
  196. package/dist/i-contribution-file-report.js +1 -0
  197. package/dist/i-contribution-file-validation.d.ts +24 -0
  198. package/dist/i-contribution-file-validation.d.ts.map +1 -0
  199. package/dist/i-contribution-file-validation.js +1 -0
  200. package/dist/i-contributions-report.d.ts +31 -0
  201. package/dist/i-contributions-report.d.ts.map +1 -0
  202. package/dist/i-contributions-report.js +1 -0
  203. package/dist/i-declared-xref-field.d.ts +25 -0
  204. package/dist/i-declared-xref-field.d.ts.map +1 -0
  205. package/dist/i-declared-xref-field.js +1 -0
  206. package/dist/i-declared-xref-issue.d.ts +25 -0
  207. package/dist/i-declared-xref-issue.d.ts.map +1 -0
  208. package/dist/i-declared-xref-issue.js +1 -0
  209. package/dist/i-declared-xref-report.d.ts +48 -0
  210. package/dist/i-declared-xref-report.d.ts.map +1 -0
  211. package/dist/i-declared-xref-report.js +1 -0
  212. package/dist/i-declared-xref-row.d.ts +29 -0
  213. package/dist/i-declared-xref-row.d.ts.map +1 -0
  214. package/dist/i-declared-xref-row.js +1 -0
  215. package/dist/i-doctor-verdict.d.ts +10 -0
  216. package/dist/i-doctor-verdict.d.ts.map +1 -0
  217. package/dist/i-doctor-verdict.js +1 -0
  218. package/dist/i-kind-outcomes.d.ts +13 -0
  219. package/dist/i-kind-outcomes.d.ts.map +1 -0
  220. package/dist/i-kind-outcomes.js +1 -0
  221. package/dist/i-pack-doctor-verdict.d.ts +15 -0
  222. package/dist/i-pack-doctor-verdict.d.ts.map +1 -0
  223. package/dist/i-pack-doctor-verdict.js +1 -0
  224. package/dist/i-probed-id-field.d.ts +17 -0
  225. package/dist/i-probed-id-field.d.ts.map +1 -0
  226. package/dist/i-probed-id-field.js +1 -0
  227. package/dist/i-reference-kind-declaration.d.ts +38 -0
  228. package/dist/i-reference-kind-declaration.d.ts.map +1 -0
  229. package/dist/i-reference-kind-declaration.js +1 -0
  230. package/dist/i-reference-warm-options.d.ts +21 -0
  231. package/dist/i-reference-warm-options.d.ts.map +1 -0
  232. package/dist/i-reference-warm-options.js +1 -0
  233. package/dist/i-registry-outcomes.d.ts +16 -0
  234. package/dist/i-registry-outcomes.d.ts.map +1 -0
  235. package/dist/i-registry-outcomes.js +1 -0
  236. package/dist/i-scaffold-pattern-doctor-report.d.ts +35 -0
  237. package/dist/i-scaffold-pattern-doctor-report.d.ts.map +1 -0
  238. package/dist/i-scaffold-pattern-doctor-report.js +1 -0
  239. package/dist/i-search-tuning-key-probe.d.ts +30 -0
  240. package/dist/i-search-tuning-key-probe.d.ts.map +1 -0
  241. package/dist/i-search-tuning-key-probe.js +1 -0
  242. package/dist/i-search-tuning-lint-issue.d.ts +61 -0
  243. package/dist/i-search-tuning-lint-issue.d.ts.map +1 -0
  244. package/dist/i-search-tuning-lint-issue.js +1 -0
  245. package/dist/i-search-tuning-lint-report.d.ts +38 -0
  246. package/dist/i-search-tuning-lint-report.d.ts.map +1 -0
  247. package/dist/i-search-tuning-lint-report.js +1 -0
  248. package/dist/i-unresolvable-reference-scan.d.ts +14 -0
  249. package/dist/i-unresolvable-reference-scan.d.ts.map +1 -0
  250. package/dist/i-unresolvable-reference-scan.js +1 -0
  251. package/dist/i-unresolvable-reference.d.ts +29 -0
  252. package/dist/i-unresolvable-reference.d.ts.map +1 -0
  253. package/dist/i-unresolvable-reference.js +1 -0
  254. package/dist/i-workspace-profile-payload.d.ts +12 -0
  255. package/dist/i-workspace-profile-payload.d.ts.map +1 -0
  256. package/dist/i-workspace-profile-payload.js +1 -0
  257. package/dist/impact-analysis.d.ts +15 -0
  258. package/dist/impact-analysis.d.ts.map +1 -1
  259. package/dist/impact-analysis.js +58 -13
  260. package/dist/impact-render.d.ts.map +1 -1
  261. package/dist/impact-render.js +22 -0
  262. package/dist/import-hygiene.d.ts +35 -1
  263. package/dist/import-hygiene.d.ts.map +1 -1
  264. package/dist/import-hygiene.js +107 -13
  265. package/dist/index.d.ts +145 -0
  266. package/dist/index.d.ts.map +1 -1
  267. package/dist/index.js +176 -0
  268. package/dist/inspection-discovery.d.ts +45 -0
  269. package/dist/inspection-discovery.d.ts.map +1 -0
  270. package/dist/inspection-discovery.js +70 -0
  271. package/dist/knowledge-advisory-code.d.ts +17 -0
  272. package/dist/knowledge-advisory-code.d.ts.map +1 -0
  273. package/dist/knowledge-advisory-code.js +17 -0
  274. package/dist/knowledge-aged-entry.d.ts +10 -0
  275. package/dist/knowledge-aged-entry.d.ts.map +1 -0
  276. package/dist/knowledge-aged-entry.js +1 -0
  277. package/dist/knowledge-authoring.d.ts +24 -1
  278. package/dist/knowledge-authoring.d.ts.map +1 -1
  279. package/dist/knowledge-authoring.js +46 -7
  280. package/dist/knowledge-entry-verdict-record.d.ts +22 -0
  281. package/dist/knowledge-entry-verdict-record.d.ts.map +1 -0
  282. package/dist/knowledge-entry-verdict-record.js +1 -0
  283. package/dist/knowledge-entry-verdict.d.ts +17 -0
  284. package/dist/knowledge-entry-verdict.d.ts.map +1 -0
  285. package/dist/knowledge-entry-verdict.js +17 -0
  286. package/dist/knowledge-graph.d.ts +6 -0
  287. package/dist/knowledge-graph.d.ts.map +1 -1
  288. package/dist/knowledge-graph.js +18 -7
  289. package/dist/knowledge-kind-bucket.d.ts +19 -0
  290. package/dist/knowledge-kind-bucket.d.ts.map +1 -0
  291. package/dist/knowledge-kind-bucket.js +1 -0
  292. package/dist/knowledge-load-failure.d.ts +23 -0
  293. package/dist/knowledge-load-failure.d.ts.map +1 -0
  294. package/dist/knowledge-load-failure.js +1 -0
  295. package/dist/knowledge-reference-kind-bucket.d.ts +11 -0
  296. package/dist/knowledge-reference-kind-bucket.d.ts.map +1 -0
  297. package/dist/knowledge-reference-kind-bucket.js +1 -0
  298. package/dist/knowledge-stale-advisory.d.ts +14 -0
  299. package/dist/knowledge-stale-advisory.d.ts.map +1 -0
  300. package/dist/knowledge-stale-advisory.js +1 -0
  301. package/dist/knowledge-stale-coverage.d.ts +19 -0
  302. package/dist/knowledge-stale-coverage.d.ts.map +1 -0
  303. package/dist/knowledge-stale-coverage.js +1 -0
  304. package/dist/knowledge-stale-gate-flags.d.ts +33 -0
  305. package/dist/knowledge-stale-gate-flags.d.ts.map +1 -0
  306. package/dist/knowledge-stale-gate-flags.js +1 -0
  307. package/dist/knowledge-stale-gate-input.d.ts +46 -0
  308. package/dist/knowledge-stale-gate-input.d.ts.map +1 -0
  309. package/dist/knowledge-stale-gate-input.js +1 -0
  310. package/dist/knowledge-stale-gate-result.d.ts +33 -0
  311. package/dist/knowledge-stale-gate-result.d.ts.map +1 -0
  312. package/dist/knowledge-stale-gate-result.js +1 -0
  313. package/dist/knowledge-stale-gate-rule.d.ts +33 -0
  314. package/dist/knowledge-stale-gate-rule.d.ts.map +1 -0
  315. package/dist/knowledge-stale-gate-rule.js +1 -0
  316. package/dist/knowledge-stale-gate-violation.d.ts +13 -0
  317. package/dist/knowledge-stale-gate-violation.d.ts.map +1 -0
  318. package/dist/knowledge-stale-gate-violation.js +1 -0
  319. package/dist/knowledge-stale-gate.d.ts +83 -0
  320. package/dist/knowledge-stale-gate.d.ts.map +1 -0
  321. package/dist/knowledge-stale-gate.js +429 -0
  322. package/dist/knowledge-stale-quality-gate.d.ts +26 -0
  323. package/dist/knowledge-stale-quality-gate.d.ts.map +1 -0
  324. package/dist/knowledge-stale-quality-gate.js +110 -0
  325. package/dist/knowledge-stale.d.ts +122 -9
  326. package/dist/knowledge-stale.d.ts.map +1 -1
  327. package/dist/knowledge-stale.js +1002 -316
  328. package/dist/knowledge-unverifiable-reason.d.ts +12 -0
  329. package/dist/knowledge-unverifiable-reason.d.ts.map +1 -0
  330. package/dist/knowledge-unverifiable-reason.js +12 -0
  331. package/dist/loader-diagnostics.d.ts +14 -2
  332. package/dist/loader-diagnostics.d.ts.map +1 -1
  333. package/dist/match-terms.d.ts +48 -0
  334. package/dist/match-terms.d.ts.map +1 -0
  335. package/dist/match-terms.js +155 -0
  336. package/dist/migration-profile-registry.d.ts +10 -0
  337. package/dist/migration-profile-registry.d.ts.map +1 -1
  338. package/dist/migration-profile-registry.js +57 -34
  339. package/dist/migration-readiness.d.ts.map +1 -1
  340. package/dist/migration-readiness.js +1 -3
  341. package/dist/nearest-id.d.ts +14 -0
  342. package/dist/nearest-id.d.ts.map +1 -0
  343. package/dist/nearest-id.js +12 -0
  344. package/dist/pack-asset-freshness.d.ts +65 -0
  345. package/dist/pack-asset-freshness.d.ts.map +1 -0
  346. package/dist/pack-asset-freshness.js +340 -0
  347. package/dist/pack-author-ux.d.ts +24 -3
  348. package/dist/pack-author-ux.d.ts.map +1 -1
  349. package/dist/pack-author-ux.js +87 -93
  350. package/dist/pack-contributions-inventory.d.ts +79 -39
  351. package/dist/pack-contributions-inventory.d.ts.map +1 -1
  352. package/dist/pack-contributions-inventory.js +443 -286
  353. package/dist/pack-doctor-verdict.d.ts +29 -0
  354. package/dist/pack-doctor-verdict.d.ts.map +1 -0
  355. package/dist/pack-doctor-verdict.js +45 -0
  356. package/dist/pack-doctor.d.ts +74 -1
  357. package/dist/pack-doctor.d.ts.map +1 -1
  358. package/dist/pack-doctor.js +281 -1
  359. package/dist/pack-helper-plan.d.ts +24 -0
  360. package/dist/pack-helper-plan.d.ts.map +1 -0
  361. package/dist/pack-helper-plan.js +77 -0
  362. package/dist/pack-helper-registry.d.ts +14 -0
  363. package/dist/pack-helper-registry.d.ts.map +1 -1
  364. package/dist/pack-helper-registry.js +76 -37
  365. package/dist/pack-manifest-reader.d.ts +8 -0
  366. package/dist/pack-manifest-reader.d.ts.map +1 -0
  367. package/dist/pack-manifest-reader.js +79 -0
  368. package/dist/pack-release-check.d.ts +14 -1
  369. package/dist/pack-release-check.d.ts.map +1 -1
  370. package/dist/pack-release-check.js +23 -1
  371. package/dist/pack-signature-status.d.ts +18 -6
  372. package/dist/pack-signature-status.d.ts.map +1 -1
  373. package/dist/pack-signature-status.js +59 -105
  374. package/dist/pack-test-runner.d.ts +27 -5
  375. package/dist/pack-test-runner.d.ts.map +1 -1
  376. package/dist/pack-test-runner.js +91 -35
  377. package/dist/pack-typecheck.d.ts +8 -0
  378. package/dist/pack-typecheck.d.ts.map +1 -0
  379. package/dist/pack-typecheck.js +76 -0
  380. package/dist/plan-review.d.ts +2 -0
  381. package/dist/plan-review.d.ts.map +1 -1
  382. package/dist/plan-review.js +17 -5
  383. package/dist/plan-simulation.d.ts.map +1 -1
  384. package/dist/plan-simulation.js +16 -5
  385. package/dist/playbook-load-issue.d.ts +16 -0
  386. package/dist/playbook-load-issue.d.ts.map +1 -0
  387. package/dist/playbook-load-issue.js +1 -0
  388. package/dist/playbook-registry.d.ts +32 -1
  389. package/dist/playbook-registry.d.ts.map +1 -1
  390. package/dist/playbook-registry.js +144 -55
  391. package/dist/policy-declaration.d.ts +18 -0
  392. package/dist/policy-declaration.d.ts.map +1 -0
  393. package/dist/policy-declaration.js +1 -0
  394. package/dist/policy-engine.d.ts +8 -0
  395. package/dist/policy-engine.d.ts.map +1 -1
  396. package/dist/policy-engine.js +26 -9
  397. package/dist/policy-overrides.d.ts.map +1 -1
  398. package/dist/policy-overrides.js +4 -4
  399. package/dist/policy-registry.d.ts +42 -0
  400. package/dist/policy-registry.d.ts.map +1 -0
  401. package/dist/policy-registry.js +131 -0
  402. package/dist/probed-id-fields.d.ts +21 -0
  403. package/dist/probed-id-fields.d.ts.map +1 -0
  404. package/dist/probed-id-fields.js +25 -0
  405. package/dist/probed-id-source.d.ts +11 -0
  406. package/dist/probed-id-source.d.ts.map +1 -0
  407. package/dist/probed-id-source.js +11 -0
  408. package/dist/profile-registry.d.ts +25 -2
  409. package/dist/profile-registry.d.ts.map +1 -1
  410. package/dist/profile-registry.js +59 -6
  411. package/dist/quality-gate-examination.d.ts +15 -0
  412. package/dist/quality-gate-examination.d.ts.map +1 -0
  413. package/dist/quality-gate-examination.js +15 -0
  414. package/dist/quality-gate-row-status.d.ts +19 -0
  415. package/dist/quality-gate-row-status.d.ts.map +1 -0
  416. package/dist/quality-gate-row-status.js +28 -0
  417. package/dist/quality-gate-status.d.ts +16 -0
  418. package/dist/quality-gate-status.d.ts.map +1 -0
  419. package/dist/quality-gate-status.js +16 -0
  420. package/dist/quality-html.d.ts.map +1 -1
  421. package/dist/quality-html.js +14 -3
  422. package/dist/quality-report-coverage.d.ts +26 -0
  423. package/dist/quality-report-coverage.d.ts.map +1 -0
  424. package/dist/quality-report-coverage.js +48 -0
  425. package/dist/quality-report.d.ts +28 -1
  426. package/dist/quality-report.d.ts.map +1 -1
  427. package/dist/quality-report.js +263 -35
  428. package/dist/query-intent-kind.d.ts +18 -0
  429. package/dist/query-intent-kind.d.ts.map +1 -0
  430. package/dist/query-intent-kind.js +18 -0
  431. package/dist/query-intent-result.d.ts +23 -0
  432. package/dist/query-intent-result.d.ts.map +1 -0
  433. package/dist/query-intent-result.js +1 -0
  434. package/dist/query-intent.d.ts +18 -0
  435. package/dist/query-intent.d.ts.map +1 -0
  436. package/dist/query-intent.js +336 -0
  437. package/dist/query-resolver.d.ts +18 -0
  438. package/dist/query-resolver.d.ts.map +1 -1
  439. package/dist/query-resolver.js +15 -12
  440. package/dist/ranked-recommendations.d.ts +36 -0
  441. package/dist/ranked-recommendations.d.ts.map +1 -0
  442. package/dist/ranked-recommendations.js +1 -0
  443. package/dist/ranker-explainability.d.ts.map +1 -1
  444. package/dist/ranker-explainability.js +38 -10
  445. package/dist/recommend-recipe.d.ts +17 -0
  446. package/dist/recommend-recipe.d.ts.map +1 -0
  447. package/dist/recommend-recipe.js +1 -0
  448. package/dist/recommend-recipes.d.ts +9 -0
  449. package/dist/recommend-recipes.d.ts.map +1 -0
  450. package/dist/recommend-recipes.js +106 -0
  451. package/dist/recommendation-candidate.d.ts +30 -0
  452. package/dist/recommendation-candidate.d.ts.map +1 -0
  453. package/dist/recommendation-candidate.js +1 -0
  454. package/dist/recommendation-confidence.d.ts +27 -0
  455. package/dist/recommendation-confidence.d.ts.map +1 -0
  456. package/dist/recommendation-confidence.js +1 -0
  457. package/dist/recommendation-ranking-options.d.ts +24 -0
  458. package/dist/recommendation-ranking-options.d.ts.map +1 -0
  459. package/dist/recommendation-ranking-options.js +1 -0
  460. package/dist/recommendation-ranking.d.ts +50 -0
  461. package/dist/recommendation-ranking.d.ts.map +1 -0
  462. package/dist/recommendation-ranking.js +527 -0
  463. package/dist/recommendation-source.d.ts +23 -0
  464. package/dist/recommendation-source.d.ts.map +1 -0
  465. package/dist/recommendation-source.js +23 -0
  466. package/dist/recommendation-suppression.d.ts +14 -0
  467. package/dist/recommendation-suppression.d.ts.map +1 -0
  468. package/dist/recommendation-suppression.js +14 -0
  469. package/dist/reference-asset-kind.d.ts +14 -0
  470. package/dist/reference-asset-kind.d.ts.map +1 -0
  471. package/dist/reference-asset-kind.js +14 -0
  472. package/dist/reference-content-check.d.ts +32 -0
  473. package/dist/reference-content-check.d.ts.map +1 -0
  474. package/dist/reference-content-check.js +143 -0
  475. package/dist/reference-failure.d.ts +31 -0
  476. package/dist/reference-failure.d.ts.map +1 -0
  477. package/dist/reference-failure.js +31 -0
  478. package/dist/reference-id-status.d.ts +15 -0
  479. package/dist/reference-id-status.d.ts.map +1 -0
  480. package/dist/reference-id-status.js +15 -0
  481. package/dist/reference-kind-declarations.d.ts +42 -0
  482. package/dist/reference-kind-declarations.d.ts.map +1 -0
  483. package/dist/reference-kind-declarations.js +142 -0
  484. package/dist/reference-lookup.d.ts +6 -0
  485. package/dist/reference-lookup.d.ts.map +1 -1
  486. package/dist/reference-lookup.js +13 -5
  487. package/dist/reference-registry.d.ts +210 -0
  488. package/dist/reference-registry.d.ts.map +1 -0
  489. package/dist/reference-registry.js +395 -0
  490. package/dist/reference-subject.d.ts +20 -0
  491. package/dist/reference-subject.d.ts.map +1 -0
  492. package/dist/reference-subject.js +1 -0
  493. package/dist/registration-hint-discovery-status.d.ts +25 -0
  494. package/dist/registration-hint-discovery-status.d.ts.map +1 -0
  495. package/dist/registration-hint-discovery-status.js +25 -0
  496. package/dist/registration-hint-registry.d.ts +80 -0
  497. package/dist/registration-hint-registry.d.ts.map +1 -1
  498. package/dist/registration-hint-registry.js +356 -138
  499. package/dist/registry-lifecycle.d.ts +200 -19
  500. package/dist/registry-lifecycle.d.ts.map +1 -1
  501. package/dist/registry-lifecycle.js +526 -136
  502. package/dist/release-readiness.d.ts.map +1 -1
  503. package/dist/release-readiness.js +10 -7
  504. package/dist/release-smoke.d.ts.map +1 -1
  505. package/dist/release-smoke.js +11 -7
  506. package/dist/report-site.d.ts.map +1 -1
  507. package/dist/report-site.js +25 -7
  508. package/dist/repository-intelligence.d.ts.map +1 -1
  509. package/dist/repository-intelligence.js +3 -2
  510. package/dist/repository-knowledge-model.d.ts.map +1 -1
  511. package/dist/repository-knowledge-model.js +18 -5
  512. package/dist/resolve-project-config.d.ts +64 -0
  513. package/dist/resolve-project-config.d.ts.map +1 -1
  514. package/dist/resolve-project-config.js +258 -32
  515. package/dist/reuse/compute-reuse-coverage.d.ts +29 -0
  516. package/dist/reuse/compute-reuse-coverage.d.ts.map +1 -0
  517. package/dist/reuse/compute-reuse-coverage.js +198 -0
  518. package/dist/reuse/rank-reuse-candidates.d.ts +38 -0
  519. package/dist/reuse/rank-reuse-candidates.d.ts.map +1 -0
  520. package/dist/reuse/rank-reuse-candidates.js +212 -0
  521. package/dist/reuse/rank-reuse-options.d.ts +20 -0
  522. package/dist/reuse/rank-reuse-options.d.ts.map +1 -0
  523. package/dist/reuse/rank-reuse-options.js +1 -0
  524. package/dist/reuse/rank-reuse-suggestions.d.ts +15 -0
  525. package/dist/reuse/rank-reuse-suggestions.d.ts.map +1 -0
  526. package/dist/reuse/rank-reuse-suggestions.js +31 -0
  527. package/dist/reuse/resolve-curated-reuse.d.ts +43 -0
  528. package/dist/reuse/resolve-curated-reuse.d.ts.map +1 -0
  529. package/dist/reuse/resolve-curated-reuse.js +115 -0
  530. package/dist/reuse/reuse-candidate.d.ts +29 -0
  531. package/dist/reuse/reuse-candidate.d.ts.map +1 -0
  532. package/dist/reuse/reuse-candidate.js +1 -0
  533. package/dist/reuse/reuse-coverage-report.d.ts +74 -0
  534. package/dist/reuse/reuse-coverage-report.d.ts.map +1 -0
  535. package/dist/reuse/reuse-coverage-report.js +1 -0
  536. package/dist/reuse/reuse-curated-coverage.d.ts +36 -0
  537. package/dist/reuse/reuse-curated-coverage.d.ts.map +1 -0
  538. package/dist/reuse/reuse-curated-coverage.js +1 -0
  539. package/dist/reuse/reuse-curated-resolution.d.ts +36 -0
  540. package/dist/reuse/reuse-curated-resolution.d.ts.map +1 -0
  541. package/dist/reuse/reuse-curated-resolution.js +1 -0
  542. package/dist/reuse/reuse-curated-status.d.ts +21 -0
  543. package/dist/reuse/reuse-curated-status.d.ts.map +1 -0
  544. package/dist/reuse/reuse-curated-status.js +21 -0
  545. package/dist/reuse/reuse-match-detail.d.ts +15 -0
  546. package/dist/reuse/reuse-match-detail.d.ts.map +1 -0
  547. package/dist/reuse/reuse-match-detail.js +1 -0
  548. package/dist/reuse/reuse-ranking.d.ts +37 -0
  549. package/dist/reuse/reuse-ranking.d.ts.map +1 -0
  550. package/dist/reuse/reuse-ranking.js +1 -0
  551. package/dist/reuse/reuse-suggestion.d.ts +19 -0
  552. package/dist/reuse/reuse-suggestion.d.ts.map +1 -0
  553. package/dist/reuse/reuse-suggestion.js +1 -0
  554. package/dist/reuse/reuse-symbol-lookup.d.ts +28 -0
  555. package/dist/reuse/reuse-symbol-lookup.d.ts.map +1 -0
  556. package/dist/reuse/reuse-symbol-lookup.js +1 -0
  557. package/dist/reuse/reuse-tokenize.d.ts +11 -0
  558. package/dist/reuse/reuse-tokenize.d.ts.map +1 -0
  559. package/dist/reuse/reuse-tokenize.js +26 -0
  560. package/dist/reuse/score-reuse-name.d.ts +16 -0
  561. package/dist/reuse/score-reuse-name.d.ts.map +1 -0
  562. package/dist/reuse/score-reuse-name.js +35 -0
  563. package/dist/reuse/score-reuse-primitive.d.ts +33 -0
  564. package/dist/reuse/score-reuse-primitive.d.ts.map +1 -0
  565. package/dist/reuse/score-reuse-primitive.js +92 -0
  566. package/dist/review-packet.d.ts +2 -0
  567. package/dist/review-packet.d.ts.map +1 -1
  568. package/dist/review-packet.js +13 -6
  569. package/dist/role-views.d.ts.map +1 -1
  570. package/dist/role-views.js +16 -16
  571. package/dist/routing-recommends-channels.d.ts +24 -0
  572. package/dist/routing-recommends-channels.d.ts.map +1 -0
  573. package/dist/routing-recommends-channels.js +19 -0
  574. package/dist/run-boundary-check.d.ts +118 -0
  575. package/dist/run-boundary-check.d.ts.map +1 -0
  576. package/dist/run-boundary-check.js +592 -0
  577. package/dist/safety-audit.js +1 -1
  578. package/dist/scaffold-coverage.js +1 -1
  579. package/dist/scaffold-pattern-doctor-report.d.ts +19 -0
  580. package/dist/scaffold-pattern-doctor-report.d.ts.map +1 -0
  581. package/dist/scaffold-pattern-doctor-report.js +54 -0
  582. package/dist/scaffold-patterns.d.ts +75 -1
  583. package/dist/scaffold-patterns.d.ts.map +1 -1
  584. package/dist/scaffold-patterns.js +375 -84
  585. package/dist/schema-inventory.d.ts.map +1 -1
  586. package/dist/schema-inventory.js +4 -3
  587. package/dist/search-document-id.d.ts +52 -0
  588. package/dist/search-document-id.d.ts.map +1 -0
  589. package/dist/search-document-id.js +72 -0
  590. package/dist/search-document-prefix.d.ts +7 -0
  591. package/dist/search-document-prefix.d.ts.map +1 -0
  592. package/dist/search-document-prefix.js +1 -0
  593. package/dist/search-index.d.ts.map +1 -1
  594. package/dist/search-index.js +20 -23
  595. package/dist/search-tuning-explain.d.ts +6 -0
  596. package/dist/search-tuning-explain.d.ts.map +1 -1
  597. package/dist/search-tuning-explain.js +19 -17
  598. package/dist/search-tuning-key-probes.d.ts +16 -0
  599. package/dist/search-tuning-key-probes.d.ts.map +1 -0
  600. package/dist/search-tuning-key-probes.js +65 -0
  601. package/dist/search-tuning-key-resolution.d.ts +25 -0
  602. package/dist/search-tuning-key-resolution.d.ts.map +1 -0
  603. package/dist/search-tuning-key-resolution.js +1 -0
  604. package/dist/search-tuning-key-resolver.d.ts +4 -0
  605. package/dist/search-tuning-key-resolver.d.ts.map +1 -0
  606. package/dist/search-tuning-key-resolver.js +107 -0
  607. package/dist/search-tuning-key-status.d.ts +24 -0
  608. package/dist/search-tuning-key-status.d.ts.map +1 -0
  609. package/dist/search-tuning-key-status.js +24 -0
  610. package/dist/search-tuning-lint.d.ts +9 -0
  611. package/dist/search-tuning-lint.d.ts.map +1 -0
  612. package/dist/search-tuning-lint.js +468 -0
  613. package/dist/search-tuning-registry.d.ts +43 -0
  614. package/dist/search-tuning-registry.d.ts.map +1 -1
  615. package/dist/search-tuning-registry.js +214 -49
  616. package/dist/self-audit.d.ts +12 -0
  617. package/dist/self-audit.d.ts.map +1 -1
  618. package/dist/self-audit.js +36 -10
  619. package/dist/self-config-doctor-v2.d.ts +145 -3
  620. package/dist/self-config-doctor-v2.d.ts.map +1 -1
  621. package/dist/self-config-doctor-v2.js +1329 -255
  622. package/dist/self-config-doctor.d.ts +20 -1
  623. package/dist/self-config-doctor.d.ts.map +1 -1
  624. package/dist/self-config-doctor.js +65 -309
  625. package/dist/settled-unit-states.d.ts +9 -0
  626. package/dist/settled-unit-states.d.ts.map +1 -0
  627. package/dist/settled-unit-states.js +14 -0
  628. package/dist/sharkcraft-inspector.d.ts +47 -1
  629. package/dist/sharkcraft-inspector.d.ts.map +1 -1
  630. package/dist/sharkcraft-inspector.js +278 -29
  631. package/dist/spec/spec-evidence.d.ts.map +1 -1
  632. package/dist/spec/spec-evidence.js +14 -20
  633. package/dist/split-identifier.d.ts +21 -0
  634. package/dist/split-identifier.d.ts.map +1 -0
  635. package/dist/split-identifier.js +27 -0
  636. package/dist/start-here.d.ts.map +1 -1
  637. package/dist/start-here.js +1 -2
  638. package/dist/substitute-placeholders.d.ts +8 -0
  639. package/dist/substitute-placeholders.d.ts.map +1 -0
  640. package/dist/substitute-placeholders.js +9 -0
  641. package/dist/symbol-index.d.ts +33 -0
  642. package/dist/symbol-index.d.ts.map +1 -1
  643. package/dist/symbol-index.js +241 -3
  644. package/dist/symbol-member-entry.d.ts +26 -0
  645. package/dist/symbol-member-entry.d.ts.map +1 -0
  646. package/dist/symbol-member-entry.js +1 -0
  647. package/dist/symbol-member-kind.d.ts +14 -0
  648. package/dist/symbol-member-kind.d.ts.map +1 -0
  649. package/dist/symbol-member-kind.js +14 -0
  650. package/dist/task-packet.d.ts.map +1 -1
  651. package/dist/task-packet.js +52 -9
  652. package/dist/task-ranker.d.ts +8 -0
  653. package/dist/task-ranker.d.ts.map +1 -1
  654. package/dist/task-ranker.js +25 -13
  655. package/dist/task-risk.js +1 -1
  656. package/dist/task-routing-hint-registry.d.ts +20 -1
  657. package/dist/task-routing-hint-registry.d.ts.map +1 -1
  658. package/dist/task-routing-hint-registry.js +186 -42
  659. package/dist/template-drift.d.ts.map +1 -1
  660. package/dist/template-drift.js +30 -9
  661. package/dist/template-lint.d.ts.map +1 -1
  662. package/dist/template-lint.js +160 -2
  663. package/dist/term-query.d.ts +10 -0
  664. package/dist/term-query.d.ts.map +1 -0
  665. package/dist/term-query.js +1 -0
  666. package/dist/test-definitions.d.ts +6 -3
  667. package/dist/test-definitions.d.ts.map +1 -1
  668. package/dist/test-runner.d.ts +95 -10
  669. package/dist/test-runner.d.ts.map +1 -1
  670. package/dist/test-runner.js +309 -318
  671. package/dist/tuning-query-tokens.d.ts +29 -0
  672. package/dist/tuning-query-tokens.d.ts.map +1 -0
  673. package/dist/tuning-query-tokens.js +51 -0
  674. package/dist/typecheck-files.d.ts +36 -0
  675. package/dist/typecheck-files.d.ts.map +1 -0
  676. package/dist/typecheck-files.js +158 -0
  677. package/dist/uncertainty.js +1 -1
  678. package/dist/universal-search.d.ts.map +1 -1
  679. package/dist/universal-search.js +5 -3
  680. package/dist/unregistered-exports.d.ts +19 -0
  681. package/dist/unregistered-exports.d.ts.map +1 -0
  682. package/dist/unregistered-exports.js +141 -0
  683. package/dist/unresolvable-reason.d.ts +11 -0
  684. package/dist/unresolvable-reason.d.ts.map +1 -0
  685. package/dist/unresolvable-reason.js +11 -0
  686. package/dist/upgrade-advisor.d.ts.map +1 -1
  687. package/dist/upgrade-advisor.js +16 -9
  688. package/dist/validate-contribution-file.d.ts +4 -0
  689. package/dist/validate-contribution-file.d.ts.map +1 -0
  690. package/dist/validate-contribution-file.js +228 -0
  691. package/dist/why-file.d.ts +3 -0
  692. package/dist/why-file.d.ts.map +1 -1
  693. package/dist/why-file.js +7 -3
  694. package/package.json +17 -17
@@ -8,10 +8,13 @@
8
8
  * Read-only: hints can be listed, fetched by id, validated, and previewed
9
9
  * against the live file system, but the engine never auto-applies them.
10
10
  */
11
- import { existsSync, readFileSync } from 'node:fs';
11
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
12
12
  import * as nodePath from 'node:path';
13
- import { validateRegistrationHint, } from '@shrkcrft/plugin-api';
14
- import { importModuleViaLoader } from '@shrkcrft/core';
13
+ import { normalizeRegistrationHint, validateRegistrationHint, } from '@shrkcrft/plugin-api';
14
+ import { SKIP_DIRS } from '@shrkcrft/boundaries';
15
+ import { DEAD_SELECTOR_CAUSES, importModuleViaLoader, MARKABLE_UNIT_LISTS, MarkableUnitList, normalizeUnitList, normalizeUnitScalar, qualifyListPath, qualifyUnitMarks, readContributionExport, RejectionCause, settleUnitLiveness, UnitDeadCause, UnitDeadWeight, UnitLivenessState, unitProblemsOf, } from '@shrkcrft/core';
16
+ import { substitutePlaceholders } from "./substitute-placeholders.js";
17
+ import { RegistrationHintDiscoveryStatus } from "./registration-hint-discovery-status.js";
15
18
  export const REGISTRATION_HINT_REGISTRY_SCHEMA = 'sharkcraft.registration-hint-registry/v1';
16
19
  export var RegistrationHintSource;
17
20
  (function (RegistrationHintSource) {
@@ -19,15 +22,20 @@ export var RegistrationHintSource;
19
22
  RegistrationHintSource["Pack"] = "pack";
20
23
  RegistrationHintSource["Fixture"] = "fixture";
21
24
  })(RegistrationHintSource || (RegistrationHintSource = {}));
22
- async function importDefault(file) {
23
- const mod = (await importModuleViaLoader(file));
24
- if (Array.isArray(mod.default))
25
- return mod.default;
26
- if (mod.default && typeof mod.default === 'object')
27
- return [mod.default];
28
- if (Array.isArray(mod.registrationHints))
29
- return mod.registrationHints;
30
- return [];
25
+ async function importHints(file) {
26
+ return readContributionExport(await importModuleViaLoader(file), { namedKeys: ['registrationHints'] });
27
+ }
28
+ /**
29
+ * THE registration-hint acceptance predicate (round 12, 12.1): every issue of
30
+ * `validateRegistrationHint`, `<field>: <message>` — `[]` means accepted.
31
+ */
32
+ export function registrationHintRejectionReasons(raw) {
33
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
34
+ return ['(entry): must be an object'];
35
+ const v = validateRegistrationHint(raw);
36
+ if (v.valid)
37
+ return [];
38
+ return v.issues.length > 0 ? v.issues.map((i) => `${i.field}: ${i.message}`) : ['(entry): failed validation'];
31
39
  }
32
40
  function localFiles(inspection) {
33
41
  const out = [];
@@ -39,54 +47,71 @@ function localFiles(inspection) {
39
47
  if (existsSync(abs))
40
48
  out.push(abs);
41
49
  }
42
- const cfg = inspection.config;
43
- for (const rel of cfg?.registrationHintFiles ?? []) {
44
- out.push(nodePath.isAbsolute(rel) ? rel : nodePath.join(dir, rel));
45
- }
50
+ // More hint files come from pack manifests (`registrationHintFiles`, loaded
51
+ // below) — there is no local-config key for them; the strict config schema
52
+ // rejects one, so a local read here could never be reached.
46
53
  return out;
47
54
  }
48
55
  export async function loadRegistrationHints(inspection) {
49
56
  const entries = [];
50
57
  const issues = [];
51
- const seen = new Set();
52
- const ingest = (raw, source, packageName, sourceFile) => {
53
- const v = validateRegistrationHint(raw);
54
- if (!v.valid) {
55
- for (const i of v.issues) {
56
- issues.push({
57
- severity: 'error',
58
- code: 'invalid-hint',
59
- message: `${i.field}: ${i.message}`,
60
- hintId: typeof raw.id === 'string' ? raw.id : undefined,
61
- source: sourceFile,
62
- });
58
+ const rejected = [];
59
+ const seen = new Map();
60
+ const ingest = (raw, source, packageName, sourceFile, at) => {
61
+ const rawId = raw && typeof raw === 'object' ? raw.id : undefined;
62
+ const hintId = typeof rawId === 'string' ? rawId : undefined;
63
+ // THE acceptance predicate, then THE normaliser (round 13): markers in
64
+ // `discovery` become plain strings + the `expectEmptyUnits` ledger, stamped
65
+ // with the contributing pack. A normaliser refusal is a rejection too —
66
+ // never a crash further down (`glob.includes is not a function`).
67
+ const invalid = registrationHintRejectionReasons(raw);
68
+ const normalized = invalid.length === 0 ? normalizeRegistrationHint(raw, packageName) : undefined;
69
+ const reasons = invalid.length > 0 ? invalid : normalized !== undefined && !normalized.ok ? unitProblemsOf(normalized.error) : [];
70
+ if (normalized === undefined || !normalized.ok) {
71
+ for (const r of reasons) {
72
+ issues.push({ severity: 'error', code: 'invalid-hint', message: r, hintId, source: sourceFile });
63
73
  }
74
+ rejected.push({ ...at, ...(hintId !== undefined ? { entryId: hintId } : {}), reasons, cause: RejectionCause.Invalid });
64
75
  return;
65
76
  }
66
- if (seen.has(raw.id)) {
77
+ const hint = normalized.value;
78
+ const prev = seen.get(hint.id);
79
+ if (prev !== undefined) {
67
80
  issues.push({
68
81
  severity: 'error',
69
82
  code: 'duplicate-id',
70
- message: `Registration hint "${raw.id}" already loaded; skipping ${sourceFile}.`,
71
- hintId: raw.id,
83
+ message: `Registration hint "${hint.id}" already loaded; skipping ${sourceFile}.`,
84
+ hintId: hint.id,
72
85
  source: sourceFile,
73
86
  });
87
+ rejected.push({
88
+ ...at,
89
+ entryId: hint.id,
90
+ reasons: [`id: "${hint.id}" is already declared in ${prev}`],
91
+ cause: RejectionCause.DuplicateId,
92
+ });
74
93
  return;
75
94
  }
76
- seen.add(raw.id);
95
+ seen.set(hint.id, sourceFile);
77
96
  entries.push({
78
- hint: raw,
97
+ hint,
79
98
  source,
80
99
  ...(packageName ? { packageName } : {}),
81
100
  sourceFile,
82
101
  });
83
102
  };
103
+ const ingestAll = (exp, file, source, packageName, sourceFile) => {
104
+ exp.items.forEach((h, i) => ingest(h, source, packageName, sourceFile, {
105
+ file,
106
+ index: exp.single ? -1 : i,
107
+ ...(exp.exportName ? { exportName: exp.exportName } : {}),
108
+ }));
109
+ };
84
110
  for (const file of localFiles(inspection)) {
85
111
  try {
86
- const list = await importDefault(file);
112
+ const exp = await importHints(file);
87
113
  const rel = nodePath.relative(inspection.projectRoot, file) || file;
88
- for (const h of list)
89
- ingest(h, RegistrationHintSource.Local, undefined, rel);
114
+ ingestAll(exp, file, RegistrationHintSource.Local, undefined, rel);
90
115
  }
91
116
  catch (e) {
92
117
  issues.push({
@@ -111,9 +136,7 @@ export async function loadRegistrationHints(inspection) {
111
136
  continue;
112
137
  }
113
138
  try {
114
- const list = await importDefault(file);
115
- for (const h of list)
116
- ingest(h, RegistrationHintSource.Pack, pack.packageName, rel);
139
+ ingestAll(await importHints(file), file, RegistrationHintSource.Pack, pack.packageName, rel);
117
140
  }
118
141
  catch (e) {
119
142
  issues.push({
@@ -125,7 +148,7 @@ export async function loadRegistrationHints(inspection) {
125
148
  }
126
149
  }
127
150
  }
128
- return { entries, issues };
151
+ return { entries, issues, rejected };
129
152
  }
130
153
  export async function listRegistrationHints(inspection) {
131
154
  const { entries } = await loadRegistrationHints(inspection);
@@ -148,16 +171,20 @@ export async function previewRegistrationHint(inspection, hintId, options = {})
148
171
  // candidates from globs on the live file system.
149
172
  let targetFile = null;
150
173
  let candidates = [];
174
+ let discoveryCapped = false;
151
175
  if (hint.discovery.targetFile) {
152
176
  targetFile = hint.discovery.targetFile;
153
177
  candidates = [hint.discovery.targetFile];
154
178
  }
155
179
  else if (hint.discovery.targetGlobs && hint.discovery.targetGlobs.length > 0) {
156
- candidates = await resolveGlobsAgainstRoot(inspection.projectRoot, hint.discovery.targetGlobs);
157
- if (candidates.length === 1)
180
+ // THE discovery authority — the doctor classifies the same candidate set.
181
+ const found = resolveRegistrationHintCandidates(inspection, hint);
182
+ candidates = [...found.candidates];
183
+ discoveryCapped = found.capped;
184
+ if (candidates.length === 1 && !discoveryCapped)
158
185
  targetFile = candidates[0];
159
186
  }
160
- const ambiguous = candidates.length !== 1;
187
+ const ambiguous = candidates.length !== 1 || discoveryCapped;
161
188
  const requiresHumanReview = hint.requiresHumanReview === true || ambiguous;
162
189
  const renderedOps = hint.operations.map((op) => {
163
190
  const description = describeOp(op);
@@ -183,68 +210,109 @@ export async function previewRegistrationHint(inspection, hintId, options = {})
183
210
  nextCommand: ambiguous
184
211
  ? `# Multiple candidates — pick one and apply manually.`
185
212
  : `# Preview only. Apply manually after human review.`,
213
+ ...(discoveryCapped ? { discoveryCapped: true } : {}),
186
214
  };
187
215
  }
188
- async function resolveGlobsAgainstRoot(projectRoot, globs) {
189
- const out = [];
190
- for (const glob of globs) {
191
- // Crude glob: only `*` and `**` recognized; fallback to literal.
192
- if (!glob.includes('*')) {
193
- const abs = nodePath.join(projectRoot, glob);
194
- if (existsSync(abs))
195
- out.push(glob);
196
- continue;
197
- }
198
- const baseSegments = [];
199
- for (const seg of glob.split('/')) {
200
- if (seg.includes('*'))
201
- break;
202
- baseSegments.push(seg);
203
- }
204
- const base = baseSegments.length > 0 ? nodePath.join(projectRoot, ...baseSegments) : projectRoot;
205
- // Replace `**` with `___DOUBLESTAR___` BEFORE escaping; then
206
- // escape special chars; then convert single `*` and the placeholder.
207
- const escaped = glob
208
- .replace(/\*\*/g, '___DOUBLESTAR___')
209
- .replace(/[.+?^${}()|[\]\\]/g, '\\$&')
210
- .replace(/\*/g, '[^/]*')
211
- .replace(/___DOUBLESTAR___/g, '.*');
212
- let re;
216
+ /** Directories one glob's discovery walk visits before it reports `capped`. */
217
+ const DISCOVERY_DIR_CAP = 5000;
218
+ /** One glob against the live tree: the preview's own dialect (`*`, `**`, else literal). */
219
+ function walkDiscoveryGlob(projectRoot, glob) {
220
+ if (!glob.includes('*')) {
221
+ return { files: existsSync(nodePath.join(projectRoot, glob)) ? [glob] : [], capped: false };
222
+ }
223
+ const baseSegments = [];
224
+ for (const seg of glob.split('/')) {
225
+ if (seg.includes('*'))
226
+ break;
227
+ baseSegments.push(seg);
228
+ }
229
+ const base = baseSegments.length > 0 ? nodePath.join(projectRoot, ...baseSegments) : projectRoot;
230
+ // Replace `**` with a placeholder BEFORE escaping; then escape special chars;
231
+ // then convert single `*` and the placeholder.
232
+ const escaped = glob
233
+ .replace(/\*\*/g, '___DOUBLESTAR___')
234
+ .replace(/[.+?^${}()|[\]\\]/g, '\\$&')
235
+ .replace(/\*/g, '[^/]*')
236
+ .replace(/___DOUBLESTAR___/g, '.*');
237
+ let re;
238
+ try {
239
+ re = new RegExp('^' + escaped + '$');
240
+ }
241
+ catch {
242
+ return { files: [], capped: false };
243
+ }
244
+ if (!existsSync(base))
245
+ return { files: [], capped: false };
246
+ const files = [];
247
+ const stack = [base];
248
+ let visited = 0;
249
+ while (stack.length > 0) {
250
+ // A truncated walk is REPORTED — a zero from a capped walk is not a dead glob.
251
+ if (visited >= DISCOVERY_DIR_CAP)
252
+ return { files, capped: true };
253
+ const dir = stack.pop();
254
+ visited += 1;
213
255
  try {
214
- re = new RegExp('^' + escaped + '$');
215
- }
216
- catch {
217
- // Malformed glob — skip.
218
- continue;
219
- }
220
- if (!existsSync(base))
221
- continue;
222
- // Walk the base directory looking for matches (capped, deterministic).
223
- const stack = [base];
224
- let safety = 0;
225
- while (stack.length > 0 && safety < 5000) {
226
- const dir = stack.pop();
227
- safety += 1;
228
- try {
229
- const { readdirSync } = await import('node:fs');
230
- const entries = readdirSync(dir, { withFileTypes: true });
231
- for (const e of entries) {
232
- const next = nodePath.join(dir, String(e.name));
233
- if (e.isDirectory())
256
+ for (const e of readdirSync(dir, { withFileTypes: true })) {
257
+ const name = String(e.name);
258
+ const next = nodePath.join(dir, name);
259
+ // The shared vendor/build/VCS skip list: node_modules is never walked.
260
+ if (e.isDirectory()) {
261
+ if (!SKIP_DIRS.has(name))
234
262
  stack.push(next);
235
- else if (e.isFile()) {
236
- const rel = nodePath.relative(projectRoot, next);
237
- if (re.test(rel))
238
- out.push(rel);
239
- }
263
+ }
264
+ else if (e.isFile()) {
265
+ const rel = nodePath.relative(projectRoot, next).split(nodePath.sep).join('/');
266
+ if (re.test(rel))
267
+ files.push(rel);
240
268
  }
241
269
  }
242
- catch {
243
- // ignore traversal errors
244
- }
270
+ }
271
+ catch {
272
+ // an unreadable directory contributes nothing
245
273
  }
246
274
  }
247
- return Array.from(new Set(out));
275
+ return { files, capped: false };
276
+ }
277
+ /**
278
+ * THE discovery authority for a registration hint: `registrations preview`
279
+ * acts on it and the doctor classifies it, so "what would this hint target?"
280
+ * has one answer. A fixed `targetFile` counts as a candidate only when it
281
+ * exists (preview still names it either way).
282
+ */
283
+ export function resolveRegistrationHintCandidates(inspection, hint) {
284
+ // Idempotent defensive normalisation (round 13): a loaded hint is plain
285
+ // already; a hand-built one carrying `{ pattern, expectEmpty }` markers is
286
+ // read by its unit instead of crashing the walk (`glob.includes`).
287
+ const discovery = hint.discovery ?? {};
288
+ const fileUnit = discovery.targetFile !== undefined ? normalizeUnitScalar(discovery.targetFile, TARGET_FILE) : undefined;
289
+ const targetFile = fileUnit?.ok ? fileUnit.value.unit : undefined;
290
+ const globUnits = discovery.targetGlobs !== undefined ? normalizeUnitList(discovery.targetGlobs, TARGET_GLOBS) : undefined;
291
+ const targetGlobs = globUnits?.ok
292
+ ? globUnits.value.units
293
+ : (discovery.targetGlobs ?? []).filter((g) => typeof g === 'string');
294
+ if (targetFile) {
295
+ const exists = existsSync(nodePath.join(inspection.projectRoot, targetFile));
296
+ return {
297
+ mode: 'fixed',
298
+ candidates: exists ? [targetFile] : [],
299
+ perGlob: [{ glob: targetFile, matched: exists ? 1 : 0 }],
300
+ capped: false,
301
+ };
302
+ }
303
+ if (!targetGlobs || targetGlobs.length === 0) {
304
+ return { mode: 'none', candidates: [], perGlob: [], capped: false };
305
+ }
306
+ const all = [];
307
+ const perGlob = [];
308
+ let capped = false;
309
+ for (const glob of targetGlobs) {
310
+ const r = walkDiscoveryGlob(inspection.projectRoot, glob);
311
+ perGlob.push({ glob, matched: r.files.length });
312
+ all.push(...r.files);
313
+ capped = capped || r.capped;
314
+ }
315
+ return { mode: 'glob', candidates: [...new Set(all)], perGlob, capped };
248
316
  }
249
317
  function describeOp(op) {
250
318
  switch (op.kind) {
@@ -268,52 +336,202 @@ function describeOp(op) {
268
336
  return `export${op.symbols ? ` { ${op.symbols.join(', ')} }` : ''} from "${op.from ?? '?'}"`;
269
337
  }
270
338
  }
339
+ /** THE placeholder substitution, shared with pack-helper plans. */
271
340
  function substituteVars(snippet, vars) {
272
- return snippet.replace(/\{\{\s*([A-Za-z0-9_]+)\s*\}\}/g, (_m, key) => vars[key] !== undefined ? vars[key] : `{{${key}}}`);
341
+ return substitutePlaceholders(snippet, vars);
273
342
  }
274
- // ─────────────────────────────────────────────────────────────────────────────
275
- // Doctor
276
- // ─────────────────────────────────────────────────────────────────────────────
277
- export async function listRegistrationHintIssues(inspection) {
278
- const { issues, entries } = await loadRegistrationHints(inspection);
279
- const out = [...issues];
280
- // Cross-validate: target files referenced by hints with a fixed
281
- // `targetFile` must currently exist; report missing as warning.
282
- for (const e of entries) {
283
- if (e.hint.discovery.targetFile) {
284
- const abs = nodePath.join(inspection.projectRoot, e.hint.discovery.targetFile);
285
- if (!existsSync(abs)) {
286
- out.push({
287
- severity: 'warning',
288
- code: 'target-file-missing',
289
- message: `Registration hint "${e.hint.id}" targets ${e.hint.discovery.targetFile} but the file is missing.`,
290
- hintId: e.hint.id,
291
- source: e.sourceFile,
292
- });
343
+ const TARGET_GLOBS = MARKABLE_UNIT_LISTS[MarkableUnitList.RegistrationHintTargetGlobs].listPath;
344
+ const TARGET_FILE = MARKABLE_UNIT_LISTS[MarkableUnitList.RegistrationHintTargetFile].listPath;
345
+ /** The list a discovery mode judges — a marker on the other list (a glob beside a fixed target) is never read. */
346
+ function judgedList(mode) {
347
+ return mode === 'fixed' ? TARGET_FILE : mode === 'glob' ? TARGET_GLOBS : undefined;
348
+ }
349
+ /**
350
+ * One observation per selector THE discovery authority judged: the fixed
351
+ * target, or each glob. Existence and liveness are one predicate here (a file
352
+ * matches, or none does); a zero from a capped walk is unproven, never dead.
353
+ */
354
+ function discoveryObservations(hint, found) {
355
+ if (found.mode === 'none') {
356
+ return [
357
+ {
358
+ list: qualifyListPath(hint.id, 'discovery'),
359
+ unit: 'no discovery',
360
+ label: `${hint.id}: no discovery`,
361
+ exists: false,
362
+ live: false,
363
+ cause: UnitDeadCause.Defect,
364
+ deadReason: 'declares neither discovery.targetFile nor discovery.targetGlobs, so it can never target a file',
365
+ },
366
+ ];
367
+ }
368
+ const fixed = found.mode === 'fixed';
369
+ const list = qualifyListPath(hint.id, fixed ? TARGET_FILE : TARGET_GLOBS);
370
+ return found.perGlob.map((g) => {
371
+ const seen = g.matched > 0 ? true : found.capped ? undefined : false;
372
+ return {
373
+ list,
374
+ unit: g.glob,
375
+ label: `${hint.id}: ${g.glob}`,
376
+ exists: seen,
377
+ live: seen,
378
+ matched: g.matched,
379
+ liveBecause: fixed ? 'the target file exists' : `matches ${g.matched} file(s)`,
380
+ deadReason: fixed ? 'the file is missing' : 'matched no file',
381
+ };
382
+ });
383
+ }
384
+ const STATUS_TOTAL = {
385
+ [RegistrationHintDiscoveryStatus.Verified]: 'verified',
386
+ [RegistrationHintDiscoveryStatus.Ambiguous]: 'ambiguous',
387
+ [RegistrationHintDiscoveryStatus.Dead]: 'dead',
388
+ [RegistrationHintDiscoveryStatus.Unverified]: 'unverified',
389
+ [RegistrationHintDiscoveryStatus.IntendedEmpty]: 'intendedEmpty',
390
+ };
391
+ /** The anchor check, the same for a fixed target and a single glob candidate. */
392
+ function checkAnchors(inspection, entry, relPath, out) {
393
+ let content;
394
+ try {
395
+ content = readFileSync(nodePath.join(inspection.projectRoot, relPath), 'utf8');
396
+ }
397
+ catch {
398
+ return;
399
+ }
400
+ for (const op of entry.hint.operations) {
401
+ if (!op.anchor || content.includes(op.anchor))
402
+ continue;
403
+ out.push({
404
+ severity: 'info',
405
+ code: 'anchor-not-present',
406
+ message: `Hint "${entry.hint.id}" expects anchor "${op.anchor}" in ${relPath} but it is missing today.`,
407
+ hintId: entry.hint.id,
408
+ source: entry.sourceFile,
409
+ target: op.anchor,
410
+ });
411
+ }
412
+ }
413
+ /**
414
+ * Verify every hint's discovery against the live tree through THE discovery
415
+ * authority. Fixed targets used to be the only ones checked; glob discovery —
416
+ * used precisely when the author was unsure of the target — got none, so a
417
+ * dead, an ambiguous and an anchor-less glob hint all read "OK".
418
+ */
419
+ export async function buildRegistrationHintDoctorReport(inspection) {
420
+ const { issues: loadIssues, entries } = await loadRegistrationHints(inspection);
421
+ const issues = [...loadIssues];
422
+ const hints = [];
423
+ const totals = { hints: entries.length, verified: 0, ambiguous: 0, dead: 0, unverified: 0, intendedEmpty: 0 };
424
+ // Observe every selector of every hint, then settle them ONCE through THE
425
+ // liveness authority (round 13): the state, the dead list and both coverage
426
+ // records (the shortfall and the expectEmpty acceptance) come from it.
427
+ const found = entries.map((e) => resolveRegistrationHintCandidates(inspection, e.hint));
428
+ const observations = [];
429
+ const marks = [];
430
+ const spans = [];
431
+ entries.forEach((e, i) => {
432
+ const f = found[i];
433
+ const own = discoveryObservations(e.hint, f);
434
+ spans.push({ start: observations.length, end: observations.length + own.length });
435
+ observations.push(...own);
436
+ const list = judgedList(f.mode);
437
+ marks.push(...qualifyUnitMarks((e.hint.expectEmptyUnits ?? []).filter((m) => m.list === list), e.hint.id));
438
+ });
439
+ const capped = found.some((f) => f.capped);
440
+ const liveness = settleUnitLiveness({
441
+ subject: 'registration hints',
442
+ unitLabel: MARKABLE_UNIT_LISTS[MarkableUnitList.RegistrationHintTargetGlobs].unitLabel,
443
+ weight: UnitDeadWeight.Coverage,
444
+ observations,
445
+ marks,
446
+ deadSummary: 'matched no file',
447
+ ...(capped ? { capped: true, cappedReason: `a discovery walk hit its ${DISCOVERY_DIR_CAP}-directory cap` } : {}),
448
+ });
449
+ entries.forEach((e, i) => {
450
+ const f = found[i];
451
+ const span = spans[i];
452
+ const units = liveness.units.slice(span.start, span.end);
453
+ const push = (severity, code, message, target = '(discovery)') => {
454
+ issues.push({ severity, code, message, hintId: e.hint.id, source: e.sourceFile, target });
455
+ };
456
+ for (const u of units)
457
+ reportDiscoveryUnit(e.hint.id, f.mode, u, push);
458
+ let status;
459
+ if (f.mode === 'none') {
460
+ status = RegistrationHintDiscoveryStatus.Dead;
461
+ }
462
+ else if (f.mode === 'fixed') {
463
+ const u = units[0];
464
+ if (u?.state === UnitLivenessState.IntendedEmpty) {
465
+ status = RegistrationHintDiscoveryStatus.IntendedEmpty;
466
+ }
467
+ else if (f.candidates.length === 0) {
468
+ status = RegistrationHintDiscoveryStatus.Dead;
293
469
  }
294
470
  else {
295
- // Sanity: if the hint uses an anchor, verify the anchor exists.
296
- for (const op of e.hint.operations) {
297
- if (op.anchor) {
298
- try {
299
- const content = readFileSync(abs, 'utf8');
300
- if (!content.includes(op.anchor)) {
301
- out.push({
302
- severity: 'info',
303
- code: 'anchor-not-present',
304
- message: `Hint "${e.hint.id}" expects anchor "${op.anchor}" in ${e.hint.discovery.targetFile} but it is missing today.`,
305
- hintId: e.hint.id,
306
- source: e.sourceFile,
307
- });
308
- }
309
- }
310
- catch {
311
- // ignore read errors
312
- }
313
- }
314
- }
471
+ checkAnchors(inspection, e, f.candidates[0], issues);
472
+ status = RegistrationHintDiscoveryStatus.Verified;
315
473
  }
316
474
  }
475
+ else if (f.capped) {
476
+ push('info', 'discovery-unverified', `Registration hint "${e.hint.id}" discovery walk hit its ${DISCOVERY_DIR_CAP}-directory cap, so its candidate set is incomplete — NOT verified.`);
477
+ status = RegistrationHintDiscoveryStatus.Unverified;
478
+ }
479
+ else if (f.candidates.length === 0) {
480
+ // A hint whose every empty selector is intended-empty is not dead: it
481
+ // targets what the adopting app does not have yet (accepted, printed).
482
+ if (units.some((u) => u.state === UnitLivenessState.Dead)) {
483
+ push('warning', 'discovery-dead', `Registration hint "${e.hint.id}" discovery (${f.perGlob.map((g) => g.glob).join(', ')}) matches no file, so it can never target one — ${DEAD_SELECTOR_CAUSES}.`);
484
+ status = RegistrationHintDiscoveryStatus.Dead;
485
+ }
486
+ else {
487
+ status = RegistrationHintDiscoveryStatus.IntendedEmpty;
488
+ }
489
+ }
490
+ else if (f.candidates.length > 1) {
491
+ push('info', 'discovery-ambiguous', `Registration hint "${e.hint.id}" discovery matches ${f.candidates.length} files (${f.candidates.slice(0, 5).join(', ')}${f.candidates.length > 5 ? ', …' : ''}); preview will not guess.`);
492
+ status = RegistrationHintDiscoveryStatus.Ambiguous;
493
+ }
494
+ else {
495
+ checkAnchors(inspection, e, f.candidates[0], issues);
496
+ status = RegistrationHintDiscoveryStatus.Verified;
497
+ }
498
+ totals[STATUS_TOTAL[status]] += 1;
499
+ hints.push({ id: e.hint.id, discovery: f.mode, candidates: f.candidates.length, status, source: e.sourceFile });
500
+ });
501
+ return {
502
+ issues,
503
+ hints,
504
+ totals,
505
+ coverage: liveness.coverage,
506
+ deadUnits: liveness.dead.map((u) => `registration hint ${u.label}`),
507
+ liveness,
508
+ };
509
+ }
510
+ /**
511
+ * The per-selector issue for one SETTLED unit: a dead selector is a warning
512
+ * (the unmarked dead list), an intended-empty one and a stale marker are info
513
+ * (the acceptance rides in coverage; a went-live marker fails only through
514
+ * `selectorUnitFails` under `--fail-on-dead-units`, never through `--strict`).
515
+ */
516
+ function reportDiscoveryUnit(hintId, mode, u, push) {
517
+ if (u.state === UnitLivenessState.Dead) {
518
+ if (mode === 'none') {
519
+ push('warning', 'discovery-missing', `Registration hint "${hintId}" ${u.deadReason ?? 'has no discovery'}.`);
520
+ }
521
+ else if (mode === 'fixed') {
522
+ push('warning', 'target-file-missing', `Registration hint "${hintId}" targets ${u.unit} but the file is missing — ${DEAD_SELECTOR_CAUSES}.`, u.unit);
523
+ }
524
+ else {
525
+ push('warning', 'discovery-glob-matched-nothing', `Registration hint "${hintId}" discovery glob "${u.unit}" matches no file — ${DEAD_SELECTOR_CAUSES}.`, u.unit);
526
+ }
317
527
  }
318
- return out;
528
+ else if (u.state === UnitLivenessState.IntendedEmpty || u.state === UnitLivenessState.WentLive) {
529
+ // THE settle's sentence, after the selector it is about.
530
+ const selector = mode === 'fixed' ? `target file ${u.unit}` : `discovery glob "${u.unit}"`;
531
+ push('info', u.state === UnitLivenessState.IntendedEmpty ? 'discovery-intended-empty' : 'discovery-went-live', `Registration hint "${hintId}" ${selector} — ${u.message}`, u.unit);
532
+ }
533
+ }
534
+ /** Load issues + discovery findings — {@link buildRegistrationHintDoctorReport}'s issue list. */
535
+ export async function listRegistrationHintIssues(inspection) {
536
+ return (await buildRegistrationHintDoctorReport(inspection)).issues;
319
537
  }