@canonical/pragma-cli 0.33.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 (892) 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 +25 -24
  505. package/pragma.conf.ts +853 -0
  506. package/src/bin.ts +276 -82
  507. package/src/capabilities/block.parity.test.ts +253 -0
  508. package/src/capabilities/capabilities/capabilities.render.ts +4 -3
  509. package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
  510. package/src/capabilities/capabilities/catalog.ts +20 -12
  511. package/src/capabilities/capabilities/hints.ts +43 -24
  512. package/src/capabilities/capabilities/index.ts +1 -1
  513. package/src/capabilities/colophon/collectColophon.ts +50 -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 +9 -5
  517. package/src/capabilities/colophon/types.ts +16 -7
  518. package/src/capabilities/config/collectConfigShow.test.ts +58 -0
  519. package/src/capabilities/config/collectConfigShow.ts +43 -6
  520. package/src/capabilities/config/field.render.ts +4 -5
  521. package/src/capabilities/config/fields.ts +17 -37
  522. package/src/capabilities/config/get.verb.ts +70 -0
  523. package/src/capabilities/config/getUnset.test.ts +264 -0
  524. package/src/capabilities/config/index.ts +5 -1
  525. package/src/capabilities/config/runField.ts +40 -22
  526. package/src/capabilities/config/runGet.ts +34 -0
  527. package/src/capabilities/config/runSet.ts +35 -9
  528. package/src/capabilities/config/set.test.ts +48 -14
  529. package/src/capabilities/config/set.verb.ts +14 -9
  530. package/src/capabilities/config/show.render.test.ts +77 -5
  531. package/src/capabilities/config/show.render.ts +8 -13
  532. package/src/capabilities/config/show.verb.ts +13 -9
  533. package/src/capabilities/config/types.ts +26 -4
  534. package/src/capabilities/config/unset.verb.ts +58 -0
  535. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  536. package/src/capabilities/create/byteEquality.test.ts +95 -103
  537. package/src/capabilities/create/cliProjection.ts +227 -0
  538. package/src/capabilities/create/constants.ts +50 -0
  539. package/src/capabilities/create/create.mcp.test.ts +91 -7
  540. package/src/capabilities/create/create.render.ts +71 -7
  541. package/src/capabilities/create/create.test.ts +523 -162
  542. package/src/capabilities/create/create.verb.ts +361 -321
  543. package/src/capabilities/create/createGrammar.test.ts +865 -0
  544. package/src/capabilities/create/createHelp.ts +71 -0
  545. package/src/capabilities/create/createSurface.generated.ts +400 -0
  546. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  547. package/src/capabilities/create/cwdJail.test.ts +24 -5
  548. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  549. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  550. package/src/capabilities/create/index.ts +9 -14
  551. package/src/capabilities/create/messages.ts +18 -0
  552. package/src/capabilities/create/mount.ts +391 -0
  553. package/src/capabilities/create/pathJail.test.ts +90 -0
  554. package/src/capabilities/create/pathJail.ts +8 -5
  555. package/src/capabilities/create/pickGenerator.ts +40 -46
  556. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  557. package/src/capabilities/create/types.ts +29 -5
  558. package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
  559. package/src/capabilities/distribution.test.ts +122 -0
  560. package/src/capabilities/distribution.ts +54 -0
  561. package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
  562. package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
  563. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
  564. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
  565. package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
  566. package/src/capabilities/doctor/checks/index.ts +27 -0
  567. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  568. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  569. package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
  570. package/src/capabilities/doctor/doctor.render.test.ts +24 -13
  571. package/src/capabilities/doctor/doctor.render.ts +45 -20
  572. package/src/capabilities/doctor/doctor.test.ts +158 -40
  573. package/src/capabilities/doctor/doctor.verb.ts +9 -5
  574. package/src/capabilities/doctor/runChecks.ts +65 -66
  575. package/src/capabilities/doctor/types.ts +21 -5
  576. package/src/capabilities/emptyRecovery.test.ts +44 -22
  577. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  578. package/src/capabilities/graph/index.ts +1 -1
  579. package/src/capabilities/graph/inspect.render.ts +70 -22
  580. package/src/capabilities/graph/inspect.test.ts +260 -5
  581. package/src/capabilities/graph/inspect.verb.ts +18 -5
  582. package/src/capabilities/graph/query.render.ts +15 -3
  583. package/src/capabilities/graph/query.verb.ts +5 -4
  584. package/src/capabilities/graph/runQuery.ts +9 -7
  585. package/src/capabilities/index.ts +25 -19
  586. package/src/capabilities/info/collectInfo.ts +15 -10
  587. package/src/capabilities/info/info.render.ts +4 -3
  588. package/src/capabilities/info/info.verb.ts +4 -3
  589. package/src/capabilities/lazy.test.ts +125 -2
  590. package/src/capabilities/meta/complete.verb.ts +1 -1
  591. package/src/capabilities/meta/index.ts +1 -1
  592. package/src/capabilities/meta/mcp.verb.ts +10 -8
  593. package/src/capabilities/ontology/index.ts +15 -11
  594. package/src/capabilities/ontology/ontology.test.ts +6 -55
  595. package/src/capabilities/ontology/queries.ts +2 -2
  596. package/src/capabilities/ontology/render.ts +3 -4
  597. package/src/capabilities/ontology/verbs.ts +42 -83
  598. package/src/capabilities/prompt/index.ts +2 -2
  599. package/src/capabilities/prompt/prompt.render.ts +6 -2
  600. package/src/capabilities/prompt/prompt.test.ts +12 -6
  601. package/src/capabilities/prompt/types.ts +1 -1
  602. package/src/capabilities/prompt/verbs.ts +26 -14
  603. package/src/capabilities/reference.test.ts +63 -0
  604. package/src/capabilities/resources/provider.ts +367 -91
  605. package/src/capabilities/resources/resources.test.ts +411 -59
  606. package/src/capabilities/setup/buildPlan.ts +236 -0
  607. package/src/capabilities/setup/index.ts +7 -7
  608. package/src/capabilities/setup/mode.ts +74 -0
  609. package/src/capabilities/setup/operations/index.ts +74 -0
  610. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  611. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  612. package/src/capabilities/setup/operations/setupGenerator.ts +397 -320
  613. package/src/capabilities/setup/operations/setupLsp.ts +329 -68
  614. package/src/capabilities/setup/operations/setupMcp.ts +137 -97
  615. package/src/capabilities/setup/operations/setupSkills.ts +336 -108
  616. package/src/capabilities/setup/plan.render.ts +241 -0
  617. package/src/capabilities/setup/plan.ts +236 -0
  618. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  619. package/src/capabilities/setup/setup.render.test.ts +281 -73
  620. package/src/capabilities/setup/setup.render.ts +45 -77
  621. package/src/capabilities/setup/setup.test.ts +972 -209
  622. package/src/capabilities/setup/setup.verb.ts +233 -74
  623. package/src/capabilities/setup/shell.test.ts +86 -0
  624. package/src/capabilities/setup/shell.ts +166 -14
  625. package/src/capabilities/setup/targets.ts +367 -0
  626. package/src/capabilities/setup/types.ts +18 -57
  627. package/src/capabilities/shared/assertExecOk.ts +68 -10
  628. package/src/capabilities/shared/index.ts +32 -0
  629. package/src/capabilities/shared/packageManager.test.ts +55 -0
  630. package/src/capabilities/shared/packageManager.ts +62 -6
  631. package/src/capabilities/skill/discover.ts +47 -9
  632. package/src/capabilities/skill/index.ts +1 -1
  633. package/src/capabilities/skill/render.ts +14 -14
  634. package/src/capabilities/skill/skill.test.ts +7 -5
  635. package/src/capabilities/skill/verbs.ts +9 -10
  636. package/src/capabilities/sources/collectStatus.ts +61 -51
  637. package/src/capabilities/sources/index.ts +2 -2
  638. package/src/capabilities/sources/installSkills.ts +86 -9
  639. package/src/capabilities/sources/runUpdate.ts +164 -141
  640. package/src/capabilities/sources/sources.test.ts +265 -119
  641. package/src/capabilities/sources/status.render.test.ts +53 -24
  642. package/src/capabilities/sources/status.render.ts +25 -30
  643. package/src/capabilities/sources/status.verb.ts +16 -9
  644. package/src/capabilities/sources/types.ts +18 -25
  645. package/src/capabilities/sources/update.render.ts +10 -3
  646. package/src/capabilities/sources/update.verb.ts +13 -24
  647. package/src/capabilities/surface.test.ts +165 -25
  648. package/src/capabilities/tier.parity.test.ts +144 -0
  649. package/src/capabilities/upgrade/runUpgrade.ts +8 -8
  650. package/src/capabilities/upgrade/upgrade.render.ts +4 -5
  651. package/src/capabilities/upgrade/upgrade.test.ts +3 -3
  652. package/src/capabilities/upgrade/upgrade.verb.ts +8 -4
  653. package/src/capabilities/version/index.ts +12 -0
  654. package/src/capabilities/version/version.test.ts +66 -0
  655. package/src/capabilities/version/version.verb.ts +39 -0
  656. package/src/constants.test.ts +8 -6
  657. package/src/constants.ts +78 -22
  658. package/src/identity.test.ts +348 -0
  659. package/src/index.ts +2 -2
  660. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
  661. package/src/kernel/completion/complete.test.ts +12 -2
  662. package/src/kernel/completion/complete.ts +1 -1
  663. package/src/kernel/completion/emitScripts.test.ts +1 -1
  664. package/src/kernel/completion/emitScripts.ts +5 -3
  665. package/src/kernel/completion/entitySource.test.ts +185 -41
  666. package/src/kernel/completion/entitySource.ts +133 -110
  667. package/src/kernel/completion/model.test.ts +165 -13
  668. package/src/kernel/completion/model.ts +105 -14
  669. package/src/kernel/completion/parse.test.ts +4 -7
  670. package/src/kernel/completion/parse.ts +15 -0
  671. package/src/kernel/completion/resolve.test.ts +0 -1
  672. package/src/kernel/completion/safety.test.ts +104 -50
  673. package/src/kernel/completion/shellDrive.test.ts +611 -0
  674. package/src/kernel/completion/templates/bash.ts +7 -2
  675. package/src/kernel/completion/templates/fish.ts +28 -6
  676. package/src/kernel/completion/templates/index.ts +23 -0
  677. package/src/kernel/completion/types.ts +10 -3
  678. package/src/kernel/config/defaults.test.ts +108 -0
  679. package/src/kernel/config/defaults.ts +13 -23
  680. package/src/kernel/config/evaluateProjectConfig.ts +33 -11
  681. package/src/kernel/config/findProjectConfig.ts +4 -3
  682. package/src/kernel/config/firstRun.test.ts +44 -38
  683. package/src/kernel/config/firstRun.ts +24 -81
  684. package/src/kernel/config/globalConfig.ts +2 -2
  685. package/src/kernel/config/index.ts +5 -6
  686. package/src/kernel/config/paths.ts +17 -17
  687. package/src/kernel/config/readConfig.test.ts +246 -7
  688. package/src/kernel/config/readConfig.ts +8 -8
  689. package/src/kernel/config/schema.test.ts +50 -0
  690. package/src/kernel/config/schema.ts +100 -11
  691. package/src/kernel/config/types.ts +75 -19
  692. package/src/kernel/copy.test.ts +483 -0
  693. package/src/kernel/copy.ts +54 -0
  694. package/src/kernel/error/PragmaError.test.ts +6 -3
  695. package/src/kernel/error/PragmaError.ts +4 -2
  696. package/src/kernel/error/constants.ts +7 -4
  697. package/src/kernel/error/fromTaskError.ts +28 -6
  698. package/src/kernel/error/index.ts +1 -1
  699. package/src/kernel/error/recovery.test.ts +22 -45
  700. package/src/kernel/error/recovery.ts +36 -27
  701. package/src/kernel/error/renderError.ts +42 -1
  702. package/src/kernel/error/types.ts +25 -4
  703. package/src/kernel/index.ts +26 -0
  704. package/src/kernel/packs/collect.test.ts +195 -11
  705. package/src/kernel/packs/collect.ts +212 -61
  706. package/src/kernel/packs/compile.test.ts +293 -8
  707. package/src/kernel/packs/compile.ts +108 -15
  708. package/src/kernel/packs/disclosure.test.ts +5 -2
  709. package/src/kernel/packs/disclosure.ts +2 -2
  710. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  711. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
  712. package/src/kernel/packs/graphql/index.ts +20 -0
  713. package/src/kernel/packs/graphqlSource.test.ts +6 -3
  714. package/src/kernel/packs/index.ts +40 -0
  715. package/src/kernel/packs/iri.test.ts +73 -0
  716. package/src/kernel/packs/iri.ts +70 -20
  717. package/src/kernel/packs/renderPack.ts +28 -7
  718. package/src/kernel/packs/resolveEntity.test.ts +213 -0
  719. package/src/kernel/packs/resolveEntity.ts +132 -34
  720. package/src/kernel/packs/runBodies.ts +16 -16
  721. package/src/kernel/packs/sample.ts +1 -1
  722. package/src/kernel/packs/schema.ts +114 -11
  723. package/src/kernel/packs/sparql/applyFilters.ts +16 -17
  724. package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
  725. package/src/kernel/packs/sparql/index.ts +37 -0
  726. package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
  727. package/src/kernel/packs/sparql/runSelect.ts +75 -37
  728. package/src/kernel/packs/toolDescription.test.ts +52 -5
  729. package/src/kernel/packs/types.ts +52 -4
  730. package/src/kernel/packs/uniqueness.ts +5 -5
  731. package/src/kernel/project/cli/buildProgram.test.ts +157 -17
  732. package/src/kernel/project/cli/buildProgram.ts +77 -18
  733. package/src/kernel/project/cli/constants.ts +34 -0
  734. package/src/kernel/project/cli/dispatch.test.ts +227 -3
  735. package/src/kernel/project/cli/dispatch.ts +250 -48
  736. package/src/kernel/project/cli/exitCodes.ts +1 -1
  737. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  738. package/src/kernel/project/cli/globalFlags.ts +130 -30
  739. package/src/kernel/project/cli/helpFormat.ts +14 -1
  740. package/src/kernel/project/cli/rootHelp.ts +140 -111
  741. package/src/kernel/project/cli/suggest.test.ts +33 -1
  742. package/src/kernel/project/cli/suggest.ts +25 -1
  743. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  744. package/src/kernel/project/cli/verbHelp.ts +23 -7
  745. package/src/kernel/project/mcp/buildServer.ts +18 -10
  746. package/src/kernel/project/mcp/envelope.ts +2 -2
  747. package/src/kernel/project/mcp/instructions.ts +12 -7
  748. package/src/kernel/project/mcp/mcpError.ts +1 -1
  749. package/src/kernel/project/mcp/parity.test.ts +42 -1
  750. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  751. package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
  752. package/src/kernel/project/mcp/prompts/provider.ts +22 -8
  753. package/src/kernel/project/mcp/prompts/source.ts +69 -68
  754. package/src/kernel/project/mcp/registerVerb.ts +56 -11
  755. package/src/kernel/project/mcp/serve.ts +13 -5
  756. package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
  757. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  758. package/src/kernel/render/contracts.ts +21 -0
  759. package/src/kernel/render/disclosure.ts +4 -2
  760. package/src/kernel/render/envelope.ts +2 -3
  761. package/src/kernel/render/formatters.ts +1 -1
  762. package/src/kernel/render/prefixes.test.ts +36 -0
  763. package/src/kernel/render/prefixes.ts +40 -13
  764. package/src/kernel/render/renderers.test.ts +244 -7
  765. package/src/kernel/render/renderers.ts +222 -20
  766. package/src/kernel/render/style.test.ts +75 -24
  767. package/src/kernel/render/style.ts +31 -1
  768. package/src/kernel/render/turtle.ts +222 -0
  769. package/src/kernel/runtime/graphpack/build.ts +29 -3
  770. package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
  771. package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
  772. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
  773. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
  775. package/src/kernel/runtime/graphpack/embedded.ts +39 -13
  776. package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
  777. package/src/kernel/runtime/graphpack/hash.ts +3 -2
  778. package/src/kernel/runtime/graphpack/index.ts +1 -1
  779. package/src/kernel/runtime/graphpack/manifest.ts +114 -12
  780. package/src/kernel/runtime/graphpack/read.ts +5 -11
  781. package/src/kernel/runtime/graphpack/schemas.ts +74 -0
  782. package/src/kernel/runtime/graphpack/stories.ts +84 -0
  783. package/src/kernel/runtime/graphpack/types.ts +61 -48
  784. package/src/kernel/runtime/loadSession.ts +1 -1
  785. package/src/kernel/runtime/paths.ts +64 -15
  786. package/src/kernel/runtime/probe.test.ts +8 -4
  787. package/src/kernel/runtime/probe.ts +6 -6
  788. package/src/kernel/runtime/readEntity.ts +477 -32
  789. package/src/kernel/runtime/refs/gitOps.ts +1 -19
  790. package/src/kernel/runtime/refs/index.ts +39 -0
  791. package/src/kernel/runtime/refs/parseRef.ts +8 -8
  792. package/src/kernel/runtime/refs/resolve.ts +82 -66
  793. package/src/kernel/runtime/resolveSources.test.ts +63 -24
  794. package/src/kernel/runtime/resolveSources.ts +36 -25
  795. package/src/kernel/runtime/storeReadiness.ts +10 -10
  796. package/src/kernel/runtime/storeless.test.ts +1 -1
  797. package/src/kernel/runtime/types.ts +15 -1
  798. package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
  799. package/src/kernel/spec/emitReference.test.ts +3 -3
  800. package/src/kernel/spec/emitReference.ts +242 -34
  801. package/src/kernel/spec/emitSurface.ts +57 -11
  802. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  803. package/src/kernel/spec/surfaceConformance.ts +8 -0
  804. package/src/kernel/spec/types.ts +277 -13
  805. package/src/kernel/spec/validate.ts +2 -1
  806. package/src/kernel/vocabulary.test.ts +164 -0
  807. package/src/kernel/vocabulary.ts +146 -0
  808. package/src/testing/PARITY_GAPS.ts +8 -2
  809. package/src/testing/behavioral/README.md +3 -3
  810. package/src/testing/behavioral/completion.test.ts +19 -6
  811. package/src/testing/behavioral/docExamples.test.ts +14 -0
  812. package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
  813. package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
  814. package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
  815. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  816. package/src/testing/behavioral/harness.foundation.test.ts +14 -5
  817. package/src/testing/behavioral/journeys.cli.test.ts +117 -76
  818. package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
  819. package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
  820. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  821. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  822. package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +9 -6
  823. package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
  824. package/src/testing/behavioral/liveReadSurface.ts +4 -3
  825. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  826. package/src/testing/behavioral/mcpSurface.test.ts +10 -5
  827. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  828. package/src/testing/behavioral/staleCommands.test.ts +10 -0
  829. package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
  830. package/src/testing/eval/cases/assembly.ts +13 -6
  831. package/src/testing/eval/cases/effectful.ts +28 -15
  832. package/src/testing/eval/cases/readNouns.ts +22 -20
  833. package/src/testing/eval/cases/stable.ts +5 -1
  834. package/src/testing/eval/eval.test.ts +7 -1
  835. package/src/testing/fixtures/blockGraph.ts +79 -0
  836. package/src/testing/fixtures/fixtureCapability.ts +45 -1
  837. package/src/testing/fixtures/graph/canonical.ts +94 -5
  838. package/src/testing/fixtures/graph/defaultPack.ts +7 -6
  839. package/src/testing/fixtures/graph/owlExport.ts +7 -5
  840. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  841. package/src/testing/helpers/fixtureGraph.ts +33 -16
  842. package/src/testing/helpers/packRuntime.ts +2 -3
  843. package/src/testing/helpers/projectCli.ts +2 -1
  844. package/src/testing/helpers/projectMcp.ts +38 -6
  845. package/src/testing/helpers/runCli.ts +35 -18
  846. package/src/testing/perf/budgets.test.ts +24 -9
  847. package/src/testing/perf/budgets.ts +76 -12
  848. package/src/testing/perf/codegen.test.ts +126 -0
  849. package/src/testing/perf/globalSetup.test.ts +286 -0
  850. package/src/testing/perf/globalSetup.ts +611 -14
  851. package/src/testing/perf/measure.test.ts +38 -0
  852. package/src/testing/perf/measure.ts +23 -4
  853. package/src/testing/setupXdgIsolation.ts +81 -21
  854. package/src/testing/tempRoot.globalSetup.ts +122 -0
  855. package/src/types.ts +2 -2
  856. package/dist/pragma +0 -0
  857. package/src/capabilities/block/blockList.test.ts +0 -79
  858. package/src/capabilities/block/blockList.verb.ts +0 -163
  859. package/src/capabilities/block/index.ts +0 -25
  860. package/src/capabilities/block/pack.ts +0 -166
  861. package/src/capabilities/block/parity.test.ts +0 -187
  862. package/src/capabilities/block/tierChain.ts +0 -78
  863. package/src/capabilities/colophon/pragmaColophon.ts +0 -66
  864. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
  865. package/src/capabilities/create/templates.embedded.generated.ts +0 -53
  866. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
  867. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  868. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
  869. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
  870. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  871. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  872. package/src/capabilities/modifier/index.ts +0 -15
  873. package/src/capabilities/modifier/pack.ts +0 -64
  874. package/src/capabilities/standard/index.ts +0 -18
  875. package/src/capabilities/standard/pack.ts +0 -128
  876. package/src/capabilities/tier/index.ts +0 -19
  877. package/src/capabilities/tier/lookup.render.test.ts +0 -72
  878. package/src/capabilities/tier/lookup.render.ts +0 -59
  879. package/src/capabilities/tier/lookup.test.ts +0 -83
  880. package/src/capabilities/tier/lookup.verb.ts +0 -44
  881. package/src/capabilities/tier/pack.ts +0 -28
  882. package/src/capabilities/tier/runLookup.ts +0 -87
  883. package/src/capabilities/token/addConfig.render.ts +0 -27
  884. package/src/capabilities/token/addConfig.test.ts +0 -62
  885. package/src/capabilities/token/addConfig.verb.ts +0 -40
  886. package/src/capabilities/token/index.ts +0 -19
  887. package/src/capabilities/token/pack.ts +0 -58
  888. package/src/capabilities/token/runAddConfig.ts +0 -95
  889. package/src/kernel/completion/bashDrive.test.ts +0 -73
  890. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
  891. package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
  892. package/src/kernel/runtime/lock.ts +0 -90
@@ -1,9 +1,10 @@
1
- import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
2
- import { detectInstallSource } from "../../shared/packageManager.js";
1
+ import { BIN_NAME } from "../../../constants.js";
2
+ import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
3
+ import { detectInstallSource } from "../../shared/index.js";
3
4
  import type { CheckResult } from "../types.js";
4
5
 
5
6
  /**
6
- * Report the pragma version and how it was installed. Always passes — purely
7
+ * Report the CLI version and how it was installed. Always passes — purely
7
8
  * informational.
8
9
  *
9
10
  * @param rt - The per-invocation runtime (for `version`).
@@ -15,7 +16,7 @@ export async function checkPragmaVersion(
15
16
  ): Promise<CheckResult> {
16
17
  const install = detectInstallSource();
17
18
  return {
18
- name: "pragma version",
19
+ name: `${BIN_NAME} version`,
19
20
  status: "pass",
20
21
  detail: `v${rt.version} (installed via ${install.label})`,
21
22
  };
@@ -1,19 +1,33 @@
1
1
  /**
2
2
  * `checkShellCompletions` — the doctor check that verifies completions are
3
- * installed AND functional.
3
+ * installed AND up to date AND functional.
4
4
  *
5
- * Runs against an isolated HOME and a controlled `$SHELL` so the three gates —
6
- * the resolver effect test, the real install-path probe, and the zsh fpath
7
- * activation gate — are deterministic. The effect test (gate 1) drives the real
5
+ * Runs against an isolated HOME and an injected shell so the gates —
6
+ * the resolver effect test, the install probe, and the zsh fpath activation
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
9
9
  * temp HOME rather than mocking the fs.
10
+ *
11
+ * Gate 2 compares BYTES, not existence, so the "installed" cases here write the
12
+ * real `emitScripts(capabilities)[shell]` body. A file that merely exists is
13
+ * now the failing case, and it has its own test — as does the boundary on the
14
+ * other side, where a per-project `completion` config must NOT be able to
15
+ * condemn the one global script.
10
16
  */
11
17
 
12
18
  import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
13
19
  import { tmpdir } from "node:os";
14
20
  import { dirname, join } from "node:path";
15
21
  import { afterEach, beforeEach, describe, expect, it } from "vitest";
16
- import { completionScriptPath } from "../../setup/shell.js";
22
+ import { emitScripts } from "../../../kernel/completion/emitScripts.js";
23
+ import { capabilities } from "../../index.js";
24
+ import { detectCompletions } from "../../setup/operations/setupCompletions.js";
25
+ import {
26
+ completionScriptPath,
27
+ type ShellDetection,
28
+ type ShellId,
29
+ } from "../../setup/shell.js";
30
+ import type { CheckResult } from "../types.js";
17
31
  import { checkShellCompletions } from "./checkShellCompletions.js";
18
32
 
19
33
  const roots: string[] = [];
@@ -24,25 +38,49 @@ const tmp = (): string => {
24
38
  };
25
39
 
26
40
  let prevHome: string | undefined;
27
- let prevShell: string | undefined;
41
+ let prevPath: string | undefined;
28
42
  beforeEach(() => {
29
43
  prevHome = process.env.HOME;
30
- prevShell = process.env.SHELL;
44
+ prevPath = process.env.PATH;
31
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;
32
52
  });
33
53
  afterEach(() => {
34
54
  process.env.HOME = prevHome;
35
- if (prevShell === undefined) delete process.env.SHELL;
36
- else process.env.SHELL = prevShell;
55
+ process.env.PATH = prevPath;
37
56
  for (const dir of roots) rmSync(dir, { recursive: true, force: true });
38
57
  roots.length = 0;
39
58
  });
40
59
 
41
- /** Write the (empty) completion script to the shell's real install path. */
42
- function installScript(shell: "zsh" | "bash" | "fish"): void {
60
+ /** Write `body` to the shell's real install path. */
61
+ function writeScript(shell: ShellId, body: string): void {
43
62
  const path = completionScriptPath(shell);
44
63
  mkdirSync(dirname(path), { recursive: true });
45
- writeFileSync(path, "# stub\n");
64
+ writeFileSync(path, body);
65
+ }
66
+
67
+ /** Install the script `setup completions` would write for this shell. */
68
+ function installScript(shell: ShellId): void {
69
+ writeScript(shell, emitScripts(capabilities)[shell]);
70
+ }
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));
46
84
  }
47
85
 
48
86
  /** Write a `.zshrc` that puts ~/.zfunc on fpath. */
@@ -57,43 +95,99 @@ describe("checkShellCompletions — effect test (gate 1)", () => {
57
95
  it("passes the resolver gate: `pragma <TAB>` resolves nouns", async () => {
58
96
  // No shell → skip, but only AFTER the resolver answered — the detail proves
59
97
  // the effect test ran and succeeded.
60
- delete process.env.SHELL;
61
- const result = await checkShellCompletions(tmp());
98
+ const result = await check(tmp(), null);
62
99
  expect(result.status).toBe("skip");
63
100
  expect(result.detail).toMatch(/resolver OK/);
64
101
  });
65
102
  });
66
103
 
67
104
  describe("checkShellCompletions — install probe (gate 2)", () => {
68
- it("fails when $SHELL is set but no script is installed", async () => {
69
- process.env.SHELL = "/usr/bin/bash";
70
- const result = await checkShellCompletions(tmp());
71
- 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");
72
108
  expect(result.detail).toMatch(/not installed/);
73
109
  expect(result.remedy).toBe("pragma setup completions");
74
110
  });
75
111
 
76
- it("passes for bash once the script exists at its real path", async () => {
77
- process.env.SHELL = "/usr/bin/bash";
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 () => {
78
128
  installScript("bash");
79
- const result = await checkShellCompletions(tmp());
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
+
135
+ it("passes for bash once the up-to-date script is at its real path", async () => {
136
+ installScript("bash");
137
+ const result = await check(tmp(), "bash");
80
138
  expect(result.status).toBe("pass");
81
- expect(result.detail).toMatch(/bash installed and resolving/);
139
+ expect(result.detail).toMatch(
140
+ /bash \(the shell in use\) up to date and resolving/,
141
+ );
82
142
  });
83
143
 
84
- it("passes for fish once the script exists at its real path", async () => {
85
- process.env.SHELL = "/usr/bin/fish";
144
+ it("passes for fish once the up-to-date script is at its real path", async () => {
86
145
  installScript("fish");
87
- const result = await checkShellCompletions(tmp());
146
+ const result = await check(tmp(), "fish");
88
147
  expect(result.status).toBe("pass");
89
148
  });
149
+
150
+ it("fails when the installed script is out of date", async () => {
151
+ // Reproduced against the compiled binary before this was fixed: overwrite
152
+ // the installed script with junk and `doctor` still reported
153
+ // "✓ Shell completions: bash installed and resolving (19 nouns)", while
154
+ // `setup completions` in the same breath said "Updating bash completions".
155
+ // Every user upgrading across a grammar change lands here: the old script
156
+ // offers the old nouns and misses the new ones, and doctor is the one
157
+ // command whose job is to say so.
158
+ writeScript("bash", "# STALE JUNK\n");
159
+ const result = await check(tmp(), "bash");
160
+ expect(result.status).toBe("fail");
161
+ expect(result.detail).toMatch(/out of date/);
162
+ expect(result.remedy).toBe("pragma setup completions");
163
+ });
164
+
165
+ it("does NOT condemn the global script for one project's `completion` config", async () => {
166
+ // The script is ONE file per user; `completion` config is layered per
167
+ // project. Comparing the global file against only THIS directory's body
168
+ // made `doctor`'s verdict flip with `cd`: reproduced against the real
169
+ // check, a project declaring `minChars: 5` passed in its own directory and
170
+ // failed in every other, and running the offered remedy there moved the
171
+ // failure back rather than closing it. The first assertion is the
172
+ // discriminator — this project really does ask for a different body — so
173
+ // deleting the config write below turns the test red.
174
+ installScript("bash");
175
+ const cwd = tmp();
176
+ writeFileSync(
177
+ join(cwd, "pragma.config.ts"),
178
+ "export default { completion: { minChars: 5 } };\n",
179
+ );
180
+ expect(
181
+ (await detectCompletions(cwd, { kind: "detected", shell: "bash" })).state,
182
+ ).toBe("stale");
183
+ expect((await check(cwd, "bash")).status).toBe("pass");
184
+ });
90
185
  });
91
186
 
92
187
  describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
93
188
  it("fails when the zsh script is installed but ~/.zfunc is not on fpath", async () => {
94
- process.env.SHELL = "/usr/bin/zsh";
95
189
  installScript("zsh");
96
- const result = await checkShellCompletions(tmp());
190
+ const result = await check(tmp(), "zsh");
97
191
  expect(result.status).toBe("fail");
98
192
  expect(result.detail).toMatch(/not on your fpath/);
99
193
  // The remedy IS the activation hint — the exact ~/.zshrc lines.
@@ -101,11 +195,12 @@ describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
101
195
  });
102
196
 
103
197
  it("passes once the zsh script is installed AND ~/.zfunc is on fpath", async () => {
104
- process.env.SHELL = "/usr/bin/zsh";
105
198
  installScript("zsh");
106
199
  wireZfunc();
107
- const result = await checkShellCompletions(tmp());
200
+ const result = await check(tmp(), "zsh");
108
201
  expect(result.status).toBe("pass");
109
- expect(result.detail).toMatch(/zsh installed and resolving/);
202
+ expect(result.detail).toMatch(
203
+ /zsh \(the shell in use\) up to date and resolving/,
204
+ );
110
205
  });
111
206
  });
@@ -1,20 +1,48 @@
1
- import { existsSync, readFileSync } from "node:fs";
1
+ import { readFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
+ import { BIN_NAME } from "../../../constants.js";
4
5
  import {
6
+ emitScripts,
5
7
  indexCompletionEnv,
6
8
  runComplete,
7
9
  } from "../../../kernel/completion/index.js";
8
10
  import { capabilities } from "../../index.js";
9
- import {
10
- activationHint,
11
- completionScriptPath,
12
- detectShell,
13
- } from "../../setup/shell.js";
11
+ import type { CompletionsDetection } from "../../setup/operations/index.js";
12
+ import { activationHint, type ShellId } from "../../setup/shell.js";
14
13
  import type { CheckResult } from "../types.js";
15
14
 
16
15
  const NAME = "Shell completions";
17
16
 
17
+ /** The one remedy for an absent or out-of-date script. */
18
+ const INSTALL_REMEDY = `${BIN_NAME} setup completions`;
19
+
20
+ /**
21
+ * Whether the installed script is the config-free emit — the body
22
+ * `setup completions` writes when no `completion` config tunes it.
23
+ *
24
+ * The completion script is ONE file per user, but the `completion` config it is
25
+ * rendered from is layered per project. So `detectCompletions(cwd)`'s `stale`
26
+ * means only "not what THIS directory would write", and on its own it would let
27
+ * any project that tunes `minChars` call a globally-correct script out of date
28
+ * from every other directory — a `doctor` verdict that flips with `cd`, and a
29
+ * remedy that just moves the failure to the project you came from. A script
30
+ * that matches neither this project's body nor the untuned one is the one that
31
+ * is genuinely stale.
32
+ *
33
+ * @param path - The install path.
34
+ * @param shell - The detected shell.
35
+ * @returns Whether the file there is byte-identical to the untuned emit.
36
+ * @note Impure — reads the install path. An unreadable file counts as `false`.
37
+ */
38
+ function isUntunedScript(path: string, shell: ShellId): boolean {
39
+ try {
40
+ return readFileSync(path, "utf-8") === emitScripts(capabilities)[shell];
41
+ } catch {
42
+ return false;
43
+ }
44
+ }
45
+
18
46
  /**
19
47
  * Whether the user's `.zshrc` puts `~/.zfunc` on `$fpath` — the activation step
20
48
  * `setup completions` cannot perform for the user. zsh loads nothing from
@@ -53,25 +81,42 @@ async function completeProbe(cwd: string): Promise<number> {
53
81
  }
54
82
 
55
83
  /**
56
- * Check that shell completions are installed AND functional.
84
+ * Check that shell completions are installed AND up to date AND functional.
57
85
  *
58
86
  * Three gates, in order:
59
87
  * 1. The resolver answers (`completeProbe` drives `runComplete` end to end) —
60
88
  * the effect every installed script depends on. A failure here is a real
61
89
  * regression, so it fails even when nothing is installed.
62
- * 2. The script file exists at the shell's real install path (`shell.ts`) —
63
- * NOT a `"pragma"` substring in an RC file, which `setup completions` never
64
- * writes.
90
+ * 2. The installed script is present AND is a script `setup completions` would
91
+ * write. Bytes, not existence: a file that merely exists proves nothing — a
92
+ * user upgrading across a grammar change keeps the old script, loses the
93
+ * moved nouns from TAB, and used to be told everything was fine. The path
94
+ * and this project's body come from `detectCompletions`, the ONE owner of
95
+ * that decision; {@link isUntunedScript} is what keeps a per-project
96
+ * `completion` config from condemning a global file (see its docblock).
65
97
  * 3. For zsh, `~/.zfunc` is on `$fpath` — the activation step setup can only
66
98
  * hint. Installed-but-unwired reports a distinct remedy.
67
99
  *
68
- * @param cwd - The project directory (for the resolver's entity seam).
69
- * @returns A CheckResult: pass (installed + wired + answering), fail (with the
70
- * attributable remedy), or skip (shell undetected).
71
- * @note Impure — reads `$SHELL`, the install path, `.zshrc`, and drives the
72
- * 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.
73
115
  */
74
- export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
116
+ export async function checkShellCompletions(
117
+ cwd: string,
118
+ d: CompletionsDetection,
119
+ ): Promise<CheckResult> {
75
120
  // 1. Effect test: the resolver the scripts delegate to must actually answer.
76
121
  let candidates: number;
77
122
  try {
@@ -82,34 +127,75 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
82
127
  name: NAME,
83
128
  status: "fail",
84
129
  detail: `completion resolver failed: ${reason}`,
85
- remedy: "Report this as a bug — `pragma __complete` should never throw.",
130
+ remedy: `Report this as a bug — \`${BIN_NAME} __complete\` should never throw.`,
86
131
  };
87
132
  }
88
133
  if (candidates === 0) {
89
134
  return {
90
135
  name: NAME,
91
136
  status: "fail",
92
- detail: "completion resolver returned no candidates for `pragma <TAB>`",
137
+ detail: `completion resolver returned no candidates for \`${BIN_NAME} <TAB>\``,
93
138
  remedy: "Report this as a bug — the noun context is always non-empty.",
94
139
  };
95
140
  }
96
141
 
97
- // 2. The script file exists at the shell's real install path.
98
- const shell = detectShell();
99
- if (!shell) {
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") {
100
147
  return {
101
148
  name: NAME,
102
149
  status: "skip",
103
- detail: "resolver OK; shell not detected ($SHELL unset)",
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.`,
104
152
  };
105
153
  }
106
- const path = completionScriptPath(shell);
107
- if (!existsSync(path)) {
154
+ if (shell === null || path === null) {
108
155
  return {
109
156
  name: NAME,
110
- status: "fail",
157
+ status: "skip",
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.`,
179
+ };
180
+ }
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.
186
+ return {
187
+ name: NAME,
188
+ status: "available",
111
189
  detail: `resolver OK; ${shell} script not installed`,
112
- remedy: "pragma setup completions",
190
+ remedy: INSTALL_REMEDY,
191
+ };
192
+ }
193
+ if (state === "stale" && !isUntunedScript(path, shell)) {
194
+ return {
195
+ name: NAME,
196
+ status: "fail",
197
+ detail: `resolver OK; ${shell} script at ${path} is out of date`,
198
+ remedy: INSTALL_REMEDY,
113
199
  };
114
200
  }
115
201
 
@@ -126,6 +212,6 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
126
212
  return {
127
213
  name: NAME,
128
214
  status: "pass",
129
- detail: `${shell} installed and resolving (${candidates} nouns)`,
215
+ detail: `${shell} (the shell in use) up to date and resolving (${candidates} nouns)`,
130
216
  };
131
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";
@@ -0,0 +1,100 @@
1
+ /**
2
+ * `commandOf` reads BOTH registered entry shapes.
3
+ *
4
+ * A harness whose schema requires `command` to be an argv array (OpenCode)
5
+ * carries the executable in the first element; a string-valued `command` IS the
6
+ * executable. Reading only the string form made doctor skip an entry `setup`
7
+ * had just written correctly — and report no command-based servers on a fully
8
+ * configured machine. The two shapes must resolve to the same executable, which
9
+ * is what these cases pin.
10
+ */
11
+
12
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
13
+ import { tmpdir } from "node:os";
14
+ import { join } from "node:path";
15
+ import type { PlatformEnv } from "@canonical/harnesses";
16
+ import { afterAll, describe, expect, it } from "vitest";
17
+ import { commandOf, commandResolves } from "./mcpCommand.js";
18
+
19
+ describe("commandOf — one executable, either entry shape", () => {
20
+ it("reads a string command", () => {
21
+ expect(commandOf({ command: "pragma", args: ["mcp", "serve"] })).toBe(
22
+ "pragma",
23
+ );
24
+ });
25
+
26
+ it("reads the executable out of an argv array", () => {
27
+ expect(commandOf({ command: ["pragma", "mcp", "serve"] })).toBe("pragma");
28
+ });
29
+
30
+ it("skips the leading empty element rather than returning it", () => {
31
+ expect(commandOf({ command: ["", "pragma"] })).toBe("pragma");
32
+ });
33
+
34
+ it("has no command for an HTTP entry", () => {
35
+ expect(commandOf({ type: "http", url: "https://example.test" })).toBe(
36
+ undefined,
37
+ );
38
+ });
39
+
40
+ it("has no command for an empty string, an empty array, or a non-entry", () => {
41
+ expect(commandOf({ command: "" })).toBe(undefined);
42
+ expect(commandOf({ command: [] })).toBe(undefined);
43
+ expect(commandOf(null)).toBe(undefined);
44
+ expect(commandOf("pragma")).toBe(undefined);
45
+ });
46
+ });
47
+
48
+ describe("commandResolves — the host's own resolution rules", () => {
49
+ const dirs: string[] = [];
50
+ const tmp = (): string => {
51
+ const dir = mkdtempSync(join(tmpdir(), "pragma-mcp-path-"));
52
+ dirs.push(dir);
53
+ return dir;
54
+ };
55
+ afterAll(() => {
56
+ for (const dir of dirs) rmSync(dir, { recursive: true, force: true });
57
+ });
58
+
59
+ const hostOf = (
60
+ platform: PlatformEnv["platform"],
61
+ dir: string,
62
+ ): PlatformEnv => ({
63
+ platform,
64
+ env: { PATH: dir },
65
+ home: dir,
66
+ isWsl: false,
67
+ });
68
+
69
+ it("resolves a Windows shim, which a bare-name PATH join cannot see", async () => {
70
+ // npm installs the CLI as `pragma.cmd` on Windows. Joining the bare name
71
+ // onto each PATH directory found nothing, so a registration `setup` had
72
+ // just written correctly was reported as a dead command. (The file is
73
+ // spelled to match a default `PATHEXT` entry exactly, because this test
74
+ // runs on a case-sensitive filesystem.)
75
+ const dir = tmp();
76
+ writeFileSync(join(dir, "pragma.CMD"), "");
77
+ expect(await commandResolves("pragma", dir, hostOf("win32", dir))).toBe(
78
+ true,
79
+ );
80
+ });
81
+
82
+ it("resolves a bare name off PATH elsewhere, and says no when it is absent", async () => {
83
+ const dir = tmp();
84
+ writeFileSync(join(dir, "pragma"), "");
85
+ expect(await commandResolves("pragma", dir, hostOf("linux", dir))).toBe(
86
+ true,
87
+ );
88
+ expect(await commandResolves("absent", dir, hostOf("linux", dir))).toBe(
89
+ false,
90
+ );
91
+ });
92
+
93
+ it("checks a path-bearing command as a file, relative to the project root", async () => {
94
+ const dir = tmp();
95
+ writeFileSync(join(dir, "local-bin"), "");
96
+ expect(
97
+ await commandResolves("./local-bin", dir, hostOf("linux", dir)),
98
+ ).toBe(true);
99
+ });
100
+ });
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Command resolution for MCP server entries.
3
+ *
4
+ * A dead `command` makes every agent session try and fail to boot the server,
5
+ * so the `mcp` doctor row reports whether the entry it owns resolves. The row
6
+ * judges ONLY the entry this CLI writes: an aggregate check over every server
7
+ * in the file failed the row whenever some FOREIGN server had a dead command,
8
+ * which is a fact about someone else's tool reported as this one's fault.
9
+ */
10
+
11
+ import { existsSync } from "node:fs";
12
+ import { isAbsolute, join } from "node:path";
13
+ import type { PlatformEnv } from "@canonical/harnesses";
14
+
15
+ /**
16
+ * Extract the stdio command from an MCP server config entry, if any. HTTP/SSE
17
+ * entries (`{ type: "http", url }`) have no command and are not checked.
18
+ *
19
+ * Both entry shapes resolve to the same executable. A harness whose schema
20
+ * requires `command` to be an argv array (OpenCode) carries the executable in
21
+ * its first element; a string-valued `command` IS the executable. Reading only
22
+ * the string form made this check skip an entry `setup` had just written
23
+ * correctly, and report no command-based servers on a configured machine.
24
+ */
25
+ export function commandOf(entry: unknown): string | undefined {
26
+ if (typeof entry !== "object" || entry === null) return undefined;
27
+ const command = (entry as { command?: unknown }).command;
28
+ if (typeof command === "string") {
29
+ return command.length > 0 ? command : undefined;
30
+ }
31
+ if (Array.isArray(command)) {
32
+ return command.find(
33
+ (part): part is string => typeof part === "string" && part.length > 0,
34
+ );
35
+ }
36
+ return undefined;
37
+ }
38
+
39
+ /**
40
+ * Resolve a command the way the host would: a path-bearing entry is checked as
41
+ * a file (relative to the project root), a bare name is searched across `PATH`
42
+ * through `@canonical/harnesses`' `executableCandidates`, which owns the PATH
43
+ * split and the win32 `PATHEXT` rules in one place.
44
+ *
45
+ * The bare-name arm used to join the name onto each PATH directory, which
46
+ * cannot see the `.cmd` shim npm installs on Windows: a registration this CLI
47
+ * had just written correctly was reported as a dead command.
48
+ *
49
+ * @param command - The executable the entry names.
50
+ * @param cwd - The project root a relative command is resolved against.
51
+ * @param platform - The captured host to use instead of this one (tests).
52
+ * @returns Whether the command resolves on this machine.
53
+ * @note Impure — tests candidate paths on the filesystem.
54
+ */
55
+ export async function commandResolves(
56
+ command: string,
57
+ cwd: string,
58
+ platform?: PlatformEnv,
59
+ ): Promise<boolean> {
60
+ if (command.includes("/") || command.includes("\\")) {
61
+ return existsSync(isAbsolute(command) ? command : join(cwd, command));
62
+ }
63
+ const { executableCandidates, readPlatformEnv } = await import(
64
+ "@canonical/harnesses"
65
+ );
66
+ return executableCandidates(command, platform ?? readPlatformEnv()).some(
67
+ (candidate) => existsSync(candidate),
68
+ );
69
+ }