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