@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,164 @@
1
+ /**
2
+ * PROTECTED — the shipped-entry `create` guard.
3
+ *
4
+ * Spawns the EMITTED entry the published package points at
5
+ * (`node dist/src/bin.js`) and asserts every `create` noun writes a tree
6
+ * BYTE-IDENTICAL to a source run of the same generator (`bun src/bin.ts …`).
7
+ * The source run is the reference: it reads the `.ejs` templates from disk with
8
+ * no indirection.
9
+ *
10
+ * WHAT THIS REPLACES. Until the distribution stopped shipping a
11
+ * `bun build --compile` executable, this guard covered `create component` only,
12
+ * and its sibling describe pinned the REFUSAL of `create package` /
13
+ * `create application`: those generators call `template({ source })`, summon-core
14
+ * fell through to `readFile(options.source)`, and inside the binary's virtual
15
+ * filesystem that died with `ENOENT … /$bunfs/templates/package.json.ejs` after
16
+ * `mkdir` had already run — a half-made package on the user's disk. The gate
17
+ * existed to turn that crash into a clean refusal.
18
+ *
19
+ * There is no virtual filesystem now. Every generator's templates are real
20
+ * files under its own package, so all three nouns run from the shipped entry and
21
+ * all three are asserted here. THE REFUSAL CASES ARE GONE ON PURPOSE: a test
22
+ * asserting `create package` refuses would now be asserting a defect.
23
+ *
24
+ * The svelte + lit cases stay load-bearing: `types.ts.ejs` / `index.ts.ejs` /
25
+ * `styles.css.ejs` / `stories.ts.ejs` exist in react/, svelte/ AND lit/, so a
26
+ * basename-matching regression could emit the WRONG framework's file. A wrong
27
+ * file differs from the source run → red here.
28
+ */
29
+
30
+ import { execFileSync, spawnSync } from "node:child_process";
31
+ import { mkdtempSync, readdirSync, readFileSync } from "node:fs";
32
+ import { tmpdir } from "node:os";
33
+ import { dirname, join, resolve } from "node:path";
34
+ import { fileURLToPath } from "node:url";
35
+ import { describe, expect, it } from "vitest";
36
+
37
+ const here = dirname(fileURLToPath(import.meta.url));
38
+ const repoRoot = resolve(here, "../../../../../..");
39
+ const cliNextDir = join(repoRoot, "packages/cli/pragma");
40
+ const sourceEntry = join(cliNextDir, "src/bin.ts");
41
+ const shippedEntry = join(cliNextDir, "dist/src/bin.js");
42
+ const freshCwd = (): string => mkdtempSync(join(tmpdir(), "pragma-shipped-"));
43
+
44
+ // `dist/` is provisioned by `testing/perf/globalSetup.ts`, which re-emits it
45
+ // whenever it is missing or older than `src/**`, `scripts/**`, `pragma.conf.ts`
46
+ // or `package.json` — so these tests exercise the current emit without a second
47
+ // `beforeAll` writing `dist/` in place while another worker is spawning it.
48
+
49
+ /** Read a directory tree into a sorted map of relative path → contents. */
50
+ function snapshot(dir: string): Map<string, string> {
51
+ const out = new Map<string, string>();
52
+ const walk = (d: string, base: string): void => {
53
+ for (const entry of readdirSync(d, { withFileTypes: true }).sort((a, b) =>
54
+ a.name.localeCompare(b.name),
55
+ )) {
56
+ const rel = base ? `${base}/${entry.name}` : entry.name;
57
+ if (entry.isDirectory()) walk(join(d, entry.name), rel);
58
+ else out.set(rel, readFileSync(join(d, entry.name), "utf-8"));
59
+ }
60
+ };
61
+ walk(dir, "");
62
+ return out;
63
+ }
64
+
65
+ /**
66
+ * The create invocations under guard — a LITERAL table, deliberately not derived
67
+ * from `create`'s own declaration, so dropping a noun from the surface turns
68
+ * this red rather than silently shrinking the guard.
69
+ *
70
+ * No case installs dependencies (`runInstall` defaults false), so every tree is
71
+ * generator output alone and byte-comparable.
72
+ */
73
+ const CASES: ReadonlyArray<{ label: string; args: readonly string[] }> = [
74
+ ...(["react", "svelte", "lit"] as const).map((framework) => ({
75
+ label: `component ${framework}`,
76
+ // The framework is a PATH SEGMENT, not a flag — `create` mirrors summon's
77
+ // own tree (`summon component react <path>`), so the two CLIs take the
78
+ // same argv.
79
+ args: ["create", "component", framework, "src/components/Widget", "--yes"],
80
+ })),
81
+ {
82
+ label: "package",
83
+ args: ["create", "package", "--name", "@canonical/probe", "--yes"],
84
+ },
85
+ {
86
+ label: "application",
87
+ // `react` is a path segment here too — the declared binding is
88
+ // `application/react`, and the tree mirrors summon's.
89
+ args: ["create", "application", "react", "probeapp", "--yes"],
90
+ },
91
+ ];
92
+
93
+ /** Run one create invocation in its own cwd and snapshot what it wrote. */
94
+ function create(
95
+ command: string,
96
+ prefix: readonly string[],
97
+ args: readonly string[],
98
+ ): Map<string, string> {
99
+ const dir = freshCwd();
100
+ execFileSync(command, [...prefix, ...args], { cwd: dir, stdio: "pipe" });
101
+ return snapshot(dir);
102
+ }
103
+
104
+ describe("shipped pragma create (PROTECTED)", () => {
105
+ for (const { label, args } of CASES) {
106
+ it(`${label}: shipped entry ≡ source run, byte-for-byte`, () => {
107
+ // (1) The shipped entry, exactly as a consumer's `pragma` runs it.
108
+ const shipped = create(process.execPath, [shippedEntry], args);
109
+ // (2) A source run — the reference output.
110
+ const source = create("bun", [sourceEntry], args);
111
+
112
+ // Wrote something. Before the distribution stopped shipping a compiled
113
+ // binary, `package` and `application` wrote NOTHING here — they refused.
114
+ expect(shipped.size).toBeGreaterThan(0);
115
+ // Same file set …
116
+ expect([...shipped.keys()].sort()).toEqual([...source.keys()].sort());
117
+ // … and byte-identical contents.
118
+ for (const [path, content] of shipped) {
119
+ expect(source.get(path), `content of ${path}`).toBe(content);
120
+ }
121
+ }, 180_000);
122
+ }
123
+ });
124
+
125
+ /**
126
+ * PROTECTED — the shipped-entry READ guard (U1-orig).
127
+ *
128
+ * A READ command (`block list`, `--help`) never calls a generator's
129
+ * `generate()`, so — with the generators loading their templates LAZILY on first
130
+ * `generate()` rather than at module-eval — it must never touch a `.ejs` at all.
131
+ * This is the exact gap the create-only smoke above missed: the component
132
+ * generators used to load templates via a top-level `await`, so a READ crashed
133
+ * with `Template not found`. The lazy load makes a READ template-free, and this
134
+ * pins it at the process boundary where an eager load would resurface.
135
+ */
136
+ describe("shipped pragma READ smoke (PROTECTED)", () => {
137
+ // A cold store cleanly reports STORE_UNAVAILABLE (exit 3); `--help` never needs
138
+ // a store (exit 0). Both fully exercise startup + dispatch — the phase where an
139
+ // eager generator template load would have crashed — without a store or writes.
140
+ const READS: ReadonlyArray<{
141
+ args: readonly string[];
142
+ okExit: readonly number[];
143
+ }> = [
144
+ { args: ["block", "list"], okExit: [0, 3] },
145
+ { args: ["--help"], okExit: [0] },
146
+ ];
147
+
148
+ for (const { args, okExit } of READS) {
149
+ it(`\`${args.join(" ")}\` runs without a Template-not-found crash`, () => {
150
+ const result = spawnSync(process.execPath, [shippedEntry, ...args], {
151
+ cwd: freshCwd(),
152
+ stdio: "pipe",
153
+ encoding: "utf-8",
154
+ });
155
+ const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
156
+ // The exact crash the lazy-template fix closes.
157
+ expect(output).not.toMatch(/Template not found/);
158
+ // Nor does it collapse to the internal-bug path (the crash's other tell).
159
+ expect(output).not.toMatch(/Internal error/);
160
+ // It reaches a clean dispatch outcome, not an uncaught startup crash.
161
+ expect(okExit).toContain(result.status);
162
+ }, 30_000);
163
+ }
164
+ });
@@ -10,3 +10,23 @@ import type { CREATE_GENERATORS } from "./constants.js";
10
10
  * heavy generator imports — into the static graph.
11
11
  */
12
12
  export type CreateKind = keyof typeof CREATE_GENERATORS;
13
+
14
+ /**
15
+ * The REGISTERED CLI spelling of one generator prompt, baked into
16
+ * `createSurface.generated.ts` at build time (the build derives it with the
17
+ * same summon-core helpers the mount registers through). Consumers that need
18
+ * only the spelling — completion tokens, the reference's usage lines — read
19
+ * this baked record instead of calling the projection, which keeps the
20
+ * `--help`/`__complete` fast paths free of the registration machinery.
21
+ */
22
+ export interface PromptCliSyntax {
23
+ /**
24
+ * The registered flag token (`--component-path`; a default-true confirm
25
+ * registers ONLY its `--no-<kebab>` form).
26
+ */
27
+ readonly flag: string;
28
+ /** Whether the registered flag takes a value (`--styles` does not). */
29
+ readonly takesValue: boolean;
30
+ /** The prompt name's kebab-case CLI spelling (`componentPath` → `component-path`). */
31
+ readonly kebabName: string;
32
+ }
@@ -33,12 +33,14 @@ function declaredShape(verb: VerbSpec): Record<string, unknown> {
33
33
  }
34
34
 
35
35
  describe("the distribution's declared stories (PROTECTED)", () => {
36
- it("declares exactly the five domain nouns", () => {
36
+ it("declares exactly the seven domain nouns", () => {
37
37
  // Every domain noun is now nothing BUT its story (L-OPEN-9), so a renamed
38
38
  // or dropped noun deletes a whole command rather than shrinking one — it
39
39
  // must fail HERE.
40
40
  expect([...declaredStories.keys()].sort()).toEqual([
41
41
  "block",
42
+ "concept",
43
+ "implementation",
42
44
  "modifier",
43
45
  "standard",
44
46
  "tier",
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * `pragma.conf.ts` declares them on the packs that supply them; this is the ONE
5
5
  * place those declarations become capabilities. They come through the SAME door
6
- * a third-party story does — {@link compilePack} — so the mechanism the CLI
6
+ * a third-party story does — {@link compileStoryModule} — so the mechanism the CLI
7
7
  * offers forks is the mechanism the CLI itself runs on.
8
8
  *
9
9
  * They are compiled STATICALLY rather than merged at dispatch on purpose: the
@@ -11,7 +11,7 @@
11
11
  * `surface/surface.v2.json` freezes the emitted surface, so a noun that only
12
12
  * arrived at dispatch would vanish from help and completion on a fresh install.
13
13
  * That is affordable because this module is zod-free and pure — `pragma.conf.ts`
14
- * is inert data and `compilePack` builds specs without touching the store.
14
+ * is inert data and the compiler builds specs without touching the store.
15
15
  *
16
16
  * Config- and package-declared stories still OVERRIDE these at dispatch; the
17
17
  * `story` marker on each module is what tells `assembleEffectiveModules` which
@@ -19,13 +19,13 @@
19
19
  */
20
20
 
21
21
  import conf from "../../pragma.conf.js";
22
- import { compilePack } from "../kernel/packs/compile.js";
22
+ import { compileStoryModule } from "../kernel/packs/compile.js";
23
23
  import {
24
24
  distributionSource,
25
25
  type PackDefinition,
26
26
  } from "../kernel/packs/types.js";
27
- import { DEFAULT_PREFIX_MAP } from "../kernel/render/prefixes.js";
28
- import type { CapabilityModule } from "../kernel/spec/types.js";
27
+ import { DEFAULT_PREFIX_MAP } from "../kernel/render/index.js";
28
+ import type { CapabilityModule } from "../kernel/spec/index.js";
29
29
 
30
30
  /** The read stories `pragma.conf.ts` declares on its packs, by noun. */
31
31
  export const declaredStories: ReadonlyMap<string, PackDefinition> = new Map(
@@ -45,15 +45,10 @@ export const declaredStories: ReadonlyMap<string, PackDefinition> = new Map(
45
45
  export const storyModules: ReadonlyMap<string, CapabilityModule> = new Map(
46
46
  [...declaredStories].map(([noun, story]) => [
47
47
  noun,
48
- {
49
- name: noun,
50
- story: true,
51
- verbs: compilePack(
52
- story,
53
- distributionSource("pragma.conf.ts"),
54
- DEFAULT_PREFIX_MAP,
55
- ),
56
- colophon: story.colophon,
57
- },
48
+ compileStoryModule(
49
+ story,
50
+ distributionSource("pragma.conf.ts"),
51
+ DEFAULT_PREFIX_MAP,
52
+ ),
58
53
  ]),
59
54
  );
@@ -1,10 +1,12 @@
1
1
  import { BIN_NAME } from "../../../constants.js";
2
2
  import { entityTotal } from "../../../kernel/completion/entitySource.js";
3
- import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
3
+ import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
4
4
  import type { CheckResult } from "../types.js";
5
5
 
6
6
  /**
7
- * Check that the ke store boots, reporting the entity total and boot time.
7
+ * Check that the local store boots, reporting the entity total and boot time.
8
+ * The check is NAMED "store" in the report — the same word every other surface
9
+ * uses for it; the ke library it boots through is an implementation detail.
8
10
  *
9
11
  * This is the ONE check that touches the store — it boots the shared lazy store
10
12
  * inside a try/catch, so doctor stays storeless-by-default at the dispatch level
@@ -24,15 +26,15 @@ export async function checkKeStore(rt: PragmaRuntime): Promise<CheckResult> {
24
26
  const total = entityTotal(session.index);
25
27
  const elapsed = Math.round(performance.now() - start);
26
28
  return {
27
- name: "ke store",
29
+ name: "store",
28
30
  status: "pass",
29
31
  detail: `${total.toLocaleString()} entities in ${elapsed}ms`,
30
32
  };
31
33
  } catch {
32
34
  return {
33
- name: "ke store",
35
+ name: "store",
34
36
  status: "fail",
35
- detail: "failed to boot",
37
+ detail: "cannot boot",
36
38
  remedy: `Ensure design-system packs are configured and run \`${BIN_NAME} sources update\`.`,
37
39
  };
38
40
  }
@@ -20,13 +20,15 @@ import {
20
20
  entityTotal,
21
21
  readPackIndex,
22
22
  } from "../../../kernel/completion/entitySource.js";
23
- import { validateStories } from "../../../kernel/packs/collect.js";
24
- import { embeddedManifest } from "../../../kernel/runtime/graphpack/embedded.js";
25
- import { readManifest } from "../../../kernel/runtime/graphpack/manifest.js";
23
+ import { validateStories } from "../../../kernel/packs/index.js";
24
+ import {
25
+ embeddedManifest,
26
+ readManifest,
27
+ } from "../../../kernel/runtime/graphpack/index.js";
26
28
  import { activeStories } from "../../../kernel/runtime/graphpack/stories.js";
29
+ import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
27
30
  import type { SourcesDecision } from "../../../kernel/runtime/resolveSources.js";
28
31
  import { resolveSources } from "../../../kernel/runtime/resolveSources.js";
29
- import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
30
32
  import type { CheckItem, CheckResult } from "../types.js";
31
33
 
32
34
  /**
@@ -1,6 +1,6 @@
1
1
  import { BIN_NAME } from "../../../constants.js";
2
- import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
3
- import { detectInstallSource } from "../../shared/packageManager.js";
2
+ import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
3
+ import { detectInstallSource } from "../../shared/index.js";
4
4
  import type { CheckResult } from "../types.js";
5
5
 
6
6
  /**
@@ -2,7 +2,7 @@
2
2
  * `checkShellCompletions` — the doctor check that verifies completions are
3
3
  * installed AND up to date AND functional.
4
4
  *
5
- * Runs against an isolated HOME and a controlled `$SHELL` so the three gates —
5
+ * Runs against an isolated HOME and an injected shell so the gates —
6
6
  * the resolver effect test, the install probe, and the zsh fpath activation
7
7
  * gate — are deterministic. The effect test (gate 1) drives the real
8
8
  * `runComplete` resolver; the install/fpath gates write real files under the
@@ -22,7 +22,12 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest";
22
22
  import { emitScripts } from "../../../kernel/completion/emitScripts.js";
23
23
  import { capabilities } from "../../index.js";
24
24
  import { detectCompletions } from "../../setup/operations/setupCompletions.js";
25
- import { completionScriptPath, type ShellId } from "../../setup/shell.js";
25
+ import {
26
+ completionScriptPath,
27
+ type ShellDetection,
28
+ type ShellId,
29
+ } from "../../setup/shell.js";
30
+ import type { CheckResult } from "../types.js";
26
31
  import { checkShellCompletions } from "./checkShellCompletions.js";
27
32
 
28
33
  const roots: string[] = [];
@@ -33,16 +38,21 @@ const tmp = (): string => {
33
38
  };
34
39
 
35
40
  let prevHome: string | undefined;
36
- let prevShell: string | undefined;
41
+ let prevPath: string | undefined;
37
42
  beforeEach(() => {
38
43
  prevHome = process.env.HOME;
39
- prevShell = process.env.SHELL;
44
+ prevPath = process.env.PATH;
40
45
  process.env.HOME = tmp();
46
+ // The installed script spawns `pragma` for every name context, and the check
47
+ // now verifies that it can. Put one on an isolated PATH so these cases are
48
+ // about the SCRIPT rather than about the host's install.
49
+ const bin = tmp();
50
+ writeFileSync(join(bin, "pragma"), "");
51
+ process.env.PATH = bin;
41
52
  });
42
53
  afterEach(() => {
43
54
  process.env.HOME = prevHome;
44
- if (prevShell === undefined) delete process.env.SHELL;
45
- else process.env.SHELL = prevShell;
55
+ process.env.PATH = prevPath;
46
56
  for (const dir of roots) rmSync(dir, { recursive: true, force: true });
47
57
  roots.length = 0;
48
58
  });
@@ -59,6 +69,20 @@ function installScript(shell: ShellId): void {
59
69
  writeScript(shell, emitScripts(capabilities)[shell]);
60
70
  }
61
71
 
72
+ /**
73
+ * Run the check the way `doctor` does: the `completions` target detects once
74
+ * per invocation and the check reads that one answer, so the test drives the
75
+ * same pairing rather than letting the check re-read behind its own back.
76
+ */
77
+ async function check(cwd: string, shell: ShellId | null): Promise<CheckResult> {
78
+ // The shell is INJECTED rather than forced through `$SHELL`: detection reads
79
+ // the process tree now, and a test that set `$SHELL` was only ever asserting
80
+ // against the login shell — the exact confusion this check exists to catch.
81
+ const detection: ShellDetection =
82
+ shell === null ? { kind: "unknown" } : { kind: "detected", shell };
83
+ return checkShellCompletions(cwd, await detectCompletions(cwd, detection));
84
+ }
85
+
62
86
  /** Write a `.zshrc` that puts ~/.zfunc on fpath. */
63
87
  function wireZfunc(): void {
64
88
  writeFileSync(
@@ -71,34 +95,55 @@ describe("checkShellCompletions — effect test (gate 1)", () => {
71
95
  it("passes the resolver gate: `pragma <TAB>` resolves nouns", async () => {
72
96
  // No shell → skip, but only AFTER the resolver answered — the detail proves
73
97
  // the effect test ran and succeeded.
74
- delete process.env.SHELL;
75
- const result = await checkShellCompletions(tmp());
98
+ const result = await check(tmp(), null);
76
99
  expect(result.status).toBe("skip");
77
100
  expect(result.detail).toMatch(/resolver OK/);
78
101
  });
79
102
  });
80
103
 
81
104
  describe("checkShellCompletions — install probe (gate 2)", () => {
82
- it("fails when $SHELL is set but no script is installed", async () => {
83
- process.env.SHELL = "/usr/bin/bash";
84
- const result = await checkShellCompletions(tmp());
85
- expect(result.status).toBe("fail");
105
+ it("a never-installed script is available (opt-in, not a fault) with the setup command", async () => {
106
+ const result = await check(tmp(), "bash");
107
+ expect(result.status).toBe("available");
86
108
  expect(result.detail).toMatch(/not installed/);
87
109
  expect(result.remedy).toBe("pragma setup completions");
88
110
  });
89
111
 
112
+ it("does not claim a script is installed when the binary is off PATH", async () => {
113
+ // This gate runs before the install probe, so it saw only that the binary
114
+ // does not resolve — and reported `bash script installed, but ...` on a
115
+ // machine where nothing had ever been installed. Anyone invoking this CLI
116
+ // by absolute path lands here, and the row invented the file it exists to
117
+ // report on.
118
+ process.env.PATH = tmp(); // an empty PATH: no binary to find
119
+ const result = await check(tmp(), "bash");
120
+ expect(result.detail).not.toMatch(/script installed/);
121
+ expect(result.detail).toMatch(/is not on PATH/);
122
+ // Nothing was installed, so nothing that exists is broken.
123
+ expect(result.status).toBe("available");
124
+ expect(result.remedy).toMatch(/on your PATH/);
125
+ });
126
+
127
+ it("fails when an INSTALLED script cannot reach the binary", async () => {
128
+ installScript("bash");
129
+ process.env.PATH = tmp();
130
+ const result = await check(tmp(), "bash");
131
+ expect(result.status).toBe("fail");
132
+ expect(result.detail).toMatch(/script installed, but/);
133
+ });
134
+
90
135
  it("passes for bash once the up-to-date script is at its real path", async () => {
91
- process.env.SHELL = "/usr/bin/bash";
92
136
  installScript("bash");
93
- const result = await checkShellCompletions(tmp());
137
+ const result = await check(tmp(), "bash");
94
138
  expect(result.status).toBe("pass");
95
- expect(result.detail).toMatch(/bash up to date and resolving/);
139
+ expect(result.detail).toMatch(
140
+ /bash \(the shell in use\) up to date and resolving/,
141
+ );
96
142
  });
97
143
 
98
144
  it("passes for fish once the up-to-date script is at its real path", async () => {
99
- process.env.SHELL = "/usr/bin/fish";
100
145
  installScript("fish");
101
- const result = await checkShellCompletions(tmp());
146
+ const result = await check(tmp(), "fish");
102
147
  expect(result.status).toBe("pass");
103
148
  });
104
149
 
@@ -110,9 +155,8 @@ describe("checkShellCompletions — install probe (gate 2)", () => {
110
155
  // Every user upgrading across a grammar change lands here: the old script
111
156
  // offers the old nouns and misses the new ones, and doctor is the one
112
157
  // command whose job is to say so.
113
- process.env.SHELL = "/usr/bin/bash";
114
158
  writeScript("bash", "# STALE JUNK\n");
115
- const result = await checkShellCompletions(tmp());
159
+ const result = await check(tmp(), "bash");
116
160
  expect(result.status).toBe("fail");
117
161
  expect(result.detail).toMatch(/out of date/);
118
162
  expect(result.remedy).toBe("pragma setup completions");
@@ -127,23 +171,23 @@ describe("checkShellCompletions — install probe (gate 2)", () => {
127
171
  // failure back rather than closing it. The first assertion is the
128
172
  // discriminator — this project really does ask for a different body — so
129
173
  // deleting the config write below turns the test red.
130
- process.env.SHELL = "/usr/bin/bash";
131
174
  installScript("bash");
132
175
  const cwd = tmp();
133
176
  writeFileSync(
134
177
  join(cwd, "pragma.config.ts"),
135
178
  "export default { completion: { minChars: 5 } };\n",
136
179
  );
137
- expect((await detectCompletions(cwd)).state).toBe("stale");
138
- expect((await checkShellCompletions(cwd)).status).toBe("pass");
180
+ expect(
181
+ (await detectCompletions(cwd, { kind: "detected", shell: "bash" })).state,
182
+ ).toBe("stale");
183
+ expect((await check(cwd, "bash")).status).toBe("pass");
139
184
  });
140
185
  });
141
186
 
142
187
  describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
143
188
  it("fails when the zsh script is installed but ~/.zfunc is not on fpath", async () => {
144
- process.env.SHELL = "/usr/bin/zsh";
145
189
  installScript("zsh");
146
- const result = await checkShellCompletions(tmp());
190
+ const result = await check(tmp(), "zsh");
147
191
  expect(result.status).toBe("fail");
148
192
  expect(result.detail).toMatch(/not on your fpath/);
149
193
  // The remedy IS the activation hint — the exact ~/.zshrc lines.
@@ -151,11 +195,12 @@ describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
151
195
  });
152
196
 
153
197
  it("passes once the zsh script is installed AND ~/.zfunc is on fpath", async () => {
154
- process.env.SHELL = "/usr/bin/zsh";
155
198
  installScript("zsh");
156
199
  wireZfunc();
157
- const result = await checkShellCompletions(tmp());
200
+ const result = await check(tmp(), "zsh");
158
201
  expect(result.status).toBe("pass");
159
- expect(result.detail).toMatch(/zsh up to date and resolving/);
202
+ expect(result.detail).toMatch(
203
+ /zsh \(the shell in use\) up to date and resolving/,
204
+ );
160
205
  });
161
206
  });
@@ -8,7 +8,7 @@ import {
8
8
  runComplete,
9
9
  } from "../../../kernel/completion/index.js";
10
10
  import { capabilities } from "../../index.js";
11
- import { detectCompletions } from "../../setup/operations/setupCompletions.js";
11
+ import type { CompletionsDetection } from "../../setup/operations/index.js";
12
12
  import { activationHint, type ShellId } from "../../setup/shell.js";
13
13
  import type { CheckResult } from "../types.js";
14
14
 
@@ -97,14 +97,26 @@ async function completeProbe(cwd: string): Promise<number> {
97
97
  * 3. For zsh, `~/.zfunc` is on `$fpath` — the activation step setup can only
98
98
  * hint. Installed-but-unwired reports a distinct remedy.
99
99
  *
100
- * @param cwd - The project directory (the resolver's entity seam, and the
101
- * `completion` config gate 2 renders this project's body from).
102
- * @returns A CheckResult: pass (up to date + wired + answering), fail (with the
103
- * attributable remedy), or skip (shell undetected).
104
- * @note Impure — reads `$SHELL`, the install path, the config layers, `.zshrc`,
105
- * and drives the storeless resolver.
100
+ * Fault tiers: a broken resolver, a stale installed script, or an unwired zsh
101
+ * install are `fail` — something that exists does not work. A script that was
102
+ * never installed is `available`: completions are opt-in and a fresh install
103
+ * is healthy without them.
104
+ *
105
+ * The detection is passed IN rather than re-read: the `completions` target
106
+ * detects once per invocation and both the setup plan and this row read that
107
+ * one answer, so the two surfaces cannot describe different files.
108
+ *
109
+ * @param cwd - The project directory (the resolver's entity seam).
110
+ * @param d - The `completions` target's detection for this invocation.
111
+ * @returns A CheckResult: pass (up to date + wired + answering), available
112
+ * (never installed, with the setup remedy), fail (with the attributable
113
+ * remedy), or skip (shell undetected).
114
+ * @note Impure — reads the install path, `.zshrc`, and drives the resolver.
106
115
  */
107
- export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
116
+ export async function checkShellCompletions(
117
+ cwd: string,
118
+ d: CompletionsDetection,
119
+ ): Promise<CheckResult> {
108
120
  // 1. Effect test: the resolver the scripts delegate to must actually answer.
109
121
  let candidates: number;
110
122
  try {
@@ -127,19 +139,53 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
127
139
  };
128
140
  }
129
141
 
130
- // 2. The installed script is a script `setup completions` would write.
131
- const { shell, path, state } = await detectCompletions(cwd);
142
+ // 2. The check is about the shell the user is IN. Reporting on the login
143
+ // shell instead is what let this row print a green check for a shell the
144
+ // user never opens while the one they live in had nothing installed.
145
+ const { shell, path, state } = d;
146
+ if (d.detection.kind === "ambiguous") {
147
+ return {
148
+ name: NAME,
149
+ status: "skip",
150
+ detail: `resolver OK; the running shell cannot be identified (SHELL names ${d.detection.login}, the login shell)`,
151
+ remedy: `Run \`${INSTALL_REMEDY}\` from the shell you want completions in.`,
152
+ };
153
+ }
132
154
  if (shell === null || path === null) {
133
155
  return {
134
156
  name: NAME,
135
157
  status: "skip",
136
- detail: "resolver OK; shell not detected ($SHELL unset)",
158
+ detail: "resolver OK; no bash, zsh, or fish in this process tree",
159
+ };
160
+ }
161
+ // The installed script delegates every name context to the binary. A script
162
+ // that cannot reach it is inert, and reporting it as current is the same
163
+ // false green this row already told once.
164
+ //
165
+ // This gate runs BEFORE the install probe, so it says only what it has
166
+ // verified: that the binary does not resolve. Claiming "script installed" here
167
+ // told a user running this CLI by absolute path that a script they had never
168
+ // installed was broken — an invented file, in the row whose whole job is to
169
+ // report the real one. Nothing installed is still the opt-in `available` tier.
170
+ if (!d.binOnPath) {
171
+ const installed = state !== "absent";
172
+ return {
173
+ name: NAME,
174
+ status: installed ? "fail" : "available",
175
+ detail: installed
176
+ ? `${shell} script installed, but \`${BIN_NAME}\` is not on PATH — the script cannot run it`
177
+ : `resolver OK; \`${BIN_NAME}\` is not on PATH — an installed script cannot run it`,
178
+ remedy: `Put \`${BIN_NAME}\` on your PATH.`,
137
179
  };
138
180
  }
139
181
  if (state === "absent") {
182
+ // Never installed is `available`, not a fault: completions are opt-in and
183
+ // a fresh install is healthy without them. An INSTALLED script that is
184
+ // out of date or unwired (below) is the real failure — something the user
185
+ // set up no longer works.
140
186
  return {
141
187
  name: NAME,
142
- status: "fail",
188
+ status: "available",
143
189
  detail: `resolver OK; ${shell} script not installed`,
144
190
  remedy: INSTALL_REMEDY,
145
191
  };
@@ -166,6 +212,6 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
166
212
  return {
167
213
  name: NAME,
168
214
  status: "pass",
169
- detail: `${shell} up to date and resolving (${candidates} nouns)`,
215
+ detail: `${shell} (the shell in use) up to date and resolving (${candidates} nouns)`,
170
216
  };
171
217
  }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The doctor check catalogue — the diagnoses `doctor` composes into a report.
3
+ *
4
+ * A check is the whole shape of this domain: it inspects ONE thing, decides
5
+ * pass or fail, and hands back a `CheckResult` carrying the remedy. Keeping
6
+ * them apart from the report body is what lets `runChecks` stay a composition
7
+ * — it orders and awaits, and knows nothing about what any check looks at.
8
+ *
9
+ * Two kinds live here, and the barrel exposes them differently. The UNBANDED
10
+ * checks diagnose what `setup` cannot install — the Node floor, the CLI's own
11
+ * version and install source, the pack answering this project's reads, and the
12
+ * store — so each is its own named entry point. The BANDED rows are derived
13
+ * per target, per band, from the setup target table rather than authored here,
14
+ * so they surface as the one generator that derives them, never as a list of
15
+ * row names this file would then have to keep in step with `setup`.
16
+ *
17
+ * The per-target probes (the completions script check, the MCP command
18
+ * resolution helpers) stay internal on purpose: `bandedChecks` is the only way
19
+ * they are meant to be reached, and a row reachable past its band is a row
20
+ * `doctor` can report and `setup` cannot fix.
21
+ */
22
+
23
+ export { checkKeStore } from "./checkKeStore.js";
24
+ export { checkNodeVersion } from "./checkNodeVersion.js";
25
+ export { checkPackageRefs } from "./checkPackageRefs.js";
26
+ export { checkPragmaVersion } from "./checkPragmaVersion.js";
27
+ export { bandedChecks } from "./targetHealth.js";