@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,5 +1,6 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { fileURLToPath } from "node:url";
3
+ import { buildOptionInfo } from "@canonical/summon-core/projection";
3
4
  import { describe, expect, it } from "vitest";
4
5
  import { MCP_SERVER_NAME, VERSION } from "../constants.js";
5
6
  import { emitSurface } from "../kernel/spec/emitSurface.js";
@@ -8,6 +9,7 @@ import {
8
9
  type Covenant,
9
10
  } from "../kernel/spec/surfaceConformance.js";
10
11
  import { projectMcp } from "../testing/helpers/projectMcp.js";
12
+ import { CREATE_SURFACE } from "./create/createSurface.generated.js";
11
13
  import { capabilities } from "./index.js";
12
14
 
13
15
  /** The committed covenant, read from disk exactly as a consumer would. */
@@ -25,22 +27,40 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
25
27
  expect(() => assertConforms(emitted, golden)).not.toThrow();
26
28
  });
27
29
 
28
- it("emits config show + the one-command config set, in covenant order (field-verbs retired, B3)", () => {
30
+ it("emits the four config verbs — show, get, set, unset — in covenant order", () => {
29
31
  // AV-228 B3 retired the per-field `tier`/`channel`/`detail` setters; the
30
- // config noun is now just the `show` reader and the `set <key> <value>` writer.
32
+ // config noun is the `show` dump, the `get <key>` single read, the
33
+ // `set <key> <value>` writer, and the `unset <key>` clearer. Reading one
34
+ // value and clearing one field are commands of their own — neither hides
35
+ // inside `show --format json` nor inside a reserved `set` value.
31
36
  expect(emitted.nouns.config?.verbs).toEqual([
32
37
  { v: "show", mcp: "config_show" },
38
+ { v: "get", args: ["<key>"], mcp: "config_get" },
33
39
  {
34
40
  v: "set",
35
41
  args: ["<key>", "<value>"],
36
42
  mutates: true,
37
43
  mcp: "config_set",
38
44
  },
45
+ {
46
+ v: "unset",
47
+ args: ["<key>"],
48
+ mutates: true,
49
+ mcp: "config_unset",
50
+ },
39
51
  ]);
40
52
  // info stays a data-only enrichment — its emitted verb is unchanged.
41
53
  expect(emitted.nouns.info?.verbs).toEqual([{ v: "info", mcp: "info" }]);
42
- // Hidden meta verbs (__complete, mcp) are excluded from the surface.
43
- expect(emitted.nouns.mcp).toBeUndefined();
54
+ // `version` is the command form of `--version`: one value, two spellings
55
+ // of the same read, and no tool — the version already rides `info`.
56
+ expect(emitted.nouns.version?.verbs).toEqual([
57
+ { v: "version", mcp: false },
58
+ ]);
59
+ // The server entry is a real noun/verb pair, emitted like any other and
60
+ // carrying no tool — it serves a protocol, it is not an agent tool.
61
+ expect(emitted.nouns.mcp?.verbs).toEqual([{ v: "serve", mcp: false }]);
62
+ // The completion resolver stays hidden — it is a protocol between the
63
+ // shell script and the bin, not a command anyone types.
44
64
  expect(emitted.nouns.__complete).toBeUndefined();
45
65
  });
46
66
 
@@ -105,15 +125,8 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
105
125
  needsStore: true,
106
126
  mcp: "ontology_lookup",
107
127
  },
108
- // `show` is the deprecated alias of `lookup` (AV-228 B1) — same shape,
109
- // both blessed in the covenant.
110
- {
111
- v: "show",
112
- args: ["<prefix>"],
113
- flags: ["--properties", "--full-uris", "--class"],
114
- needsStore: true,
115
- mcp: "ontology_show",
116
- },
128
+ // One job, one spelling: `lookup` is the by-name read, and nothing
129
+ // else answers to it.
117
130
  ]);
118
131
  // skill discovery is storeless (filesystem) — no needsStore.
119
132
  expect(emitted.nouns.skill?.verbs).toEqual([
@@ -137,6 +150,92 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
137
150
  ]);
138
151
  });
139
152
 
153
+ it("emits the L-CIS create noun — projected grammar, deep-equal to the covenant", () => {
154
+ // The create surface DERIVES from the generators' prompts (L-CIS): the
155
+ // framework tree segment is a required positional enum, component's flags
156
+ // are the framework union (incl. the svelte-only --use-ts-stories), and
157
+ // every flag AND positional token is the REGISTERED spelling (L-CIS-2) —
158
+ // a default-true confirm registers ONLY its `--no-<kebab>` form, and the
159
+ // args carry the kebab positional the usage line prints, so the covenant
160
+ // names `--no-with-styles` and `[component-path]`, never a
161
+ // `--with-styles` the CLI rejects or a `[componentPath]` its help never
162
+ // prints. Pin the three entries verbatim so a prompt edit that moves the
163
+ // covenant is SEEN.
164
+ expect(emitted.nouns.create?.verbs).toEqual([
165
+ {
166
+ v: "component",
167
+ args: ["<framework>", "[component-path]"],
168
+ flags: [
169
+ "--no-with-styles",
170
+ "--no-with-stories",
171
+ "--no-with-ssr-tests",
172
+ "--use-ts-stories",
173
+ ],
174
+ mutates: true,
175
+ mcp: "create_component",
176
+ },
177
+ {
178
+ v: "package",
179
+ flags: [
180
+ "--name",
181
+ "--type",
182
+ "--description",
183
+ "--with-react",
184
+ "--with-storybook",
185
+ "--with-cli",
186
+ "--with-pr-template",
187
+ "--no-run-install",
188
+ ],
189
+ mutates: true,
190
+ mcp: "create_package",
191
+ },
192
+ {
193
+ v: "application",
194
+ args: ["[app-path]"],
195
+ // ssr/router are GONE: always-on facts, not prompts — the pair had no
196
+ // reachable explicit form (only `--no-` spellings the generator's own
197
+ // guard rejected), so the projection no longer carries them.
198
+ flags: ["--no-forms", "--intl", "--relay", "--no-run-install"],
199
+ mutates: true,
200
+ mcp: "create_application",
201
+ },
202
+ ]);
203
+ });
204
+
205
+ it("every create covenant flag token is buildOptionInfo's primary registered long form (L-CIS-2)", () => {
206
+ // The derivation tie: the covenant's create tokens must be EXACTLY the
207
+ // long forms the single flag-shape authority yields for the projected
208
+ // prompts — the same expression both binaries register from — so the
209
+ // covenant can never again teach a spelling the CLI rejects (the
210
+ // round-15 F2 defect: kebab-cased param names blessed `--with-styles`
211
+ // and rejected the real `--no-with-styles`).
212
+ const registered = new Map<string, string>();
213
+ for (const surface of Object.values(CREATE_SURFACE)) {
214
+ for (const prompt of surface.prompts) {
215
+ if (prompt.positional === true) continue;
216
+ registered.set(
217
+ prompt.name,
218
+ buildOptionInfo(prompt).flags.split(" ")[0] as string,
219
+ );
220
+ }
221
+ }
222
+ for (const verb of emitted.nouns.create?.verbs ?? []) {
223
+ expect(verb.flags?.length ?? 0).toBeGreaterThan(0);
224
+ for (const token of verb.flags ?? []) {
225
+ expect([...registered.values()]).toContain(token);
226
+ }
227
+ }
228
+ // …and every non-positional projected prompt is named by some entry.
229
+ const covenantTokens = new Set(
230
+ (emitted.nouns.create?.verbs ?? []).flatMap((verb) => verb.flags ?? []),
231
+ );
232
+ for (const [name, token] of registered) {
233
+ expect(covenantTokens.has(token), `${name} → ${token} missing`).toBe(
234
+ true,
235
+ );
236
+ }
237
+ });
238
+
140
239
  it("emits the PR6 effect/diagnostic self-verbs (doctor, upgrade)", () => {
141
240
  // doctor is a storeless read self-verb — no args, no flags, no needsStore.
142
241
  expect(emitted.nouns.doctor?.verbs).toEqual([
@@ -158,8 +257,8 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
158
257
  it("emits setup as a mixed self+sub noun (self is a tool, sub-verbs are mcp:false)", () => {
159
258
  // The one covenant noun both directly runnable AND with sub-verbs. The self
160
259
  // verb is the `setup` tool; the four installers are CLI-only (mcp:false).
161
- // The band-aware verbs (setup/mcp/skills) carry the --scope/--global/--local
162
- // flags; completions/lsp are single-band installers with no scope.
260
+ // The scope-aware verbs (setup/mcp/skills) carry the --scope/--global/--local
261
+ // flags; completions/lsp are single-scope installers with no scope.
163
262
  expect(emitted.nouns.setup?.verbs).toEqual([
164
263
  {
165
264
  v: "setup",
@@ -167,20 +266,36 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
167
266
  mutates: true,
168
267
  mcp: "setup",
169
268
  },
269
+ {
270
+ v: "config",
271
+ flags: ["--scope", "--global", "--local"],
272
+ mutates: true,
273
+ mcp: false,
274
+ },
275
+ {
276
+ v: "completions",
277
+ flags: ["--scope", "--global", "--local"],
278
+ mutates: true,
279
+ mcp: false,
280
+ },
281
+ {
282
+ v: "lsp",
283
+ flags: ["--scope", "--global", "--local"],
284
+ mutates: true,
285
+ mcp: false,
286
+ },
170
287
  {
171
288
  v: "mcp",
172
289
  flags: ["--scope", "--global", "--local"],
173
290
  mutates: true,
174
291
  mcp: false,
175
292
  },
176
- { v: "completions", mutates: true, mcp: false },
177
293
  {
178
294
  v: "skills",
179
295
  flags: ["--scope", "--global", "--local"],
180
296
  mutates: true,
181
297
  mcp: false,
182
298
  },
183
- { v: "lsp", mutates: true, mcp: false },
184
299
  ]);
185
300
  });
186
301
 
@@ -200,6 +315,8 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
200
315
  "standard_sample",
201
316
  "tier_list",
202
317
  "config_show",
318
+ "config_get",
319
+ "config_unset",
203
320
  "colophon",
204
321
  ]) {
205
322
  expect(tools).toContain(tool);
@@ -213,14 +330,14 @@ describe("surface COMPLETE — emitted == covenant (PROTECTED)", () => {
213
330
  // The CLOSING direction: assertConforms already proves emitted ⊆ covenant;
214
331
  // this proves covenant ⊆ emitted, so together the tool sets are EQUAL — the
215
332
  // surface-complete milestone. After PR7, every covenant tool is realized.
216
- it("emits every covenant tool (all 37) — set equality with the covenant", () => {
333
+ it("emits every covenant tool (all 42) — set equality with the covenant", () => {
217
334
  const emittedTools = new Set(emitted.mcpSurface.tools);
218
335
  const missing = golden.mcpSurface.tools.filter((t) => !emittedTools.has(t));
219
336
  expect(missing).toEqual([]);
220
337
  expect([...emitted.mcpSurface.tools].sort()).toEqual(
221
338
  [...golden.mcpSurface.tools].sort(),
222
339
  );
223
- expect(emitted.mcpSurface.tools).toHaveLength(37);
340
+ expect(emitted.mcpSurface.tools).toHaveLength(42);
224
341
  });
225
342
 
226
343
  // The covenant edit: the non-tool MCP surface is frozen too.
@@ -13,6 +13,11 @@
13
13
  * by `assertExecOk` as an actionable UNSUPPORTED (exit 1) — the interpreter
14
14
  * RESOLVES on a nonzero exit, so the check is the consumer's job.
15
15
  * - offline / already-latest carry NO exec — a real run just returns the status.
16
+ * - a non-global install (linked / ephemeral / workspace / unknown) also
17
+ * carries NO exec even when an update exists: there is no command pragma may
18
+ * run for it, so the task reports the delta plus the state's guidance and
19
+ * mutates nothing. `pmUpdateCommand` only accepts the global arm, so this is
20
+ * enforced by the types, not by convention.
16
21
  *
17
22
  * The whole registry read is preview-safe, so no `mutation.preview` gating is
18
23
  * needed here (unlike `sources update`, whose heavy resolve must be gated).
@@ -21,13 +26,16 @@
21
26
  */
22
27
 
23
28
  import { $, exec, gen, info, type Task, warn } from "@canonical/task";
24
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
25
- import { assertExecOk, guardMissingBinary } from "../shared/assertExecOk.js";
29
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
26
30
  import {
31
+ assertExecOk,
32
+ checkRegistryVersion,
27
33
  detectInstallSource,
34
+ guardMissingBinary,
35
+ PRAGMA_PACKAGE,
28
36
  pmUpdateCommand,
29
- } from "../shared/packageManager.js";
30
- import { checkRegistryVersion, PRAGMA_PACKAGE } from "../shared/registry.js";
37
+ updateGuidance,
38
+ } from "../shared/index.js";
31
39
  import type { UpgradeData } from "./types.js";
32
40
 
33
41
  /**
@@ -44,8 +52,15 @@ export async function runUpgrade(
44
52
  ): Promise<Task<UpgradeData>> {
45
53
  const { channel } = (await rt.loadConfig()).config;
46
54
  const install = detectInstallSource();
47
- const command = pmUpdateCommand(install.pm, PRAGMA_PACKAGE);
55
+ // Only a GLOBAL install has a sanctioned update command — the type of
56
+ // `pmUpdateCommand` enforces the narrowing. A linked checkout in particular
57
+ // must never be handed `npm i -g`: it would overwrite the development link.
58
+ const command =
59
+ install.kind === "global"
60
+ ? pmUpdateCommand(install, PRAGMA_PACKAGE)
61
+ : undefined;
48
62
  const pm = install.label;
63
+ const kind = install.kind;
49
64
  const current = rt.version;
50
65
 
51
66
  const registry = await checkRegistryVersion(PRAGMA_PACKAGE, channel);
@@ -53,17 +68,16 @@ export async function runUpgrade(
53
68
  if (registry === undefined) {
54
69
  const data: UpgradeData = {
55
70
  pm,
71
+ kind,
56
72
  current,
57
73
  latest: undefined,
58
- command,
74
+ ...(command !== undefined ? { command } : {}),
59
75
  offline: true,
60
76
  alreadyLatest: false,
61
77
  executed: false,
62
78
  };
63
79
  return gen(function* () {
64
- yield* $(
65
- warn("Could not reach the registry — skipped the update check."),
66
- );
80
+ yield* $(warn("Cannot reach the registry — skipped the update check."));
67
81
  return data;
68
82
  });
69
83
  }
@@ -71,9 +85,10 @@ export async function runUpgrade(
71
85
  if (registry.latest === current) {
72
86
  const data: UpgradeData = {
73
87
  pm,
88
+ kind,
74
89
  current,
75
90
  latest: registry.latest,
76
- command,
91
+ ...(command !== undefined ? { command } : {}),
77
92
  offline: false,
78
93
  alreadyLatest: true,
79
94
  executed: false,
@@ -84,20 +99,44 @@ export async function runUpgrade(
84
99
  });
85
100
  }
86
101
 
102
+ if (install.kind !== "global") {
103
+ // An update exists, but this install has no command pragma may run for
104
+ // it — say so honestly and run NOTHING. (The discriminant narrowing is
105
+ // what lets `updateGuidance` accept `install` here.)
106
+ const guidance = updateGuidance(install);
107
+ const data: UpgradeData = {
108
+ pm,
109
+ kind,
110
+ current,
111
+ latest: registry.latest,
112
+ guidance,
113
+ offline: false,
114
+ alreadyLatest: false,
115
+ executed: false,
116
+ };
117
+ return gen(function* () {
118
+ yield* $(info(`${current} → ${registry.latest}`));
119
+ yield* $(warn(`No automatic upgrade for this install: ${guidance}`));
120
+ return data;
121
+ });
122
+ }
123
+
124
+ const updateCommand = pmUpdateCommand(install, PRAGMA_PACKAGE);
87
125
  const data: UpgradeData = {
88
126
  pm,
127
+ kind,
89
128
  current,
90
129
  latest: registry.latest,
91
- command,
130
+ command: updateCommand,
92
131
  offline: false,
93
132
  alreadyLatest: false,
94
133
  executed: true,
95
134
  };
96
- const parts = command.split(" ");
135
+ const parts = updateCommand.split(" ");
97
136
  const bin = parts[0] ?? "npm";
98
137
  const args = parts.slice(1);
99
138
  // Guard the spawn: an absent package manager (`bin` not on PATH) REJECTS the
100
- // exec with ENOENT, which would collapse to INTERNAL_ERROR ("please report
139
+ // exec with ENOENT, which would collapse to INTERNAL_ERROR ("report
101
140
  // this issue"). Surface it as a named "`<pm>` not found on PATH" instead.
102
141
  return guardMissingBinary(
103
142
  bin,
@@ -112,7 +151,7 @@ export async function runUpgrade(
112
151
  // so inspect the result: a failed install (e.g. EACCES on a global
113
152
  // `npm i -g`) must fail loudly, not report a silent success.
114
153
  const result = yield* $(exec(bin, args, rt.cwd));
115
- assertExecOk(command, result);
154
+ assertExecOk(updateCommand, result);
116
155
  return data;
117
156
  }),
118
157
  );
@@ -2,16 +2,24 @@
2
2
  * Data shape for `pragma upgrade`.
3
3
  */
4
4
 
5
+ import type { InstallKind } from "../../kernel/render/vocabulary.js";
6
+
5
7
  /** The outcome of an upgrade run (or its plan). */
6
8
  export interface UpgradeData {
7
9
  /** The install-source label (e.g. `bun (global)`). */
8
10
  readonly pm: string;
11
+ /** The install-source state behind the label. */
12
+ readonly kind: InstallKind;
9
13
  /** The currently-installed version. */
10
14
  readonly current: string;
11
15
  /** The latest published version, or `undefined` when offline. */
12
16
  readonly latest: string | undefined;
13
- /** The package-manager command that applies the update. */
14
- readonly command: string;
17
+ /** The package-manager command that applies the update — only for a GLOBAL
18
+ * install; every other state carries {@link guidance} instead. */
19
+ readonly command?: string;
20
+ /** The honest sentence for an install with no sanctioned update command
21
+ * (linked / ephemeral / workspace / unknown). */
22
+ readonly guidance?: string;
15
23
  /** True when the registry could not be reached. */
16
24
  readonly offline: boolean;
17
25
  /** True when the installed version is already the latest. */
@@ -7,15 +7,15 @@
7
7
  */
8
8
 
9
9
  import chalk from "chalk";
10
- import type { Formatters } from "../../kernel/spec/types.js";
11
- import { PRAGMA_PACKAGE } from "../shared/registry.js";
10
+ import type { Formatters } from "../../kernel/spec/index.js";
11
+ import { PRAGMA_PACKAGE } from "../shared/index.js";
12
12
  import type { UpgradeData } from "./types.js";
13
13
 
14
14
  export const upgradeFormatters: Formatters<UpgradeData> = {
15
15
  plain(data) {
16
16
  const lines = [`Installed via: ${data.pm}`];
17
17
  if (data.offline) {
18
- lines.push("Could not reach the registry — try again later.");
18
+ lines.push("Cannot reach the registry — try again later.");
19
19
  return lines.join("\n");
20
20
  }
21
21
  if (data.alreadyLatest) {
@@ -33,20 +33,26 @@ export const upgradeFormatters: Formatters<UpgradeData> = {
33
33
  "",
34
34
  `Updated to ${data.latest}.`,
35
35
  );
36
- } else {
36
+ } else if (data.command) {
37
37
  lines.push(`Run: ${chalk.cyan(data.command)}`);
38
+ } else {
39
+ // No sanctioned command for this install (linked / ephemeral /
40
+ // workspace / unknown) — the guidance sentence is the whole story.
41
+ lines.push(`No automatic upgrade for this install: ${data.guidance}`);
38
42
  }
39
43
  return lines.join("\n");
40
44
  },
41
45
 
42
46
  llm(data) {
43
- if (data.offline)
44
- return "Upgrade check failed: could not reach the registry.";
47
+ if (data.offline) return "Upgrade check failed: cannot reach the registry.";
45
48
  if (data.alreadyLatest) {
46
49
  return `Already at the latest version (${data.current}).`;
47
50
  }
48
51
  if (data.executed) return `Upgraded: ${data.current} → ${data.latest}`;
49
- return `Update available: ${data.current} → ${data.latest} (\`${data.command}\`)`;
52
+ if (data.command) {
53
+ return `Update available: ${data.current} → ${data.latest} (\`${data.command}\`)`;
54
+ }
55
+ return `Update available: ${data.current} → ${data.latest} — ${data.guidance}`;
50
56
  },
51
57
 
52
58
  json(data) {
@@ -28,6 +28,7 @@ import {
28
28
  guardMissingBinary,
29
29
  isMissingBinaryError,
30
30
  } from "../shared/assertExecOk.js";
31
+ import type { InstallSource } from "../shared/index.js";
31
32
  import {
32
33
  checkRegistryVersion,
33
34
  REGISTRY_TIMEOUT_MS,
@@ -36,6 +37,22 @@ import { runUpgrade } from "./runUpgrade.js";
36
37
  import type { UpgradeData } from "./types.js";
37
38
  import { upgradeModule } from "./upgrade.verb.js";
38
39
 
40
+ // Pin the install-source detection: the real detector reads THIS process
41
+ // (whose entry is a source checkout — an honest `unknown` with no command,
42
+ // which would starve every update-needed case of its exec). Detection itself
43
+ // is covered by `shared/packageManager.test.ts`; here it is a fixture.
44
+ const detection = vi.hoisted(() => ({ install: undefined as unknown }));
45
+ vi.mock("../shared/index.js", async (importOriginal) => ({
46
+ ...(await importOriginal<object>()),
47
+ detectInstallSource: () => detection.install,
48
+ }));
49
+
50
+ const GLOBAL_NPM: InstallSource = {
51
+ kind: "global",
52
+ pm: "npm",
53
+ label: "npm (global)",
54
+ };
55
+
39
56
  const upgradeVerb = upgradeModule.verbs[0] as VerbSpec;
40
57
  const FLAGS_JSON: GlobalFlags = {
41
58
  llm: false,
@@ -71,6 +88,7 @@ let prevXdg: string | undefined;
71
88
  beforeEach(() => {
72
89
  prevXdg = process.env.XDG_CONFIG_HOME;
73
90
  process.env.XDG_CONFIG_HOME = tmpCwd();
91
+ detection.install = GLOBAL_NPM;
74
92
  });
75
93
  afterEach(() => {
76
94
  process.env.XDG_CONFIG_HOME = prevXdg;
@@ -181,6 +199,60 @@ describe("upgrade — update needed", () => {
181
199
  });
182
200
  });
183
201
 
202
+ describe("upgrade — a non-global install NEVER gets an exec (the headline)", () => {
203
+ const LINKED: InstallSource = {
204
+ kind: "linked",
205
+ pm: "npm",
206
+ target: "/home/u/code/pragma/packages/cli/pragma",
207
+ label: "npm link (development checkout)",
208
+ };
209
+
210
+ it("linked + update available: no command, no exec — guidance instead", async () => {
211
+ // The case that must never regress: `npm i -g` against an npm-linked
212
+ // install would OVERWRITE the symlink to the development worktree.
213
+ detection.install = LINKED;
214
+ stubRegistry("99.0.0");
215
+ const task = await runUpgrade(bootRuntime(FLAGS_JSON, tmpCwd()));
216
+ const { value, effects } = dryRun(task);
217
+ expect(value.executed).toBe(false);
218
+ expect(value.command).toBeUndefined();
219
+ expect(value.kind).toBe("linked");
220
+ expect(value.guidance).toMatch(/development checkout/i);
221
+ expect(effects.some((e) => e._tag === "Exec")).toBe(false);
222
+ });
223
+
224
+ it("--dry-run through dispatch plans NO Execute line for a linked install", async () => {
225
+ detection.install = LINKED;
226
+ stubRegistry("99.0.0");
227
+ const outcome = await executeVerb(
228
+ upgradeVerb,
229
+ {},
230
+ DRY,
231
+ bootRuntime(FLAGS_JSON, tmpCwd()),
232
+ );
233
+ const plan = JSON.parse(outcome.stdout as string).data.plan as string[];
234
+ expect(plan.some((line) => line.startsWith("Execute:"))).toBe(false);
235
+ expect(plan.some((line) => line.includes("No automatic upgrade"))).toBe(
236
+ true,
237
+ );
238
+ });
239
+
240
+ it("an ephemeral run reports its state with no command either", async () => {
241
+ detection.install = {
242
+ kind: "ephemeral",
243
+ runner: "npx",
244
+ label: "npx (ephemeral)",
245
+ } satisfies InstallSource;
246
+ stubRegistry("99.0.0");
247
+ const { value, effects } = dryRun(
248
+ await runUpgrade(bootRuntime(FLAGS_JSON, tmpCwd())),
249
+ );
250
+ expect(value.executed).toBe(false);
251
+ expect(value.command).toBeUndefined();
252
+ expect(effects.some((e) => e._tag === "Exec")).toBe(false);
253
+ });
254
+ });
255
+
184
256
  describe("assertExecOk — the exec-exitCode guard", () => {
185
257
  it("returns on a zero exit and throws an actionable UNSUPPORTED (with stderr) on nonzero", () => {
186
258
  expect(() =>
@@ -199,10 +271,10 @@ describe("assertExecOk — the exec-exitCode guard", () => {
199
271
  }
200
272
  const err = asPragmaError(thrown);
201
273
  // A denied `npm i -g` is user-fixable, NOT a bug — so it must not tell the
202
- // user to "please report this issue" (that is INTERNAL_ERROR's recovery).
274
+ // user to "report this issue" (that is INTERNAL_ERROR's recovery).
203
275
  expect(err.code).toBe("UNSUPPORTED");
204
276
  expect(err.recovery?.message).not.toContain("report this issue");
205
- expect(err.recovery?.message).toMatch(/permissions or network/i);
277
+ expect(err.recovery?.message).toMatch(/elevated privileges/i);
206
278
  // Surfaces the command + exit code + the captured stderr (trimmed).
207
279
  expect(err.message).toContain("npm i -g @canonical/pragma-cli");
208
280
  expect(err.message).toContain("code 13");
@@ -276,7 +348,7 @@ describe("upgrade — a failed exec maps to an actionable runtime error (exit 1)
276
348
 
277
349
  it("a missing-binary spawn (ENOENT) at a guarded site is a named UNSUPPORTED, not INTERNAL_ERROR", async () => {
278
350
  // The same wrapper `runUpgrade`/`setupLsp` apply: a spawn ENOENT REJECTS the
279
- // exec, which used to collapse to INTERNAL_ERROR ("please report this issue").
351
+ // exec, which used to collapse to INTERNAL_ERROR ("report this issue").
280
352
  // `guardMissingBinary` names it instead.
281
353
  const thrown = await runToError(
282
354
  failVerbWith((_p, rt) =>
@@ -16,7 +16,7 @@
16
16
  import type { Task } from "@canonical/task";
17
17
  import { BIN_NAME } from "../../constants.js";
18
18
  import { asVerb } from "../../kernel/spec/asVerb.js";
19
- import type { CapabilityModule, VerbSpec } from "../../kernel/spec/types.js";
19
+ import type { CapabilityModule, VerbSpec } from "../../kernel/spec/index.js";
20
20
  import type { UpgradeData } from "./types.js";
21
21
  import { upgradeFormatters } from "./upgrade.render.js";
22
22
 
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The `version` capability barrel — the command form of `--version`.
3
+ */
4
+
5
+ import type { CapabilityModule } from "../../kernel/spec/index.js";
6
+ import { versionVerbSpec } from "./version.verb.js";
7
+
8
+ /** The `version` capability module. */
9
+ export const versionModule: CapabilityModule = {
10
+ name: "version",
11
+ verbs: [versionVerbSpec],
12
+ };
@@ -0,0 +1,66 @@
1
+ /**
2
+ * `pragma version` — the command form of `--version`.
3
+ *
4
+ * The verb exists because users type it; the ONLY thing worth pinning is that
5
+ * it is not a second answer to the same question. The process-boundary cell
6
+ * compares the two spellings byte for byte through the shipped entry, so a
7
+ * change to either one that does not change the other reddens here. The rest
8
+ * pins the covenant slice and the storeless, tool-free shape.
9
+ */
10
+
11
+ import { describe, expect, it } from "vitest";
12
+ import { VERSION } from "../../constants.js";
13
+ import { executeVerb } from "../../kernel/project/cli/dispatch.js";
14
+ import { bootRuntime } from "../../kernel/runtime/boot.js";
15
+ import type { GlobalFlags } from "../../kernel/runtime/types.js";
16
+ import { emitVerb } from "../../kernel/spec/emitSurface.js";
17
+ import { runCli } from "../../testing/helpers/runCli.js";
18
+ import { versionModule } from "./index.js";
19
+
20
+ const FLAGS: GlobalFlags = {
21
+ llm: false,
22
+ autoLlm: false,
23
+ format: "plain",
24
+ verbose: false,
25
+ };
26
+ const REAL = { dryRun: false, undo: false, yes: false };
27
+ const versionVerb = versionModule.verbs[0];
28
+
29
+ describe("version — covenant-exact emission (PROTECTED)", () => {
30
+ it("emits a no-argument self-verb with NO tool", () => {
31
+ // The version already rides `info` and the MCP handshake's serverInfo, so
32
+ // a tool here would be a third way to ask one question.
33
+ expect(emitVerb(versionVerb)).toEqual({ v: "version", mcp: false });
34
+ });
35
+ });
36
+
37
+ describe("version — one value, two spellings of the same read", () => {
38
+ it("prints the version and never boots the store", async () => {
39
+ const rt = bootRuntime(FLAGS, process.cwd());
40
+ const outcome = await executeVerb(versionVerb, {}, REAL, rt);
41
+ expect(outcome.stdout).toBe(`${VERSION}\n`);
42
+ expect(outcome.exitCode).toBe(0);
43
+ expect(rt.store.booted).toBe(false);
44
+ });
45
+
46
+ it("json carries the value under a named field, not a bare scalar", async () => {
47
+ const outcome = await executeVerb(
48
+ versionVerb,
49
+ {},
50
+ REAL,
51
+ bootRuntime({ ...FLAGS, format: "json" }, process.cwd()),
52
+ );
53
+ expect(JSON.parse(outcome.stdout ?? "").data).toEqual({
54
+ version: VERSION,
55
+ });
56
+ });
57
+
58
+ it("the verb and the flag print the SAME bytes through the shipped entry", () => {
59
+ const fromVerb = runCli(["version"]);
60
+ const fromFlag = runCli(["--version"]);
61
+ expect(fromVerb.exitCode).toBe(0);
62
+ expect(fromFlag.exitCode).toBe(0);
63
+ expect(fromVerb.stdout).toBe(fromFlag.stdout);
64
+ expect(fromVerb.stdout).toBe(`${VERSION}\n`);
65
+ });
66
+ });