@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
@@ -1,10 +1,11 @@
1
1
  import { existsSync, mkdtempSync, readdirSync, writeFileSync } from "node:fs";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
- import { fail, succeed } from "@canonical/task";
4
+ import { $, fail, gen, log, mkdir, succeed, writeFile } from "@canonical/task";
5
5
  import { afterEach, describe, expect, it, vi } from "vitest";
6
6
  import { fixturePreviewModule } from "../../../testing/fixtures/fixtureCapability.js";
7
7
  import { PragmaError } from "../../error/PragmaError.js";
8
+ import { canPrompt } from "../../interactivity.js";
8
9
  import { bootRuntime } from "../../runtime/boot.js";
9
10
  import type { GlobalFlags } from "../../runtime/types.js";
10
11
  import type { ParamSpec, VerbSpec } from "../../spec/types.js";
@@ -150,6 +151,46 @@ describe("executeVerb — mutations", () => {
150
151
  expect(outcome.stdout).toContain("Dry run");
151
152
  });
152
153
 
154
+ it("a verb with NO formatPlan renders the effect dump, byte for byte", async () => {
155
+ // The `formatPlan` seam is opt-in, and opting out is the majority case.
156
+ // These are the exact bytes the kernel produced before any verb had a
157
+ // renderer of its own — the whole literal, not a substring — so a verb
158
+ // that declares nothing can never be re-rendered by accident.
159
+ const dumped: VerbSpec = {
160
+ ...make,
161
+ run: () =>
162
+ gen(function* () {
163
+ yield* $(log("info", "starting"));
164
+ yield* $(mkdir("out"));
165
+ yield* $(writeFile("out/thing.txt", "hello"));
166
+ return { dumped: true };
167
+ }),
168
+ };
169
+ const outcome = await executeVerb(
170
+ dumped,
171
+ {},
172
+ { dryRun: true, undo: false, yes: false },
173
+ bootRuntime(PLAIN, mkdtempSync(join(tmpdir(), "pragma-dump-"))),
174
+ );
175
+ expect(outcome.stdout).toBe(
176
+ "Dry run — planned effects:\n" +
177
+ " - Log [info]: starting\n" +
178
+ " - Created out/\n" +
179
+ " - Write file: out/thing.txt (5 bytes)\n",
180
+ );
181
+ expect(outcome.exitCode).toBe(0);
182
+ });
183
+
184
+ it("an empty plan renders the no-effects line, byte for byte", async () => {
185
+ const outcome = await executeVerb(
186
+ make,
187
+ {},
188
+ { dryRun: true, undo: false, yes: false },
189
+ bootRuntime(PLAIN),
190
+ );
191
+ expect(outcome.stdout).toBe("Dry run — no effects.\n");
192
+ });
193
+
153
194
  it("reports undo count under --undo", async () => {
154
195
  const outcome = await executeVerb(
155
196
  make,
@@ -161,6 +202,104 @@ describe("executeVerb — mutations", () => {
161
202
  });
162
203
  });
163
204
 
205
+ describe("--quiet — success is silent, failure is not", () => {
206
+ // The rule the flag has to keep: everything muted is success-path narration
207
+ // (the calm zero-record notice, a mutation's stage lines). Error rendering
208
+ // does not route through either seam, so no failure can hide behind it.
209
+ const QUIET: GlobalFlags = { ...PLAIN, quiet: true };
210
+ const savedExit = process.exitCode;
211
+ afterEach(() => {
212
+ process.exitCode = savedExit;
213
+ });
214
+
215
+ const emptyList: VerbSpec = {
216
+ ...echo,
217
+ params: [],
218
+ output: {
219
+ formatters: {
220
+ ...passthroughFormatters,
221
+ plain: () => "",
222
+ notice: () => "No results.",
223
+ },
224
+ },
225
+ run: async () => [],
226
+ };
227
+
228
+ it("mutes the empty-state notice but keeps stdout and the exit code", async () => {
229
+ const loud = await executeVerb(
230
+ emptyList,
231
+ {},
232
+ { dryRun: false, undo: false, yes: false },
233
+ bootRuntime(PLAIN),
234
+ );
235
+ expect(loud.stderr).toBe("No results.\n");
236
+
237
+ const quiet = await executeVerb(
238
+ emptyList,
239
+ {},
240
+ { dryRun: false, undo: false, yes: false },
241
+ bootRuntime(QUIET),
242
+ );
243
+ expect(quiet.stderr).toBeUndefined();
244
+ expect(quiet.stdout).toBe(loud.stdout);
245
+ expect(quiet.exitCode).toBe(0);
246
+ });
247
+
248
+ it("mutes a mutation's progress lines", async () => {
249
+ const reporting: VerbSpec = {
250
+ ...make,
251
+ run: (_params, runtime) => {
252
+ runtime.report?.("Resolving the pack…");
253
+ return succeed({ made: true });
254
+ },
255
+ };
256
+ const errs: string[] = [];
257
+ const spy = vi
258
+ .spyOn(process.stderr, "write")
259
+ .mockImplementation((chunk: string | Uint8Array) => {
260
+ errs.push(String(chunk));
261
+ return true;
262
+ });
263
+ await executeVerb(
264
+ reporting,
265
+ {},
266
+ { dryRun: false, undo: false, yes: true },
267
+ bootRuntime(PLAIN),
268
+ );
269
+ const loud = errs.join("");
270
+ errs.length = 0;
271
+ await executeVerb(
272
+ reporting,
273
+ {},
274
+ { dryRun: false, undo: false, yes: true },
275
+ bootRuntime(QUIET),
276
+ );
277
+ spy.mockRestore();
278
+ expect(loud).toContain("Resolving the pack…");
279
+ expect(errs.join("")).toBe("");
280
+ });
281
+
282
+ it("still renders the error, with its exit code", async () => {
283
+ const failing: VerbSpec = {
284
+ ...echo,
285
+ run: async () => {
286
+ throw PragmaError.notFound("thing", "Nope");
287
+ },
288
+ };
289
+ const errs: string[] = [];
290
+ const spy = vi
291
+ .spyOn(process.stderr, "write")
292
+ .mockImplementation((chunk: string | Uint8Array) => {
293
+ errs.push(String(chunk));
294
+ return true;
295
+ });
296
+ await dispatch(failing, ["x"], {}, QUIET);
297
+ spy.mockRestore();
298
+ expect(errs.join("")).toContain('thing "Nope" not found.');
299
+ expect(process.exitCode).toBe(1);
300
+ });
301
+ });
302
+
164
303
  describe("dispatch — errors", () => {
165
304
  const savedExit = process.exitCode;
166
305
  afterEach(() => {
@@ -190,7 +329,7 @@ describe("dispatch — errors", () => {
190
329
  it("renders a declined confirm gate as a clean cancellation, not a bug report", async () => {
191
330
  // A TTY user declining execute()'s "Proceed?" gate fails the task with
192
331
  // GENERATOR_CANCELLED; the boundary must treat it as a clean cancel, never
193
- // the scary INTERNAL_ERROR "please report this issue" / exit 1.
332
+ // the scary INTERNAL_ERROR "report this issue" / exit 1.
194
333
  const cancelling: VerbSpec = {
195
334
  ...make,
196
335
  run: () => fail({ code: "GENERATOR_CANCELLED", message: "Cancelled." }),
@@ -352,4 +491,23 @@ describe("executeVerb — interactivity gate (H3)", () => {
352
491
  );
353
492
  expect(sink.isTTY).toBe(true);
354
493
  });
494
+
495
+ it("canPrompt IS the stdin+stderr conjunction — the one gate both callers read", () => {
496
+ // The mount's create decision reads the same exported function this
497
+ // describe drives through executeVerb, so pinning the truth table here
498
+ // pins BOTH callers (nothing is left to keep two copies in step).
499
+ const cases: Array<[boolean, boolean, boolean, boolean]> = [
500
+ [true, true, false, true], // stdout is irrelevant…
501
+ [true, true, true, true],
502
+ [false, true, true, false], // …stdin is required…
503
+ [true, false, true, false], // …and so is stderr.
504
+ [false, false, false, false],
505
+ ];
506
+ for (const [stdin, stderr, stdout, expected] of cases) {
507
+ setTTY(process.stdin, stdin);
508
+ setTTY(process.stderr, stderr);
509
+ setTTY(process.stdout, stdout);
510
+ expect(canPrompt(), `stdin=${stdin} stderr=${stderr}`).toBe(expected);
511
+ }
512
+ });
355
513
  });
@@ -11,7 +11,7 @@
11
11
  * exit code.
12
12
  */
13
13
 
14
- import { describeEffect, type Task } from "@canonical/task";
14
+ import { describeEffect, type Effect, type Task } from "@canonical/task";
15
15
  import { runPreview, runTask, runUndo } from "@canonical/task/node";
16
16
  import {
17
17
  asPragmaError,
@@ -19,22 +19,22 @@ import {
19
19
  isCancellation,
20
20
  isInterruption,
21
21
  } from "../../error/fromTaskError.js";
22
- import { PragmaError } from "../../error/PragmaError.js";
23
22
  import {
23
+ PragmaError,
24
24
  renderErrorJson,
25
25
  renderErrorLlm,
26
26
  renderErrorPlain,
27
- } from "../../error/renderError.js";
28
- import { successEnvelope } from "../../render/envelope.js";
29
- import { selectFormatter } from "../../render/formatters.js";
30
- import { writeStdout } from "../../render/writeStdout.js";
31
- import { bootRuntime } from "../../runtime/boot.js";
27
+ } from "../../error/index.js";
28
+ import { canPrompt, stdoutIsCaptured } from "../../interactivity.js";
29
+ import type { RenderContext } from "../../render/contracts.js";
30
+ import { successEnvelope, writeStdout } from "../../render/index.js";
31
+ import { bootRuntime } from "../../runtime/index.js";
32
32
  import type {
33
33
  GlobalFlags,
34
34
  InteractionRuntime,
35
35
  PragmaRuntime,
36
36
  } from "../../runtime/types.js";
37
- import type { ParamSpec, VerbSpec } from "../../spec/types.js";
37
+ import type { ParamSpec, VerbSpec } from "../../spec/index.js";
38
38
  import { EXIT, mapExitCode } from "./exitCodes.js";
39
39
 
40
40
  /** The CLI-only mutation flags auto-injected onto every mutating verb. */
@@ -53,6 +53,18 @@ const logToStderr = (_level: string, message: string): void => {
53
53
  process.stderr.write(`${message}\n`);
54
54
  };
55
55
 
56
+ /** A silenced log sink — `--quiet` drops progress; errors render elsewhere. */
57
+ const logNowhere = (_level: string, _message: string): void => {};
58
+
59
+ /**
60
+ * The interpreter log sink for this invocation: stderr, or — under `--quiet`
61
+ * — nothing. Progress/stage lines are success-path output; error rendering
62
+ * never routes through this sink, so muting it cannot hide a failure.
63
+ */
64
+ function logSink(flags: GlobalFlags): (level: string, message: string) => void {
65
+ return flags.quiet === true ? logNowhere : logToStderr;
66
+ }
67
+
56
68
  /** The result of running a verb: what to write where, and the exit code. */
57
69
  export interface DispatchOutcome {
58
70
  readonly stdout?: string;
@@ -62,6 +74,15 @@ export interface DispatchOutcome {
62
74
 
63
75
  /** Coerce one raw arg into the type its {@link ParamSpec} declares. */
64
76
  function coerceParam(param: ParamSpec, raw: unknown): unknown {
77
+ // A repeatable flag's collector hands over an array of occurrences; coerce
78
+ // each element so an enum still validates every value.
79
+ if (
80
+ Array.isArray(raw) &&
81
+ (param.kind === "string" || param.kind === "enum") &&
82
+ param.repeatable === true
83
+ ) {
84
+ return raw.map((value) => coerceParam(param, value));
85
+ }
65
86
  switch (param.kind) {
66
87
  case "number": {
67
88
  const value = typeof raw === "number" ? raw : Number(raw);
@@ -128,7 +149,19 @@ export function extractParams(
128
149
  return result;
129
150
  }
130
151
 
131
- /** Render a read/execute result through the verb's formatters. */
152
+ /**
153
+ * Render a read/execute result through the verb's formatters.
154
+ *
155
+ * The plain branch owns two ROUTING decisions (the rendering itself stays in
156
+ * the formatters): it threads the presentation context (`--no-headers`,
157
+ * stdout's TTY-ness) into the plain formatter, and it routes a declared
158
+ * empty-state notice to STDERR with exit 0 — a zero-record result is a calm
159
+ * success, and stdout (the data stream) must not carry a human sentence a
160
+ * pipe would read as a record. `llm` and `json` keep their own empty shapes
161
+ * on stdout: both are machine contracts whose consumers read one stream.
162
+ *
163
+ * @note Impure — reads stdout's capture state for the render context.
164
+ */
132
165
  function renderData(
133
166
  verb: VerbSpec,
134
167
  flags: GlobalFlags,
@@ -137,26 +170,93 @@ function renderData(
137
170
  ): DispatchOutcome {
138
171
  if (flags.format === "json") {
139
172
  const projection = JSON.parse(verb.output.formatters.json(data));
173
+ // The calm notice rides `meta` on the machine surfaces, so an empty result
174
+ // is distinguishable from an unbuilt store or a mistyped filter, and an
175
+ // ambiguous lookup hit from an unambiguous one. `data` keeps its uniform
176
+ // shape, and MCP builds the same key from the same seam
177
+ // (`mcp/registerVerb.ts#noticeMeta`) — the two machine surfaces stay
178
+ // byte-equal.
179
+ const notice = verb.output.formatters.notice?.(data);
140
180
  return {
141
- stdout: `${JSON.stringify(successEnvelope(projection, meta))}\n`,
181
+ stdout: `${JSON.stringify(
182
+ successEnvelope(projection, notice ? { ...meta, notice } : meta),
183
+ )}\n`,
142
184
  exitCode: 0,
143
185
  };
144
186
  }
145
- const text = selectFormatter(flags, verb.output.formatters)(data);
146
- return { stdout: text ? `${text}\n` : "", exitCode: 0 };
187
+ if (flags.llm) {
188
+ const text = verb.output.formatters.llm(data);
189
+ return { stdout: text ? `${text}\n` : "", exitCode: 0 };
190
+ }
191
+ const context: RenderContext = {
192
+ headers: flags.noHeaders !== true,
193
+ stdoutIsTty: !stdoutIsCaptured(),
194
+ };
195
+ const text = verb.output.formatters.plain(data, context);
196
+ // The calm notice is success-path guidance — `--quiet` mutes it.
197
+ const notice =
198
+ flags.quiet === true ? undefined : verb.output.formatters.notice?.(data);
199
+ return {
200
+ stdout: text ? `${text}\n` : "",
201
+ ...(notice ? { stderr: `${notice}\n` } : {}),
202
+ exitCode: 0,
203
+ };
147
204
  }
148
205
 
149
- /** Render a dry-run plan (the effects a mutation would perform). */
150
- function renderPlan(
206
+ /**
207
+ * Render a dry-run plan.
208
+ *
209
+ * The default render is the effect dump — one described effect per line — which
210
+ * is what every verb without a plan of its own gets, byte for byte as before.
211
+ * A verb that declares `output.formatPlan` renders that instead: the dump is
212
+ * debug material (interpreter log effects, a repeated absolute path prefix on
213
+ * every line), and a preview is something a user is meant to read.
214
+ *
215
+ * The JSON envelope is decided by the STASHED DATA, not by the seam: `plan` is
216
+ * the same string array it always was, and `targets` appears only for a verb
217
+ * that stashed a structured plan beside it. So a verb whose renderer works off
218
+ * the effects alone leaves the machine-readable shape exactly as it found it.
219
+ *
220
+ * @param flags - The global flags (format selection, verbosity).
221
+ * @param plan - The described effects the mutation would perform.
222
+ * @param effects - Those same effects, unformatted, for the verb's renderer.
223
+ * @param seam - The verb's plan renderer + whatever it stashed, when it has one.
224
+ * @returns The dispatch outcome.
225
+ */
226
+ async function renderPlan(
151
227
  flags: GlobalFlags,
152
228
  plan: readonly string[],
153
- ): DispatchOutcome {
229
+ effects: readonly Effect[],
230
+ seam?: {
231
+ format: (
232
+ planData: unknown,
233
+ effects: readonly Effect[],
234
+ verbose: boolean,
235
+ ) => string | Promise<string>;
236
+ planData: unknown;
237
+ },
238
+ ): Promise<DispatchOutcome> {
154
239
  if (flags.format === "json") {
240
+ const body =
241
+ seam?.planData === undefined
242
+ ? { plan }
243
+ : { plan, targets: seam.planData };
155
244
  return {
156
- stdout: `${JSON.stringify(successEnvelope({ plan }, { dryRun: true }))}\n`,
245
+ stdout: `${JSON.stringify(successEnvelope(body, { dryRun: true }))}\n`,
157
246
  exitCode: 0,
158
247
  };
159
248
  }
249
+ if (seam !== undefined) {
250
+ // Awaited: the seam MAY be async, so a renderer can load formatting rules
251
+ // that live in another package behind a dynamic `import()` instead of
252
+ // charging every `--help` spawn for them (see `VerbSpec.output.formatPlan`).
253
+ const rendered = await seam.format(
254
+ seam.planData,
255
+ effects,
256
+ flags.verbose === true,
257
+ );
258
+ return { stdout: `${rendered}\n`, exitCode: 0 };
259
+ }
160
260
  const body =
161
261
  plan.length > 0
162
262
  ? `Dry run — planned effects:\n${plan.map((p) => ` - ${p}`).join("\n")}`
@@ -228,10 +328,8 @@ export async function executeVerb(
228
328
  // block on input. `--undo` stays handler-free and untouched by this seam.
229
329
  const controller = new AbortController();
230
330
  const interaction: InteractionRuntime = {
231
- // Gate on STDERR (H3): the Ink wizard renders to stderr and reads stdin,
232
- // so `<verb> 2>/dev/null` must be non-interactive — gating on stdout would
233
- // mount an invisible render that blocks on stdin.
234
- isTTY: process.stdin.isTTY === true && process.stderr.isTTY === true,
331
+ // The shared H3 gate (see `canPrompt`): stdin and stderr, never stdout.
332
+ isTTY: canPrompt(),
235
333
  transport: "cli",
236
334
  yes: mutation.yes,
237
335
  signal: controller.signal,
@@ -242,12 +340,15 @@ export async function executeVerb(
242
340
  };
243
341
  const mutationRuntime: PragmaRuntime = {
244
342
  ...runtime,
245
- mutation: { preview: mutation.dryRun },
343
+ mutation: { preview: mutation.dryRun, undo: mutation.undo },
246
344
  interaction,
247
345
  // Progress seam (U7): a long mutation's eager resolve/build runs before its
248
346
  // Task is returned, so `onLog` can't reach it — stream stage lines straight
249
347
  // to stderr instead, keeping stdout (the JSON/data stream) clean.
250
- report: (message: string) => process.stderr.write(`${message}\n`),
348
+ report:
349
+ flags.quiet === true
350
+ ? () => {}
351
+ : (message: string) => process.stderr.write(`${message}\n`),
251
352
  };
252
353
  const task = await Promise.resolve(
253
354
  verb.run(params, mutationRuntime) as
@@ -262,20 +363,46 @@ export async function executeVerb(
262
363
  // `exec.cwd` is the same write root the real run resolves paths against,
263
364
  // and `exec.onEffectStart` carries summon's stamping transform, so the
264
365
  // planned byte counts are the bytes the run would actually write.
366
+ //
367
+ // NO `onLog`, deliberately. A preview that PERFORMS an effect is not a
368
+ // preview of that effect: routing the recorded `Log`s to stderr printed
369
+ // the generator's whole commentary on the way through, and the plan then
370
+ // listed the very same lines as rows. The interpreter prints nothing of
371
+ // its own when `onLog` is absent, so a log is now planned once and
372
+ // performed never.
265
373
  const previewExec = mutationRuntime.exec ?? {};
266
374
  try {
267
375
  const { effects } = await runPreview(task, {
268
376
  cwd: previewExec.cwd,
269
377
  onEffectStart: previewExec.onEffectStart,
270
- onLog: logToStderr,
271
378
  });
272
379
  // A plan is the effects a mutation WOULD apply — a `Prompt` is not one,
273
380
  // so the interactive confirm gate / answer prompts never clutter it.
274
- return renderPlan(
381
+ const planned = effects.filter((effect) => effect._tag !== "Prompt");
382
+ // The DESCRIBED plan — what `--format json` carries and what a verb
383
+ // with no renderer of its own is dumped as — passes the same
384
+ // visibility filter the MCP payload and the human preview use. It is
385
+ // the filter, not the row format, that this seam shares: `plan` is
386
+ // structured description, so it stays `describeEffect` strings rather
387
+ // than terminal rows, and the two surfaces can be compared string for
388
+ // string (`testing/behavioral/parity.test.ts`, A6).
389
+ //
390
+ // Loaded lazily from the LIGHT `/format` subpath. A dry run is already
391
+ // several filesystem reads deep here; a `--help` spawn never reaches
392
+ // this branch, and the kernel keeps summon-core off its static graph.
393
+ const { visiblePlanEffects } = await import(
394
+ "@canonical/summon-core/format"
395
+ );
396
+ const format = verb.output.formatPlan;
397
+ return await renderPlan(
275
398
  flags,
276
- effects
277
- .filter((effect) => effect._tag !== "Prompt")
278
- .map(describeEffect),
399
+ visiblePlanEffects(planned, flags.verbose === true).map(
400
+ describeEffect,
401
+ ),
402
+ planned,
403
+ format === undefined
404
+ ? undefined
405
+ : { format, planData: mutationRuntime.planData },
279
406
  );
280
407
  } finally {
281
408
  // A verb that mounted an interactive session before returning its Task
@@ -284,22 +411,27 @@ export async function executeVerb(
284
411
  }
285
412
  }
286
413
  if (mutation.undo) {
287
- const { undoCount } = await runUndo(task, { onLog: logToStderr });
414
+ const { undoCount } = await runUndo(task, { onLog: logSink(flags) });
288
415
  return renderUndo(flags, undoCount);
289
416
  }
290
417
  // Real execution: spread the verb's runner options into the node
291
418
  // interpreter (prompt handler, stamping/progress callbacks, log routing,
292
- // signal). Teardown (e.g. unmount an Ink render) runs in `finally`.
419
+ // signal). Teardown (e.g. unmount an Ink render) runs in `finally` —
420
+ // BEFORE the outcome is rendered: an interactive session's closing frame
421
+ // flushes on its dispose, so printing the result first put the verb's
422
+ // stdout recap ABOVE a frame that then repainted stale beneath it. Tear
423
+ // the UI down, then report; the error path gets the same order for free.
293
424
  const exec = mutationRuntime.exec ?? {};
294
425
  const onSigint = (): void => controller.abort();
295
426
  process.once("SIGINT", onSigint);
427
+ let value: unknown;
296
428
  try {
297
- const value = await runTask(task, { onLog: logToStderr, ...exec });
298
- return renderData(verb, flags, value, {});
429
+ value = await runTask(task, { onLog: logSink(flags), ...exec });
299
430
  } finally {
300
431
  process.removeListener("SIGINT", onSigint);
301
432
  await exec.dispose?.();
302
433
  }
434
+ return renderData(verb, flags, value, {});
303
435
  }
304
436
 
305
437
  const data = await Promise.resolve(
@@ -309,30 +441,29 @@ export async function executeVerb(
309
441
  }
310
442
 
311
443
  /**
312
- * Dispatch a matched verb: coerce, run, and perform the output I/O.
444
+ * Run a verb whose params are already prepared, then perform the output I/O —
445
+ * the shared tail of {@link dispatch} and of a mounted subtree's own
446
+ * dispatcher, which extracts its params by its own rules but reuses every
447
+ * piece of the kernel machinery from here down: dry-run/undo/real-run
448
+ * interpretation, error rendering, exit codes, SIGINT.
313
449
  *
314
- * @param verb - The matched verb spec.
315
- * @param positionals - Positional args from Commander.
316
- * @param opts - Commander's parsed option values (incl. mutation flags).
450
+ * @param verb - The verb spec to run.
451
+ * @param getParams - Produces the coerced param bag (may throw a usage error;
452
+ * it is rendered exactly like a run error).
453
+ * @param mutation - The mutation flags.
317
454
  * @param globalFlags - The parsed global flags.
318
455
  * @note Impure — writes stdout/stderr and sets `process.exitCode`.
319
456
  */
320
- export async function dispatch(
457
+ async function runPrepared(
321
458
  verb: VerbSpec,
322
- positionals: readonly string[],
323
- opts: Record<string, unknown>,
459
+ getParams: () => Record<string, unknown>,
460
+ mutation: MutationFlags,
324
461
  globalFlags: GlobalFlags,
325
462
  ): Promise<void> {
326
463
  const runtime = bootRuntime(globalFlags);
327
464
  let outcome: DispatchOutcome;
328
465
  try {
329
- const params = extractParams(verb.params, positionals, opts);
330
- const mutation: MutationFlags = {
331
- dryRun: opts.dryRun === true,
332
- undo: opts.undo === true,
333
- yes: opts.yes === true,
334
- };
335
- outcome = await executeVerb(verb, params, mutation, runtime);
466
+ outcome = await executeVerb(verb, getParams(), mutation, runtime);
336
467
  } catch (error) {
337
468
  // Two clean, non-bug outcomes print the same "Cancelled." line but exit
338
469
  // differently — both set DIRECTLY here, out-of-band from `mapExitCode`'s
@@ -354,3 +485,53 @@ export async function dispatch(
354
485
  if (outcome.stderr) process.stderr.write(outcome.stderr);
355
486
  if (outcome.exitCode !== 0) process.exitCode = outcome.exitCode;
356
487
  }
488
+
489
+ /**
490
+ * Dispatch a matched verb: coerce, run, and perform the output I/O.
491
+ *
492
+ * @param verb - The matched verb spec.
493
+ * @param positionals - Positional args from Commander.
494
+ * @param opts - Commander's parsed option values (incl. mutation flags).
495
+ * @param globalFlags - The parsed global flags.
496
+ * @note Impure — writes stdout/stderr and sets `process.exitCode`.
497
+ */
498
+ export async function dispatch(
499
+ verb: VerbSpec,
500
+ positionals: readonly string[],
501
+ opts: Record<string, unknown>,
502
+ globalFlags: GlobalFlags,
503
+ ): Promise<void> {
504
+ const mutation: MutationFlags = {
505
+ dryRun: opts.dryRun === true,
506
+ undo: opts.undo === true,
507
+ yes: opts.yes === true,
508
+ };
509
+ await runPrepared(
510
+ verb,
511
+ () => extractParams(verb.params, positionals, opts),
512
+ mutation,
513
+ globalFlags,
514
+ );
515
+ }
516
+
517
+ /**
518
+ * Dispatch a verb whose params were ALREADY extracted by the caller — the
519
+ * seam a mounted subtree drives: its leaf specs carry no Commander defaults
520
+ * (explicit stays distinguishable from default), so the mount extracts the
521
+ * explicit answers itself and hands them here, reusing the whole kernel tail
522
+ * (interpreters, rendering, exit codes, SIGINT) byte-for-byte.
523
+ *
524
+ * @param verb - The (possibly synthesized) verb spec to run.
525
+ * @param params - The prepared param bag.
526
+ * @param mutation - The mutation flags.
527
+ * @param globalFlags - The parsed global flags.
528
+ * @note Impure — writes stdout/stderr and sets `process.exitCode`.
529
+ */
530
+ export async function dispatchPrepared(
531
+ verb: VerbSpec,
532
+ params: Record<string, unknown>,
533
+ mutation: MutationFlags,
534
+ globalFlags: GlobalFlags,
535
+ ): Promise<void> {
536
+ await runPrepared(verb, () => params, mutation, globalFlags);
537
+ }
@@ -18,7 +18,7 @@
18
18
  * is NOT produced by `mapExitCode`.
19
19
  */
20
20
 
21
- import type { ErrorCode } from "../../error/types.js";
21
+ import type { ErrorCode } from "../../error/index.js";
22
22
 
23
23
  /**
24
24
  * The process exit codes. The first four are the covenant's frozen