@canonical/pragma-cli 0.34.0 → 0.36.0

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 (832) hide show
  1. package/README.md +153 -30
  2. package/bundled-skills/add-standard/SKILL.md +338 -0
  3. package/bundled-skills/adoption-a1-styles/SKILL.md +269 -0
  4. package/bundled-skills/adoption-a2-components/SKILL.md +291 -0
  5. package/bundled-skills/adoption-a3-forms/SKILL.md +260 -0
  6. package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +406 -0
  7. package/bundled-skills/anatomy-author/SKILL.md +1226 -0
  8. package/bundled-skills/design-auditor/SKILL.md +455 -0
  9. package/bundled-skills/implement-component/SKILL.md +333 -0
  10. package/bundled-skills/specify-component/SKILL.md +331 -0
  11. package/bundled-skills/specify-pattern/SKILL.md +292 -0
  12. package/dist/.build-ok +0 -0
  13. package/dist/package.json +84 -0
  14. package/dist/pragma.conf.js +1016 -0
  15. package/dist/pragma.conf.js.map +1 -0
  16. package/dist/src/bin.js +356 -0
  17. package/dist/src/bin.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  19. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  20. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  21. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  22. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  23. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  24. package/dist/src/capabilities/capabilities/hints.js +195 -0
  25. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  26. package/dist/src/capabilities/capabilities/index.js +11 -0
  27. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  28. package/dist/src/capabilities/capabilities/types.js +11 -0
  29. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  30. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  31. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  32. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  33. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  34. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  35. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  36. package/dist/src/capabilities/colophon/index.js +5 -0
  37. package/dist/src/capabilities/colophon/index.js.map +1 -0
  38. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  39. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  40. package/dist/src/capabilities/colophon/types.js +10 -0
  41. package/dist/src/capabilities/colophon/types.js.map +1 -0
  42. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  43. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  44. package/dist/src/capabilities/config/field.render.js +22 -0
  45. package/dist/src/capabilities/config/field.render.js.map +1 -0
  46. package/dist/src/capabilities/config/fields.js +46 -0
  47. package/dist/src/capabilities/config/fields.js.map +1 -0
  48. package/dist/src/capabilities/config/get.verb.js +61 -0
  49. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/index.js +5 -0
  51. package/dist/src/capabilities/config/index.js.map +1 -0
  52. package/dist/src/capabilities/config/runField.js +59 -0
  53. package/dist/src/capabilities/config/runField.js.map +1 -0
  54. package/dist/src/capabilities/config/runGet.js +28 -0
  55. package/dist/src/capabilities/config/runGet.js.map +1 -0
  56. package/dist/src/capabilities/config/runSet.js +53 -0
  57. package/dist/src/capabilities/config/runSet.js.map +1 -0
  58. package/dist/src/capabilities/config/set.verb.js +66 -0
  59. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  60. package/dist/src/capabilities/config/show.render.js +84 -0
  61. package/dist/src/capabilities/config/show.render.js.map +1 -0
  62. package/dist/src/capabilities/config/show.verb.js +44 -0
  63. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  64. package/dist/src/capabilities/config/types.js +5 -0
  65. package/dist/src/capabilities/config/types.js.map +1 -0
  66. package/dist/src/capabilities/config/unset.verb.js +49 -0
  67. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  68. package/dist/src/capabilities/create/cliProjection.js +195 -0
  69. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  70. package/dist/src/capabilities/create/constants.js +47 -0
  71. package/dist/src/capabilities/create/constants.js.map +1 -0
  72. package/dist/src/capabilities/create/create.render.js +100 -0
  73. package/dist/src/capabilities/create/create.render.js.map +1 -0
  74. package/dist/src/capabilities/create/create.verb.js +438 -0
  75. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  76. package/dist/src/capabilities/create/createHelp.js +47 -0
  77. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  78. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  79. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  80. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  81. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  82. package/dist/src/capabilities/create/index.js +18 -0
  83. package/dist/src/capabilities/create/index.js.map +1 -0
  84. package/dist/src/capabilities/create/messages.js +16 -0
  85. package/dist/src/capabilities/create/messages.js.map +1 -0
  86. package/dist/src/capabilities/create/mount.js +294 -0
  87. package/dist/src/capabilities/create/mount.js.map +1 -0
  88. package/dist/src/capabilities/create/pathJail.js +65 -0
  89. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  90. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  91. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  92. package/dist/src/capabilities/create/types.js +2 -0
  93. package/dist/src/capabilities/create/types.js.map +1 -0
  94. package/dist/src/capabilities/distribution.js +40 -0
  95. package/dist/src/capabilities/distribution.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  97. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  99. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +148 -0
  101. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  102. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  103. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  104. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  105. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  106. package/dist/src/capabilities/doctor/checks/harnessInventory.js +195 -0
  107. package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -0
  108. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  109. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  110. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  111. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  112. package/dist/src/capabilities/doctor/checks/targetHealth.js +349 -0
  113. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  114. package/dist/src/capabilities/doctor/doctor.render.js +164 -0
  115. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  116. package/dist/src/capabilities/doctor/doctor.verb.js +49 -0
  117. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  118. package/dist/src/capabilities/doctor/index.js +5 -0
  119. package/dist/src/capabilities/doctor/index.js.map +1 -0
  120. package/dist/src/capabilities/doctor/runChecks.js +86 -0
  121. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  122. package/dist/src/capabilities/doctor/types.js +5 -0
  123. package/dist/src/capabilities/doctor/types.js.map +1 -0
  124. package/dist/src/capabilities/graph/index.js +19 -0
  125. package/dist/src/capabilities/graph/index.js.map +1 -0
  126. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  127. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  128. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  129. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  130. package/dist/src/capabilities/graph/query.render.js +73 -0
  131. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  132. package/dist/src/capabilities/graph/query.verb.js +49 -0
  133. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  134. package/dist/src/capabilities/graph/runQuery.js +41 -0
  135. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  136. package/dist/src/capabilities/index.js +56 -0
  137. package/dist/src/capabilities/index.js.map +1 -0
  138. package/dist/src/capabilities/info/collectInfo.js +72 -0
  139. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  140. package/dist/src/capabilities/info/index.js +5 -0
  141. package/dist/src/capabilities/info/index.js.map +1 -0
  142. package/dist/src/capabilities/info/info.render.js +57 -0
  143. package/dist/src/capabilities/info/info.render.js.map +1 -0
  144. package/dist/src/capabilities/info/info.verb.js +42 -0
  145. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  146. package/dist/src/capabilities/info/types.js +5 -0
  147. package/dist/src/capabilities/info/types.js.map +1 -0
  148. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  149. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  150. package/dist/src/capabilities/meta/index.js +13 -0
  151. package/dist/src/capabilities/meta/index.js.map +1 -0
  152. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  153. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  154. package/dist/src/capabilities/ontology/index.js +21 -0
  155. package/dist/src/capabilities/ontology/index.js.map +1 -0
  156. package/dist/src/capabilities/ontology/queries.js +123 -0
  157. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  158. package/dist/src/capabilities/ontology/render.js +66 -0
  159. package/dist/src/capabilities/ontology/render.js.map +1 -0
  160. package/dist/src/capabilities/ontology/verbs.js +181 -0
  161. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  162. package/dist/src/capabilities/prompt/index.js +16 -0
  163. package/dist/src/capabilities/prompt/index.js.map +1 -0
  164. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  165. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  166. package/dist/src/capabilities/prompt/types.js +10 -0
  167. package/dist/src/capabilities/prompt/types.js.map +1 -0
  168. package/dist/src/capabilities/prompt/verbs.js +93 -0
  169. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  170. package/dist/src/capabilities/resources/index.js +10 -0
  171. package/dist/src/capabilities/resources/index.js.map +1 -0
  172. package/dist/src/capabilities/resources/provider.js +423 -0
  173. package/dist/src/capabilities/resources/provider.js.map +1 -0
  174. package/dist/src/capabilities/setup/buildPlan.js +172 -0
  175. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  176. package/dist/src/capabilities/setup/index.js +5 -0
  177. package/dist/src/capabilities/setup/index.js.map +1 -0
  178. package/dist/src/capabilities/setup/mode.js +53 -0
  179. package/dist/src/capabilities/setup/mode.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/index.js +39 -0
  181. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  182. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  183. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  184. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  185. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  186. package/dist/src/capabilities/setup/operations/setupGenerator.js +390 -0
  187. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  188. package/dist/src/capabilities/setup/operations/setupLsp.js +329 -0
  189. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  190. package/dist/src/capabilities/setup/operations/setupMcp.js +253 -0
  191. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  192. package/dist/src/capabilities/setup/operations/setupSkills.js +594 -0
  193. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  194. package/dist/src/capabilities/setup/plan.js +128 -0
  195. package/dist/src/capabilities/setup/plan.js.map +1 -0
  196. package/dist/src/capabilities/setup/plan.render.js +271 -0
  197. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  198. package/dist/src/capabilities/setup/setup.render.js +54 -0
  199. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  200. package/dist/src/capabilities/setup/setup.verb.js +387 -0
  201. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  202. package/dist/src/capabilities/setup/shell.js +196 -0
  203. package/dist/src/capabilities/setup/shell.js.map +1 -0
  204. package/dist/src/capabilities/setup/targets.js +328 -0
  205. package/dist/src/capabilities/setup/targets.js.map +1 -0
  206. package/dist/src/capabilities/setup/types.js +5 -0
  207. package/dist/src/capabilities/setup/types.js.map +1 -0
  208. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  209. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  210. package/dist/src/capabilities/shared/index.js +27 -0
  211. package/dist/src/capabilities/shared/index.js.map +1 -0
  212. package/dist/src/capabilities/shared/packageManager.js +349 -0
  213. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  214. package/dist/src/capabilities/shared/registry.js +55 -0
  215. package/dist/src/capabilities/shared/registry.js.map +1 -0
  216. package/dist/src/capabilities/skill/discover.js +281 -0
  217. package/dist/src/capabilities/skill/discover.js.map +1 -0
  218. package/dist/src/capabilities/skill/index.js +10 -0
  219. package/dist/src/capabilities/skill/index.js.map +1 -0
  220. package/dist/src/capabilities/skill/render.js +49 -0
  221. package/dist/src/capabilities/skill/render.js.map +1 -0
  222. package/dist/src/capabilities/skill/verbs.js +83 -0
  223. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  224. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  225. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  226. package/dist/src/capabilities/sources/index.js +13 -0
  227. package/dist/src/capabilities/sources/index.js.map +1 -0
  228. package/dist/src/capabilities/sources/installSkills.js +309 -0
  229. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  230. package/dist/src/capabilities/sources/runUpdate.js +460 -0
  231. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  232. package/dist/src/capabilities/sources/status.render.js +64 -0
  233. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  234. package/dist/src/capabilities/sources/status.verb.js +40 -0
  235. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  236. package/dist/src/capabilities/sources/types.js +6 -0
  237. package/dist/src/capabilities/sources/types.js.map +1 -0
  238. package/dist/src/capabilities/sources/update.render.js +34 -0
  239. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  240. package/dist/src/capabilities/sources/update.verb.js +55 -0
  241. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  242. package/dist/src/capabilities/upgrade/index.js +5 -0
  243. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  244. package/dist/src/capabilities/upgrade/runUpgrade.js +135 -0
  245. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  246. package/dist/src/capabilities/upgrade/types.js +5 -0
  247. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  248. package/dist/src/capabilities/upgrade/upgrade.render.js +52 -0
  249. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  250. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  251. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  252. package/dist/src/capabilities/version/index.js +10 -0
  253. package/dist/src/capabilities/version/index.js.map +1 -0
  254. package/dist/src/capabilities/version/version.verb.js +36 -0
  255. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  256. package/dist/src/constants.js +87 -0
  257. package/dist/src/constants.js.map +1 -0
  258. package/dist/src/index.js +12 -0
  259. package/dist/src/index.js.map +1 -0
  260. package/dist/src/kernel/completion/complete.js +66 -0
  261. package/dist/src/kernel/completion/complete.js.map +1 -0
  262. package/dist/src/kernel/completion/emitScripts.js +92 -0
  263. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  264. package/dist/src/kernel/completion/entitySource.js +285 -0
  265. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  266. package/dist/src/kernel/completion/index.js +14 -0
  267. package/dist/src/kernel/completion/index.js.map +1 -0
  268. package/dist/src/kernel/completion/model.js +301 -0
  269. package/dist/src/kernel/completion/model.js.map +1 -0
  270. package/dist/src/kernel/completion/parse.js +253 -0
  271. package/dist/src/kernel/completion/parse.js.map +1 -0
  272. package/dist/src/kernel/completion/rank.js +101 -0
  273. package/dist/src/kernel/completion/rank.js.map +1 -0
  274. package/dist/src/kernel/completion/resolve.js +100 -0
  275. package/dist/src/kernel/completion/resolve.js.map +1 -0
  276. package/dist/src/kernel/completion/templates/bash.js +209 -0
  277. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  278. package/dist/src/kernel/completion/templates/fish.js +214 -0
  279. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  280. package/dist/src/kernel/completion/templates/index.js +23 -0
  281. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  282. package/dist/src/kernel/completion/templates/shared.js +98 -0
  283. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  284. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  285. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  286. package/dist/src/kernel/completion/types.js +13 -0
  287. package/dist/src/kernel/completion/types.js.map +1 -0
  288. package/dist/src/kernel/config/defaults.js +17 -0
  289. package/dist/src/kernel/config/defaults.js.map +1 -0
  290. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  291. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  292. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  293. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  294. package/dist/src/kernel/config/firstRun.js +34 -0
  295. package/dist/src/kernel/config/firstRun.js.map +1 -0
  296. package/dist/src/kernel/config/globalConfig.js +79 -0
  297. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  298. package/dist/src/kernel/config/index.js +16 -0
  299. package/dist/src/kernel/config/index.js.map +1 -0
  300. package/dist/src/kernel/config/paths.js +35 -0
  301. package/dist/src/kernel/config/paths.js.map +1 -0
  302. package/dist/src/kernel/config/readConfig.js +78 -0
  303. package/dist/src/kernel/config/readConfig.js.map +1 -0
  304. package/dist/src/kernel/config/schema.js +130 -0
  305. package/dist/src/kernel/config/schema.js.map +1 -0
  306. package/dist/src/kernel/config/types.js +19 -0
  307. package/dist/src/kernel/config/types.js.map +1 -0
  308. package/dist/src/kernel/config/writeConfigField.js +59 -0
  309. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  310. package/dist/src/kernel/copy.js +43 -0
  311. package/dist/src/kernel/copy.js.map +1 -0
  312. package/dist/src/kernel/error/PragmaError.js +149 -0
  313. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  314. package/dist/src/kernel/error/constants.js +40 -0
  315. package/dist/src/kernel/error/constants.js.map +1 -0
  316. package/dist/src/kernel/error/fromTaskError.js +96 -0
  317. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  318. package/dist/src/kernel/error/index.js +13 -0
  319. package/dist/src/kernel/error/index.js.map +1 -0
  320. package/dist/src/kernel/error/recovery.js +52 -0
  321. package/dist/src/kernel/error/recovery.js.map +1 -0
  322. package/dist/src/kernel/error/renderError.js +115 -0
  323. package/dist/src/kernel/error/renderError.js.map +1 -0
  324. package/dist/src/kernel/error/serialize.js +25 -0
  325. package/dist/src/kernel/error/serialize.js.map +1 -0
  326. package/dist/src/kernel/error/types.js +9 -0
  327. package/dist/src/kernel/error/types.js.map +1 -0
  328. package/dist/src/kernel/index.js +34 -0
  329. package/dist/src/kernel/index.js.map +1 -0
  330. package/dist/src/kernel/interactivity.js +68 -0
  331. package/dist/src/kernel/interactivity.js.map +1 -0
  332. package/dist/src/kernel/packs/collect.js +187 -0
  333. package/dist/src/kernel/packs/collect.js.map +1 -0
  334. package/dist/src/kernel/packs/compile.js +304 -0
  335. package/dist/src/kernel/packs/compile.js.map +1 -0
  336. package/dist/src/kernel/packs/disclosure.js +76 -0
  337. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  338. package/dist/src/kernel/packs/glob.js +38 -0
  339. package/dist/src/kernel/packs/glob.js.map +1 -0
  340. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  341. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  342. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  343. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  344. package/dist/src/kernel/packs/graphql/index.js +20 -0
  345. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  346. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  347. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  348. package/dist/src/kernel/packs/index.js +34 -0
  349. package/dist/src/kernel/packs/index.js.map +1 -0
  350. package/dist/src/kernel/packs/iri.js +110 -0
  351. package/dist/src/kernel/packs/iri.js.map +1 -0
  352. package/dist/src/kernel/packs/renderPack.js +129 -0
  353. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  354. package/dist/src/kernel/packs/resolveEntity.js +274 -0
  355. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  356. package/dist/src/kernel/packs/runBodies.js +140 -0
  357. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  358. package/dist/src/kernel/packs/sample.js +56 -0
  359. package/dist/src/kernel/packs/sample.js.map +1 -0
  360. package/dist/src/kernel/packs/schema.js +421 -0
  361. package/dist/src/kernel/packs/schema.js.map +1 -0
  362. package/dist/src/kernel/packs/sparql/applyFilters.js +167 -0
  363. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  364. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  365. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  366. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +480 -0
  367. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  368. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  369. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  370. package/dist/src/kernel/packs/sparql/index.js +31 -0
  371. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  372. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  373. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  374. package/dist/src/kernel/packs/types.js +30 -0
  375. package/dist/src/kernel/packs/types.js.map +1 -0
  376. package/dist/src/kernel/packs/uniqueness.js +30 -0
  377. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  378. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  379. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  380. package/dist/src/kernel/project/cli/constants.js +27 -0
  381. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  382. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  383. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  384. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  385. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  386. package/dist/src/kernel/project/cli/globalFlags.js +219 -0
  387. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  388. package/dist/src/kernel/project/cli/helpFormat.js +58 -0
  389. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  390. package/dist/src/kernel/project/cli/index.js +14 -0
  391. package/dist/src/kernel/project/cli/index.js.map +1 -0
  392. package/dist/src/kernel/project/cli/rootHelp.js +227 -0
  393. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  394. package/dist/src/kernel/project/cli/suggest.js +75 -0
  395. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  396. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  397. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  398. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  399. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  401. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  403. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/index.js +8 -0
  405. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  407. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  408. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  409. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  410. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  411. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  412. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  413. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  414. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  415. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  416. package/dist/src/kernel/project/mcp/registerVerb.js +315 -0
  417. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  418. package/dist/src/kernel/project/mcp/serve.js +35 -0
  419. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  420. package/dist/src/kernel/render/compactUri.js +24 -0
  421. package/dist/src/kernel/render/compactUri.js.map +1 -0
  422. package/dist/src/kernel/render/contracts.js +10 -0
  423. package/dist/src/kernel/render/contracts.js.map +1 -0
  424. package/dist/src/kernel/render/disclosure.js +34 -0
  425. package/dist/src/kernel/render/disclosure.js.map +1 -0
  426. package/dist/src/kernel/render/envelope.js +30 -0
  427. package/dist/src/kernel/render/envelope.js.map +1 -0
  428. package/dist/src/kernel/render/formatters.js +27 -0
  429. package/dist/src/kernel/render/formatters.js.map +1 -0
  430. package/dist/src/kernel/render/index.js +15 -0
  431. package/dist/src/kernel/render/index.js.map +1 -0
  432. package/dist/src/kernel/render/prefixes.js +46 -0
  433. package/dist/src/kernel/render/prefixes.js.map +1 -0
  434. package/dist/src/kernel/render/renderers.js +468 -0
  435. package/dist/src/kernel/render/renderers.js.map +1 -0
  436. package/dist/src/kernel/render/style.js +105 -0
  437. package/dist/src/kernel/render/style.js.map +1 -0
  438. package/dist/src/kernel/render/turtle.js +194 -0
  439. package/dist/src/kernel/render/turtle.js.map +1 -0
  440. package/dist/src/kernel/render/vocabulary.js +174 -0
  441. package/dist/src/kernel/render/vocabulary.js.map +1 -0
  442. package/dist/src/kernel/render/writeStdout.js +43 -0
  443. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  444. package/dist/src/kernel/runtime/boot.js +49 -0
  445. package/dist/src/kernel/runtime/boot.js.map +1 -0
  446. package/dist/src/kernel/runtime/facade.js +39 -0
  447. package/dist/src/kernel/runtime/facade.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  449. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  451. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  453. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  455. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  457. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  459. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  460. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  461. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  462. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  463. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  464. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  465. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  466. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  467. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  468. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  469. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  470. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  471. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  472. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  473. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  474. package/dist/src/kernel/runtime/index.js +8 -0
  475. package/dist/src/kernel/runtime/index.js.map +1 -0
  476. package/dist/src/kernel/runtime/loadSession.js +34 -0
  477. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  478. package/dist/src/kernel/runtime/paths.js +78 -0
  479. package/dist/src/kernel/runtime/paths.js.map +1 -0
  480. package/dist/src/kernel/runtime/probe.js +37 -0
  481. package/dist/src/kernel/runtime/probe.js.map +1 -0
  482. package/dist/src/kernel/runtime/readEntity.js +363 -0
  483. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  484. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  485. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  486. package/dist/src/kernel/runtime/refs/index.js +29 -0
  487. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  488. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  489. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  490. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  491. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  492. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  493. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  494. package/dist/src/kernel/runtime/store.js +75 -0
  495. package/dist/src/kernel/runtime/store.js.map +1 -0
  496. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  497. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  498. package/dist/src/kernel/runtime/types.js +11 -0
  499. package/dist/src/kernel/runtime/types.js.map +1 -0
  500. package/dist/src/kernel/spec/asVerb.js +21 -0
  501. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  502. package/dist/src/kernel/spec/emitReference.js +578 -0
  503. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  504. package/dist/src/kernel/spec/emitSurface.js +202 -0
  505. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  506. package/dist/src/kernel/spec/index.js +11 -0
  507. package/dist/src/kernel/spec/index.js.map +1 -0
  508. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  509. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  510. package/dist/src/kernel/spec/types.js +14 -0
  511. package/dist/src/kernel/spec/types.js.map +1 -0
  512. package/dist/src/kernel/spec/validate.js +110 -0
  513. package/dist/src/kernel/spec/validate.js.map +1 -0
  514. package/dist/src/kernel/vocabulary.js +97 -0
  515. package/dist/src/kernel/vocabulary.js.map +1 -0
  516. package/dist/src/types.js +11 -0
  517. package/dist/src/types.js.map +1 -0
  518. package/package.json +22 -23
  519. package/pragma.conf.ts +486 -90
  520. package/src/bin.ts +274 -82
  521. package/src/capabilities/block.parity.test.ts +29 -12
  522. package/src/capabilities/block.shipped.exec.test.ts +282 -0
  523. package/src/capabilities/block.tierRank.exec.test.ts +300 -0
  524. package/src/capabilities/capabilities/capabilities.render.ts +1 -1
  525. package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
  526. package/src/capabilities/capabilities/catalog.ts +3 -3
  527. package/src/capabilities/capabilities/hints.ts +32 -7
  528. package/src/capabilities/capabilities/index.ts +1 -1
  529. package/src/capabilities/colophon/collectColophon.ts +35 -24
  530. package/src/capabilities/colophon/colophon.render.ts +24 -1
  531. package/src/capabilities/colophon/colophon.test.ts +42 -21
  532. package/src/capabilities/colophon/colophon.verb.ts +4 -4
  533. package/src/capabilities/config/collectConfigShow.test.ts +1 -0
  534. package/src/capabilities/config/collectConfigShow.ts +3 -3
  535. package/src/capabilities/config/field.render.ts +4 -5
  536. package/src/capabilities/config/fields.ts +17 -10
  537. package/src/capabilities/config/get.verb.ts +70 -0
  538. package/src/capabilities/config/getUnset.test.ts +264 -0
  539. package/src/capabilities/config/index.ts +5 -1
  540. package/src/capabilities/config/runField.ts +40 -22
  541. package/src/capabilities/config/runGet.ts +34 -0
  542. package/src/capabilities/config/runSet.ts +35 -9
  543. package/src/capabilities/config/set.test.ts +48 -14
  544. package/src/capabilities/config/set.verb.ts +8 -7
  545. package/src/capabilities/config/show.render.ts +1 -1
  546. package/src/capabilities/config/show.verb.ts +9 -6
  547. package/src/capabilities/config/types.ts +18 -4
  548. package/src/capabilities/config/unset.verb.ts +58 -0
  549. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  550. package/src/capabilities/create/byteEquality.test.ts +25 -11
  551. package/src/capabilities/create/cliProjection.ts +227 -0
  552. package/src/capabilities/create/constants.ts +36 -61
  553. package/src/capabilities/create/create.mcp.test.ts +89 -5
  554. package/src/capabilities/create/create.render.ts +71 -7
  555. package/src/capabilities/create/create.test.ts +433 -219
  556. package/src/capabilities/create/create.verb.ts +297 -328
  557. package/src/capabilities/create/createGrammar.test.ts +865 -0
  558. package/src/capabilities/create/createHelp.ts +71 -0
  559. package/src/capabilities/create/createSurface.generated.ts +400 -0
  560. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  561. package/src/capabilities/create/cwdJail.test.ts +24 -5
  562. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  563. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  564. package/src/capabilities/create/index.ts +7 -4
  565. package/src/capabilities/create/messages.ts +18 -0
  566. package/src/capabilities/create/mount.ts +391 -0
  567. package/src/capabilities/create/pathJail.test.ts +90 -0
  568. package/src/capabilities/create/pathJail.ts +8 -5
  569. package/src/capabilities/create/pickGenerator.ts +23 -35
  570. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  571. package/src/capabilities/create/types.ts +20 -0
  572. package/src/capabilities/distribution.parity.test.ts +4 -0
  573. package/src/capabilities/distribution.test.ts +3 -1
  574. package/src/capabilities/distribution.ts +10 -15
  575. package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
  576. package/src/capabilities/doctor/checks/checkPackageRefs.ts +75 -8
  577. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
  578. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +76 -29
  579. package/src/capabilities/doctor/checks/checkShellCompletions.ts +63 -17
  580. package/src/capabilities/doctor/checks/harnessInventory.test.ts +219 -0
  581. package/src/capabilities/doctor/checks/harnessInventory.ts +298 -0
  582. package/src/capabilities/doctor/checks/index.ts +27 -0
  583. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  584. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  585. package/src/capabilities/doctor/checks/targetHealth.ts +444 -0
  586. package/src/capabilities/doctor/doctor.render.test.ts +125 -38
  587. package/src/capabilities/doctor/doctor.render.ts +74 -74
  588. package/src/capabilities/doctor/doctor.test.ts +338 -37
  589. package/src/capabilities/doctor/doctor.verb.ts +8 -3
  590. package/src/capabilities/doctor/runChecks.ts +65 -63
  591. package/src/capabilities/doctor/types.ts +22 -15
  592. package/src/capabilities/emptyRecovery.test.ts +21 -8
  593. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  594. package/src/capabilities/graph/index.ts +1 -1
  595. package/src/capabilities/graph/inspect.render.ts +70 -22
  596. package/src/capabilities/graph/inspect.test.ts +260 -5
  597. package/src/capabilities/graph/inspect.verb.ts +18 -6
  598. package/src/capabilities/graph/query.render.ts +15 -3
  599. package/src/capabilities/graph/query.verb.ts +3 -3
  600. package/src/capabilities/graph/runQuery.ts +2 -3
  601. package/src/capabilities/index.ts +3 -1
  602. package/src/capabilities/info/collectInfo.ts +13 -5
  603. package/src/capabilities/info/info.render.ts +7 -3
  604. package/src/capabilities/info/info.test.ts +37 -1
  605. package/src/capabilities/info/info.verb.ts +1 -1
  606. package/src/capabilities/info/types.ts +10 -2
  607. package/src/capabilities/lazy.test.ts +32 -0
  608. package/src/capabilities/meta/complete.verb.ts +1 -1
  609. package/src/capabilities/meta/index.ts +1 -1
  610. package/src/capabilities/meta/mcp.verb.ts +10 -8
  611. package/src/capabilities/ontology/index.ts +15 -11
  612. package/src/capabilities/ontology/ontology.test.ts +6 -55
  613. package/src/capabilities/ontology/queries.ts +2 -2
  614. package/src/capabilities/ontology/render.ts +3 -4
  615. package/src/capabilities/ontology/verbs.ts +27 -68
  616. package/src/capabilities/prompt/index.ts +2 -2
  617. package/src/capabilities/prompt/prompt.render.ts +6 -2
  618. package/src/capabilities/prompt/types.ts +1 -1
  619. package/src/capabilities/prompt/verbs.ts +4 -5
  620. package/src/capabilities/reference.test.ts +63 -0
  621. package/src/capabilities/renderVocabularySync.test.ts +82 -0
  622. package/src/capabilities/resources/provider.ts +342 -85
  623. package/src/capabilities/resources/resources.test.ts +355 -59
  624. package/src/capabilities/scopeTypeSync.test.ts +29 -15
  625. package/src/capabilities/setup/buildPlan.ts +240 -0
  626. package/src/capabilities/setup/index.ts +7 -7
  627. package/src/capabilities/setup/mode.ts +74 -0
  628. package/src/capabilities/setup/operations/index.ts +79 -0
  629. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  630. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  631. package/src/capabilities/setup/operations/setupGenerator.ts +478 -334
  632. package/src/capabilities/setup/operations/setupLsp.ts +420 -67
  633. package/src/capabilities/setup/operations/setupMcp.ts +238 -127
  634. package/src/capabilities/setup/operations/setupSkills.ts +667 -105
  635. package/src/capabilities/setup/plan.render.ts +336 -0
  636. package/src/capabilities/setup/plan.ts +241 -0
  637. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  638. package/src/capabilities/setup/setup.render.test.ts +297 -75
  639. package/src/capabilities/setup/setup.render.ts +45 -77
  640. package/src/capabilities/setup/setup.test.ts +1819 -225
  641. package/src/capabilities/setup/setup.verb.ts +288 -78
  642. package/src/capabilities/setup/shell.test.ts +86 -0
  643. package/src/capabilities/setup/shell.ts +137 -11
  644. package/src/capabilities/setup/targets.ts +435 -0
  645. package/src/capabilities/setup/types.ts +23 -70
  646. package/src/capabilities/shared/assertExecOk.ts +68 -10
  647. package/src/capabilities/shared/index.ts +43 -0
  648. package/src/capabilities/shared/packageManager.test.ts +470 -0
  649. package/src/capabilities/shared/packageManager.ts +425 -34
  650. package/src/capabilities/skill/bundledSkills.test.ts +347 -0
  651. package/src/capabilities/skill/discover.ts +131 -10
  652. package/src/capabilities/skill/index.ts +1 -1
  653. package/src/capabilities/skill/render.ts +10 -9
  654. package/src/capabilities/skill/skill.test.ts +22 -7
  655. package/src/capabilities/skill/verbs.ts +3 -4
  656. package/src/capabilities/sources/collectStatus.ts +7 -2
  657. package/src/capabilities/sources/index.ts +1 -1
  658. package/src/capabilities/sources/installSkills.ts +265 -10
  659. package/src/capabilities/sources/runUpdate.ts +131 -23
  660. package/src/capabilities/sources/sources.test.ts +382 -2
  661. package/src/capabilities/sources/status.render.ts +1 -1
  662. package/src/capabilities/sources/status.verb.ts +1 -1
  663. package/src/capabilities/sources/update.render.ts +1 -1
  664. package/src/capabilities/sources/update.verb.ts +4 -4
  665. package/src/capabilities/surface.test.ts +136 -19
  666. package/src/capabilities/upgrade/runUpgrade.ts +53 -14
  667. package/src/capabilities/upgrade/types.ts +10 -2
  668. package/src/capabilities/upgrade/upgrade.render.ts +13 -7
  669. package/src/capabilities/upgrade/upgrade.test.ts +75 -3
  670. package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
  671. package/src/capabilities/version/index.ts +12 -0
  672. package/src/capabilities/version/version.test.ts +66 -0
  673. package/src/capabilities/version/version.verb.ts +39 -0
  674. package/src/constants.ts +36 -1
  675. package/src/identity.test.ts +57 -29
  676. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
  677. package/src/kernel/completion/complete.test.ts +12 -2
  678. package/src/kernel/completion/complete.ts +1 -1
  679. package/src/kernel/completion/emitScripts.ts +1 -1
  680. package/src/kernel/completion/entitySource.test.ts +16 -3
  681. package/src/kernel/completion/entitySource.ts +21 -8
  682. package/src/kernel/completion/model.test.ts +164 -12
  683. package/src/kernel/completion/model.ts +94 -14
  684. package/src/kernel/completion/parse.test.ts +4 -7
  685. package/src/kernel/completion/parse.ts +15 -0
  686. package/src/kernel/completion/resolve.test.ts +0 -1
  687. package/src/kernel/completion/safety.test.ts +50 -35
  688. package/src/kernel/completion/shellDrive.test.ts +28 -9
  689. package/src/kernel/completion/templates/bash.ts +7 -2
  690. package/src/kernel/completion/templates/index.ts +23 -0
  691. package/src/kernel/completion/types.ts +7 -0
  692. package/src/kernel/config/defaults.test.ts +27 -3
  693. package/src/kernel/config/defaults.ts +4 -3
  694. package/src/kernel/config/evaluateProjectConfig.ts +31 -8
  695. package/src/kernel/config/firstRun.test.ts +44 -38
  696. package/src/kernel/config/firstRun.ts +24 -88
  697. package/src/kernel/config/index.ts +1 -1
  698. package/src/kernel/config/readConfig.test.ts +6 -3
  699. package/src/kernel/config/readConfig.ts +1 -1
  700. package/src/kernel/config/schema.ts +3 -1
  701. package/src/kernel/config/types.ts +3 -1
  702. package/src/kernel/copy.test.ts +34 -4
  703. package/src/kernel/copy.ts +54 -0
  704. package/src/kernel/error/PragmaError.test.ts +5 -2
  705. package/src/kernel/error/PragmaError.ts +4 -2
  706. package/src/kernel/error/constants.ts +7 -5
  707. package/src/kernel/error/fromTaskError.ts +28 -6
  708. package/src/kernel/error/recovery.ts +14 -0
  709. package/src/kernel/error/renderError.ts +42 -1
  710. package/src/kernel/error/types.ts +21 -1
  711. package/src/kernel/index.ts +35 -0
  712. package/src/kernel/interactivity.test.ts +76 -0
  713. package/src/kernel/interactivity.ts +69 -0
  714. package/src/kernel/packs/collect.ts +12 -16
  715. package/src/kernel/packs/compile.test.ts +222 -1
  716. package/src/kernel/packs/compile.ts +93 -3
  717. package/src/kernel/packs/disclosure.ts +2 -2
  718. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  719. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
  720. package/src/kernel/packs/graphql/index.ts +20 -0
  721. package/src/kernel/packs/index.ts +40 -0
  722. package/src/kernel/packs/iri.test.ts +73 -0
  723. package/src/kernel/packs/iri.ts +66 -14
  724. package/src/kernel/packs/renderPack.ts +25 -6
  725. package/src/kernel/packs/resolveEntity.test.ts +274 -0
  726. package/src/kernel/packs/resolveEntity.ts +200 -42
  727. package/src/kernel/packs/runBodies.ts +86 -22
  728. package/src/kernel/packs/sample.ts +1 -1
  729. package/src/kernel/packs/schema.ts +78 -5
  730. package/src/kernel/packs/sparql/applyFilters.ts +136 -16
  731. package/src/kernel/packs/sparql/buildLookupQuery.test.ts +290 -0
  732. package/src/kernel/packs/sparql/buildLookupQuery.ts +367 -17
  733. package/src/kernel/packs/sparql/index.ts +37 -0
  734. package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
  735. package/src/kernel/packs/sparql/runSelect.ts +3 -4
  736. package/src/kernel/packs/toolDescription.test.ts +77 -4
  737. package/src/kernel/packs/types.ts +136 -0
  738. package/src/kernel/packs/uniqueness.ts +1 -1
  739. package/src/kernel/project/cli/buildProgram.test.ts +218 -12
  740. package/src/kernel/project/cli/buildProgram.ts +84 -18
  741. package/src/kernel/project/cli/constants.ts +34 -0
  742. package/src/kernel/project/cli/dispatch.test.ts +160 -2
  743. package/src/kernel/project/cli/dispatch.ts +226 -45
  744. package/src/kernel/project/cli/exitCodes.ts +1 -1
  745. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  746. package/src/kernel/project/cli/globalFlags.ts +134 -31
  747. package/src/kernel/project/cli/helpFormat.ts +14 -2
  748. package/src/kernel/project/cli/rootHelp.ts +74 -12
  749. package/src/kernel/project/cli/suggest.test.ts +33 -1
  750. package/src/kernel/project/cli/suggest.ts +25 -1
  751. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  752. package/src/kernel/project/cli/verbHelp.ts +23 -7
  753. package/src/kernel/project/mcp/buildServer.ts +7 -4
  754. package/src/kernel/project/mcp/envelope.ts +2 -2
  755. package/src/kernel/project/mcp/instructions.ts +2 -2
  756. package/src/kernel/project/mcp/mcpError.ts +1 -1
  757. package/src/kernel/project/mcp/parity.test.ts +5 -2
  758. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  759. package/src/kernel/project/mcp/prompts/source.ts +2 -2
  760. package/src/kernel/project/mcp/registerVerb.ts +55 -10
  761. package/src/kernel/project/mcp/serve.ts +2 -2
  762. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  763. package/src/kernel/render/contracts.ts +21 -0
  764. package/src/kernel/render/envelope.ts +2 -3
  765. package/src/kernel/render/formatters.ts +1 -1
  766. package/src/kernel/render/renderers.test.ts +243 -6
  767. package/src/kernel/render/renderers.ts +222 -20
  768. package/src/kernel/render/style.test.ts +75 -24
  769. package/src/kernel/render/style.ts +59 -6
  770. package/src/kernel/render/turtle.ts +222 -0
  771. package/src/kernel/render/vocabulary.ts +276 -0
  772. package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
  773. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
  775. package/src/kernel/runtime/graphpack/embedded.ts +3 -3
  776. package/src/kernel/runtime/graphpack/manifest.ts +1 -1
  777. package/src/kernel/runtime/graphpack/read.ts +1 -2
  778. package/src/kernel/runtime/loadSession.ts +1 -1
  779. package/src/kernel/runtime/probe.ts +6 -6
  780. package/src/kernel/runtime/readEntity.ts +472 -28
  781. package/src/kernel/runtime/refs/index.ts +39 -0
  782. package/src/kernel/runtime/refs/parseRef.ts +2 -2
  783. package/src/kernel/runtime/refs/resolve.ts +4 -4
  784. package/src/kernel/runtime/storeReadiness.ts +1 -2
  785. package/src/kernel/runtime/types.ts +15 -1
  786. package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
  787. package/src/kernel/spec/emitReference.ts +105 -30
  788. package/src/kernel/spec/emitSurface.ts +48 -6
  789. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  790. package/src/kernel/spec/types.ts +277 -4
  791. package/src/testing/PARITY_GAPS.ts +9 -3
  792. package/src/testing/behavioral/docExamples.test.ts +16 -0
  793. package/src/testing/behavioral/errorMatrix.mcp.test.ts +112 -9
  794. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  795. package/src/testing/behavioral/journeys.cli.test.ts +1 -1
  796. package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
  797. package/src/testing/behavioral/journeys.firstInstall.test.ts +7 -2
  798. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  799. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  800. package/src/testing/behavioral/journeys.packageStories.test.ts +10 -7
  801. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  802. package/src/testing/behavioral/mcpSurface.test.ts +1 -1
  803. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  804. package/src/testing/eval/__snapshots__/eval.test.ts.snap +26 -1
  805. package/src/testing/eval/cases/effectful.ts +3 -2
  806. package/src/testing/eval/cases/readNouns.ts +245 -9
  807. package/src/testing/fixtures/blockGraph.ts +104 -10
  808. package/src/testing/fixtures/graph/canonical.ts +182 -13
  809. package/src/testing/fixtures/graph/defaultPack.ts +1 -1
  810. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  811. package/src/testing/helpers/projectMcp.ts +32 -6
  812. package/src/testing/helpers/runCli.ts +35 -18
  813. package/src/testing/perf/budgets.test.ts +20 -9
  814. package/src/testing/perf/budgets.ts +58 -9
  815. package/src/testing/perf/codegen.test.ts +126 -0
  816. package/src/testing/perf/globalSetup.test.ts +286 -0
  817. package/src/testing/perf/globalSetup.ts +505 -23
  818. package/src/testing/perf/measure.test.ts +38 -0
  819. package/src/testing/perf/measure.ts +23 -4
  820. package/src/testing/setupXdgIsolation.ts +81 -21
  821. package/src/testing/tempRoot.globalSetup.ts +122 -0
  822. package/dist/pragma +0 -0
  823. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
  824. package/src/capabilities/create/templates.embedded.generated.ts +0 -28
  825. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
  826. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  827. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
  828. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
  829. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  830. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  831. package/src/capabilities/shared/bands.ts +0 -16
  832. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
@@ -0,0 +1,282 @@
1
+ /**
2
+ * The `block` story's declared vocabulary, EXECUTED against the shipped pack
3
+ * (PROTECTED).
4
+ *
5
+ * `block.parity.test.ts` asserts the story's semantics over a FIXTURE graph the
6
+ * repository writes. That is a real check, but it can only ever prove the story
7
+ * agrees with the fixture — and when the two drifted apart, that is exactly
8
+ * what happened: the story read `ds:whenToUse`/`ds:whenNotToUse`, the fixture
9
+ * obligingly declared them, the suite stayed green, and every real install
10
+ * rendered `block lookup` with no usage narrative at all, because the ontology
11
+ * had long since retired both terms in favour of a single `ds:usage`. Nothing
12
+ * in the pipeline treats that as an error: the GraphQL projection omits a name
13
+ * it cannot express the way OPTIONAL omits an unbound variable, and the
14
+ * renderer skips a section with no value. Silence all the way down.
15
+ *
16
+ * So this file boots the SHIPPED graph and asserts what a fixture structurally
17
+ * cannot. It distinguishes two failures that look identical in the output but
18
+ * are not the same defect:
19
+ *
20
+ * - a declared property the ontology does not define is a STORY bug — the CLI
21
+ * is asking for a name the schema can never answer, and no upstream content
22
+ * edit can ever make it render. That is this defect, and it is forbidden here.
23
+ * - a declared property the ontology defines but no instance asserts yet is a
24
+ * CONTENT gap upstream (`ds:figmaLink` is one today). The story is correct and
25
+ * degrades gracefully; that is not this suite's business.
26
+ *
27
+ * The `graph/examples.exec.test.ts` precedent: an example is a promise to a
28
+ * stranger, and only running it against what actually ships reads it as one. A
29
+ * declared property is the same kind of promise.
30
+ */
31
+
32
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
33
+ import {
34
+ isNestedExpand,
35
+ type PackExpandSelect,
36
+ } from "../kernel/packs/types.js";
37
+ import { verbKey } from "../kernel/packs/uniqueness.js";
38
+ import { bootRuntime } from "../kernel/runtime/boot.js";
39
+ import type { PragmaRuntime } from "../kernel/runtime/types.js";
40
+ import type { VerbSpec } from "../kernel/spec/types.js";
41
+ import { TEST_FLAGS } from "../testing/helpers/projectCli.js";
42
+ import { declaredStories, storyModules } from "./distribution.js";
43
+
44
+ const story = declaredStories.get("block");
45
+ if (!story?.lookup) {
46
+ throw new Error('pragma.conf.ts declares no "block" lookup');
47
+ }
48
+ const blockLookup = story.lookup;
49
+
50
+ const blockModule = storyModules.get("block");
51
+ if (!blockModule) {
52
+ throw new Error('pragma.conf.ts declares no story for "block"');
53
+ }
54
+
55
+ const lookupVerb = blockModule.verbs.find(
56
+ (v) => verbKey(v.path) === "block lookup",
57
+ ) as VerbSpec;
58
+
59
+ /**
60
+ * The block classes the lookup addresses, read from the story rather than
61
+ * retyped — a class added there widens these checks with it.
62
+ */
63
+ const TYPE_VALUES = (blockLookup.types ?? []).join(" ");
64
+
65
+ /** One graph term the story names, paired with the site that declares it. */
66
+ interface DeclaredTerm {
67
+ readonly what: string;
68
+ readonly property: string;
69
+ }
70
+
71
+ /**
72
+ * Every term an `expand.select` names, to whatever depth it nests.
73
+ *
74
+ * WALKED, not listed. A hand-maintained enumeration would carry this file's own
75
+ * defect one level down: `ds:hasModifier`, `ds:propertyType` and `ds:optional`
76
+ * could be retired exactly the way `ds:whenToUse` was, and `block lookup` would
77
+ * quietly lose its modifier values and its property table while a list nobody
78
+ * thought to update stayed green. Recursing over the declaration instead means
79
+ * a term added to any `select` is covered the moment it is declared, by the
80
+ * author who declares it and without their help.
81
+ */
82
+ function selectedTerms(
83
+ site: string,
84
+ select: readonly PackExpandSelect[],
85
+ ): readonly DeclaredTerm[] {
86
+ return select.flatMap((entry) =>
87
+ isNestedExpand(entry)
88
+ ? [
89
+ {
90
+ what: `${site} → nested expand "${entry.name}"`,
91
+ property: entry.relation,
92
+ },
93
+ ...selectedTerms(`${site} → "${entry.name}"`, entry.select),
94
+ ]
95
+ : [
96
+ {
97
+ what: `${site} → field "${entry.name}"`,
98
+ property: entry.property,
99
+ },
100
+ ],
101
+ );
102
+ }
103
+
104
+ /**
105
+ * Every property the story names in the graph, read from the declaration.
106
+ *
107
+ * The identity property, fields, sections, expand relations and everything
108
+ * selected beneath them all name graph vocabulary and all fail the same silent
109
+ * way, so all of them are held to the same standard. `by` is included because a
110
+ * lookup whose identity property the ontology has retired resolves NOTHING —
111
+ * the loudest form of the same defect, and the one no rendering test would
112
+ * reach, since there would be no entity to render.
113
+ *
114
+ * One case per declaration SITE rather than per distinct term: `ds:name` is
115
+ * named at six of them, and a failure that names the site it was declared at
116
+ * is the one a reader can act on.
117
+ */
118
+ const DECLARED_PROPERTIES: readonly DeclaredTerm[] = [
119
+ { what: "lookup `by`", property: blockLookup.by },
120
+ ...(blockLookup.fields ?? []).map((f) => ({
121
+ what: `field "${f.name}"`,
122
+ property: f.property,
123
+ })),
124
+ ...(blockLookup.sections ?? []).map((s) => ({
125
+ what: `section "${s.name}"`,
126
+ property: s.property,
127
+ })),
128
+ ...(blockLookup.expand ?? []).flatMap((e) => [
129
+ { what: `expand "${e.name}"`, property: e.relation },
130
+ ...selectedTerms(`expand "${e.name}"`, e.select),
131
+ ]),
132
+ ];
133
+
134
+ /** The IRI of the block whose usage narrative is asserted on below. */
135
+ const BUTTON = "https://ds.canonical.com/global.component.button";
136
+
137
+ // ONE store for the file — booting the shipped pack is the expensive part, and
138
+ // this package already contends under parallel runs.
139
+ let rt: PragmaRuntime;
140
+ beforeAll(async () => {
141
+ rt = bootRuntime(TEST_FLAGS);
142
+ // Load the shipped store HERE, once. `it.each` splits the vocabulary check
143
+ // into one small case per declared property, and whichever ran first would
144
+ // otherwise pay the whole lazy-load cost and time out under contention.
145
+ await rt.store.get();
146
+ }, 60_000);
147
+ afterAll(async () => {
148
+ (await rt.store.get()).store.dispose();
149
+ });
150
+
151
+ /** One scalar from the shipped graph, queried directly. */
152
+ async function scalar(query: string): Promise<string | undefined> {
153
+ const result = await rt.query.sparql(query);
154
+ if (result.type !== "select") return undefined;
155
+ const row = result.bindings[0];
156
+ return row === undefined ? undefined : Object.values(row)[0];
157
+ }
158
+
159
+ /** The `llm` rendering of `block lookup <value>`. */
160
+ async function renderLookup(value: string): Promise<string> {
161
+ const out = (await lookupVerb.run({ name: [value] }, rt)) as never;
162
+ return lookupVerb.output.formatters.llm(out);
163
+ }
164
+
165
+ describe("the `block` story declares vocabulary the shipped ontology defines (PROTECTED)", () => {
166
+ it("declares at least one property to check", () => {
167
+ expect(DECLARED_PROPERTIES.length).toBeGreaterThan(0);
168
+ });
169
+
170
+ it.each(
171
+ DECLARED_PROPERTIES,
172
+ )("$what reads $property, which the shipped ontology defines", async ({
173
+ what,
174
+ property,
175
+ }) => {
176
+ const result = await rt.query.sparql(
177
+ [
178
+ "ASK {",
179
+ ` ${property} a ?kind .`,
180
+ " VALUES ?kind { owl:DatatypeProperty owl:ObjectProperty }",
181
+ "}",
182
+ ].join("\n"),
183
+ );
184
+ expect(result.type).toBe("ask");
185
+ expect(
186
+ result.type === "ask" ? result.result : false,
187
+ `${what} reads ${property}, which the shipped ontology does not define — it can never render, for any block, on any install`,
188
+ ).toBe(true);
189
+ });
190
+ });
191
+
192
+ describe("the shipped graph carries the usage narrative on every block (PROTECTED)", () => {
193
+ it("asserts ds:usage on every block, and neither retired term on any", async () => {
194
+ const blocks = await scalar(
195
+ [
196
+ "SELECT (COUNT(DISTINCT ?b) AS ?n) WHERE {",
197
+ ` VALUES ?class { ${TYPE_VALUES} }`,
198
+ " ?b a ?class .",
199
+ "}",
200
+ ].join("\n"),
201
+ );
202
+ const withUsage = await scalar(
203
+ [
204
+ "SELECT (COUNT(DISTINCT ?b) AS ?n) WHERE {",
205
+ ` VALUES ?class { ${TYPE_VALUES} }`,
206
+ " ?b a ?class ; ds:usage ?u .",
207
+ "}",
208
+ ].join("\n"),
209
+ );
210
+ expect(Number(blocks)).toBeGreaterThan(0);
211
+ expect(withUsage).toBe(blocks);
212
+
213
+ // The retirement itself, pinned: reading these again would reintroduce the
214
+ // defect, silently, exactly as before.
215
+ for (const retired of ["ds:whenToUse", "ds:whenNotToUse"]) {
216
+ const result = await rt.query.sparql(`ASK { ?s ${retired} ?o }`);
217
+ expect(
218
+ result.type === "ask" ? result.result : true,
219
+ `${retired} is asserted somewhere in the shipped graph`,
220
+ ).toBe(false);
221
+ }
222
+ });
223
+ });
224
+
225
+ describe("block lookup renders the usage narrative from the shipped graph (PROTECTED)", () => {
226
+ it("renders a Usage section carrying the graph's own literal", async () => {
227
+ const usage = await scalar(`SELECT ?u WHERE { <${BUTTON}> ds:usage ?u }`);
228
+ expect(usage?.trim().length ?? 0).toBeGreaterThan(0);
229
+
230
+ const llm = await renderLookup(BUTTON);
231
+ expect(llm).toContain("### Usage");
232
+ // The narrative itself, not just its heading: the first prose line of the
233
+ // literal is read FROM the graph rather than retyped here, so editing the
234
+ // content upstream cannot leave this asserting yesterday's copy.
235
+ const firstProseLine = (usage ?? "")
236
+ .split("\n")
237
+ .map((line) => line.trim())
238
+ .find((line) => line.length > 0 && !line.startsWith("#")) as string;
239
+ expect(llm).toContain(firstProseLine);
240
+ });
241
+
242
+ it("nests the literal's own headings UNDER the Usage heading", async () => {
243
+ // The live literals carry their own `### When to use` / `### When not to
244
+ // use` sub-sections. Left at `###` they would be siblings of the section
245
+ // heading, which reads as an empty Usage section; the renderer demotes them.
246
+ const heading = await scalar(
247
+ [
248
+ "SELECT ?h WHERE {",
249
+ ` <${BUTTON}> ds:usage ?u .`,
250
+ ' BIND(REPLACE(STR(?u), "(?s)^.*?\\\\n### ([^\\\\n]+)\\\\n.*$", "$1") AS ?h)',
251
+ "}",
252
+ ].join("\n"),
253
+ );
254
+ expect(
255
+ heading,
256
+ "the Button usage literal carries no `### ` heading",
257
+ ).toBeDefined();
258
+
259
+ const llm = await renderLookup(BUTTON);
260
+ expect(llm).toContain(`#### ${heading}`);
261
+ expect(llm).not.toContain(`\n### ${heading}\n`);
262
+ });
263
+
264
+ it("prints no Usage heading for a block whose usage literal is empty", async () => {
265
+ // Roughly half the shipped blocks assert `ds:usage ""`. An empty literal
266
+ // must render as no section at all, never as a heading with nothing below.
267
+ const uri = await scalar(
268
+ [
269
+ "SELECT ?b WHERE {",
270
+ ` VALUES ?class { ${TYPE_VALUES} }`,
271
+ " ?b a ?class ; ds:usage ?u .",
272
+ ' FILTER(STR(?u) = "")',
273
+ "}",
274
+ "ORDER BY ?b",
275
+ "LIMIT 1",
276
+ ].join("\n"),
277
+ );
278
+ expect(uri, "no shipped block carries an empty ds:usage").toBeDefined();
279
+
280
+ expect(await renderLookup(uri as string)).not.toContain("### Usage");
281
+ });
282
+ });
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Which block a SHARED name means, EXECUTED against the shipped pack
3
+ * (PROTECTED).
4
+ *
5
+ * 25 of the design system's block names are carried by two or three blocks
6
+ * apiece, across tiers. `block lookup` used to answer each of them with whichever
7
+ * IRI sorted first and say nothing about the rest, so `button` returned
8
+ * Launchpad's Button — `apps_launchpad…` sorts before `global…` — and an agent
9
+ * had no way to learn that the block everybody means also existed.
10
+ *
11
+ * Two properties, both asserted here: EVERY block the name reaches comes back,
12
+ * and they come back RANKED. Either alone leaves a caller stuck — a better
13
+ * arbitrary pick is still arbitrary, and an unordered list of two makes the
14
+ * reader do the ranking the graph already knows how to do.
15
+ *
16
+ * This suite is deliberately NOT fixture-backed, and that is the whole point of
17
+ * it. The two nearest specimens in this package show why: `journeys.livePack`
18
+ * is NAMED for ordering determinism and its fixture contains one Button, and
19
+ * the ambiguity fixture in `blockGraph.ts` pits two tiers that do not outrank
20
+ * each other, so neither graph can be wrong about the ranking in the way the
21
+ * live graph was. A fixture written alongside a ranking rule agrees with the
22
+ * rule by construction. The shipped pack does not.
23
+ *
24
+ * So every case here READS the collisions out of the store it is judging. There
25
+ * is no list of block names in this file to fall out of date — add a tier
26
+ * upstream, rename one, retire a duplicate, and these assertions follow.
27
+ */
28
+
29
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
30
+ import { verbKey } from "../kernel/packs/uniqueness.js";
31
+ import { bootRuntime } from "../kernel/runtime/boot.js";
32
+ import type { PragmaRuntime } from "../kernel/runtime/types.js";
33
+ import type { VerbSpec } from "../kernel/spec/types.js";
34
+ import { TEST_FLAGS } from "../testing/helpers/projectCli.js";
35
+ import { declaredStories, storyModules } from "./distribution.js";
36
+
37
+ const story = declaredStories.get("block");
38
+ if (!story?.lookup)
39
+ throw new Error('pragma.conf.ts declares no "block" lookup');
40
+ const blockLookup = story.lookup;
41
+
42
+ const blockModule = storyModules.get("block");
43
+ if (!blockModule) throw new Error('pragma.conf.ts declares no "block" story');
44
+
45
+ const verbFor = (verb: string): VerbSpec =>
46
+ blockModule.verbs.find(
47
+ (v) => verbKey(v.path) === `block ${verb}`,
48
+ ) as VerbSpec;
49
+ const lookupVerb = verbFor("lookup");
50
+ const listVerb = verbFor("list");
51
+
52
+ /** The block classes the story addresses, read from the story rather than retyped. */
53
+ const TYPE_VALUES = (blockLookup.types ?? []).join(" ");
54
+
55
+ /**
56
+ * The scope declaration under test, read from the config it lives in.
57
+ *
58
+ * Reading `falloff` here rather than writing `0.2` is what keeps this suite a
59
+ * check on the RULE instead of on one tuning of it: change the number in
60
+ * `pragma.conf.ts` and these cases still assert that a shallower tier outranks
61
+ * a deeper one, which is the judgement that was signed off.
62
+ */
63
+ const scope = blockLookup.scopeWeight;
64
+ if (!scope) throw new Error('the "block" lookup declares no scopeWeight');
65
+
66
+ let rt: PragmaRuntime;
67
+ beforeAll(async () => {
68
+ rt = bootRuntime(TEST_FLAGS);
69
+ await rt.store.get();
70
+ }, 60_000);
71
+ afterAll(async () => {
72
+ (await rt.store.get()).store.dispose();
73
+ });
74
+
75
+ /** Rows from the shipped store, as plain records. */
76
+ async function rows(query: string): Promise<Record<string, string>[]> {
77
+ const result = await rt.query.sparql(query);
78
+ return result.type === "select"
79
+ ? (result.bindings as Record<string, string>[])
80
+ : [];
81
+ }
82
+
83
+ /** One `block lookup <name>`: the IRI it answered with, and the ones it did not. */
84
+ async function lookup(
85
+ name: string,
86
+ ): Promise<{ chosen: string; others: string[] }> {
87
+ const out = (await lookupVerb.run({ name: [name] }, rt)) as {
88
+ results: { uri?: string }[];
89
+ };
90
+ // Every entity the name reached, best first. `chosen` is simply the head —
91
+ // the ranking orders the answer now, it does not select it.
92
+ const [chosen, ...others] = out.results.map((entity) => String(entity.uri));
93
+ return { chosen: String(chosen), others };
94
+ }
95
+
96
+ /**
97
+ * Every block name the shipped graph gives to more than one block, with each
98
+ * block's IRI, its tier's declared name and whether it is a subcomponent.
99
+ *
100
+ * Read with the SAME `LCASE` the resolve filters by, so a pair that collides
101
+ * only for a lookup (`Button` vs `button`) is in this set too.
102
+ */
103
+ async function collisions(): Promise<
104
+ Map<string, { uri: string; tier: string; part: boolean }[]>
105
+ > {
106
+ const found = await rows(
107
+ [
108
+ "SELECT ?uri ?key ?tierName ?part WHERE {",
109
+ ` VALUES ?class { ${TYPE_VALUES} }`,
110
+ " ?uri a ?class .",
111
+ ` ?uri ${blockLookup.by} ?name .`,
112
+ ` OPTIONAL { ?uri ${scope.via} ?tier . ?tier ${scope.by} ?tn . }`,
113
+ " BIND(LCASE(STR(?name)) AS ?key)",
114
+ ' BIND(COALESCE(?tn, "") AS ?tierName)',
115
+ " BIND(EXISTS { ?uri a ds:Subcomponent } AS ?part)",
116
+ "}",
117
+ ].join("\n"),
118
+ );
119
+ const byName = new Map<
120
+ string,
121
+ { uri: string; tier: string; part: boolean }[]
122
+ >();
123
+ for (const row of found) {
124
+ const key = String(row.key);
125
+ const entry = {
126
+ uri: String(row.uri),
127
+ tier: String(row.tierName ?? ""),
128
+ part: String(row.part) === "true",
129
+ };
130
+ const seen = byName.get(key);
131
+ if (seen) {
132
+ if (!seen.some((e) => e.uri === entry.uri)) seen.push(entry);
133
+ } else byName.set(key, [entry]);
134
+ }
135
+ return new Map([...byName].filter(([, entries]) => entries.length > 1));
136
+ }
137
+
138
+ /** A tier's depth: the separator count in its DECLARED name, +1. */
139
+ const depthOf = (tierName: string): number =>
140
+ tierName === "" ? 1 : tierName.split("/").length;
141
+
142
+ describe("a shared block name reaches every block that carries it (PROTECTED)", () => {
143
+ it("finds shared names in the shipped graph at all", async () => {
144
+ // The guard on every other case in this file: if the graph ever stops
145
+ // sharing names, these assertions become vacuous and must be told to go.
146
+ expect((await collisions()).size).toBeGreaterThan(1);
147
+ });
148
+
149
+ it("answers `button` with the GLOBAL Button, and names the other", async () => {
150
+ // The reported defect, exactly as reported. Two components of equal kind,
151
+ // separated by their tiers alone: Global is depth 1, Apps/Launchpad depth 2.
152
+ const out = await lookup("button");
153
+ expect(out.chosen).toBe("https://ds.canonical.com/global.component.button");
154
+ expect(out.others).toEqual([
155
+ "https://ds.canonical.com/apps_launchpad.component.button",
156
+ ]);
157
+ });
158
+
159
+ it("answers `TextInput` with the LAUNCHPAD one — a whole block beats a part", async () => {
160
+ // The case that stops the plausible wrong fix. A rule of "global wins", or
161
+ // a tier tiebreak ABOVE the type weight, would answer with the global
162
+ // SUBcomponent here. As a product it does not: 0.6 × 1 < 1 × 0.8. The
163
+ // editorial rule that a subcomponent is a PART of a block, never the block
164
+ // someone means, survives the tier ranking being added on top of it.
165
+ const out = await lookup("TextInput");
166
+ expect(out.chosen).toBe(
167
+ "https://ds.canonical.com/apps_launchpad.component.text_input",
168
+ );
169
+ expect(out.others).toEqual([
170
+ "https://ds.canonical.com/global.subcomponent.text_input",
171
+ ]);
172
+ });
173
+
174
+ it("answers a name shared by two EQUALLY deep tiers deterministically", async () => {
175
+ // `ThemeSwitcher` is Apps/Anbox against Apps/WorkplaceEngineering — same
176
+ // depth, so the ranking has nothing to say and the total order's final key
177
+ // decides. This is the residual the ranking does NOT resolve, asserted as
178
+ // such: the claim is not that the right one wins, it is that the same one
179
+ // wins every time and the other is never left unmentioned.
180
+ const runs = await Promise.all([
181
+ lookup("ThemeSwitcher"),
182
+ lookup("themeswitcher"),
183
+ lookup("ThemeSwitcher"),
184
+ ]);
185
+ for (const out of runs) {
186
+ expect(out.chosen).toBe(runs[0]?.chosen);
187
+ expect(out.others).toEqual(runs[0]?.others);
188
+ expect(out.others).toHaveLength(1);
189
+ // Equal rank, so the order's final key decides — the same key, the same
190
+ // way, as everywhere else in it.
191
+ expect([out.chosen, ...out.others].sort()).toEqual([
192
+ out.chosen,
193
+ ...out.others,
194
+ ]);
195
+ }
196
+ });
197
+
198
+ it("never leaves a block a shared name reaches unmentioned", async () => {
199
+ // Swept over the whole collision set, not a chosen few: the silent discard
200
+ // is the defect, and it was invisible precisely because it looked like a
201
+ // normal answer. Every block the name reaches is either the answer or named
202
+ // beside it — and named as an IRI, the one address that reaches it.
203
+ for (const [name, entries] of await collisions()) {
204
+ const out = await lookup(name);
205
+ expect(
206
+ [out.chosen, ...out.others].sort(),
207
+ `block lookup ${name}`,
208
+ ).toEqual(entries.map((entry) => entry.uri).sort());
209
+ }
210
+ });
211
+
212
+ it("ranks the winner's tier no worse than every loser's", async () => {
213
+ // The invariant, COMPUTED from the pack rather than listed. It holds for
214
+ // every shared name at once and cannot be satisfied by hard-coding an
215
+ // answer, so it survives a new tier, a renamed one, and a new collision.
216
+ //
217
+ // Stated over WHOLE BLOCKS only. A subcomponent is deliberately allowed to
218
+ // lose to a shallower-ranked component AND to a deeper-ranked one — that is
219
+ // the product, and `TextInput` above is the case that pins it.
220
+ for (const [name, entries] of await collisions()) {
221
+ const blocks = entries.filter((entry) => !entry.part);
222
+ if (blocks.length < 2) continue;
223
+ const { chosen } = await lookup(name);
224
+ const winner = blocks.find((entry) => entry.uri === chosen);
225
+ if (!winner) continue;
226
+ for (const loser of blocks) {
227
+ expect(
228
+ depthOf(winner.tier),
229
+ `block lookup ${name} led with ${winner.uri} (${winner.tier}) over ${loser.uri} (${loser.tier})`,
230
+ ).toBeLessThanOrEqual(depthOf(loser.tier));
231
+ }
232
+ }
233
+ });
234
+ });
235
+
236
+ describe("`block list` orders its ties totally (PROTECTED)", () => {
237
+ /** The entity IRIs of one `block list` run, in the order it printed them. */
238
+ async function listOrder(): Promise<string[]> {
239
+ const data = (await listVerb.run({}, rt)) as { uri?: string }[];
240
+ return data.map((row) => String(row.uri));
241
+ }
242
+
243
+ it("repeats the same order across runs", async () => {
244
+ // The half that looks like the whole defect and is not: across runs the
245
+ // store's scan order can change (a repack, another machine).
246
+ const [first, second] = await Promise.all([listOrder(), listOrder()]);
247
+ expect(first).toEqual(second);
248
+ expect(first.length).toBeGreaterThan(1);
249
+ });
250
+
251
+ it("orders EVERY tie the same way, within one run", async () => {
252
+ // The half that was actually broken. In ONE output `Button` came
253
+ // launchpad-first while `CheckboxInput` came global-first — not flakiness
254
+ // between runs, an inconsistency inside a single answer, because SPARQL
255
+ // says nothing about tied rows and the query's ORDER BY ended at `?name`.
256
+ //
257
+ // Asserted as a RULE over every shared name rather than on the two that
258
+ // happened to disagree: shallower tier leads, and equal depths fall back to
259
+ // a key that cannot tie.
260
+ const order = await listOrder();
261
+ const position = new Map(order.map((uri, index) => [uri, index]));
262
+ const shared = await collisions();
263
+ expect(shared.size).toBeGreaterThan(1);
264
+ for (const [name, entries] of shared) {
265
+ const group = [...entries].sort(
266
+ (a, b) => (position.get(a.uri) ?? -1) - (position.get(b.uri) ?? -1),
267
+ );
268
+ expect(
269
+ group.map((entry) => position.get(entry.uri)),
270
+ `block list rows for ${name}`,
271
+ ).not.toContain(undefined);
272
+ for (const [index, entry] of group.entries()) {
273
+ const next = group[index + 1];
274
+ if (!next) continue;
275
+ const keys = [
276
+ [depthOf(entry.tier), entry.uri],
277
+ [depthOf(next.tier), next.uri],
278
+ ] as const;
279
+ expect(
280
+ keys[0][0] < keys[1][0] ||
281
+ (keys[0][0] === keys[1][0] && keys[0][1] < keys[1][1]),
282
+ `block list printed ${entry.uri} (${entry.tier}) before ${next.uri} (${next.tier}) for "${name}"`,
283
+ ).toBe(true);
284
+ }
285
+ }
286
+ });
287
+
288
+ it("keeps every shared name's rows adjacent, one per block", async () => {
289
+ // The ordering above would also be satisfied by a list that lost a row, so
290
+ // the population is checked with it: the tie-break decides the order of the
291
+ // rows, never how many there are.
292
+ const order = await listOrder();
293
+ for (const [name, entries] of await collisions()) {
294
+ const present = entries.filter((entry) => order.includes(entry.uri));
295
+ expect(present, `block list rows for ${name}`).toHaveLength(
296
+ entries.length,
297
+ );
298
+ }
299
+ });
300
+ });
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  import { BIN_NAME } from "../../constants.js";
10
- import type { Formatters } from "../../kernel/spec/types.js";
10
+ import type { Formatters } from "../../kernel/spec/index.js";
11
11
  import type { CapabilitiesData, ToolCategory } from "./types.js";
12
12
 
13
13
  /** Category display order for grouped tool listings. */
@@ -23,7 +23,7 @@
23
23
 
24
24
  import { BIN_NAME } from "../../constants.js";
25
25
  import { asVerb } from "../../kernel/spec/asVerb.js";
26
- import type { VerbSpec } from "../../kernel/spec/types.js";
26
+ import type { VerbSpec } from "../../kernel/spec/index.js";
27
27
  import { capabilitiesFormatters } from "./capabilities.render.js";
28
28
  import type { CapabilitiesData } from "./types.js";
29
29
 
@@ -15,8 +15,8 @@
15
15
  */
16
16
 
17
17
  import { BIN_NAME, PROGRAM_DESCRIPTION, VERSION } from "../../constants.js";
18
- import { emitSurface } from "../../kernel/spec/emitSurface.js";
19
- import type { CapabilityModule } from "../../kernel/spec/types.js";
18
+ import type { CapabilityModule } from "../../kernel/spec/index.js";
19
+ import { emitSurface } from "../../kernel/spec/index.js";
20
20
  import { TOOL_HINTS } from "./hints.js";
21
21
  import type {
22
22
  CapabilitiesData,
@@ -91,7 +91,7 @@ export function buildDiscoverySequence(
91
91
  stage: 2,
92
92
  tool: "sources_status",
93
93
  purpose:
94
- "See which pack is answering. A fresh install answers reads from the snapshot embedded in the binary and needs no build; only an `unavailable` status requires sources_update (confirm: true), which is a project that declared its own packs and has not built them.",
94
+ "See which pack is answering. A fresh install answers reads from the snapshot shipped with the CLI and needs no build; only an `unavailable` status requires sources_update (confirm: true), which is a project that declared its own packs and has not built them.",
95
95
  },
96
96
  {
97
97
  stage: 3,