@canonical/pragma-cli 0.34.0 → 0.35.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 (798) hide show
  1. package/README.md +153 -30
  2. package/dist/.build-ok +0 -0
  3. package/dist/package.json +83 -0
  4. package/dist/pragma.conf.js +814 -0
  5. package/dist/pragma.conf.js.map +1 -0
  6. package/dist/src/bin.js +356 -0
  7. package/dist/src/bin.js.map +1 -0
  8. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  9. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  10. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  11. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  12. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  13. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  14. package/dist/src/capabilities/capabilities/hints.js +195 -0
  15. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  16. package/dist/src/capabilities/capabilities/index.js +11 -0
  17. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/types.js +11 -0
  19. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  20. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  21. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  22. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  23. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  24. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  25. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  26. package/dist/src/capabilities/colophon/index.js +5 -0
  27. package/dist/src/capabilities/colophon/index.js.map +1 -0
  28. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  29. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  30. package/dist/src/capabilities/colophon/types.js +10 -0
  31. package/dist/src/capabilities/colophon/types.js.map +1 -0
  32. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  33. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  34. package/dist/src/capabilities/config/field.render.js +22 -0
  35. package/dist/src/capabilities/config/field.render.js.map +1 -0
  36. package/dist/src/capabilities/config/fields.js +46 -0
  37. package/dist/src/capabilities/config/fields.js.map +1 -0
  38. package/dist/src/capabilities/config/get.verb.js +61 -0
  39. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  40. package/dist/src/capabilities/config/index.js +5 -0
  41. package/dist/src/capabilities/config/index.js.map +1 -0
  42. package/dist/src/capabilities/config/runField.js +59 -0
  43. package/dist/src/capabilities/config/runField.js.map +1 -0
  44. package/dist/src/capabilities/config/runGet.js +28 -0
  45. package/dist/src/capabilities/config/runGet.js.map +1 -0
  46. package/dist/src/capabilities/config/runSet.js +53 -0
  47. package/dist/src/capabilities/config/runSet.js.map +1 -0
  48. package/dist/src/capabilities/config/set.verb.js +66 -0
  49. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/show.render.js +84 -0
  51. package/dist/src/capabilities/config/show.render.js.map +1 -0
  52. package/dist/src/capabilities/config/show.verb.js +44 -0
  53. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  54. package/dist/src/capabilities/config/types.js +5 -0
  55. package/dist/src/capabilities/config/types.js.map +1 -0
  56. package/dist/src/capabilities/config/unset.verb.js +49 -0
  57. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  58. package/dist/src/capabilities/create/cliProjection.js +195 -0
  59. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  60. package/dist/src/capabilities/create/constants.js +47 -0
  61. package/dist/src/capabilities/create/constants.js.map +1 -0
  62. package/dist/src/capabilities/create/create.render.js +100 -0
  63. package/dist/src/capabilities/create/create.render.js.map +1 -0
  64. package/dist/src/capabilities/create/create.verb.js +438 -0
  65. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  66. package/dist/src/capabilities/create/createHelp.js +47 -0
  67. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  68. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  69. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  70. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  71. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  72. package/dist/src/capabilities/create/index.js +18 -0
  73. package/dist/src/capabilities/create/index.js.map +1 -0
  74. package/dist/src/capabilities/create/messages.js +16 -0
  75. package/dist/src/capabilities/create/messages.js.map +1 -0
  76. package/dist/src/capabilities/create/mount.js +293 -0
  77. package/dist/src/capabilities/create/mount.js.map +1 -0
  78. package/dist/src/capabilities/create/pathJail.js +65 -0
  79. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  80. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  81. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  82. package/dist/src/capabilities/create/types.js +2 -0
  83. package/dist/src/capabilities/create/types.js.map +1 -0
  84. package/dist/src/capabilities/distribution.js +40 -0
  85. package/dist/src/capabilities/distribution.js.map +1 -0
  86. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  87. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  88. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  89. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  90. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
  91. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  92. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  93. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  94. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  95. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  97. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  99. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
  101. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  102. package/dist/src/capabilities/doctor/doctor.render.js +185 -0
  103. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  104. package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
  105. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  106. package/dist/src/capabilities/doctor/index.js +5 -0
  107. package/dist/src/capabilities/doctor/index.js.map +1 -0
  108. package/dist/src/capabilities/doctor/runChecks.js +83 -0
  109. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  110. package/dist/src/capabilities/doctor/types.js +5 -0
  111. package/dist/src/capabilities/doctor/types.js.map +1 -0
  112. package/dist/src/capabilities/graph/index.js +19 -0
  113. package/dist/src/capabilities/graph/index.js.map +1 -0
  114. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  115. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  116. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  117. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  118. package/dist/src/capabilities/graph/query.render.js +73 -0
  119. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  120. package/dist/src/capabilities/graph/query.verb.js +49 -0
  121. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  122. package/dist/src/capabilities/graph/runQuery.js +41 -0
  123. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  124. package/dist/src/capabilities/index.js +56 -0
  125. package/dist/src/capabilities/index.js.map +1 -0
  126. package/dist/src/capabilities/info/collectInfo.js +66 -0
  127. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  128. package/dist/src/capabilities/info/index.js +5 -0
  129. package/dist/src/capabilities/info/index.js.map +1 -0
  130. package/dist/src/capabilities/info/info.render.js +53 -0
  131. package/dist/src/capabilities/info/info.render.js.map +1 -0
  132. package/dist/src/capabilities/info/info.verb.js +42 -0
  133. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  134. package/dist/src/capabilities/info/types.js +5 -0
  135. package/dist/src/capabilities/info/types.js.map +1 -0
  136. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  137. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  138. package/dist/src/capabilities/meta/index.js +13 -0
  139. package/dist/src/capabilities/meta/index.js.map +1 -0
  140. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  141. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  142. package/dist/src/capabilities/ontology/index.js +21 -0
  143. package/dist/src/capabilities/ontology/index.js.map +1 -0
  144. package/dist/src/capabilities/ontology/queries.js +123 -0
  145. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  146. package/dist/src/capabilities/ontology/render.js +66 -0
  147. package/dist/src/capabilities/ontology/render.js.map +1 -0
  148. package/dist/src/capabilities/ontology/verbs.js +181 -0
  149. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  150. package/dist/src/capabilities/prompt/index.js +16 -0
  151. package/dist/src/capabilities/prompt/index.js.map +1 -0
  152. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  153. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  154. package/dist/src/capabilities/prompt/types.js +10 -0
  155. package/dist/src/capabilities/prompt/types.js.map +1 -0
  156. package/dist/src/capabilities/prompt/verbs.js +93 -0
  157. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  158. package/dist/src/capabilities/resources/index.js +10 -0
  159. package/dist/src/capabilities/resources/index.js.map +1 -0
  160. package/dist/src/capabilities/resources/provider.js +423 -0
  161. package/dist/src/capabilities/resources/provider.js.map +1 -0
  162. package/dist/src/capabilities/setup/buildPlan.js +168 -0
  163. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  164. package/dist/src/capabilities/setup/index.js +5 -0
  165. package/dist/src/capabilities/setup/index.js.map +1 -0
  166. package/dist/src/capabilities/setup/mode.js +53 -0
  167. package/dist/src/capabilities/setup/mode.js.map +1 -0
  168. package/dist/src/capabilities/setup/operations/index.js +39 -0
  169. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  170. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  171. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  172. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  173. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  174. package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
  175. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  176. package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
  177. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  178. package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
  179. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
  181. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  182. package/dist/src/capabilities/setup/plan.js +128 -0
  183. package/dist/src/capabilities/setup/plan.js.map +1 -0
  184. package/dist/src/capabilities/setup/plan.render.js +193 -0
  185. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  186. package/dist/src/capabilities/setup/setup.render.js +54 -0
  187. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  188. package/dist/src/capabilities/setup/setup.verb.js +334 -0
  189. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  190. package/dist/src/capabilities/setup/shell.js +196 -0
  191. package/dist/src/capabilities/setup/shell.js.map +1 -0
  192. package/dist/src/capabilities/setup/targets.js +263 -0
  193. package/dist/src/capabilities/setup/targets.js.map +1 -0
  194. package/dist/src/capabilities/setup/types.js +5 -0
  195. package/dist/src/capabilities/setup/types.js.map +1 -0
  196. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  197. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  198. package/dist/src/capabilities/shared/bands.js +16 -0
  199. package/dist/src/capabilities/shared/bands.js.map +1 -0
  200. package/dist/src/capabilities/shared/index.js +26 -0
  201. package/dist/src/capabilities/shared/index.js.map +1 -0
  202. package/dist/src/capabilities/shared/packageManager.js +103 -0
  203. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  204. package/dist/src/capabilities/shared/registry.js +55 -0
  205. package/dist/src/capabilities/shared/registry.js.map +1 -0
  206. package/dist/src/capabilities/skill/discover.js +195 -0
  207. package/dist/src/capabilities/skill/discover.js.map +1 -0
  208. package/dist/src/capabilities/skill/index.js +10 -0
  209. package/dist/src/capabilities/skill/index.js.map +1 -0
  210. package/dist/src/capabilities/skill/render.js +49 -0
  211. package/dist/src/capabilities/skill/render.js.map +1 -0
  212. package/dist/src/capabilities/skill/verbs.js +83 -0
  213. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  214. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  215. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  216. package/dist/src/capabilities/sources/index.js +13 -0
  217. package/dist/src/capabilities/sources/index.js.map +1 -0
  218. package/dist/src/capabilities/sources/installSkills.js +167 -0
  219. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  220. package/dist/src/capabilities/sources/runUpdate.js +394 -0
  221. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  222. package/dist/src/capabilities/sources/status.render.js +64 -0
  223. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  224. package/dist/src/capabilities/sources/status.verb.js +40 -0
  225. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  226. package/dist/src/capabilities/sources/types.js +6 -0
  227. package/dist/src/capabilities/sources/types.js.map +1 -0
  228. package/dist/src/capabilities/sources/update.render.js +34 -0
  229. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  230. package/dist/src/capabilities/sources/update.verb.js +55 -0
  231. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  232. package/dist/src/capabilities/upgrade/index.js +5 -0
  233. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  234. package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
  235. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  236. package/dist/src/capabilities/upgrade/types.js +5 -0
  237. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  238. package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
  239. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  240. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  241. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  242. package/dist/src/capabilities/version/index.js +10 -0
  243. package/dist/src/capabilities/version/index.js.map +1 -0
  244. package/dist/src/capabilities/version/version.verb.js +36 -0
  245. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  246. package/dist/src/constants.js +82 -0
  247. package/dist/src/constants.js.map +1 -0
  248. package/dist/src/index.js +12 -0
  249. package/dist/src/index.js.map +1 -0
  250. package/dist/src/kernel/completion/complete.js +66 -0
  251. package/dist/src/kernel/completion/complete.js.map +1 -0
  252. package/dist/src/kernel/completion/emitScripts.js +92 -0
  253. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  254. package/dist/src/kernel/completion/entitySource.js +285 -0
  255. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  256. package/dist/src/kernel/completion/index.js +14 -0
  257. package/dist/src/kernel/completion/index.js.map +1 -0
  258. package/dist/src/kernel/completion/model.js +301 -0
  259. package/dist/src/kernel/completion/model.js.map +1 -0
  260. package/dist/src/kernel/completion/parse.js +253 -0
  261. package/dist/src/kernel/completion/parse.js.map +1 -0
  262. package/dist/src/kernel/completion/rank.js +101 -0
  263. package/dist/src/kernel/completion/rank.js.map +1 -0
  264. package/dist/src/kernel/completion/resolve.js +100 -0
  265. package/dist/src/kernel/completion/resolve.js.map +1 -0
  266. package/dist/src/kernel/completion/templates/bash.js +209 -0
  267. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  268. package/dist/src/kernel/completion/templates/fish.js +214 -0
  269. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  270. package/dist/src/kernel/completion/templates/index.js +23 -0
  271. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  272. package/dist/src/kernel/completion/templates/shared.js +98 -0
  273. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  274. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  275. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  276. package/dist/src/kernel/completion/types.js +13 -0
  277. package/dist/src/kernel/completion/types.js.map +1 -0
  278. package/dist/src/kernel/config/defaults.js +17 -0
  279. package/dist/src/kernel/config/defaults.js.map +1 -0
  280. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  281. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  282. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  283. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  284. package/dist/src/kernel/config/firstRun.js +34 -0
  285. package/dist/src/kernel/config/firstRun.js.map +1 -0
  286. package/dist/src/kernel/config/globalConfig.js +79 -0
  287. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  288. package/dist/src/kernel/config/index.js +16 -0
  289. package/dist/src/kernel/config/index.js.map +1 -0
  290. package/dist/src/kernel/config/paths.js +35 -0
  291. package/dist/src/kernel/config/paths.js.map +1 -0
  292. package/dist/src/kernel/config/readConfig.js +78 -0
  293. package/dist/src/kernel/config/readConfig.js.map +1 -0
  294. package/dist/src/kernel/config/schema.js +130 -0
  295. package/dist/src/kernel/config/schema.js.map +1 -0
  296. package/dist/src/kernel/config/types.js +19 -0
  297. package/dist/src/kernel/config/types.js.map +1 -0
  298. package/dist/src/kernel/config/writeConfigField.js +59 -0
  299. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  300. package/dist/src/kernel/copy.js +43 -0
  301. package/dist/src/kernel/copy.js.map +1 -0
  302. package/dist/src/kernel/error/PragmaError.js +149 -0
  303. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  304. package/dist/src/kernel/error/constants.js +40 -0
  305. package/dist/src/kernel/error/constants.js.map +1 -0
  306. package/dist/src/kernel/error/fromTaskError.js +96 -0
  307. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  308. package/dist/src/kernel/error/index.js +13 -0
  309. package/dist/src/kernel/error/index.js.map +1 -0
  310. package/dist/src/kernel/error/recovery.js +52 -0
  311. package/dist/src/kernel/error/recovery.js.map +1 -0
  312. package/dist/src/kernel/error/renderError.js +115 -0
  313. package/dist/src/kernel/error/renderError.js.map +1 -0
  314. package/dist/src/kernel/error/serialize.js +25 -0
  315. package/dist/src/kernel/error/serialize.js.map +1 -0
  316. package/dist/src/kernel/error/types.js +9 -0
  317. package/dist/src/kernel/error/types.js.map +1 -0
  318. package/dist/src/kernel/index.js +25 -0
  319. package/dist/src/kernel/index.js.map +1 -0
  320. package/dist/src/kernel/packs/collect.js +187 -0
  321. package/dist/src/kernel/packs/collect.js.map +1 -0
  322. package/dist/src/kernel/packs/compile.js +304 -0
  323. package/dist/src/kernel/packs/compile.js.map +1 -0
  324. package/dist/src/kernel/packs/disclosure.js +76 -0
  325. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  326. package/dist/src/kernel/packs/glob.js +38 -0
  327. package/dist/src/kernel/packs/glob.js.map +1 -0
  328. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  329. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  330. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  331. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  332. package/dist/src/kernel/packs/graphql/index.js +20 -0
  333. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  334. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  335. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  336. package/dist/src/kernel/packs/index.js +34 -0
  337. package/dist/src/kernel/packs/index.js.map +1 -0
  338. package/dist/src/kernel/packs/iri.js +110 -0
  339. package/dist/src/kernel/packs/iri.js.map +1 -0
  340. package/dist/src/kernel/packs/renderPack.js +129 -0
  341. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  342. package/dist/src/kernel/packs/resolveEntity.js +223 -0
  343. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  344. package/dist/src/kernel/packs/runBodies.js +87 -0
  345. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  346. package/dist/src/kernel/packs/sample.js +56 -0
  347. package/dist/src/kernel/packs/sample.js.map +1 -0
  348. package/dist/src/kernel/packs/schema.js +369 -0
  349. package/dist/src/kernel/packs/schema.js.map +1 -0
  350. package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
  351. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  352. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  353. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  354. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
  355. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  356. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  357. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  358. package/dist/src/kernel/packs/sparql/index.js +31 -0
  359. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  360. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  361. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  362. package/dist/src/kernel/packs/types.js +30 -0
  363. package/dist/src/kernel/packs/types.js.map +1 -0
  364. package/dist/src/kernel/packs/uniqueness.js +30 -0
  365. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  366. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  367. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  368. package/dist/src/kernel/project/cli/constants.js +27 -0
  369. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  370. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  371. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  372. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  373. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  374. package/dist/src/kernel/project/cli/globalFlags.js +216 -0
  375. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  376. package/dist/src/kernel/project/cli/helpFormat.js +59 -0
  377. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  378. package/dist/src/kernel/project/cli/index.js +14 -0
  379. package/dist/src/kernel/project/cli/index.js.map +1 -0
  380. package/dist/src/kernel/project/cli/rootHelp.js +197 -0
  381. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  382. package/dist/src/kernel/project/cli/suggest.js +75 -0
  383. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  384. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  385. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  386. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  387. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  388. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  389. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  390. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  391. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  392. package/dist/src/kernel/project/mcp/index.js +8 -0
  393. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  394. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  395. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  396. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  397. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  398. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  399. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  401. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  403. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
  405. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/serve.js +35 -0
  407. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  408. package/dist/src/kernel/render/compactUri.js +24 -0
  409. package/dist/src/kernel/render/compactUri.js.map +1 -0
  410. package/dist/src/kernel/render/contracts.js +10 -0
  411. package/dist/src/kernel/render/contracts.js.map +1 -0
  412. package/dist/src/kernel/render/disclosure.js +34 -0
  413. package/dist/src/kernel/render/disclosure.js.map +1 -0
  414. package/dist/src/kernel/render/envelope.js +30 -0
  415. package/dist/src/kernel/render/envelope.js.map +1 -0
  416. package/dist/src/kernel/render/formatters.js +27 -0
  417. package/dist/src/kernel/render/formatters.js.map +1 -0
  418. package/dist/src/kernel/render/index.js +15 -0
  419. package/dist/src/kernel/render/index.js.map +1 -0
  420. package/dist/src/kernel/render/prefixes.js +46 -0
  421. package/dist/src/kernel/render/prefixes.js.map +1 -0
  422. package/dist/src/kernel/render/renderers.js +468 -0
  423. package/dist/src/kernel/render/renderers.js.map +1 -0
  424. package/dist/src/kernel/render/style.js +85 -0
  425. package/dist/src/kernel/render/style.js.map +1 -0
  426. package/dist/src/kernel/render/turtle.js +194 -0
  427. package/dist/src/kernel/render/turtle.js.map +1 -0
  428. package/dist/src/kernel/render/writeStdout.js +43 -0
  429. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  430. package/dist/src/kernel/runtime/boot.js +49 -0
  431. package/dist/src/kernel/runtime/boot.js.map +1 -0
  432. package/dist/src/kernel/runtime/facade.js +39 -0
  433. package/dist/src/kernel/runtime/facade.js.map +1 -0
  434. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  435. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  436. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  437. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  438. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  439. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  440. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  441. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  442. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  443. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  444. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  445. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  446. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  447. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  449. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  451. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  453. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  455. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  457. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  459. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  460. package/dist/src/kernel/runtime/index.js +8 -0
  461. package/dist/src/kernel/runtime/index.js.map +1 -0
  462. package/dist/src/kernel/runtime/loadSession.js +34 -0
  463. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  464. package/dist/src/kernel/runtime/paths.js +78 -0
  465. package/dist/src/kernel/runtime/paths.js.map +1 -0
  466. package/dist/src/kernel/runtime/probe.js +37 -0
  467. package/dist/src/kernel/runtime/probe.js.map +1 -0
  468. package/dist/src/kernel/runtime/readEntity.js +363 -0
  469. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  470. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  471. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  472. package/dist/src/kernel/runtime/refs/index.js +29 -0
  473. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  474. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  475. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  476. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  477. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  478. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  479. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  480. package/dist/src/kernel/runtime/store.js +75 -0
  481. package/dist/src/kernel/runtime/store.js.map +1 -0
  482. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  483. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  484. package/dist/src/kernel/runtime/types.js +11 -0
  485. package/dist/src/kernel/runtime/types.js.map +1 -0
  486. package/dist/src/kernel/spec/asVerb.js +21 -0
  487. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  488. package/dist/src/kernel/spec/emitReference.js +578 -0
  489. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  490. package/dist/src/kernel/spec/emitSurface.js +202 -0
  491. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  492. package/dist/src/kernel/spec/index.js +11 -0
  493. package/dist/src/kernel/spec/index.js.map +1 -0
  494. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  495. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  496. package/dist/src/kernel/spec/types.js +14 -0
  497. package/dist/src/kernel/spec/types.js.map +1 -0
  498. package/dist/src/kernel/spec/validate.js +110 -0
  499. package/dist/src/kernel/spec/validate.js.map +1 -0
  500. package/dist/src/kernel/vocabulary.js +97 -0
  501. package/dist/src/kernel/vocabulary.js.map +1 -0
  502. package/dist/src/types.js +11 -0
  503. package/dist/src/types.js.map +1 -0
  504. package/package.json +20 -22
  505. package/pragma.conf.ts +249 -60
  506. package/src/bin.ts +267 -82
  507. package/src/capabilities/block.parity.test.ts +6 -3
  508. package/src/capabilities/capabilities/capabilities.render.ts +1 -1
  509. package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
  510. package/src/capabilities/capabilities/catalog.ts +3 -3
  511. package/src/capabilities/capabilities/hints.ts +32 -7
  512. package/src/capabilities/capabilities/index.ts +1 -1
  513. package/src/capabilities/colophon/collectColophon.ts +35 -24
  514. package/src/capabilities/colophon/colophon.render.ts +25 -1
  515. package/src/capabilities/colophon/colophon.test.ts +42 -21
  516. package/src/capabilities/colophon/colophon.verb.ts +4 -4
  517. package/src/capabilities/config/collectConfigShow.test.ts +1 -0
  518. package/src/capabilities/config/collectConfigShow.ts +3 -3
  519. package/src/capabilities/config/field.render.ts +4 -5
  520. package/src/capabilities/config/fields.ts +17 -10
  521. package/src/capabilities/config/get.verb.ts +70 -0
  522. package/src/capabilities/config/getUnset.test.ts +264 -0
  523. package/src/capabilities/config/index.ts +5 -1
  524. package/src/capabilities/config/runField.ts +40 -22
  525. package/src/capabilities/config/runGet.ts +34 -0
  526. package/src/capabilities/config/runSet.ts +35 -9
  527. package/src/capabilities/config/set.test.ts +48 -14
  528. package/src/capabilities/config/set.verb.ts +8 -7
  529. package/src/capabilities/config/show.render.ts +1 -1
  530. package/src/capabilities/config/show.verb.ts +9 -6
  531. package/src/capabilities/config/types.ts +18 -4
  532. package/src/capabilities/config/unset.verb.ts +58 -0
  533. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  534. package/src/capabilities/create/byteEquality.test.ts +25 -11
  535. package/src/capabilities/create/cliProjection.ts +227 -0
  536. package/src/capabilities/create/constants.ts +36 -61
  537. package/src/capabilities/create/create.mcp.test.ts +89 -5
  538. package/src/capabilities/create/create.render.ts +71 -7
  539. package/src/capabilities/create/create.test.ts +433 -219
  540. package/src/capabilities/create/create.verb.ts +297 -328
  541. package/src/capabilities/create/createGrammar.test.ts +865 -0
  542. package/src/capabilities/create/createHelp.ts +71 -0
  543. package/src/capabilities/create/createSurface.generated.ts +400 -0
  544. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  545. package/src/capabilities/create/cwdJail.test.ts +24 -5
  546. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  547. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  548. package/src/capabilities/create/index.ts +7 -4
  549. package/src/capabilities/create/messages.ts +18 -0
  550. package/src/capabilities/create/mount.ts +391 -0
  551. package/src/capabilities/create/pathJail.test.ts +90 -0
  552. package/src/capabilities/create/pathJail.ts +8 -5
  553. package/src/capabilities/create/pickGenerator.ts +23 -35
  554. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  555. package/src/capabilities/create/types.ts +20 -0
  556. package/src/capabilities/distribution.test.ts +3 -1
  557. package/src/capabilities/distribution.ts +10 -15
  558. package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
  559. package/src/capabilities/doctor/checks/checkPackageRefs.ts +6 -4
  560. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
  561. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +72 -27
  562. package/src/capabilities/doctor/checks/checkShellCompletions.ts +59 -13
  563. package/src/capabilities/doctor/checks/index.ts +27 -0
  564. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  565. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  566. package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
  567. package/src/capabilities/doctor/doctor.render.test.ts +18 -7
  568. package/src/capabilities/doctor/doctor.render.ts +43 -19
  569. package/src/capabilities/doctor/doctor.test.ts +123 -34
  570. package/src/capabilities/doctor/doctor.verb.ts +3 -3
  571. package/src/capabilities/doctor/runChecks.ts +62 -63
  572. package/src/capabilities/doctor/types.ts +20 -4
  573. package/src/capabilities/emptyRecovery.test.ts +13 -8
  574. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  575. package/src/capabilities/graph/index.ts +1 -1
  576. package/src/capabilities/graph/inspect.render.ts +70 -22
  577. package/src/capabilities/graph/inspect.test.ts +260 -5
  578. package/src/capabilities/graph/inspect.verb.ts +18 -6
  579. package/src/capabilities/graph/query.render.ts +15 -3
  580. package/src/capabilities/graph/query.verb.ts +3 -3
  581. package/src/capabilities/graph/runQuery.ts +2 -3
  582. package/src/capabilities/index.ts +3 -1
  583. package/src/capabilities/info/collectInfo.ts +5 -4
  584. package/src/capabilities/info/info.render.ts +1 -1
  585. package/src/capabilities/info/info.verb.ts +1 -1
  586. package/src/capabilities/lazy.test.ts +32 -0
  587. package/src/capabilities/meta/complete.verb.ts +1 -1
  588. package/src/capabilities/meta/index.ts +1 -1
  589. package/src/capabilities/meta/mcp.verb.ts +10 -8
  590. package/src/capabilities/ontology/index.ts +15 -11
  591. package/src/capabilities/ontology/ontology.test.ts +6 -55
  592. package/src/capabilities/ontology/queries.ts +2 -2
  593. package/src/capabilities/ontology/render.ts +3 -4
  594. package/src/capabilities/ontology/verbs.ts +27 -68
  595. package/src/capabilities/prompt/index.ts +2 -2
  596. package/src/capabilities/prompt/prompt.render.ts +6 -2
  597. package/src/capabilities/prompt/types.ts +1 -1
  598. package/src/capabilities/prompt/verbs.ts +4 -5
  599. package/src/capabilities/reference.test.ts +63 -0
  600. package/src/capabilities/resources/provider.ts +342 -85
  601. package/src/capabilities/resources/resources.test.ts +355 -59
  602. package/src/capabilities/setup/buildPlan.ts +236 -0
  603. package/src/capabilities/setup/index.ts +7 -7
  604. package/src/capabilities/setup/mode.ts +74 -0
  605. package/src/capabilities/setup/operations/index.ts +74 -0
  606. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  607. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  608. package/src/capabilities/setup/operations/setupGenerator.ts +396 -326
  609. package/src/capabilities/setup/operations/setupLsp.ts +329 -68
  610. package/src/capabilities/setup/operations/setupMcp.ts +137 -97
  611. package/src/capabilities/setup/operations/setupSkills.ts +336 -108
  612. package/src/capabilities/setup/plan.render.ts +241 -0
  613. package/src/capabilities/setup/plan.ts +236 -0
  614. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  615. package/src/capabilities/setup/setup.render.test.ts +281 -73
  616. package/src/capabilities/setup/setup.render.ts +45 -77
  617. package/src/capabilities/setup/setup.test.ts +972 -209
  618. package/src/capabilities/setup/setup.verb.ts +223 -71
  619. package/src/capabilities/setup/shell.test.ts +86 -0
  620. package/src/capabilities/setup/shell.ts +137 -11
  621. package/src/capabilities/setup/targets.ts +367 -0
  622. package/src/capabilities/setup/types.ts +18 -57
  623. package/src/capabilities/shared/assertExecOk.ts +68 -10
  624. package/src/capabilities/shared/index.ts +32 -0
  625. package/src/capabilities/shared/packageManager.test.ts +55 -0
  626. package/src/capabilities/shared/packageManager.ts +62 -6
  627. package/src/capabilities/skill/discover.ts +37 -5
  628. package/src/capabilities/skill/index.ts +1 -1
  629. package/src/capabilities/skill/render.ts +10 -9
  630. package/src/capabilities/skill/skill.test.ts +7 -5
  631. package/src/capabilities/skill/verbs.ts +3 -4
  632. package/src/capabilities/sources/collectStatus.ts +7 -2
  633. package/src/capabilities/sources/index.ts +1 -1
  634. package/src/capabilities/sources/installSkills.ts +84 -7
  635. package/src/capabilities/sources/runUpdate.ts +53 -21
  636. package/src/capabilities/sources/sources.test.ts +154 -2
  637. package/src/capabilities/sources/status.render.ts +1 -1
  638. package/src/capabilities/sources/status.verb.ts +1 -1
  639. package/src/capabilities/sources/update.render.ts +1 -1
  640. package/src/capabilities/sources/update.verb.ts +1 -1
  641. package/src/capabilities/surface.test.ts +134 -17
  642. package/src/capabilities/upgrade/runUpgrade.ts +8 -8
  643. package/src/capabilities/upgrade/upgrade.render.ts +4 -5
  644. package/src/capabilities/upgrade/upgrade.test.ts +3 -3
  645. package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
  646. package/src/capabilities/version/index.ts +12 -0
  647. package/src/capabilities/version/version.test.ts +66 -0
  648. package/src/capabilities/version/version.verb.ts +39 -0
  649. package/src/constants.ts +31 -1
  650. package/src/identity.test.ts +40 -25
  651. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
  652. package/src/kernel/completion/complete.test.ts +12 -2
  653. package/src/kernel/completion/complete.ts +1 -1
  654. package/src/kernel/completion/emitScripts.ts +1 -1
  655. package/src/kernel/completion/entitySource.test.ts +1 -1
  656. package/src/kernel/completion/entitySource.ts +21 -8
  657. package/src/kernel/completion/model.test.ts +164 -12
  658. package/src/kernel/completion/model.ts +94 -14
  659. package/src/kernel/completion/parse.test.ts +4 -7
  660. package/src/kernel/completion/parse.ts +15 -0
  661. package/src/kernel/completion/resolve.test.ts +0 -1
  662. package/src/kernel/completion/safety.test.ts +34 -26
  663. package/src/kernel/completion/shellDrive.test.ts +28 -9
  664. package/src/kernel/completion/templates/bash.ts +7 -2
  665. package/src/kernel/completion/templates/index.ts +23 -0
  666. package/src/kernel/completion/types.ts +7 -0
  667. package/src/kernel/config/defaults.test.ts +25 -2
  668. package/src/kernel/config/defaults.ts +4 -3
  669. package/src/kernel/config/evaluateProjectConfig.ts +31 -8
  670. package/src/kernel/config/firstRun.test.ts +44 -38
  671. package/src/kernel/config/firstRun.ts +24 -88
  672. package/src/kernel/config/index.ts +1 -1
  673. package/src/kernel/config/readConfig.test.ts +6 -3
  674. package/src/kernel/config/readConfig.ts +1 -1
  675. package/src/kernel/config/schema.ts +3 -1
  676. package/src/kernel/config/types.ts +3 -1
  677. package/src/kernel/copy.test.ts +34 -4
  678. package/src/kernel/copy.ts +54 -0
  679. package/src/kernel/error/PragmaError.test.ts +5 -2
  680. package/src/kernel/error/PragmaError.ts +4 -2
  681. package/src/kernel/error/constants.ts +7 -5
  682. package/src/kernel/error/fromTaskError.ts +28 -6
  683. package/src/kernel/error/recovery.ts +14 -0
  684. package/src/kernel/error/renderError.ts +42 -1
  685. package/src/kernel/error/types.ts +21 -1
  686. package/src/kernel/index.ts +26 -0
  687. package/src/kernel/packs/collect.ts +12 -16
  688. package/src/kernel/packs/compile.test.ts +130 -1
  689. package/src/kernel/packs/compile.ts +93 -3
  690. package/src/kernel/packs/disclosure.ts +2 -2
  691. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  692. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
  693. package/src/kernel/packs/graphql/index.ts +20 -0
  694. package/src/kernel/packs/index.ts +40 -0
  695. package/src/kernel/packs/iri.test.ts +73 -0
  696. package/src/kernel/packs/iri.ts +66 -14
  697. package/src/kernel/packs/renderPack.ts +24 -5
  698. package/src/kernel/packs/resolveEntity.test.ts +213 -0
  699. package/src/kernel/packs/resolveEntity.ts +112 -18
  700. package/src/kernel/packs/runBodies.ts +2 -3
  701. package/src/kernel/packs/sample.ts +1 -1
  702. package/src/kernel/packs/schema.ts +18 -1
  703. package/src/kernel/packs/sparql/applyFilters.ts +16 -17
  704. package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
  705. package/src/kernel/packs/sparql/index.ts +37 -0
  706. package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
  707. package/src/kernel/packs/sparql/runSelect.ts +3 -4
  708. package/src/kernel/packs/toolDescription.test.ts +42 -3
  709. package/src/kernel/packs/types.ts +13 -0
  710. package/src/kernel/packs/uniqueness.ts +1 -1
  711. package/src/kernel/project/cli/buildProgram.test.ts +147 -12
  712. package/src/kernel/project/cli/buildProgram.ts +77 -18
  713. package/src/kernel/project/cli/constants.ts +34 -0
  714. package/src/kernel/project/cli/dispatch.test.ts +160 -3
  715. package/src/kernel/project/cli/dispatch.ts +222 -42
  716. package/src/kernel/project/cli/exitCodes.ts +1 -1
  717. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  718. package/src/kernel/project/cli/globalFlags.ts +130 -30
  719. package/src/kernel/project/cli/helpFormat.ts +13 -0
  720. package/src/kernel/project/cli/rootHelp.ts +41 -12
  721. package/src/kernel/project/cli/suggest.test.ts +33 -1
  722. package/src/kernel/project/cli/suggest.ts +25 -1
  723. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  724. package/src/kernel/project/cli/verbHelp.ts +23 -7
  725. package/src/kernel/project/mcp/buildServer.ts +7 -4
  726. package/src/kernel/project/mcp/envelope.ts +2 -2
  727. package/src/kernel/project/mcp/instructions.ts +2 -2
  728. package/src/kernel/project/mcp/mcpError.ts +1 -1
  729. package/src/kernel/project/mcp/parity.test.ts +5 -2
  730. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  731. package/src/kernel/project/mcp/prompts/source.ts +2 -2
  732. package/src/kernel/project/mcp/registerVerb.ts +35 -9
  733. package/src/kernel/project/mcp/serve.ts +2 -2
  734. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  735. package/src/kernel/render/contracts.ts +21 -0
  736. package/src/kernel/render/envelope.ts +2 -3
  737. package/src/kernel/render/formatters.ts +1 -1
  738. package/src/kernel/render/renderers.test.ts +243 -6
  739. package/src/kernel/render/renderers.ts +222 -20
  740. package/src/kernel/render/style.test.ts +75 -24
  741. package/src/kernel/render/style.ts +31 -1
  742. package/src/kernel/render/turtle.ts +222 -0
  743. package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
  744. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
  745. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
  746. package/src/kernel/runtime/graphpack/embedded.ts +3 -3
  747. package/src/kernel/runtime/graphpack/manifest.ts +1 -1
  748. package/src/kernel/runtime/graphpack/read.ts +1 -2
  749. package/src/kernel/runtime/loadSession.ts +1 -1
  750. package/src/kernel/runtime/probe.ts +6 -6
  751. package/src/kernel/runtime/readEntity.ts +472 -28
  752. package/src/kernel/runtime/refs/index.ts +39 -0
  753. package/src/kernel/runtime/refs/parseRef.ts +2 -2
  754. package/src/kernel/runtime/refs/resolve.ts +4 -4
  755. package/src/kernel/runtime/storeReadiness.ts +1 -2
  756. package/src/kernel/runtime/types.ts +15 -1
  757. package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
  758. package/src/kernel/spec/emitReference.ts +105 -30
  759. package/src/kernel/spec/emitSurface.ts +48 -6
  760. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  761. package/src/kernel/spec/types.ts +248 -4
  762. package/src/testing/behavioral/docExamples.test.ts +14 -0
  763. package/src/testing/behavioral/errorMatrix.mcp.test.ts +2 -2
  764. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  765. package/src/testing/behavioral/journeys.cli.test.ts +1 -1
  766. package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
  767. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  768. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  769. package/src/testing/behavioral/journeys.packageStories.test.ts +4 -4
  770. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  771. package/src/testing/behavioral/mcpSurface.test.ts +1 -1
  772. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  773. package/src/testing/eval/cases/effectful.ts +3 -2
  774. package/src/testing/fixtures/blockGraph.ts +79 -0
  775. package/src/testing/fixtures/graph/canonical.ts +88 -2
  776. package/src/testing/fixtures/graph/defaultPack.ts +1 -1
  777. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  778. package/src/testing/helpers/projectMcp.ts +32 -6
  779. package/src/testing/helpers/runCli.ts +35 -18
  780. package/src/testing/perf/budgets.test.ts +20 -9
  781. package/src/testing/perf/budgets.ts +58 -9
  782. package/src/testing/perf/codegen.test.ts +126 -0
  783. package/src/testing/perf/globalSetup.test.ts +286 -0
  784. package/src/testing/perf/globalSetup.ts +505 -23
  785. package/src/testing/perf/measure.test.ts +38 -0
  786. package/src/testing/perf/measure.ts +23 -4
  787. package/src/testing/setupXdgIsolation.ts +81 -21
  788. package/src/testing/tempRoot.globalSetup.ts +122 -0
  789. package/dist/pragma +0 -0
  790. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
  791. package/src/capabilities/create/templates.embedded.generated.ts +0 -28
  792. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
  793. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  794. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
  795. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
  796. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  797. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  798. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
@@ -31,22 +31,24 @@ import {
31
31
  writeFile,
32
32
  } from "@canonical/task";
33
33
  import { VERSION } from "../../constants.js";
34
- import { PragmaError } from "../../kernel/error/PragmaError.js";
35
- import { cliRecovery } from "../../kernel/error/recovery.js";
34
+ import { cliRecovery, PragmaError } from "../../kernel/error/index.js";
35
+ // DIRECT LEAF IMPORT, not `graphpack/index.js`. The barrel re-exports
36
+ // `embedded.ts`, which statically imports the ~1.9 MB generated pack — and
37
+ // with per-file `tsc` output ESM evaluates that re-export when this module
38
+ // loads. `sources update` builds a USER pack; it must not pay the embedded
39
+ // pack's cost to do it.
36
40
  import { buildPack } from "../../kernel/runtime/graphpack/build.js";
41
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
37
42
  import { activePackPath, readActivePack } from "../../kernel/runtime/paths.js";
38
- import type { PackageRef } from "../../kernel/runtime/refs/parseRef.js";
39
- import {
40
- parsePackDeclaration,
41
- redactUrl,
42
- } from "../../kernel/runtime/refs/parseRef.js";
43
+ import type { PackageRef } from "../../kernel/runtime/refs/index.js";
43
44
  import {
44
45
  detectPrefixClashes,
45
46
  harvestPrefixes,
47
+ parsePackDeclaration,
46
48
  type ResolvedPackage,
49
+ redactUrl,
47
50
  resolvePackage,
48
- } from "../../kernel/runtime/refs/resolve.js";
49
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
51
+ } from "../../kernel/runtime/refs/index.js";
50
52
  import { installedSkillsDir } from "../skill/discover.js";
51
53
  import { planSkillInstall } from "./installSkills.js";
52
54
  import type { SourcesUpdateData } from "./types.js";
@@ -209,17 +211,17 @@ export async function buildUpdateTask(
209
211
  // prefix. Display-only, so a warning (not a hard failure) is the right call.
210
212
  for (const clash of detectPrefixClashes(inputs)) {
211
213
  report?.(
212
- `Prefix "${clash.label}:" is declared with conflicting IRIs across packages (${clash.iris.join(" vs ")}); last wins, so some entities may compact to the wrong prefix.`,
214
+ `Prefix "${clash.label}:" is declared with conflicting IRIs across packs (${clash.iris.join(" vs ")}); last wins, so some entities may compact to the wrong prefix.`,
213
215
  );
214
216
  }
215
217
 
216
218
  report?.(`Building store from ${inputs.length} source(s)`);
217
219
  if (verbose) for (const input of inputs) report?.(` parse ${input.path}`);
218
220
  if (stories.length > 0)
219
- report?.(`Carrying ${stories.length} package read story file(s)`);
221
+ report?.(`Carrying ${stories.length} pack read story file(s)`);
220
222
 
221
223
  // Build the pack. On a parse/build failure, classify it as a NAMED data error
222
- // (U6) — not INTERNAL_ERROR's "please report this issue" — identifying the
224
+ // (U6) — not INTERNAL_ERROR's "report this issue" — identifying the
223
225
  // offending package source, since ke's parser error carries only line/column.
224
226
  // With `--skip-invalid`, drop the unparseable sources (warning LOUDLY about
225
227
  // each — never a silent partial graph) and build from the rest instead of
@@ -262,7 +264,7 @@ export async function buildUpdateTask(
262
264
  );
263
265
  if (usableInputs.length === 0)
264
266
  throw PragmaError.configError(
265
- `All ${inputs.length} configured source(s) failed to parse — nothing to build.`,
267
+ `None of the ${inputs.length} configured source(s) can be parsed — nothing to build.`,
266
268
  {
267
269
  recovery: cliRecovery(
268
270
  "sources update --verbose",
@@ -299,7 +301,7 @@ export async function buildUpdateTask(
299
301
  {
300
302
  recovery: cliRecovery(
301
303
  "sources update --verbose",
302
- "Check that the package sources actually contain RDF triples, then re-run.",
304
+ "Check that the pack sources actually contain RDF triples, then re-run.",
303
305
  ),
304
306
  },
305
307
  );
@@ -322,13 +324,24 @@ export async function buildUpdateTask(
322
324
 
323
325
  // Install package-provided skills (U10): symlink each resolved package's
324
326
  // `skills/*` into the installed-skills root, so `skill list` / `setup skills`
325
- // see them after an update. Kept in this Task (reversible: created links carry
326
- // an unlink undo) so `sources update --undo` also removes them.
327
- const skillLinks = planSkillInstall(resolved).filter(
328
- (link) => link.action !== "skipped",
327
+ // see them after an update — and RETIRE the links of skills those packages
328
+ // have since dropped, which the same plan reports as `pruned`. Kept in this
329
+ // Task (reversible: a created link carries an unlink undo, a pruned one a
330
+ // re-link undo) so `sources update --undo` restores the root as it was.
331
+ //
332
+ // The two are split, not counted together: a prune is a deletion, so folding
333
+ // it into "Installing N skill(s)" would report a removal as an install.
334
+ const skillPlan = planSkillInstall(resolved);
335
+ const skillLinks = skillPlan.filter(
336
+ (link) => link.action === "created" || link.action === "replaced",
329
337
  );
338
+ const staleLinks = skillPlan.filter((link) => link.action === "pruned");
330
339
  if (skillLinks.length > 0)
331
340
  report?.(`Installing ${skillLinks.length} skill(s)`);
341
+ if (staleLinks.length > 0)
342
+ report?.(
343
+ `Removing ${staleLinks.length} skill link(s) no longer provided by any package`,
344
+ );
332
345
 
333
346
  report?.(`Pointing ${runtime.cwd} at pack ${built.contentHash.slice(0, 12)}`);
334
347
  return gen(function* () {
@@ -344,6 +357,25 @@ export async function buildUpdateTask(
344
357
  );
345
358
  }
346
359
  }
360
+ // No `mkdir` guard here: a stale link can only have been enumerated FROM
361
+ // the installed root, so the root necessarily exists.
362
+ //
363
+ // The undo re-creates the link exactly as found — dangling target and all —
364
+ // because undo's job is to restore the prior state, not to improve on it. It
365
+ // clears the path first because the undo interpreter MOCKS forward effects
366
+ // when collecting: the delete above may never have run, and `fs.symlink`
367
+ // refuses a path that already exists. Same delete-then-link shape the
368
+ // `replaced` branch above uses, for the same reason.
369
+ for (const stale of staleLinks) {
370
+ yield* $(
371
+ deleteFile(stale.linkPath, {
372
+ undo: gen(function* () {
373
+ yield* $(deleteFile(stale.linkPath));
374
+ yield* $(symlink(stale.target, stale.linkPath));
375
+ }),
376
+ }),
377
+ );
378
+ }
347
379
  return data;
348
380
  });
349
381
  }
@@ -385,12 +417,12 @@ export async function classifySourceBuildError(
385
417
  const culprit = await isolateBadSource(inputs);
386
418
  const detail = culprit?.message ?? parserMessage;
387
419
  const where = culprit
388
- ? `Package source "${culprit.path}" could not be parsed`
389
- : "The configured package sources could not be built into a store";
420
+ ? `Pack source "${culprit.path}" cannot be parsed`
421
+ : "The configured packs cannot be built into a store";
390
422
  return PragmaError.configError(`${where}: ${detail}`, {
391
423
  recovery: cliRecovery(
392
424
  "sources update --verbose",
393
- "Re-run with --verbose to see each file as it parses. If a package ships malformed RDF, report it to that package's maintainer.",
425
+ "Re-run with --verbose to see each file as it parses. If a pack ships malformed RDF, report it to that pack's maintainer.",
394
426
  ),
395
427
  });
396
428
  }
@@ -1,9 +1,12 @@
1
1
  import { execFileSync } from "node:child_process";
2
2
  import {
3
3
  existsSync,
4
+ lstatSync,
4
5
  mkdirSync,
5
6
  mkdtempSync,
7
+ readdirSync,
6
8
  readFileSync,
9
+ readlinkSync,
7
10
  rmSync,
8
11
  symlinkSync,
9
12
  writeFileSync,
@@ -200,7 +203,7 @@ describe("sources update round-trip (PROTECTED)", () => {
200
203
  it("does not recurse into a symlinked directory cycle (L6 safety)", async () => {
201
204
  // The L6 fix follows symlinked FILES but must NOT recurse into a symlinked
202
205
  // DIRECTORY: a link to an ancestor dir is a cycle that, if walked, recurses
203
- // without bound → a stack-overflow RangeError (an INTERNAL "please report").
206
+ // without bound → a stack-overflow RangeError (an INTERNAL "report").
204
207
  // The real `.ttl` is still ingested and the build completes.
205
208
  const pkg = tmp("pragma-symlink-cycle-");
206
209
  mkdirSync(join(pkg, "definitions"), { recursive: true });
@@ -499,7 +502,7 @@ describe("sources update — data-failure classification (U6)", () => {
499
502
  expect(err.message).toContain("bad-pkg/definitions/broken.ttl");
500
503
  // … carries the parser's own detail …
501
504
  expect(err.message.toLowerCase()).toContain("parser error");
502
- // … and is NOT the internal-bug "please report this issue" path.
505
+ // … and is NOT the internal-bug "report this issue" path.
503
506
  expect(err.message).not.toContain("Internal error");
504
507
  expect(err.recovery?.message ?? "").not.toContain("report this issue");
505
508
  // The recovery points the user at a runnable, useful next step.
@@ -768,6 +771,155 @@ describe("sources update — installs package skills (U10)", () => {
768
771
 
769
772
  expect(existsSync(join(dataHome, "pragma", "skills", "bar"))).toBe(false);
770
773
  });
774
+
775
+ /** The installed-skills root, created so a prior install can be seeded into it. */
776
+ function installedRoot(): string {
777
+ const root = join(dataHome, "pragma", "skills");
778
+ mkdirSync(root, { recursive: true });
779
+ return root;
780
+ }
781
+
782
+ /** A symlink at `<installedRoot>/<name>` whose target does not exist. */
783
+ function danglingLink(root: string, name: string): string {
784
+ const target = join(tmp("pragma-uninstalled-"), "skills", name);
785
+ symlinkSync(target, join(root, name));
786
+ return target;
787
+ }
788
+
789
+ // The `@canonical/design-system` 0.2.0 regression: 0.1.2 shipped
790
+ // `component-specifier`, 0.2.0 deleted it in favour of `specify-component`,
791
+ // and every machine that had updated against 0.1.2 kept a symlink into a
792
+ // package directory that no longer exists.
793
+ it("prunes a link whose package dropped the skill", async () => {
794
+ const pkg = skillPackage("specify-component"); // the 0.2.0 shape
795
+ const root = installedRoot();
796
+ danglingLink(root, "component-specifier"); // what 0.1.2 left behind
797
+
798
+ const cwd = tmp("pragma-proj-");
799
+ const runtime = runtimeFor(cwd, [
800
+ { name: "design-system", source: `file://${pkg}` },
801
+ ]);
802
+ await runTask(await buildUpdateTask(runtime));
803
+
804
+ expect(readdirSync(root)).toEqual(["specify-component"]);
805
+ expect(discoverSkills(cwd).map((s) => s.name)).not.toContain(
806
+ "component-specifier",
807
+ );
808
+ });
809
+
810
+ it("spares a manually-installed skill and a foreign link that still resolves", async () => {
811
+ const pkg = skillPackage("specify-component");
812
+ const root = installedRoot();
813
+ danglingLink(root, "component-specifier");
814
+
815
+ // A hand-installed skill: a REAL directory, belonging to no package. The
816
+ // install pass already refuses to clobber these; so must the prune pass.
817
+ const manual = join(root, "hand-written");
818
+ mkdirSync(manual, { recursive: true });
819
+ writeFileSync(
820
+ join(manual, "SKILL.md"),
821
+ "---\nname: hand-written\ndescription: Mine.\n---\n",
822
+ );
823
+ // Someone's own link into a checkout this update knows nothing about, and
824
+ // which still resolves. Deliberately RELATIVE: a relative target is stored
825
+ // relative to the LINK's directory, so resolving it against anything else
826
+ // (the cwd, say) would read as broken and eat a perfectly live link.
827
+ const foreign = join(dataHome, "elsewhere", "my-own");
828
+ mkdirSync(foreign, { recursive: true });
829
+ writeFileSync(
830
+ join(foreign, "SKILL.md"),
831
+ "---\nname: my-own\ndescription: Theirs.\n---\n",
832
+ );
833
+ symlinkSync(join("..", "..", "elsewhere", "my-own"), join(root, "my-own"));
834
+
835
+ const cwd = tmp("pragma-proj-");
836
+ const runtime = runtimeFor(cwd, [
837
+ { name: "design-system", source: `file://${pkg}` },
838
+ ]);
839
+ await runTask(await buildUpdateTask(runtime));
840
+
841
+ // Only the dangling link went.
842
+ expect(readdirSync(root).sort()).toEqual([
843
+ "hand-written",
844
+ "my-own",
845
+ "specify-component",
846
+ ]);
847
+ expect(lstatSync(manual).isDirectory()).toBe(true);
848
+ expect(existsSync(join(manual, "SKILL.md"))).toBe(true);
849
+ expect(lstatSync(join(root, "my-own")).isSymbolicLink()).toBe(true);
850
+ expect(existsSync(join(root, "my-own"))).toBe(true); // still resolves
851
+ const found = discoverSkills(cwd).map((s) => s.name);
852
+ expect(found).toEqual(
853
+ expect.arrayContaining(["hand-written", "my-own", "specify-component"]),
854
+ );
855
+ });
856
+
857
+ it("re-points, rather than prunes, a dangling link the package still provides", async () => {
858
+ const pkg = skillPackage("foo");
859
+ const root = installedRoot();
860
+ danglingLink(root, "foo"); // e.g. the package moved to a new cache dir
861
+
862
+ const cwd = tmp("pragma-proj-");
863
+ const runtime = runtimeFor(cwd, [
864
+ { name: "pkg-a", source: `file://${pkg}` },
865
+ ]);
866
+ await runTask(await buildUpdateTask(runtime));
867
+
868
+ // `replaced`, never `pruned`: the prune pass skips every name this run
869
+ // planned, or it would delete the link the install pass just created.
870
+ expect(readlinkSync(join(root, "foo"))).toBe(join(pkg, "skills", "foo"));
871
+ expect(discoverSkills(cwd).map((s) => s.name)).toContain("foo");
872
+ });
873
+
874
+ it("is reversible — undo restores a pruned link, dangling target and all", async () => {
875
+ const pkg = skillPackage("specify-component");
876
+ const root = installedRoot();
877
+ const staleTarget = danglingLink(root, "component-specifier");
878
+ const link = join(root, "component-specifier");
879
+
880
+ const cwd = tmp("pragma-proj-");
881
+ const runtime = runtimeFor(cwd, [
882
+ { name: "design-system", source: `file://${pkg}` },
883
+ ]);
884
+ // The plan is made while the stale link is still there; `runUndo` MOCKS the
885
+ // forward effects, so stand in for the delete it would have performed.
886
+ const task = await buildUpdateTask(runtime);
887
+ rmSync(link);
888
+
889
+ const { runUndo } = await import("@canonical/task/node");
890
+ await runUndo(task);
891
+
892
+ expect(lstatSync(link).isSymbolicLink()).toBe(true);
893
+ expect(readlinkSync(link)).toBe(staleTarget); // the target it always had
894
+ });
895
+
896
+ it("undoes a prune whose forward delete never ran, rather than failing EEXIST", async () => {
897
+ const pkg = skillPackage("specify-component");
898
+ const root = installedRoot();
899
+ const staleTarget = danglingLink(root, "component-specifier");
900
+
901
+ const cwd = tmp("pragma-proj-");
902
+ const runtime = runtimeFor(cwd, [
903
+ { name: "design-system", source: `file://${pkg}` },
904
+ ]);
905
+ // No `rmSync` this time: the link is still in place when the undo re-links,
906
+ // and `fs.symlink` refuses an existing path — so the undo must clear it.
907
+ const { runUndo } = await import("@canonical/task/node");
908
+ await expect(runUndo(await buildUpdateTask(runtime))).resolves.toBeTruthy();
909
+
910
+ expect(readlinkSync(join(root, "component-specifier"))).toBe(staleTarget);
911
+ });
912
+
913
+ it("plans no prunes when nothing was ever installed", async () => {
914
+ const pkg = skillPackage("foo"); // $XDG_DATA_HOME/pragma/skills absent
915
+ const cwd = tmp("pragma-proj-");
916
+ const runtime = runtimeFor(cwd, [
917
+ { name: "pkg-a", source: `file://${pkg}` },
918
+ ]);
919
+ await runTask(await buildUpdateTask(runtime));
920
+
921
+ expect(readdirSync(join(dataHome, "pragma", "skills"))).toEqual(["foo"]);
922
+ });
771
923
  });
772
924
 
773
925
  describe("sources status — entityCount from the manifest (A10)", () => {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { BIN_NAME } from "../../constants.js";
6
6
  import { defaultStyle, type RenderStyle } from "../../kernel/render/style.js";
7
- import type { Formatters } from "../../kernel/spec/types.js";
7
+ import type { Formatters } from "../../kernel/spec/index.js";
8
8
  import type { SourcesStatusData } from "./types.js";
9
9
 
10
10
  /**
@@ -9,7 +9,7 @@
9
9
  */
10
10
 
11
11
  import { BIN_NAME } from "../../constants.js";
12
- import type { VerbSpec } from "../../kernel/spec/types.js";
12
+ import type { VerbSpec } from "../../kernel/spec/index.js";
13
13
  import { statusFormatters } from "./status.render.js";
14
14
  import type { SourcesStatusData } from "./types.js";
15
15
 
@@ -2,7 +2,7 @@
2
2
  * Formatters for `pragma sources update` — plain, llm, json.
3
3
  */
4
4
 
5
- import type { Formatters } from "../../kernel/spec/types.js";
5
+ import type { Formatters } from "../../kernel/spec/index.js";
6
6
  import type { SourcesUpdateData } from "./types.js";
7
7
 
8
8
  export const updateFormatters: Formatters<SourcesUpdateData> = {
@@ -14,7 +14,7 @@
14
14
 
15
15
  import type { Task } from "@canonical/task";
16
16
  import { BIN_NAME } from "../../constants.js";
17
- import type { VerbSpec } from "../../kernel/spec/types.js";
17
+ import type { VerbSpec } from "../../kernel/spec/index.js";
18
18
  import type { SourcesUpdateData } from "./types.js";
19
19
  import { updateFormatters } from "./update.render.js";
20
20
 
@@ -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([
@@ -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.
@@ -21,13 +21,15 @@
21
21
  */
22
22
 
23
23
  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";
24
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
26
25
  import {
26
+ assertExecOk,
27
+ checkRegistryVersion,
27
28
  detectInstallSource,
29
+ guardMissingBinary,
30
+ PRAGMA_PACKAGE,
28
31
  pmUpdateCommand,
29
- } from "../shared/packageManager.js";
30
- import { checkRegistryVersion, PRAGMA_PACKAGE } from "../shared/registry.js";
32
+ } from "../shared/index.js";
31
33
  import type { UpgradeData } from "./types.js";
32
34
 
33
35
  /**
@@ -61,9 +63,7 @@ export async function runUpgrade(
61
63
  executed: false,
62
64
  };
63
65
  return gen(function* () {
64
- yield* $(
65
- warn("Could not reach the registry — skipped the update check."),
66
- );
66
+ yield* $(warn("Cannot reach the registry — skipped the update check."));
67
67
  return data;
68
68
  });
69
69
  }
@@ -97,7 +97,7 @@ export async function runUpgrade(
97
97
  const bin = parts[0] ?? "npm";
98
98
  const args = parts.slice(1);
99
99
  // 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
100
+ // exec with ENOENT, which would collapse to INTERNAL_ERROR ("report
101
101
  // this issue"). Surface it as a named "`<pm>` not found on PATH" instead.
102
102
  return guardMissingBinary(
103
103
  bin,