@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
@@ -2,58 +2,36 @@
2
2
  * Pack signature freshness inspector.
3
3
  *
4
4
  * Reports each discovered pack's signature state without ever computing or
5
- * faking HMAC. Surfaces three statuses:
5
+ * faking HMAC. Freshness is read from THE pack-asset freshness authority
6
+ * (`detectPackAssetFreshness`): content digests recorded at sign time, never an
7
+ * mtime. Statuses:
6
8
  *
7
- * present — manifest has a signature and the timestamp is >= any
8
- * contribution file mtime we can see (heuristic — real
9
- * HMAC validation happens in pack-doctor).
10
- * stale — manifest has a signature but at least one contribution
11
- * file has a newer mtime than the signature timestamp.
12
- * missing — manifest has no signature block.
9
+ * present — signed, and every recorded contribution file still has the
10
+ * content that was signed (real HMAC validation happens in
11
+ * pack-doctor / packs verify).
12
+ * stale — signed, but a recorded contribution file changed since.
13
+ * unverified — signed, but the signature records no content digest for some
14
+ * file (signed before digests existed) — freshness NOT verified.
15
+ * missing — manifest has no signature block.
13
16
  *
14
17
  * The check is deterministic, read-only, and never requires the pack secret.
15
18
  */
16
- import { existsSync, statSync } from 'node:fs';
17
19
  import * as nodePath from 'node:path';
20
+ import { describePackAssetFreshness, detectPackAssetFreshness } from "./pack-asset-freshness.js";
18
21
  export const PACK_SIGNATURE_STATUS_SCHEMA = 'sharkcraft.pack-signature-status/v1';
19
22
  export var PackSignatureStatusKind;
20
23
  (function (PackSignatureStatusKind) {
21
24
  PackSignatureStatusKind["Present"] = "present";
22
25
  PackSignatureStatusKind["Stale"] = "stale";
26
+ PackSignatureStatusKind["Unverified"] = "unverified";
23
27
  PackSignatureStatusKind["Missing"] = "missing";
24
28
  })(PackSignatureStatusKind || (PackSignatureStatusKind = {}));
25
- const CONTRIB_SLOTS = [
26
- 'knowledgeFiles',
27
- 'ruleFiles',
28
- 'pathFiles',
29
- 'pathConventionFiles',
30
- 'templateFiles',
31
- 'pipelineFiles',
32
- 'presetFiles',
33
- 'boundaryFiles',
34
- 'contextTestFiles',
35
- 'agentTestFiles',
36
- 'scaffoldPatternFiles',
37
- 'policyCheckFiles',
38
- 'constructFiles',
39
- 'constructFacetFiles',
40
- 'playbookFiles',
41
- 'searchTuningFiles',
42
- 'feedbackRuleFiles',
43
- 'decisionFiles',
44
- 'mcpToolFiles',
45
- 'aiProviderFiles',
46
- 'docsFiles',
47
- 'contractTemplateFiles',
48
- 'migrationProfileFiles',
49
- 'conventionFiles',
50
- 'helperFiles',
51
- 'taskRoutingHintFiles',
52
- ];
53
29
  export function buildPackSignatureStatusReport(inspection) {
54
30
  const secret = Boolean(process.env['SHARKCRAFT_PACK_SECRET']);
55
31
  const out = [];
56
32
  for (const pack of inspection.packs.validPacks ?? []) {
33
+ const rel = nodePath.relative(inspection.projectRoot, pack.packageRoot);
34
+ const signCmd = secret ? `shrk packs sign ${rel}` : `SHARKCRAFT_PACK_SECRET=<secret> shrk packs sign ${rel}`;
57
35
  const sig = pack.manifest?.signature;
58
36
  if (!sig) {
59
37
  out.push({
@@ -63,87 +41,57 @@ export function buildPackSignatureStatusReport(inspection) {
63
41
  status: PackSignatureStatusKind.Missing,
64
42
  reason: 'no signature block on manifest',
65
43
  secretAvailable: secret,
66
- nextCommand: secret
67
- ? `shrk packs sign ${nodePath.relative(inspection.projectRoot, pack.packageRoot)}`
68
- : `SHARKCRAFT_PACK_SECRET=<secret> shrk packs sign ${nodePath.relative(inspection.projectRoot, pack.packageRoot)}`,
44
+ nextCommand: signCmd,
69
45
  });
70
46
  continue;
71
47
  }
72
- const sigMs = (() => {
73
- try {
74
- return new Date(sig.signedAt).getTime();
75
- }
76
- catch {
77
- return 0;
78
- }
79
- })();
80
- let newerFile;
81
- let newerMtime;
82
- const contributions = (pack.manifest?.contributions ?? {});
83
- for (const slot of CONTRIB_SLOTS) {
84
- const rels = contributions[slot];
85
- if (!rels)
86
- continue;
87
- for (const rel of rels) {
88
- const abs = nodePath.resolve(pack.packageRoot, rel);
89
- if (!existsSync(abs))
90
- continue;
91
- try {
92
- const st = statSync(abs);
93
- if (st.mtimeMs > sigMs + 1000) {
94
- newerFile = rel;
95
- newerMtime = new Date(st.mtimeMs).toISOString();
96
- break;
97
- }
98
- }
99
- catch {
100
- continue;
101
- }
102
- }
103
- if (newerFile)
104
- break;
105
- }
106
- if (newerFile && sig.dev === true) {
48
+ const freshness = detectPackAssetFreshness(pack);
49
+ const said = describePackAssetFreshness(freshness).signature;
50
+ const base = {
51
+ packageName: pack.packageName,
52
+ packageVersion: pack.packageVersion,
53
+ packageRoot: pack.packageRoot,
54
+ signatureSignedAt: sig.signedAt,
55
+ secretAvailable: secret,
56
+ ...(freshness.signature.diverged.length > 0
57
+ ? { divergedFiles: freshness.signature.diverged, newerContributionFile: freshness.signature.diverged[0] }
58
+ : {}),
59
+ ...(freshness.signature.unrecorded.length > 0 ? { unrecordedFiles: freshness.signature.unrecorded } : {}),
60
+ };
61
+ if (freshness.signature.state === 'diverged' && sig.dev === true) {
107
62
  // Dev packs are signed with the well-known PACK_DEV_SECRET and load fine
108
- // locally unsigned/dev — every local `npm run build` re-stales them, so a
109
- // standing "stale" warning is pure noise during pack development. Keep
110
- // them out of the stale bucket (still counted under summary.dev) and
111
- // soften the reason. Production (non-dev) signed packs are untouched.
63
+ // locally — every local build re-stales them, so a standing "stale" is
64
+ // pure noise during pack development. Keep them out of the stale bucket
65
+ // (still counted under summary.dev) and soften the reason. Production
66
+ // (non-dev) signed packs are untouched.
112
67
  out.push({
113
- packageName: pack.packageName,
114
- packageVersion: pack.packageVersion,
115
- packageRoot: pack.packageRoot,
68
+ ...base,
116
69
  status: PackSignatureStatusKind.Present,
117
- signatureSignedAt: sig.signedAt,
118
- secretAvailable: secret,
119
70
  dev: true,
120
- reason: `dev signature re-staled by a local build ("${newerFile}" newer) — dev packs load fine locally; re-sign before release`,
71
+ reason: `dev signature re-staled by a local build ("${freshness.signature.diverged[0]}" changed since signing) — dev packs load fine locally; re-sign before release`,
121
72
  });
122
73
  }
123
- else if (newerFile) {
74
+ else if (freshness.signature.state === 'diverged') {
124
75
  out.push({
125
- packageName: pack.packageName,
126
- packageVersion: pack.packageVersion,
127
- packageRoot: pack.packageRoot,
76
+ ...base,
128
77
  status: PackSignatureStatusKind.Stale,
129
- signatureSignedAt: sig.signedAt,
130
- reason: `contribution file "${newerFile}" mtime (${newerMtime}) is newer than signature (${sig.signedAt})`,
131
- newerContributionFile: newerFile,
132
- newerContributionMtime: newerMtime,
133
- secretAvailable: secret,
134
- nextCommand: secret
135
- ? `shrk packs sign ${nodePath.relative(inspection.projectRoot, pack.packageRoot)}`
136
- : `SHARKCRAFT_PACK_SECRET=<secret> shrk packs sign ${nodePath.relative(inspection.projectRoot, pack.packageRoot)}`,
78
+ ...(said ? { reason: said } : {}),
79
+ nextCommand: signCmd,
80
+ });
81
+ }
82
+ else if (freshness.signature.state === 'unrecorded') {
83
+ out.push({
84
+ ...base,
85
+ status: PackSignatureStatusKind.Unverified,
86
+ ...(said ? { reason: said } : {}),
87
+ ...(sig.dev === true ? { dev: true } : {}),
88
+ nextCommand: signCmd,
137
89
  });
138
90
  }
139
91
  else {
140
92
  out.push({
141
- packageName: pack.packageName,
142
- packageVersion: pack.packageVersion,
143
- packageRoot: pack.packageRoot,
93
+ ...base,
144
94
  status: PackSignatureStatusKind.Present,
145
- signatureSignedAt: sig.signedAt,
146
- secretAvailable: secret,
147
95
  ...(sig.dev === true ? { dev: true } : {}),
148
96
  });
149
97
  }
@@ -156,6 +104,7 @@ export function buildPackSignatureStatusReport(inspection) {
156
104
  total: out.length,
157
105
  present: out.filter((p) => p.status === PackSignatureStatusKind.Present).length,
158
106
  stale: out.filter((p) => p.status === PackSignatureStatusKind.Stale).length,
107
+ unverified: out.filter((p) => p.status === PackSignatureStatusKind.Unverified).length,
159
108
  missing: out.filter((p) => p.status === PackSignatureStatusKind.Missing).length,
160
109
  dev: out.filter((p) => p.dev === true).length,
161
110
  },
@@ -209,16 +158,21 @@ export function explainPackSignatureStatus(inspection, options = {}) {
209
158
  }
210
159
  else if (fresh?.status === 'stale') {
211
160
  state = 'stale';
212
- explanation = `${fresh.reason ?? 'Signature is older than at least one contribution file.'}`;
161
+ explanation = `${fresh.reason ?? 'A contribution file changed since the signature was made.'}`;
162
+ nextCommand = signCmd;
163
+ }
164
+ else if (fresh?.status === 'unverified') {
165
+ state = 'freshness-unverified';
166
+ explanation = `${fresh.reason ?? 'The signature records no content digests, so freshness is NOT verified.'}`;
213
167
  nextCommand = signCmd;
214
168
  }
215
169
  else if (fresh?.status === 'present') {
216
170
  // Freshness only — the HMAC was NOT checked this run. Reserve `valid`
217
- // strictly for a real verifier pass so a bogus-HMAC-but-fresh-timestamp
218
- // pack is never mislabelled as verified.
171
+ // strictly for a real verifier pass so a bogus-HMAC-but-fresh pack is
172
+ // never mislabelled as verified.
219
173
  state = 'present-unverified';
220
174
  explanation =
221
- 'Signature present and newer than every contribution file, but the HMAC was NOT checked this run.';
175
+ 'Signature present and every contribution file still matches its signed content digest, but the HMAC was NOT checked this run.';
222
176
  nextCommand = 'shrk packs verify --required';
223
177
  }
224
178
  else {
@@ -8,10 +8,19 @@
8
8
  *
9
9
  * The runner:
10
10
  * 1. Loads the pack tests via dynamic import (Bun handles TS natively).
11
- * 2. For each test case, builds a task packet against an isolated inspection.
12
- * 3. Validates the packet contains every `expect*Ids` and none of the
13
- * `mustNotIncludeIds`, optionally capping the token budget.
14
- * 4. Emits a structured diagnostic report.
11
+ * 2. Inspects the pack once and warms the shared reference registry.
12
+ * 3. For each test case, builds a task packet and checks the expectations —
13
+ * two classes of assertion, reported separately:
14
+ * - ranker-SURFACED (`expectKnowledgeIds` / `expectRuleIds` /
15
+ * `expectTemplateIds` / `expectPipelineIds`): the id is in the packet.
16
+ * Order-sensitive; an unrelated content edit can flip it.
17
+ * - registry-EXISTENCE (`expectPlaybookIds` / `expectConstructIds`): the
18
+ * id is registered. Stable. These were declared but never evaluated
19
+ * (the packet summary hard-coded both lists to []), so a typo'd id
20
+ * passed silently.
21
+ * 4. Emits a structured diagnostic report. A surfaced-class miss says whether
22
+ * the id exists at all (`unknown-id` — can never pass) or merely did not
23
+ * rank (`not-surfaced`), and names the registry it consulted.
15
24
  */
16
25
  export interface IPackTestCase {
17
26
  id: string;
@@ -32,8 +41,21 @@ export interface IPackTestResult {
32
41
  task: string;
33
42
  passed: boolean;
34
43
  diagnostics: ReadonlyArray<{
35
- code: 'missing-id' | 'unexpected-id' | 'token-budget' | 'load-error';
44
+ /**
45
+ * `unknown-id` — not registered at all (can never pass); `not-surfaced` —
46
+ * registered but not in the packet; `unexpected-id` — a mustNotInclude id
47
+ * was surfaced.
48
+ */
49
+ code: 'unknown-id' | 'not-surfaced' | 'unexpected-id' | 'token-budget' | 'load-error';
36
50
  field?: string;
51
+ /** `surfaced` (in the task packet) or `exists` (registered). */
52
+ assertion?: 'surfaced' | 'exists';
53
+ /** The registry the existence answer came from. */
54
+ consulted?: {
55
+ kind: string;
56
+ listVerb: string;
57
+ size: number;
58
+ };
37
59
  expected?: string;
38
60
  actual?: string;
39
61
  suggestion?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"pack-test-runner.d.ts","sourceRoot":"","sources":["../src/pack-test-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAE/D;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,aAAa,CAAC;QACzB,IAAI,EAAE,YAAY,GAAG,eAAe,GAAG,cAAc,GAAG,YAAY,CAAC;QACrE,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,gCAAgC,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;CACvC;AA4HD,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,eAAe,CAAC,CAgE3B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiBxE"}
1
+ {"version":3,"file":"pack-test-runner.d.ts","sourceRoot":"","sources":["../src/pack-test-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAcH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAE1C,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAE/D;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,aAAa,CAAC;QACzB;;;;WAIG;QACH,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,YAAY,CAAC;QACtF,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,gEAAgE;QAChE,SAAS,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;QAClC,mDAAmD;QACnD,SAAS,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,gCAAgC,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;CACvC;AAsKD,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,eAAe,CAAC,CAsE3B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAoBxE"}
@@ -8,16 +8,26 @@
8
8
  *
9
9
  * The runner:
10
10
  * 1. Loads the pack tests via dynamic import (Bun handles TS natively).
11
- * 2. For each test case, builds a task packet against an isolated inspection.
12
- * 3. Validates the packet contains every `expect*Ids` and none of the
13
- * `mustNotIncludeIds`, optionally capping the token budget.
14
- * 4. Emits a structured diagnostic report.
11
+ * 2. Inspects the pack once and warms the shared reference registry.
12
+ * 3. For each test case, builds a task packet and checks the expectations —
13
+ * two classes of assertion, reported separately:
14
+ * - ranker-SURFACED (`expectKnowledgeIds` / `expectRuleIds` /
15
+ * `expectTemplateIds` / `expectPipelineIds`): the id is in the packet.
16
+ * Order-sensitive; an unrelated content edit can flip it.
17
+ * - registry-EXISTENCE (`expectPlaybookIds` / `expectConstructIds`): the
18
+ * id is registered. Stable. These were declared but never evaluated
19
+ * (the packet summary hard-coded both lists to []), so a typo'd id
20
+ * passed silently.
21
+ * 4. Emits a structured diagnostic report. A surfaced-class miss says whether
22
+ * the id exists at all (`unknown-id` — can never pass) or merely did not
23
+ * rank (`not-surfaced`), and names the registry it consulted.
15
24
  */
16
25
  import { existsSync, writeFileSync, mkdirSync } from 'node:fs';
17
26
  import { join } from 'node:path';
18
27
  import { inspectSharkcraft } from "./sharkcraft-inspector.js";
19
28
  import { buildTaskPacket } from "./task-packet.js";
20
29
  import { importModuleViaLoader } from '@shrkcrft/core';
30
+ import { referenceIdExists, referenceIdsFor, warmReferenceRegistries, } from "./reference-registry.js";
21
31
  export function definePackTest(t) {
22
32
  return t;
23
33
  }
@@ -26,6 +36,14 @@ const TEST_FILE_CANDIDATES = [
26
36
  'src/assets/pack-tests.ts',
27
37
  'pack-tests.ts',
28
38
  ];
39
+ const LIST_VERBS = Object.freeze({
40
+ knowledge: 'shrk knowledge list',
41
+ rule: 'shrk rules list',
42
+ template: 'shrk templates list',
43
+ pipeline: 'shrk pipelines list',
44
+ playbook: 'shrk playbooks list',
45
+ construct: 'shrk constructs list',
46
+ });
29
47
  function findTestsFile(packPath) {
30
48
  for (const rel of TEST_FILE_CANDIDATES) {
31
49
  const abs = join(packPath, rel);
@@ -42,45 +60,73 @@ async function loadTestCases(file) {
42
60
  function unique(arr) {
43
61
  return [...new Set(arr)];
44
62
  }
45
- async function summariseTaskPacket(packPath, task) {
46
- const inspection = await inspectSharkcraft({ cwd: packPath });
63
+ function summariseTaskPacket(inspection, task) {
47
64
  const packet = buildTaskPacket(inspection, task);
48
- const knowledgeIds = unique(packet.context.sections.flatMap((s) => [...s.entryIds]));
49
- const ruleIds = unique(packet.relevantRules.map((r) => r.id));
50
- const templateIds = unique(packet.relevantTemplates.map((t) => t.id));
51
- const pipelineIds = unique(packet.recommendedPipelines.map((p) => p.pipelineId));
52
65
  return {
53
- knowledgeIds,
54
- ruleIds,
55
- templateIds,
56
- pipelineIds,
57
- playbookIds: [],
58
- constructIds: [],
66
+ knowledgeIds: unique(packet.context.sections.flatMap((s) => [...s.entryIds])),
67
+ ruleIds: unique(packet.relevantRules.map((r) => r.id)),
68
+ templateIds: unique(packet.relevantTemplates.map((t) => t.id)),
69
+ pipelineIds: unique(packet.recommendedPipelines.map((p) => p.pipelineId)),
59
70
  tokenEstimate: packet.tokenEstimate,
60
71
  };
61
72
  }
62
- function evaluateCase(testCase, packet) {
73
+ function consultedRegistry(inspection, kind) {
74
+ return {
75
+ kind,
76
+ listVerb: LIST_VERBS[kind] ?? `shrk ${kind} list`,
77
+ size: referenceIdsFor(inspection, kind).length,
78
+ };
79
+ }
80
+ function evaluateCase(testCase, packet, inspection) {
63
81
  const diagnostics = [];
64
- const checks = [
65
- { field: 'knowledgeIds', expected: testCase.expectKnowledgeIds },
66
- { field: 'ruleIds', expected: testCase.expectRuleIds },
67
- { field: 'templateIds', expected: testCase.expectTemplateIds },
68
- { field: 'pipelineIds', expected: testCase.expectPipelineIds },
82
+ const surfaced = [
83
+ { field: 'knowledgeIds', kind: 'knowledge', expected: testCase.expectKnowledgeIds },
84
+ { field: 'ruleIds', kind: 'rule', expected: testCase.expectRuleIds },
85
+ { field: 'templateIds', kind: 'template', expected: testCase.expectTemplateIds },
86
+ { field: 'pipelineIds', kind: 'pipeline', expected: testCase.expectPipelineIds },
69
87
  ];
70
- for (const c of checks) {
88
+ for (const c of surfaced) {
71
89
  if (!c.expected)
72
90
  continue;
73
91
  const actualList = packet[c.field];
74
92
  for (const id of c.expected) {
75
- if (!actualList.includes(id)) {
76
- diagnostics.push({
77
- code: 'missing-id',
78
- field: c.field,
79
- expected: id,
80
- suggestion: `Add ${id} to the pack's ${c.field} or to the recommender for "${testCase.task}".`,
81
- message: `Expected ${c.field} to include "${id}" for task "${testCase.task}", but it did not.`,
82
- });
83
- }
93
+ if (actualList.includes(id))
94
+ continue;
95
+ const registry = consultedRegistry(inspection, c.kind);
96
+ const exists = referenceIdExists(inspection, c.kind, id);
97
+ diagnostics.push({
98
+ code: exists ? 'not-surfaced' : 'unknown-id',
99
+ field: c.field,
100
+ assertion: 'surfaced',
101
+ consulted: registry,
102
+ expected: id,
103
+ suggestion: exists
104
+ ? `Tune ${id}'s tags / appliesWhen, or reference it from a preset, so the recommender surfaces it for "${testCase.task}".`
105
+ : `Correct the id or ship the ${c.kind} — it is not among the ${registry.size} ids \`${registry.listVerb}\` prints.`,
106
+ message: exists
107
+ ? `Expected ${c.field} to include "${id}" for task "${testCase.task}": it is registered but was not surfaced.`
108
+ : `Expected ${c.field} to include "${id}", but no ${c.kind} "${id}" is registered — this expectation can never pass.`,
109
+ });
110
+ }
111
+ }
112
+ const existence = [
113
+ { field: 'playbookIds', kind: 'playbook', expected: testCase.expectPlaybookIds },
114
+ { field: 'constructIds', kind: 'construct', expected: testCase.expectConstructIds },
115
+ ];
116
+ for (const c of existence) {
117
+ for (const id of c.expected ?? []) {
118
+ if (referenceIdExists(inspection, c.kind, id))
119
+ continue;
120
+ const registry = consultedRegistry(inspection, c.kind);
121
+ diagnostics.push({
122
+ code: 'unknown-id',
123
+ field: c.field,
124
+ assertion: 'exists',
125
+ consulted: registry,
126
+ expected: id,
127
+ suggestion: `Correct the id or ship the ${c.kind} — it is not among the ${registry.size} ids \`${registry.listVerb}\` prints.`,
128
+ message: `Expected ${c.kind} "${id}" to be registered, but it is not.`,
129
+ });
84
130
  }
85
131
  }
86
132
  if (testCase.mustNotIncludeIds && testCase.mustNotIncludeIds.length > 0) {
@@ -94,6 +140,7 @@ function evaluateCase(testCase, packet) {
94
140
  if (allIds.includes(id)) {
95
141
  diagnostics.push({
96
142
  code: 'unexpected-id',
143
+ assertion: 'surfaced',
97
144
  expected: id,
98
145
  actual: id,
99
146
  message: `"${id}" should not have been included in the packet for task "${testCase.task}".`,
@@ -159,9 +206,15 @@ export async function runPackTests(input) {
159
206
  if (caseId)
160
207
  cases = cases.filter((c) => c.id === caseId);
161
208
  const results = [];
162
- for (const tc of cases) {
163
- const summary = await summariseTaskPacket(packPath, tc.task);
164
- results.push(evaluateCase(tc, summary));
209
+ if (cases.length > 0) {
210
+ // One inspection, warmed once: every existence answer comes from the
211
+ // shared reference registry (the playbook / construct kinds are
212
+ // cache-backed and read empty until warmed).
213
+ const inspection = await inspectSharkcraft({ cwd: packPath });
214
+ await warmReferenceRegistries(inspection);
215
+ for (const tc of cases) {
216
+ results.push(evaluateCase(tc, summariseTaskPacket(inspection, tc.task), inspection));
217
+ }
165
218
  }
166
219
  if (input.updateSnapshots) {
167
220
  const snapsDir = join(packPath, 'sharkcraft', 'pack-test-snapshots');
@@ -195,6 +248,9 @@ export function renderPackTestReportText(report) {
195
248
  lines.push(` ${c.passed ? '✓' : '✗'} ${c.id} ${c.task}`);
196
249
  for (const d of c.diagnostics) {
197
250
  lines.push(` - [${d.code}] ${d.message}`);
251
+ if (d.consulted) {
252
+ lines.push(` consulted: ${d.consulted.kind} registry (${d.consulted.size} ids, \`${d.consulted.listVerb}\`)`);
253
+ }
198
254
  if (d.suggestion)
199
255
  lines.push(` ↳ ${d.suggestion}`);
200
256
  }
@@ -0,0 +1,8 @@
1
+ import { type ISharkCraftPackManifest } from '@shrkcrft/plugin-api';
2
+ import { type ITypecheckFilesResult } from './typecheck-files.js';
3
+ export declare function typecheckPackAssets(pack: {
4
+ readonly packageRoot: string;
5
+ readonly manifestPath?: string | null;
6
+ readonly manifest?: ISharkCraftPackManifest | null;
7
+ }): ITypecheckFilesResult;
8
+ //# sourceMappingURL=pack-typecheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-typecheck.d.ts","sourceRoot":"","sources":["../src/pack-typecheck.ts"],"names":[],"mappings":"AAiBA,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAIlF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACpD,GAAG,qBAAqB,CAoBxB"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Type-check a pack's own TypeScript assets — the manifest file plus every
3
+ * `.ts`/`.tsx` contribution the manifest declares — with the ONE in-process
4
+ * check (`typecheckFiles`). Pack loading is transpile-only, so this is the
5
+ * only place an implicit-any parameter or a misspelled field in an asset is
6
+ * caught before it ships.
7
+ *
8
+ * Opt-in (`--typecheck` on `packs test | doctor | release-check`): it is
9
+ * costly, and default loading must not change behaviour. The pack's own
10
+ * `tsconfig.json` applies when present; otherwise strict defaults with `.ts`
11
+ * import specifiers allowed (Bun loads them). Every diagnostic in a file under
12
+ * the pack root is reported (so a group module an asset imports is checked
13
+ * too). `ran: false` — no TS files, or TypeScript could not run — is a
14
+ * not-verified outcome for callers, never a pass.
15
+ */
16
+ import { existsSync } from 'node:fs';
17
+ import { resolve } from 'node:path';
18
+ import { CONTRIBUTION_FILE_KEYS, FUTURE_CONTRIBUTION_FILE_KEYS, } from '@shrkcrft/plugin-api';
19
+ import { typecheckFiles } from "./typecheck-files.js";
20
+ const TS_SOURCE = /\.(?:[cm]?ts|tsx)$/;
21
+ export function typecheckPackAssets(pack) {
22
+ const roots = new Set();
23
+ if (pack.manifestPath && TS_SOURCE.test(pack.manifestPath) && existsSync(pack.manifestPath)) {
24
+ roots.add(resolve(pack.manifestPath));
25
+ }
26
+ const contributions = (pack.manifest?.contributions ?? {});
27
+ for (const key of [...CONTRIBUTION_FILE_KEYS, ...FUTURE_CONTRIBUTION_FILE_KEYS]) {
28
+ for (const rel of contributions[key] ?? []) {
29
+ if (typeof rel !== 'string' || !TS_SOURCE.test(rel))
30
+ continue;
31
+ const abs = resolve(pack.packageRoot, rel);
32
+ if (existsSync(abs))
33
+ roots.add(abs);
34
+ }
35
+ }
36
+ const result = typecheckFiles(pack.packageRoot, {
37
+ rootNames: [...roots].sort(),
38
+ reportOnlyUnder: pack.packageRoot,
39
+ allowTsExtensionsByDefault: true,
40
+ includeGlobalDiagnostics: true,
41
+ });
42
+ return sdkUnresolved(result, pack.packageRoot) ?? result;
43
+ }
44
+ /** "Cannot find module" — 2307, and 2792 (its moduleResolution-hint variant). */
45
+ const MODULE_NOT_FOUND = new Set([2307, 2792]);
46
+ const SDK_SPECIFIER = /['"](@shrkcrft\/[^'"]+)['"]/;
47
+ /**
48
+ * A pack that imports the SharkCraft SDK (`@shrkcrft/*`) from a tree where it
49
+ * is not installed (a fresh `packs new` scaffold before `npm install`) cannot
50
+ * be type-checked: every SDK type is unresolved, so the diagnostics are the
51
+ * missing devDependency — cascading into implicit-any errors — not defects in
52
+ * the pack. That run examined nothing trustworthy: report it as NOT run (a
53
+ * not-verified outcome for every caller), never as pack errors.
54
+ */
55
+ function sdkUnresolved(result, packageRoot) {
56
+ if (!result.ran)
57
+ return undefined;
58
+ const missing = new Set();
59
+ for (const e of result.errors) {
60
+ if (!MODULE_NOT_FOUND.has(e.code))
61
+ continue;
62
+ const m = SDK_SPECIFIER.exec(e.message);
63
+ if (m)
64
+ missing.add(m[1]);
65
+ }
66
+ if (missing.size === 0)
67
+ return undefined;
68
+ return {
69
+ ran: false,
70
+ errors: [],
71
+ checkedFiles: result.checkedFiles,
72
+ tsconfigPath: result.tsconfigPath,
73
+ note: `SDK not installed — ${[...missing].sort().join(', ')} cannot be resolved from ${packageRoot}, so the ` +
74
+ `${result.errors.length} diagnostic(s) it produced are withheld; run \`npm install\` in the pack and re-run — typecheck NOT verified`,
75
+ };
76
+ }
@@ -56,6 +56,8 @@ export interface IPlanReviewReport {
56
56
  * scanning its imports against the boundary rules.
57
57
  */
58
58
  planIntroducedBoundaryConcerns: readonly IPlanIntroducedBoundaryConcern[];
59
+ /** Why `potentialBoundaryConcerns` is not the full answer for the targets (THE boundary verdict's shortfalls). */
60
+ boundaryShortfalls?: readonly string[];
59
61
  /** Verification commands recommended to run after apply. */
60
62
  verificationCommands: readonly string[];
61
63
  humanApprovalReminder: string;
@@ -1 +1 @@
1
- {"version":3,"file":"plan-review.d.ts","sourceRoot":"","sources":["../src/plan-review.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,IAAI,EACA,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,cAAc,GACd,eAAe,GACf,SAAS,GACT,QAAQ,GACR,MAAM,GACN,UAAU,GACV,SAAS,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC7C,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,GAAG,eAAe,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,iBAAiB,EAAE,kBAAkB,GAAG,sCAAsC,CAAC;CAChF;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,6CAA6C;IAC7C,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C,oDAAoD;IACpD,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iEAAiE;IACjE,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,8EAA8E;IAC9E,yBAAyB,EAAE,SAAS;QAClC,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;IACJ;;;;OAIG;IACH,8BAA8B,EAAE,SAAS,8BAA8B,EAAE,CAAC;IAC1E,4DAA4D;IAC5D,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,eAAe,CAC7B,UAAU,EAAE,qBAAqB,EACjC,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAkLnB"}
1
+ {"version":3,"file":"plan-review.d.ts","sourceRoot":"","sources":["../src/plan-review.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,IAAI,EACA,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,cAAc,GACd,eAAe,GACf,SAAS,GACT,QAAQ,GACR,MAAM,GACN,UAAU,GACV,SAAS,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC7C,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,GAAG,eAAe,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,iBAAiB,EAAE,kBAAkB,GAAG,sCAAsC,CAAC;CAChF;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,6CAA6C;IAC7C,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C,oDAAoD;IACpD,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iEAAiE;IACjE,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,8EAA8E;IAC9E,yBAAyB,EAAE,SAAS;QAClC,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;IACJ;;;;OAIG;IACH,8BAA8B,EAAE,SAAS,8BAA8B,EAAE,CAAC;IAC1E,kHAAkH;IAClH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,4DAA4D;IAC5D,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,eAAe,CAC7B,UAAU,EAAE,qBAAqB,EACjC,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAwLnB"}
@@ -1,5 +1,7 @@
1
1
  import { readFileSync } from 'node:fs';
2
- import { evaluateBoundaries, loadTsconfigPaths, scanImports, } from '@shrkcrft/boundaries';
2
+ import { evaluateBoundaries, loadTsconfigPaths, } from '@shrkcrft/boundaries';
3
+ import { ChangedScopeMode } from "./boundaries-changed-only.js";
4
+ import { runBoundaryCheck } from "./run-boundary-check.js";
3
5
  import { checkFolderOpSafety, FolderOpSafety, planGeneration, verifyPlan, } from '@shrkcrft/generator';
4
6
  import { matchAffectedConventions } from '@shrkcrft/paths';
5
7
  export function reviewSavedPlan(inspection, planPath) {
@@ -88,14 +90,20 @@ export function reviewSavedPlan(inspection, planPath) {
88
90
  missingTestsHeuristic.push(`${f.relativePath} → expected ${candidate}`);
89
91
  }
90
92
  }
91
- // Current-state boundary scan on the target paths (existing behavior).
93
+ // Current-state boundary scan on the target paths — through THE boundary
94
+ // orchestrator, scoped to the planned paths (round 11 review R11-GAP-3): a
95
+ // governed target it could not read is named in `boundaryShortfalls`.
92
96
  let potentialBoundaryConcerns = [];
97
+ let boundaryShortfalls = [];
93
98
  const tsconfigPaths = loadTsconfigPaths(inspection.projectRoot);
94
99
  const aliasOpts = tsconfigPaths.aliases.size > 0 ? { tsconfigPaths } : {};
95
100
  if (inspection.boundaryRegistry.size() > 0 && files.length > 0) {
96
- const scan = scanImports({ projectRoot: inspection.projectRoot });
97
- const evalResult = evaluateBoundaries(scan, inspection.boundaryRegistry.list(), aliasOpts);
98
- const targetSet = new Set(files.map((f) => f.relativePath));
101
+ const targets = files.map((f) => f.relativePath);
102
+ const evalResult = runBoundaryCheck(inspection, { changed: { mode: ChangedScopeMode.Files, files: targets } });
103
+ if (evalResult.verdict === 'not-verified' && evalResult.selectedRuleIds.length > 0) {
104
+ boundaryShortfalls = evalResult.shortfalls;
105
+ }
106
+ const targetSet = new Set(targets);
99
107
  potentialBoundaryConcerns = evalResult.violations
100
108
  .filter((v) => targetSet.has(v.file))
101
109
  .map((v) => ({
@@ -111,6 +119,9 @@ export function reviewSavedPlan(inspection, planPath) {
111
119
  // planned paths.
112
120
  const planIntroducedBoundaryConcerns = [];
113
121
  if (inspection.boundaryRegistry.size() > 0 && liveChanges.length > 0) {
122
+ // PLANNED contents are not on disk, so the orchestrator cannot scan them:
123
+ // a sanctioned direct `evaluateBoundaries` over planned edges only (the
124
+ // r75 one-boundary-authority lock names this call site).
114
125
  const plannedEdges = collectPlannedEdges(liveChanges);
115
126
  const evalResult = evaluateBoundaries({ filesScanned: liveChanges.length, edges: plannedEdges, warnings: [] }, inspection.boundaryRegistry.list(), aliasOpts);
116
127
  for (const v of evalResult.violations) {
@@ -157,6 +168,7 @@ export function reviewSavedPlan(inspection, planPath) {
157
168
  missingTestsHeuristic,
158
169
  potentialBoundaryConcerns,
159
170
  planIntroducedBoundaryConcerns,
171
+ ...(boundaryShortfalls.length > 0 ? { boundaryShortfalls } : {}),
160
172
  verificationCommands: [
161
173
  'shrk doctor',
162
174
  'shrk check boundaries',