@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
@@ -0,0 +1,206 @@
1
+ /**
2
+ * The `implementation` story's SEMANTICS, in-process through the real CLI
3
+ * dispatch path (`executeVerb`), against the canonical fixture.
4
+ *
5
+ * The generic live-surface tests call `implementation_list` with empty
6
+ * parameters and check the envelope, so they stay green whether or not the
7
+ * story means anything: the block-name join could resolve to the wrong subject,
8
+ * the IRI fallback could never fire, and `--platform` / `--library` could
9
+ * filter nothing at all. Those are the four claims the noun actually makes, so
10
+ * they are pinned here rather than left to the envelope.
11
+ *
12
+ * The join is the reason this noun exists and the reason it is worth a
13
+ * fixture-backed test: `ds:implementsBlock` points from an implementation
14
+ * collected in THIS repository at a block declared by a DIFFERENT pack, and the
15
+ * row's `block` column is the design system's own `ds:name` reached across that
16
+ * edge — not a string this repository holds anywhere.
17
+ */
18
+
19
+ import { afterAll, describe, expect, it } from "vitest";
20
+ import { storyModules } from "../../capabilities/distribution.js";
21
+ import { verbKey } from "../../kernel/packs/uniqueness.js";
22
+ import { executeVerb } from "../../kernel/project/cli/dispatch.js";
23
+ import { bootRuntime } from "../../kernel/runtime/boot.js";
24
+ import type { VerbSpec } from "../../kernel/spec/types.js";
25
+ import {
26
+ CANONICAL_CONFIG,
27
+ CANONICAL_TTL,
28
+ } from "../fixtures/graph/canonical.js";
29
+ import {
30
+ bootFixtureRuntime,
31
+ type FixtureGraph,
32
+ } from "../helpers/fixtureGraph.js";
33
+ import { JSON_FLAGS, NO_MUTATION } from "../helpers/parity.js";
34
+
35
+ const implementationModule = storyModules.get("implementation");
36
+ if (!implementationModule) {
37
+ throw new Error('pragma.conf.ts declares no story for "implementation"');
38
+ }
39
+
40
+ const verbOf = (key: string): VerbSpec =>
41
+ implementationModule.verbs.find((v) => verbKey(v.path) === key) as VerbSpec;
42
+
43
+ const listVerb = verbOf("implementation list");
44
+ const librariesVerb = verbOf("implementation libraries");
45
+
46
+ const fixtures: FixtureGraph[] = [];
47
+ afterAll(async () => {
48
+ await Promise.all(fixtures.map((f) => f.dispose()));
49
+ });
50
+
51
+ /** Boot one tracked canonical fixture, for auto-disposal. */
52
+ async function boot(): Promise<FixtureGraph> {
53
+ const fixture = await bootFixtureRuntime({
54
+ ttl: CANONICAL_TTL,
55
+ config: CANONICAL_CONFIG,
56
+ });
57
+ fixtures.push(fixture);
58
+ return fixture;
59
+ }
60
+
61
+ type Row = Record<string, string>;
62
+
63
+ async function rows(
64
+ verb: VerbSpec,
65
+ params: Record<string, unknown> = {},
66
+ ): Promise<Row[]> {
67
+ const fixture = await boot();
68
+ const out = await executeVerb(
69
+ verb,
70
+ params,
71
+ NO_MUTATION,
72
+ bootRuntime(JSON_FLAGS, fixture.cwd),
73
+ );
74
+ return JSON.parse(out.stdout as string).data as Row[];
75
+ }
76
+
77
+ /**
78
+ * What the fixture's implementation graph says, as pairs: Button is
79
+ * implemented TWICE, on two platforms, and Modal once.
80
+ */
81
+ const EVERY_PAIR = [
82
+ "Button|@canonical/react-ds-global",
83
+ "Button|@canonical/svelte-ds-global",
84
+ "Modal|@canonical/react-ds-global",
85
+ ];
86
+
87
+ const pairs = (list: Row[]): string[] =>
88
+ list.map((r) => `${r.block}|${r.library}`).sort();
89
+
90
+ describe("implementation list — the cross-pack join", () => {
91
+ it("names each block by the design system's ds:name, not by its IRI", async () => {
92
+ // `ds:implementsBlock ds:button` carries no name; `Button` exists only on
93
+ // the block node BLOCK_TTL declares. A row reading `button` here would mean
94
+ // the join silently degraded to the IRI fallback and nobody noticed.
95
+ const list = await rows(listVerb);
96
+ expect(pairs(list)).toEqual(EVERY_PAIR);
97
+ expect(list.map((r) => r.block)).not.toContain("button");
98
+ });
99
+
100
+ it("one block implemented twice yields two rows, one per library", async () => {
101
+ // The row is the EDGE, not the block: collapsing the two Button rows into
102
+ // one would answer "is this implemented?" while losing "by whom", which is
103
+ // the question the noun exists for.
104
+ const list = await rows(listVerb);
105
+ expect(list.filter((r) => r.block === "Button")).toHaveLength(2);
106
+ });
107
+
108
+ it("carries the source link and the implementation's own IRI", async () => {
109
+ const list = await rows(listVerb);
110
+ const react = list.find(
111
+ (r) => r.block === "Button" && r.platform === "react",
112
+ );
113
+ expect(react?.source).toBe("https://example.test/react/Button.tsx");
114
+ expect(react?.uri).toBe(
115
+ "https://ds.canonical.com/implementation.react-ds-global.button",
116
+ );
117
+ });
118
+
119
+ it("falls back to the IRI local name for a block the store does not declare", async () => {
120
+ // The design-system pack can be absent while this one is present — a
121
+ // `sources` config carrying only the implementation graph. The row must
122
+ // stay readable, so the fallback is exercised against an edge whose target
123
+ // is a bare IRI with no `ds:name` anywhere in the store.
124
+ const fixture = await bootFixtureRuntime({
125
+ ttl: `${CANONICAL_TTL}
126
+ ds:implementation.library.orphan-lib a ds:ImplementationLibrary ;
127
+ ds:libraryName "@canonical/orphan-lib" ;
128
+ ds:platform "react" ;
129
+ ds:hasImplementation ds:implementation.orphan-lib.unnamed .
130
+
131
+ ds:implementation.orphan-lib.unnamed a ds:ImplementationObject ;
132
+ ds:implementsBlock ds:global.component.unnamed_block ;
133
+ ds:headLink "https://example.test/orphan/Unnamed.tsx" .
134
+ `,
135
+ config: CANONICAL_CONFIG,
136
+ });
137
+ fixtures.push(fixture);
138
+ const out = await executeVerb(
139
+ listVerb,
140
+ {},
141
+ NO_MUTATION,
142
+ bootRuntime(JSON_FLAGS, fixture.cwd),
143
+ );
144
+ const list = JSON.parse(out.stdout as string).data as Row[];
145
+ const orphan = list.find((r) => r.library === "@canonical/orphan-lib");
146
+ expect(orphan?.block).toBe("global.component.unnamed_block");
147
+ });
148
+ });
149
+
150
+ describe("implementation list — the declared filters", () => {
151
+ it("--platform keeps only that platform's rows", async () => {
152
+ expect(pairs(await rows(listVerb, { platform: "svelte" }))).toEqual([
153
+ "Button|@canonical/svelte-ds-global",
154
+ ]);
155
+ });
156
+
157
+ it("--library keeps only that library's rows", async () => {
158
+ expect(
159
+ pairs(await rows(listVerb, { library: "@canonical/react-ds-global" })),
160
+ ).toEqual([
161
+ "Button|@canonical/react-ds-global",
162
+ "Modal|@canonical/react-ds-global",
163
+ ]);
164
+ });
165
+
166
+ it("--search matches the block name and the library name alike", async () => {
167
+ expect(pairs(await rows(listVerb, { search: "modal" }))).toEqual([
168
+ "Modal|@canonical/react-ds-global",
169
+ ]);
170
+ expect(pairs(await rows(listVerb, { search: "svelte" }))).toEqual([
171
+ "Button|@canonical/svelte-ds-global",
172
+ ]);
173
+ });
174
+ });
175
+
176
+ describe("implementation libraries — the library rows", () => {
177
+ it("lists every library with its platform, tier, version and block count", async () => {
178
+ const list = await rows(librariesVerb);
179
+ expect(list.map((r) => r.name).sort()).toEqual([
180
+ "@canonical/react-ds-global",
181
+ "@canonical/svelte-ds-global",
182
+ ]);
183
+ const react = list.find((r) => r.name === "@canonical/react-ds-global");
184
+ expect(react).toMatchObject({
185
+ platform: "react",
186
+ tier: "global",
187
+ version: "0.34.0",
188
+ count: "2",
189
+ });
190
+ });
191
+
192
+ it("the counts agree with the rows `implementation list` returns", async () => {
193
+ // `ds:implementationCount` is asserted by the aggregate INDEX, on the same
194
+ // subject the per-library file describes. The two files can drift apart in
195
+ // the generator, and a count that disagrees with the edges is worse than no
196
+ // count at all — so the two halves are compared rather than each pinned.
197
+ const [libraries, list] = await Promise.all([
198
+ rows(librariesVerb),
199
+ rows(listVerb),
200
+ ]);
201
+ for (const library of libraries) {
202
+ const actual = list.filter((r) => r.library === library.name).length;
203
+ expect(Number(library.count)).toBe(actual);
204
+ }
205
+ });
206
+ });
@@ -24,8 +24,8 @@
24
24
  *
25
25
  * TODO(AV-231/E4): when `node-pty` (or an equivalent PTY shim) is on the
26
26
  * devDependency set, replace each `it.todo` with a PTY-driven `it` that spawns
27
- * `dist/pragma create …` under a pty, writes the keystroke, and asserts the exit
28
- * code + "Cancelled." line. The compiled binary is already provisioned for the
27
+ * the shipped `pragma create …` under a pty, writes the keystroke, and asserts the exit
28
+ * code + "Cancelled." line. The shipped entry is already provisioned for the
29
29
  * spawn-e2e layer by `testing/perf/globalSetup.ts`.
30
30
  */
31
31
 
@@ -1,11 +1,11 @@
1
1
  /**
2
- * The package tier, end to end: a noun the binary never shipped.
2
+ * The package tier, end to end: a noun the distribution never shipped.
3
3
  *
4
4
  * A package that ships `stories/*.json` and is declared as a `file:` pack
5
5
  * contributes a working command to a project that declares it — resolved by
6
6
  * `sources update`, hashed into the pack, written into the pack directory, read
7
7
  * back storelessly at dispatch, and answered from the fixture graph. Proven both
8
- * in-process and through the COMPILED binary in a real subprocess.
8
+ * in-process and through the SHIPPED entry in a real subprocess.
9
9
  *
10
10
  * The same package also ships a malformed story and a schema-invalid one. Those
11
11
  * must be DROPPED, not fatal: package stories reach dispatch before the command
@@ -43,7 +43,7 @@ ex:soup a ex:Recipe ; ex:name "Soup" .
43
43
  ex:stew a ex:Recipe ; ex:name "Stew" .
44
44
  `;
45
45
 
46
- /** A valid read story — the noun the binary never shipped. */
46
+ /** A valid read story — the noun the distribution never shipped. */
47
47
  const RECIPE_STORY = JSON.stringify({
48
48
  noun: "recipe",
49
49
  description: "List recipes.",
@@ -147,7 +147,7 @@ describe("the two recoveries still run with bad stories in the pack", () => {
147
147
  });
148
148
  });
149
149
 
150
- describe("the compiled binary answers the package's noun (subprocess)", () => {
150
+ describe("the shipped entry answers the package's noun (subprocess)", () => {
151
151
  it("pragma recipe list --format json returns the package's rows", () => {
152
152
  const result = runCli(["recipe", "list", "--format", "json"], {
153
153
  cwd: graph.cwd,
@@ -1,10 +1,17 @@
1
1
  /**
2
- * A7 — `pragma mcp` serve boot, observed through the real compiled binary.
2
+ * A7 — `pragma mcp serve` boot, observed through the real shipped entry.
3
3
  *
4
4
  * Replaces the old mocked-SIGINT unit test: `runCli` spawns with no `input`,
5
5
  * which gives the child an immediately-EOF stdin (verified equivalent to
6
6
  * `< /dev/null`) — the shape a host that closes the pipe on shutdown produces.
7
7
  * The server must connect and exit cleanly, not hang or crash.
8
+ *
9
+ * The other half of the contract is the one the bin's narrow short-circuit
10
+ * exists to keep honest: only the exact serve invocation serves. `pragma mcp`,
11
+ * any help form, and any argv with a token after `serve` print text or an
12
+ * error and start NO server — which is only observable across the process
13
+ * boundary, because in-process dispatch never reaches the short-circuit at
14
+ * all.
8
15
  */
9
16
 
10
17
  import { describe, expect, it } from "vitest";
@@ -12,10 +19,58 @@ import { runCli } from "../helpers/runCli.js";
12
19
 
13
20
  describe("mcp serve — stdin close boots and exits cleanly (A7, e2e)", () => {
14
21
  it("exits 0 with no output and no signal", () => {
15
- const result = runCli(["mcp"]);
22
+ const result = runCli(["mcp", "serve"]);
16
23
  expect(result.exitCode).toBe(0);
17
24
  expect(result.signal).toBeNull();
18
25
  expect(result.stdout).toBe("");
19
26
  expect(result.stderr).toBe("");
20
27
  });
21
28
  });
29
+
30
+ describe("mcp — the noun is ordinary grammar (e2e)", () => {
31
+ it("bare `mcp` prints the noun help and exits 0, serving nothing", () => {
32
+ const result = runCli(["mcp"]);
33
+ expect(result.exitCode).toBe(0);
34
+ expect(result.stdout).toContain("Usage: pragma mcp");
35
+ expect(result.stdout).toContain("serve");
36
+ // A JSON-RPC handshake would have started with `{`; help never does.
37
+ expect(result.stdout.startsWith("{")).toBe(false);
38
+ });
39
+
40
+ it("`mcp --help` prints help rather than starting the server", () => {
41
+ const result = runCli(["mcp", "--help"]);
42
+ expect(result.exitCode).toBe(0);
43
+ expect(result.stdout).toContain("serve");
44
+ });
45
+
46
+ it("`mcp serve --help` documents the verb rather than starting it", () => {
47
+ const result = runCli(["mcp", "serve", "--help"]);
48
+ expect(result.exitCode).toBe(0);
49
+ expect(result.stdout).toContain("Start the MCP server over stdio");
50
+ expect(result.stdout).toContain("Usage: pragma mcp serve");
51
+ });
52
+ });
53
+
54
+ /**
55
+ * The short-circuit matches argv EXACTLY. A prefix match would extend the
56
+ * stdio-purity budget — no flag parsing, no first-run, nothing on stdout but
57
+ * JSON-RPC — to argv the server was never asked to answer, so a suffixed line
58
+ * would serve instead of being parsed. These are the two suffixes that prove
59
+ * the fall-through: a global flag the program owns, and a stray operand.
60
+ */
61
+ describe("mcp serve — anything suffixed falls through to the grammar (e2e)", () => {
62
+ it("`mcp serve --version` answers the global flag, serving nothing", () => {
63
+ const result = runCli(["mcp", "serve", "--version"]);
64
+ expect(result.exitCode).toBe(0);
65
+ expect(result.stdout.trim()).toMatch(/^\d+\.\d+\.\d+/);
66
+ // A JSON-RPC handshake would have started with `{`; a version never does.
67
+ expect(result.stdout.startsWith("{")).toBe(false);
68
+ });
69
+
70
+ it("`mcp serve extra` is parsed, so its bad global value is rejected", () => {
71
+ const result = runCli(["mcp", "serve", "extra", "--format", "bogus"]);
72
+ expect(result.exitCode).toBe(2);
73
+ expect(result.stderr).toContain('Invalid format "bogus"');
74
+ expect(result.stdout).toBe("");
75
+ });
76
+ });
@@ -13,7 +13,7 @@
13
13
  * Representative args are built structurally: a lookup/sample's positional
14
14
  * resolves through its noun's OWN `list` (browse-then-address, same as B1); a
15
15
  * `prefix`/`uri`-named positional (the grammar's TBox/entity-inspection
16
- * convention, used today by `ontology show`/`graph inspect`) resolves from the
16
+ * convention, used today by `ontology lookup`/`graph inspect`) resolves from the
17
17
  * pack index generically, not by noun name. A mutating tool is called WITHOUT
18
18
  * `confirm` (a safe plan-only preview).
19
19
  */
@@ -22,8 +22,32 @@ describe("--version at every level (A2, e2e)", () => {
22
22
  expect(VERSION).toMatch(/^\d+\.\d+\.\d+/);
23
23
  });
24
24
 
25
- it("-v is equivalent to --version", () => {
26
- expect(runCli(["-v"]).stdout.trim()).toBe(VERSION);
25
+ it("-v is rejected — --version is the one spelling", () => {
26
+ const result = runCli(["-v"]);
27
+ expect(result.exitCode).toBe(2);
28
+ expect(result.stderr).toContain('Unknown option "-v"');
29
+ });
30
+ });
31
+
32
+ describe("global value flags reject bad values loudly (e2e)", () => {
33
+ it("--format text is not a format", () => {
34
+ const result = runCli(["config", "show", "--format", "text"]);
35
+ expect(result.exitCode).toBe(2);
36
+ expect(result.stderr).toContain('Invalid format "text"');
37
+ expect(result.stderr).toContain("plain, llm, json");
38
+ });
39
+
40
+ it("--detail rejects an unrecognized level, naming the valid ones", () => {
41
+ const result = runCli(["config", "show", "--detail", "bogus"]);
42
+ expect(result.exitCode).toBe(2);
43
+ expect(result.stderr).toContain('Invalid detail "bogus"');
44
+ expect(result.stderr).toContain("summary, standard, detailed");
45
+ });
46
+
47
+ it("--verbose=<x> is rejected — the flag takes no value", () => {
48
+ const result = runCli(["config", "show", "--verbose=true"]);
49
+ expect(result.exitCode).toBe(2);
50
+ expect(result.stderr).toContain("`--verbose` takes no value");
27
51
  });
28
52
  });
29
53
 
@@ -88,7 +88,7 @@ export const effectfulEvalCases: readonly EvalCase[] = [
88
88
  id: "tool-doctor-reports-check-tallies",
89
89
  kind: "tool",
90
90
  input:
91
- "doctor returns a { checks, passed, failed, skipped } diagnostic report where the tallies sum to the checks.",
91
+ "doctor returns a { checks, passed, failed, available, skipped } diagnostic report where the tallies sum to the checks.",
92
92
  async expect({ mcp }) {
93
93
  const result = await mcp.callTool("doctor");
94
94
  assert.equal(result.ok, true);
@@ -96,11 +96,12 @@ export const effectfulEvalCases: readonly EvalCase[] = [
96
96
  checks: unknown[];
97
97
  passed: number;
98
98
  failed: number;
99
+ available: number;
99
100
  skipped: number;
100
101
  };
101
102
  assert.ok(Array.isArray(data.checks), "expected a checks array");
102
103
  assert.equal(
103
- data.passed + data.failed + data.skipped,
104
+ data.passed + data.failed + data.available + data.skipped,
104
105
  data.checks.length,
105
106
  );
106
107
  },
@@ -21,6 +21,18 @@ export const BLOCK_PREFIXES: Readonly<Record<string, string>> = {
21
21
  xsd: "http://www.w3.org/2001/XMLSchema#",
22
22
  };
23
23
 
24
+ /**
25
+ * A membership roster deep enough to cross the entity read's fan-in threshold,
26
+ * so the fixture exercises the SAMPLED branch and not only the listed one.
27
+ * Generated rather than written out: the count is the whole point of the case,
28
+ * and 22 hand-copied lines invite someone to "tidy" one away.
29
+ */
30
+ const ROSTER_MEMBER_COUNT = 22;
31
+ const ROSTER_MEMBERS = Array.from(
32
+ { length: ROSTER_MEMBER_COUNT },
33
+ (_, index) => `ds:probe.member${index} a ds:Probe ; ds:tier ds:rosterHub .`,
34
+ ).join("\n");
35
+
24
36
  /** The fixture ontology + individuals as Turtle. */
25
37
  export const BLOCK_TTL = `
26
38
  @prefix ds: <https://ds.canonical.com/> .
@@ -109,4 +121,71 @@ ds:mod.importance.secondary a ds:Modifier ; ds:name "secondary" ; ds:modifierFam
109
121
  ds:mod.density.compact a ds:Modifier ; ds:name "compact" ; ds:modifierFamily ds:family.density .
110
122
  ds:mod.size.small a ds:Modifier ; ds:name "small" ; ds:modifierFamily ds:family.size .
111
123
  ds:mod.size.large a ds:Modifier ; ds:name "large" ; ds:modifierFamily ds:family.size .
124
+
125
+ # ---- Neighbourhood-read probes ----
126
+ # Typed \`ds:Probe\`, which is deliberately NOT declared as an owl:Class and is
127
+ # outside the block VALUES set, so these individuals reach the entity reader
128
+ # without entering any block list or the ontology class listing.
129
+ #
130
+ # literalTrap holds a STRING that begins with the ds: namespace. Read through
131
+ # the lossy string view it was indistinguishable from an IRI and got compacted
132
+ # into something that read back as one; the term view is what tells them apart.
133
+ ds:literalTrap a ds:Probe ;
134
+ ds:name "literal trap" ;
135
+ ds:figmaLink "https://ds.canonical.com/not-an-iri" .
136
+
137
+ # blankHolder carries blank-node objects — store-local handles that re-mint on
138
+ # every load — so the read must inline them as records AND order those records
139
+ # by content rather than by the label that grouped them.
140
+ ds:blankHolder a ds:Probe ;
141
+ ds:name "blank holder" ;
142
+ ds:changeLog [ a ds:ChangeLogEntry ; ds:changeType "decision" ; ds:change "Split the button." ] ;
143
+ ds:changeLog [ a ds:ChangeLogEntry ; ds:changeType "revision" ; ds:change "Renamed the slot." ] .
144
+
145
+ # One blank node reached by TWO predicates — keyed by node alone, the second
146
+ # edge silently vanished.
147
+ ds:doubleLinked a ds:Probe ;
148
+ ds:name "double linked" ;
149
+ ds:changeLog [ a ds:ChangeLogEntry ; ds:changeType "decision" ] ;
150
+ ds:usageNote [ a ds:ChangeLogEntry ; ds:changeType "note" ] .
151
+
152
+ # An RDF 1.2 directional literal — dropped, it reads as a plain @ar literal.
153
+ ds:directional a ds:Probe ;
154
+ ds:name "\u0645\u0631\u062D\u0628\u0627"@ar--rtl .
155
+
156
+ # The roster hub also carries ONE edge under a different predicate, so a read
157
+ # can prove that a 22-deep neighbour does not evict its quieter sibling.
158
+ ds:rosterHub a ds:Probe ; ds:name "roster hub" .
159
+ ds:probe.quiet a ds:Probe ; ds:hasSubcomponent ds:rosterHub .
160
+ ${ROSTER_MEMBERS}
161
+ `;
162
+
163
+ /**
164
+ * An OPT-IN overlay for the lookup-addressing suite, appended to
165
+ * {@link BLOCK_TTL} by the tests that need it and by nothing else — the block
166
+ * parity, ontology and GraphQL-engine suites assert over the base graph and
167
+ * must keep seeing exactly two components.
168
+ *
169
+ * It models the three shapes the addressing path gets wrong: two components
170
+ * sharing one `ds:name` (declared zeta-first so the store's enumeration order
171
+ * and IRI order DISAGREE — an unordered `LIMIT 1` picks the zeta one), and a
172
+ * component carrying no `ds:name` at all (reachable only by IRI, the way 131 of
173
+ * the 144 live code standards are).
174
+ */
175
+ export const AMBIGUOUS_TTL = `
176
+ ds:apps a ds:Tier ; ds:name "apps" .
177
+
178
+ ds:zeta.chip a ds:Component ;
179
+ ds:name "Chip" ;
180
+ ds:tier ds:global ;
181
+ ds:summary "The zeta chip — declared first, sorts last." .
182
+
183
+ ds:alpha.chip a ds:Component ;
184
+ ds:name "Chip" ;
185
+ ds:tier ds:apps ;
186
+ ds:summary "The alpha chip — declared last, sorts first." .
187
+
188
+ ds:nameless.widget a ds:Component ;
189
+ ds:tier ds:global ;
190
+ ds:summary "Carries no ds:name; addressable only by IRI." .
112
191
  `;
@@ -160,11 +160,97 @@ ds:prompt.configure a ds:Prompt ;
160
160
  ds:prompt.scaffold-component a ds:Prompt ;
161
161
  rdfs:label "scaffold-component" ;
162
162
  rdfs:comment "Scaffold a new component and align it to the standards." ;
163
- ds:promptBody "Scaffold the {{componentName}} component in {{framework}}. Use create_component with the component path and --framework {{framework}}, then review the generated files against the react/component standards via standard_lookup." ;
163
+ ds:promptBody "Scaffold the {{componentName}} component in {{framework}}. Use create_component with framework {{framework}} and the component path, then review the generated files against the react/component standards via standard_lookup." ;
164
164
  ds:promptArgument [ ds:argName "componentName" ; rdfs:comment "Component name/path (e.g. Button)." ; ds:argRequired true ] ;
165
165
  ds:promptArgument [ ds:argName "framework" ; rdfs:comment "react | svelte | lit." ; ds:argRequired false ] .
166
166
  `;
167
167
 
168
+ /** The `ds:Concept` section — long-form documentation entries the `concept`
169
+ * story reads. Mirrors the real design-system data shape (canonical/design-system#64):
170
+ * `ds:name`/`ds:summary`/`ds:tier` base, the Markdown body in `ds:content`
171
+ * (standard disclosure), `ds:knownEdgeCases` (detailed), and `ds:conceptType`
172
+ * → a named `ds:ConceptType` individual carrying its own `ds:name`. */
173
+ const CONCEPT_TTL = `
174
+ ds:Concept a owl:Class .
175
+ ds:ConceptType a owl:Class .
176
+ ds:content a owl:DatatypeProperty ; rdfs:domain ds:Concept ; rdfs:range xsd:string .
177
+ ds:knownEdgeCases a owl:DatatypeProperty ; rdfs:domain ds:Concept ; rdfs:range xsd:string .
178
+ ds:conceptType a owl:ObjectProperty ; rdfs:domain ds:Concept ; rdfs:range ds:ConceptType .
179
+
180
+ ds:concepttype.Explanation a ds:ConceptType ;
181
+ ds:name "Explanation" ;
182
+ ds:summary "Concept documentation that deepens understanding of a topic." .
183
+
184
+ ds:concepttype.How-to-guide a ds:ConceptType ;
185
+ ds:name "How-to guide" ;
186
+ ds:summary "Concept documentation that walks through solving a problem." .
187
+
188
+ ds:concept.Foundations-Grid a ds:Concept ;
189
+ ds:name "Foundations: Grid" ;
190
+ ds:summary "How the grid system underpins every layout." ;
191
+ ds:tier ds:global ;
192
+ ds:conceptType ds:concepttype.Explanation ;
193
+ ds:content "The grid is the shared spatial contract every block lays out against." ;
194
+ ds:knownEdgeCases "Nested grids inherit the outer gutter unless re-declared." .
195
+
196
+ ds:concept.Question-mark-vs-information-icon a ds:Concept ;
197
+ ds:name "Question mark vs information icon" ;
198
+ ds:summary "Deciding between the information icon and the question mark icon." ;
199
+ ds:tier ds:global ;
200
+ ds:conceptType ds:concepttype.How-to-guide ;
201
+ ds:content "The information icon offers context proactively; the question mark answers a question the user already has." ;
202
+ ds:knownEdgeCases "Icon interpretation depends on the user's prior conventions." .
203
+ `;
204
+
205
+ /**
206
+ * The implementation graph: two libraries whose `ds:implementsBlock` edges point
207
+ * at `BLOCK_TTL`'s own Button/Modal IRIs, so a test can prove the cross-pack
208
+ * join (an implementation collected from source resolving to a block declared by
209
+ * the design system) rather than just the shape of a row. Button is implemented
210
+ * TWICE, on two platforms — the case `--platform` has to separate.
211
+ */
212
+ const IMPLEMENTATION_TTL = `
213
+ ds:ImplementationLibrary a owl:Class .
214
+ ds:ImplementationObject a owl:Class .
215
+ ds:hasImplementation a owl:ObjectProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range ds:ImplementationObject .
216
+ ds:implementsBlock a owl:ObjectProperty ; rdfs:domain ds:ImplementationObject ; rdfs:range ds:UIBlock .
217
+ ds:libraryName a owl:DatatypeProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range xsd:string .
218
+ ds:platform a owl:DatatypeProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range xsd:string .
219
+ ds:libraryTier a owl:ObjectProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range ds:Tier .
220
+ ds:implementationCount a owl:DatatypeProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range xsd:integer .
221
+ ds:headLink a owl:DatatypeProperty ; rdfs:domain ds:ImplementationObject ; rdfs:range xsd:string .
222
+ ds:versionedLink a owl:DatatypeProperty ; rdfs:domain ds:ImplementationObject ; rdfs:range xsd:string .
223
+
224
+ ds:implementation.library.react-ds-global a ds:ImplementationLibrary ;
225
+ ds:libraryName "@canonical/react-ds-global" ;
226
+ ds:platform "react" ;
227
+ ds:libraryTier ds:global ;
228
+ ds:version "0.34.0" ;
229
+ ds:implementationCount 2 ;
230
+ ds:hasImplementation ds:implementation.react-ds-global.button,
231
+ ds:implementation.react-ds-global.modal .
232
+
233
+ ds:implementation.react-ds-global.button a ds:ImplementationObject ;
234
+ ds:implementsBlock ds:button ;
235
+ ds:headLink "https://example.test/react/Button.tsx" .
236
+
237
+ ds:implementation.react-ds-global.modal a ds:ImplementationObject ;
238
+ ds:implementsBlock ds:modal ;
239
+ ds:headLink "https://example.test/react/Modal.tsx" .
240
+
241
+ ds:implementation.library.svelte-ds-global a ds:ImplementationLibrary ;
242
+ ds:libraryName "@canonical/svelte-ds-global" ;
243
+ ds:platform "svelte" ;
244
+ ds:libraryTier ds:global ;
245
+ ds:version "0.34.0" ;
246
+ ds:implementationCount 1 ;
247
+ ds:hasImplementation ds:implementation.svelte-ds-global.button .
248
+
249
+ ds:implementation.svelte-ds-global.button a ds:ImplementationObject ;
250
+ ds:implementsBlock ds:button ;
251
+ ds:headLink "https://example.test/svelte/Button.svelte" .
252
+ `;
253
+
168
254
  /** The prefixes the canonical store is built and queried with. */
169
255
  export const CANONICAL_PREFIXES: Readonly<Record<string, string>> = {
170
256
  ...BLOCK_PREFIXES,
@@ -172,7 +258,7 @@ export const CANONICAL_PREFIXES: Readonly<Record<string, string>> = {
172
258
  };
173
259
 
174
260
  /** The full canonical Turtle: PR3's `BLOCK_TTL` verbatim, plus the sections above. */
175
- export const CANONICAL_TTL = `${BLOCK_TTL}\n${DS_EXTRA_TTL}\n${CS_TTL}\n${PROMPT_TTL}`;
261
+ export const CANONICAL_TTL = `${BLOCK_TTL}\n${DS_EXTRA_TTL}\n${CS_TTL}\n${PROMPT_TTL}\n${CONCEPT_TTL}\n${IMPLEMENTATION_TTL}`;
176
262
 
177
263
  /** Default viewing config: no tier set, `normal` channel — drops the beta-only block. */
178
264
  export const CANONICAL_CONFIG = { channel: "normal" as const };
@@ -171,7 +171,7 @@ ex:beta ex:name "Beta" .
171
171
  /**
172
172
  * A malformed Turtle source — a subject/predicate with no object — drives the
173
173
  * `sources update` data-error classification path (a NAMED `CONFIG_ERROR`, not
174
- * an INTERNAL "please report this issue").
174
+ * an INTERNAL "report this issue").
175
175
  */
176
176
  export const MALFORMED_TTL = `@prefix ex: <https://ex.test/#> .
177
177
  ex:One a ex:Widget .
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Blank the @canonical/* dependency ranges inside a scaffolded application's
3
+ * `my-app/package.json` — identically on every snapshot — before a byte
4
+ * comparison. The application generator resolves its range through each
5
+ * producer's OWN `npm view` call (no timeout, no shared cache), so an
6
+ * asymmetric registry outcome (one producer reaches npm and another does
7
+ * not, or a @canonical/* release lands between the calls) would turn
8
+ * `^0.34.0` vs `^0.33.0` across all 11 ranges into a red that says nothing
9
+ * about the code under test. The networked cases prove the TEMPLATE surface;
10
+ * range truth belongs to the offline cells, where the outcome is forced
11
+ * (`capabilities/create/shippedCreate.subprocess.test.ts`).
12
+ *
13
+ * The regex preserves the dependency KEY (`$1`), so a key-set or
14
+ * non-@canonical divergence still fails; only the range value collapses.
15
+ * Deliberately import-free — a pure string transform no module-graph guard
16
+ * can ever see.
17
+ *
18
+ * @param tree - A tree snapshot (relative path → contents).
19
+ * @param manifestPath - The scaffolded manifest's path within the tree.
20
+ * @returns A NEW map with the manifest's @canonical/* ranges blanked; the
21
+ * input is untouched. A tree without the manifest comes back copied as-is.
22
+ */
23
+ export function blankCanonicalRanges(
24
+ tree: ReadonlyMap<string, string>,
25
+ manifestPath = "my-app/package.json",
26
+ ): Map<string, string> {
27
+ const out = new Map(tree);
28
+ const manifest = out.get(manifestPath);
29
+ if (manifest !== undefined) {
30
+ out.set(
31
+ manifestPath,
32
+ manifest.replaceAll(/("@canonical\/[^"]+": )"[^"]+"/g, '$1"<range>"'),
33
+ );
34
+ }
35
+ return out;
36
+ }