@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
@@ -1,14 +1,20 @@
1
1
  /**
2
- * `pragma doctor` — the nine environment health checks.
2
+ * `pragma doctor` — the environment checks plus the banded target rows.
3
3
  *
4
4
  * Runs against isolated HOME/cwd/XDG so the harness/config/completion checks are
5
5
  * deterministic (no harnesses, no config, no rc files). Covers the shape, a
6
- * representative pass/fail/skip spread, the store check (down via an injected
7
- * throwing store; up via the canonical fixture), exit 0 despite failures, and
8
- * the MCP read-only envelope.
6
+ * representative pass/fail/available/skip spread, the store check (down via an
7
+ * injected throwing store; up via the canonical fixture), exit 0 despite
8
+ * failures, and the MCP read-only envelope.
9
9
  */
10
10
 
11
- import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
11
+ import {
12
+ chmodSync,
13
+ mkdirSync,
14
+ mkdtempSync,
15
+ rmSync,
16
+ writeFileSync,
17
+ } from "node:fs";
12
18
  import { tmpdir } from "node:os";
13
19
  import { join } from "node:path";
14
20
  import { afterEach, beforeEach, describe, expect, it } from "vitest";
@@ -28,7 +34,7 @@ import {
28
34
  } from "../../testing/fixtures/graph/canonical.js";
29
35
  import { bootFixtureRuntime } from "../../testing/helpers/fixtureGraph.js";
30
36
  import { projectMcp } from "../../testing/helpers/projectMcp.js";
31
- import { checkMcpConfigured } from "./checks/checkMcpConfigured.js";
37
+ import { bandedChecks } from "./checks/targetHealth.js";
32
38
  import { doctorModule } from "./index.js";
33
39
  import { runChecks } from "./runChecks.js";
34
40
  import type { DoctorData } from "./types.js";
@@ -112,12 +118,14 @@ const byName = (data: DoctorData, name: string) =>
112
118
  data.checks.find((c) => c.name === name);
113
119
 
114
120
  describe("doctor — shape & spread", () => {
115
- it("returns 9 checks whose tallies sum, each with a valid status", async () => {
121
+ it("returns the environment checks plus one row per banded target", async () => {
116
122
  const data = await runChecks(bootRuntime(FLAGS, tmp("pragma-proj-")));
117
- expect(data.checks).toHaveLength(9);
118
- expect(data.passed + data.failed + data.skipped).toBe(9);
123
+ // Four unbanded environment checks, then the target table in both bands:
124
+ // all five targets are global, mcp and skills are also project.
125
+ expect(data.checks).toHaveLength(11);
126
+ expect(data.passed + data.failed + data.available + data.skipped).toBe(11);
119
127
  for (const check of data.checks) {
120
- expect(["pass", "fail", "skip"]).toContain(check.status);
128
+ expect(["pass", "fail", "available", "skip"]).toContain(check.status);
121
129
  }
122
130
  // Deterministic under the isolated env.
123
131
  expect(byName(data, "Node version")?.status).toBe("pass");
@@ -127,12 +135,35 @@ describe("doctor — shape & spread", () => {
127
135
  expect(pkgRefs?.status).toBe("pass");
128
136
  expect(pkgRefs?.detail).toContain("embedded snapshot @ ");
129
137
  expect(pkgRefs?.remedy).toBeUndefined();
130
- // No harnesses in an empty HOME/cwd — attributable fail + skips.
131
- expect(byName(data, "MCP configured")?.status).toBe("fail");
132
- expect(byName(data, "Skills symlinked")?.status).toBe("skip");
133
- expect(byName(data, "MCP commands")?.status).toBe("skip");
134
- // No project/global config in the isolated XDG.
135
- expect(byName(data, "pragma config")?.status).toBe("fail");
138
+
139
+ // The banded rows carry the TARGET IDS verbatim — `mcp`, not "MCP
140
+ // configured" — because the row name IS the fix command's argument. The
141
+ // environment checks stay unbanded.
142
+ const banded = data.checks.filter((c) => c.band !== undefined);
143
+ expect(banded.map((c) => `${c.band}:${c.name}`)).toEqual([
144
+ "global:config",
145
+ "global:completions",
146
+ "global:lsp",
147
+ "global:mcp",
148
+ "global:skills",
149
+ "project:mcp",
150
+ "project:skills",
151
+ ]);
152
+ // Every row that wants action names the exact command that repairs it,
153
+ // band included — the bijection, derived rather than authored.
154
+ for (const check of banded) {
155
+ if (check.status === "fail" || check.status === "available") {
156
+ expect(check.remedy).toBeDefined();
157
+ }
158
+ }
159
+ // No harnesses in an empty HOME/cwd, so both mcp rows skip; the project
160
+ // band is opt-in, so its absence is never a fault.
161
+ expect(
162
+ banded.find((c) => c.band === "project" && c.name === "mcp")?.status,
163
+ ).toBe("skip");
164
+ // No global config in the isolated XDG — an opt-in that is not set up yet.
165
+ expect(byName(data, "config")?.status).toBe("available");
166
+ expect(byName(data, "config")?.remedy).toBe("pragma setup config");
136
167
  });
137
168
  });
138
169
 
@@ -169,10 +200,10 @@ describe("doctor — the pack-refs check", () => {
169
200
  describe("doctor — the store check", () => {
170
201
  it("a store that fails to boot is an attributable fail, not a crash", async () => {
171
202
  const data = await runChecks(throwingStoreRuntime(tmp("pragma-proj-")));
172
- expect(data.checks).toHaveLength(9);
173
- const keStore = byName(data, "ke store");
174
- expect(keStore?.status).toBe("fail");
175
- expect(keStore?.remedy).toBeTruthy();
203
+ expect(data.checks).toHaveLength(11);
204
+ const store = byName(data, "store");
205
+ expect(store?.status).toBe("fail");
206
+ expect(store?.remedy).toBeTruthy();
176
207
  });
177
208
 
178
209
  it("a booted store passes with an entity total", async () => {
@@ -181,9 +212,9 @@ describe("doctor — the store check", () => {
181
212
  config: ALL_VISIBLE_CONFIG,
182
213
  });
183
214
  const data = await runChecks(fixture.runtime);
184
- const keStore = byName(data, "ke store");
185
- expect(keStore?.status).toBe("pass");
186
- expect(keStore?.detail).toMatch(/entities/);
215
+ const store = byName(data, "store");
216
+ expect(store?.status).toBe("pass");
217
+ expect(store?.detail).toMatch(/entities/);
187
218
  await fixture.dispose();
188
219
  });
189
220
  });
@@ -211,28 +242,86 @@ describe("doctor — dispatch & MCP", () => {
211
242
  const envelope = await mcp.callTool("doctor");
212
243
  await mcp.cleanup();
213
244
  expect(envelope.ok).toBe(true);
214
- expect((envelope.data as DoctorData).checks).toHaveLength(9);
245
+ expect((envelope.data as DoctorData).checks).toHaveLength(11);
215
246
  });
216
247
  });
217
248
 
218
- describe("doctor — MCP checks band by detected harness scope, not check name", () => {
219
- it("bands a configured GLOBAL-scope harness (Windsurf) as global", async () => {
220
- // Windsurf is a global-only harness whose MCP config lives in the home band.
221
- // The old static map tagged every "MCP configured" result PROJECT; the fix
222
- // derives the band from the harness's real scope, so this reports `global`.
249
+ describe("doctor — the banded rows can see the GLOBAL band", () => {
250
+ it("reports a configured global-band entry as configured, not missing", async () => {
251
+ // The regression this closes: detection recorded only each harness's
252
+ // DEFAULT band, so a server registered by `setup mcp --global` was invisible
253
+ // and doctor reported it not-configured forever. The rows now come from the
254
+ // same target table `setup` writes through, enumerated in BOTH bands, so the
255
+ // two surfaces cannot disagree about what they looked at.
223
256
  const cwd = tmp("pragma-doctor-proj-");
224
257
  mkdirSync(join(cwd, ".windsurf"), { recursive: true }); // ⇒ Windsurf detected
225
258
  const home = process.env.HOME ?? "";
226
259
  const wsDir = join(home, ".codeium", "windsurf");
227
260
  mkdirSync(wsDir, { recursive: true });
261
+ // Exactly what a global-band `setup mcp` writes: no `cwd`, so the entry is
262
+ // not pinned to whatever directory the registration ran from.
228
263
  writeFileSync(
229
264
  join(wsDir, "mcp_config.json"),
230
- JSON.stringify({ mcpServers: { pragma: { command: "pragma" } } }),
265
+ JSON.stringify({
266
+ mcpServers: { pragma: { command: "pragma", args: ["mcp", "serve"] } },
267
+ }),
231
268
  );
269
+ // The row also verifies the command BOOTS, so put a `pragma` on the
270
+ // isolated PATH — otherwise the row correctly fails for a second reason.
271
+ const binDir = process.env.PATH as string;
272
+ writeFileSync(join(binDir, "pragma"), "#!/bin/sh\nexit 0\n");
273
+ chmodSync(join(binDir, "pragma"), 0o755);
274
+
275
+ const rows = await bandedChecks(bootRuntime(FLAGS, cwd), "pragma");
276
+ const global = rows.find((r) => r.name === "mcp" && r.band === "global");
277
+ expect(global?.status).toBe("pass");
278
+ expect(
279
+ global?.items?.some((i) => i.label.includes("mcp_config.json")),
280
+ ).toBe(true);
281
+ // ...and the project band stays an opt-in skip, never a fault.
282
+ const project = rows.find((r) => r.name === "mcp" && r.band === "project");
283
+ expect(project?.status).toBe("skip");
284
+ });
285
+ });
286
+
287
+ describe("doctor — a blocked skill link path is never reported as current", () => {
288
+ it("distinguishes a hand-placed real directory from a link that is correct", async () => {
289
+ // Detection marks both `skipped` — there is nothing to do to either — so
290
+ // the row counted the blocked path as healthy and said "links current"
291
+ // where no link exists at all.
292
+ const cwd = tmp("pragma-doctor-proj-");
293
+ const skillDir = join(cwd, ".pragma", "skills", "my-skill");
294
+ mkdirSync(skillDir, { recursive: true });
295
+ writeFileSync(
296
+ join(skillDir, "SKILL.md"),
297
+ "---\nname: my-skill\ndescription: A test skill.\n---\n",
298
+ );
299
+ // A hand-placed directory sitting exactly where the link would go.
300
+ mkdirSync(join(cwd, ".agents", "skills", "my-skill"), { recursive: true });
301
+
302
+ const rows = await bandedChecks(bootRuntime(FLAGS, cwd), "pragma");
303
+ const row = rows.find((r) => r.name === "skills" && r.band === "project");
304
+ expect(row?.status).not.toBe("pass");
305
+ expect(row?.detail).toContain("real directory");
306
+ // And the remedy is the one that settles it — rerunning setup skips it.
307
+ expect(row?.remedy).toMatch(/Move or delete/);
308
+ });
309
+ });
310
+
311
+ describe("doctor — an unconfigured opt-in integration is available, not a fault", () => {
312
+ it("a detected harness with no MCP entry reports available with the setup command", async () => {
313
+ // Windsurf is detected (project signal) but nothing is configured. A fresh
314
+ // install lands exactly here, and a fresh install is healthy — so this is
315
+ // the `available` tier, keeping its actionable setup command, and it must
316
+ // never inflate the failure count.
317
+ const cwd = tmp("pragma-doctor-proj-");
318
+ mkdirSync(join(cwd, ".windsurf"), { recursive: true }); // ⇒ Windsurf detected
232
319
 
233
- const check = await checkMcpConfigured(cwd);
234
- expect(check.status).toBe("pass");
235
- expect(check.detail).toContain("Windsurf");
236
- expect(check.band).toBe("global"); // NOT the old static "project"
320
+ const rows = await bandedChecks(bootRuntime(FLAGS, cwd), "pragma");
321
+ const check = rows.find((r) => r.name === "mcp" && r.band === "global");
322
+ expect(check?.status).toBe("available");
323
+ expect(check?.detail).toContain("not configured");
324
+ // The fix is the target's own invocation, derived from the row's id + band.
325
+ expect(check?.remedy).toBe("pragma setup mcp");
237
326
  });
238
327
  });
@@ -14,14 +14,14 @@
14
14
 
15
15
  import { BIN_NAME } from "../../constants.js";
16
16
  import { asVerb } from "../../kernel/spec/asVerb.js";
17
- import type { CapabilityModule, VerbSpec } from "../../kernel/spec/types.js";
17
+ import type { CapabilityModule, VerbSpec } from "../../kernel/spec/index.js";
18
18
  import { doctorFormatters } from "./doctor.render.js";
19
19
  import type { DoctorData } from "./types.js";
20
20
 
21
21
  const doctorVerb: VerbSpec<Record<string, unknown>, DoctorData> = {
22
22
  path: ["doctor"],
23
- summary: "Check environment health — Node, config, store, MCP, and skills.",
24
- doc: "Runs nine diagnostic checks and reports pass/fail/skip with inline remedies. Storeless by default; the store check boots lazily and never fails the run.",
23
+ summary: "Check environment health and every setup target, in both bands.",
24
+ doc: "Reports the environment checks and then one row per setup target in each band, as pass, fail, available (an opt-in integration not yet set up), or skip, with inline remedies. Every banded row is named after the setup target that repairs it. Storeless by default; the store check boots lazily and never fails the run.",
25
25
  params: [],
26
26
  output: { formatters: doctorFormatters },
27
27
  examples: [
@@ -1,100 +1,99 @@
1
1
  /**
2
- * The `doctor` run body: orchestrate all environment health checks.
2
+ * The `doctor` run body: the unbanded environment checks plus the banded rows
3
+ * the setup target table derives.
4
+ *
5
+ * Two kinds of finding live in one report and they are not the same kind. The
6
+ * ENVIRONMENT checks — the Node version, this CLI's own version, pack refs, the
7
+ * store — diagnose things `setup` cannot install; they carry no band and stay
8
+ * their own section. The BANDED rows are exactly the setup targets, in both
9
+ * bands, named with the target ids verbatim and repaired by the target's own
10
+ * command. Adding a target adds its rows here for free.
3
11
  *
4
12
  * Checks are started eagerly (they run concurrently) and collected in
5
13
  * declaration order for a deterministic report. Each is guarded so a thrown
6
- * check becomes an attributable `fail` rather than aborting the whole run — the
7
- * same discipline the old shell used. Lazily imported by `doctor.verb.ts`, so
8
- * neither the checks nor `@canonical/harnesses` land on the fast path.
14
+ * check becomes an attributable `fail` rather than aborting the whole run.
15
+ * Lazily imported by `doctor.verb.ts`, so neither the checks nor
16
+ * `@canonical/harnesses` land on the fast path.
9
17
  */
10
18
 
11
19
  import { BIN_NAME } from "../../constants.js";
12
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
13
- import { checkConfigFile } from "./checks/checkConfigFile.js";
20
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
14
21
  import { checkKeStore } from "./checks/checkKeStore.js";
15
- import { checkMcpCommands } from "./checks/checkMcpCommands.js";
16
- import { checkMcpConfigured } from "./checks/checkMcpConfigured.js";
17
22
  import { checkNodeVersion } from "./checks/checkNodeVersion.js";
18
23
  import { checkPackageRefs } from "./checks/checkPackageRefs.js";
19
24
  import { checkPragmaVersion } from "./checks/checkPragmaVersion.js";
20
- import { checkShellCompletions } from "./checks/checkShellCompletions.js";
21
- import { checkSkillsSymlinked } from "./checks/checkSkillsSymlinked.js";
22
- import type { CheckResult, DoctorData, ScopeBand } from "./types.js";
23
-
24
- /**
25
- * The band a check statically concerns, by name — for checks whose band is
26
- * fixed by construction: skills always symlink into the per-repo project dir
27
- * (`skillsPath` is project-rooted), and completions install into the user/home
28
- * shell dir. The MCP checks are NOT here: they detect harnesses across BOTH
29
- * bands, so each derives its own band from what it found (see `deriveBand`) and
30
- * sets it on its own result — {@link attachBand} preserves that.
31
- */
32
- const CHECK_BANDS: Record<string, ScopeBand> = {
33
- "Skills symlinked": "project",
34
- "Shell completions": "global",
35
- };
36
-
37
- /**
38
- * Attach a band tag to a check result. A check that already set its own band
39
- * (the harness-derived MCP checks) keeps it; otherwise the static
40
- * {@link CHECK_BANDS} map fills one in by name, if defined.
41
- */
42
- function attachBand(result: CheckResult): CheckResult {
43
- if (result.band !== undefined) return result;
44
- const band = CHECK_BANDS[result.name];
45
- return band ? { ...result, band } : result;
46
- }
25
+ import { bandedChecks } from "./checks/targetHealth.js";
26
+ import type { CheckResult, DoctorData } from "./types.js";
47
27
 
48
28
  /**
49
- * Each check paired with the display name used if it rejects. The fallback name
50
- * matches the `name` each check returns on success, so a thrown check reports
51
- * the same label and stays correlatable. Declaration order fixes the report
52
- * order.
29
+ * The unbanded environment checks, each paired with the display name used if it
30
+ * rejects. The fallback name matches the `name` each check returns on success,
31
+ * so a thrown check reports the same label and stays correlatable.
53
32
  */
54
- function buildChecks(
33
+ function buildEnvironmentChecks(
55
34
  rt: PragmaRuntime,
56
35
  ): readonly [string, Promise<CheckResult>][] {
57
36
  return [
58
37
  ["Node version", checkNodeVersion()],
59
38
  [`${BIN_NAME} version`, checkPragmaVersion(rt)],
60
- [`${BIN_NAME} config`, checkConfigFile(rt)],
61
39
  ["pack refs", checkPackageRefs(rt)],
62
- ["ke store", checkKeStore(rt)],
63
- ["Shell completions", checkShellCompletions(rt.cwd)],
64
- ["MCP configured", checkMcpConfigured(rt.cwd)],
65
- ["MCP commands", checkMcpCommands(rt.cwd)],
66
- ["Skills symlinked", checkSkillsSymlinked(rt.cwd)],
40
+ ["store", checkKeStore(rt)],
67
41
  ];
68
42
  }
69
43
 
44
+ /** Turn a rejected check into an attributable failure rather than a crash. */
45
+ async function guarded(
46
+ name: string,
47
+ promise: Promise<CheckResult>,
48
+ ): Promise<CheckResult> {
49
+ try {
50
+ return await promise;
51
+ } catch (error) {
52
+ const reason = error instanceof Error ? error.message : String(error);
53
+ return {
54
+ name,
55
+ status: "fail",
56
+ detail: `Check threw an unexpected error: ${reason}`,
57
+ remedy: `Re-run \`${BIN_NAME} doctor\`; if it persists, report this as a bug.`,
58
+ };
59
+ }
60
+ }
61
+
70
62
  /**
71
- * Run every environment health check and aggregate the results.
63
+ * Run every health check and aggregate the results.
72
64
  *
73
65
  * @param rt - The per-invocation runtime.
74
- * @returns The `{ checks, passed, failed, skipped }` summary.
66
+ * @returns The `{ checks, passed, failed, available, skipped }` summary.
75
67
  * @note Impure — the checks read the fs, boot the store, and detect harnesses.
76
68
  */
77
69
  export async function runChecks(rt: PragmaRuntime): Promise<DoctorData> {
78
- const checks: CheckResult[] = await Promise.all(
79
- buildChecks(rt).map(async ([name, promise]): Promise<CheckResult> => {
80
- try {
81
- return attachBand(await promise);
82
- } catch (error) {
83
- const reason = error instanceof Error ? error.message : String(error);
84
- return attachBand({
85
- name,
86
- status: "fail",
87
- detail: `Check threw an unexpected error: ${reason}`,
88
- remedy: `Re-run \`${BIN_NAME} doctor\`; if it persists, report this as a bug.`,
89
- });
90
- }
91
- }),
92
- );
70
+ // The banded rows come back as a batch (one detection pass over the table),
71
+ // so they are guarded as a batch: a detection that throws becomes one
72
+ // attributable failure instead of taking the environment section with it.
73
+ const [environmentResults, bandedResults] = await Promise.all([
74
+ Promise.all(
75
+ buildEnvironmentChecks(rt).map(([name, promise]) =>
76
+ guarded(name, promise),
77
+ ),
78
+ ),
79
+ bandedChecks(rt, BIN_NAME).catch((error: unknown): CheckResult[] => [
80
+ {
81
+ name: "setup targets",
82
+ status: "fail",
83
+ detail: `Detection threw an unexpected error: ${
84
+ error instanceof Error ? error.message : String(error)
85
+ }`,
86
+ remedy: `Re-run \`${BIN_NAME} doctor\`; if it persists, report this as a bug.`,
87
+ },
88
+ ]),
89
+ ]);
93
90
 
91
+ const checks: CheckResult[] = [...environmentResults, ...bandedResults];
94
92
  return {
95
93
  checks,
96
94
  passed: checks.filter((c) => c.status === "pass").length,
97
95
  failed: checks.filter((c) => c.status === "fail").length,
96
+ available: checks.filter((c) => c.status === "available").length,
98
97
  skipped: checks.filter((c) => c.status === "skip").length,
99
98
  };
100
99
  }
@@ -9,8 +9,19 @@
9
9
  */
10
10
  export type ScopeBand = "project" | "global";
11
11
 
12
- /** Status of a doctor check or one of its sub-items. */
13
- export type CheckStatus = "pass" | "fail" | "skip";
12
+ /**
13
+ * Status of a doctor check or one of its sub-items.
14
+ *
15
+ * `available` is the tier between fail and skip that keeps the report honest:
16
+ * an opt-in integration (MCP registration, skills symlinks, a completion
17
+ * script) that is detected and installable but that the user has not set up.
18
+ * Nothing is broken — a fresh install is HEALTHY with several availables — so
19
+ * reporting these as `fail` would teach users that the failure count is noise.
20
+ * `fail` stays reserved for a real fault: something set up that no longer
21
+ * works, or an environment the CLI cannot run correctly in. `skip` remains
22
+ * "nothing to check here" (no shell detected, no harnesses present).
23
+ */
24
+ export type CheckStatus = "pass" | "fail" | "available" | "skip";
14
25
 
15
26
  /**
16
27
  * A structured sub-item under a check — e.g. one resolved package under
@@ -35,7 +46,10 @@ export interface CheckResult {
35
46
  readonly detail: string;
36
47
  /** Optional structured breakdown, rendered as indented sub-items. */
37
48
  readonly items?: readonly CheckItem[];
38
- /** Remedial instruction shown inline under a failing check. */
49
+ /**
50
+ * Remedial instruction shown inline under the check: for `fail` the fix,
51
+ * for `available` the setup command that enables the integration.
52
+ */
39
53
  readonly remedy?: string;
40
54
  /**
41
55
  * Which config band the check concerns, if any: `global` for the user/home
@@ -47,10 +61,12 @@ export interface CheckResult {
47
61
  readonly band?: ScopeBand;
48
62
  }
49
63
 
50
- /** Aggregated results from all doctor checks. */
64
+ /** Aggregated results from all doctor checks — one count per status tier. */
51
65
  export interface DoctorData {
52
66
  readonly checks: readonly CheckResult[];
53
67
  readonly passed: number;
54
68
  readonly failed: number;
69
+ /** Opt-in integrations detected but not set up — counted apart from failures. */
70
+ readonly available: number;
55
71
  readonly skipped: number;
56
72
  }
@@ -85,7 +85,7 @@ const listVerb = (pack: PackDefinition): VerbSpec =>
85
85
  const PACK_LISTS: readonly { pack: PackDefinition; hint: RegExp }[] = [
86
86
  { pack: storyFor("modifier"), hint: /pragma sources update/ },
87
87
  { pack: storyFor("token"), hint: /pragma sources update/ },
88
- { pack: storyFor("standard"), hint: /broaden your filter/ },
88
+ { pack: storyFor("standard"), hint: /broaden the filter/ },
89
89
  ];
90
90
 
91
91
  const REAL = { dryRun: false, undo: false, yes: false };
@@ -101,21 +101,23 @@ describe("pack list empty-state (U5, PROTECTED)", () => {
101
101
 
102
102
  it.each(
103
103
  PACK_LISTS,
104
- )("$pack.noun list renders a non-blank message (+ hint) and keeps JSON []", ({
104
+ )("$pack.noun list declares a non-blank empty notice (+ hint), JSON stays []", ({
105
105
  pack,
106
106
  hint,
107
107
  }) => {
108
108
  const { formatters } = listVerb(pack).output;
109
- const plain = formatters.plain([]);
110
- expect(plain).toContain(`No ${pack.noun} entries found.`);
111
- expect(plain).toMatch(hint);
109
+ // The message + runnable hint live on the empty-state seam — the
110
+ // dispatcher routes them to stderr, keeping plain stdout pure data.
111
+ const notice = formatters.emptyNotice?.([]);
112
+ expect(notice).toContain(`No ${pack.noun} entries found.`);
113
+ expect(notice).toMatch(hint);
112
114
  // JSON is the uniform empty array — unchanged by the message.
113
115
  expect(formatters.json([])).toBe("[]");
114
116
  // The llm view stays non-blank too (the `(0)` heading plus the message).
115
117
  expect(formatters.llm([]).trim().length).toBeGreaterThan(0);
116
118
  });
117
119
 
118
- it("dispatch prints the empty message on stdout and exits 0 (end-to-end)", async () => {
120
+ it("dispatch routes the empty message to stderr and exits 0 (end-to-end)", async () => {
119
121
  const outcome = await executeVerb(
120
122
  listVerb(storyFor("modifier")),
121
123
  {},
@@ -123,7 +125,10 @@ describe("pack list empty-state (U5, PROTECTED)", () => {
123
125
  rt,
124
126
  );
125
127
  expect(outcome.exitCode).toBe(0);
126
- expect(outcome.stdout).toContain("No modifier entries found.");
127
- expect(outcome.stdout).toContain("pragma sources update");
128
+ // stdout carries no prose a pipe would read as a record; the calm notice
129
+ // and its hint reach the human on stderr.
130
+ expect(outcome.stdout ?? "").not.toContain("No modifier entries found.");
131
+ expect(outcome.stderr).toContain("No modifier entries found.");
132
+ expect(outcome.stderr).toContain("pragma sources update");
128
133
  });
129
134
  });
@@ -0,0 +1,107 @@
1
+ /**
2
+ * The documented examples, EXECUTED against the shipped pack (PROTECTED).
3
+ *
4
+ * The existing documentation suite validates example GRAMMAR — that a `cmd`
5
+ * parses as a command this CLI declares. Grammar is not truth: the previous
6
+ * `graph inspect ds:button` examples passed that check for as long as they
7
+ * existed while 404ing for every user who copied them, and the `graph query`
8
+ * ASK example passed while quietly answering `false`.
9
+ *
10
+ * So these run the examples as WRITTEN, against the embedded graph, and assert
11
+ * they answer. An example is a promise to a stranger; this is the only check
12
+ * that reads it as one.
13
+ */
14
+
15
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
16
+ import { verbKey } from "../../kernel/packs/uniqueness.js";
17
+ import { bootRuntime } from "../../kernel/runtime/boot.js";
18
+ import type { InspectResult } from "../../kernel/runtime/readEntity.js";
19
+ import type { PragmaRuntime } from "../../kernel/runtime/types.js";
20
+ import type { VerbSpec } from "../../kernel/spec/types.js";
21
+ import { TEST_FLAGS } from "../../testing/helpers/projectCli.js";
22
+ import { graphModule } from "./index.js";
23
+
24
+ const verb = (name: string): VerbSpec =>
25
+ graphModule.verbs.find((v) => verbKey(v.path) === name) as VerbSpec;
26
+
27
+ /**
28
+ * The name of a verb's single positional, read from the verb rather than
29
+ * retyped — the point of this file is that documentation and code agree, so it
30
+ * should not itself hardcode a name that could drift.
31
+ */
32
+ const positionalOf = (spec: VerbSpec): string =>
33
+ spec.params.find((p) => p.positional)?.name ?? "";
34
+
35
+ /**
36
+ * The argument an example passes, recovered from the example's own `cmd`.
37
+ *
38
+ * Read from the declaration rather than retyped, so editing an example without
39
+ * editing this file cannot leave the test asserting the old one.
40
+ */
41
+ function exampleArg(spec: VerbSpec, index: number): string {
42
+ const cmd = spec.examples?.[index]?.cmd ?? "";
43
+ const quoted = cmd.match(/"([^"]*)"/);
44
+ if (quoted?.[1]) return quoted[1];
45
+ return cmd.trim().split(/\s+/).slice(3).join(" ");
46
+ }
47
+
48
+ // ONE store for the file. Booting per case tripled this suite's cost against
49
+ // the shipped pack for no extra coverage, and the whole package already flakes
50
+ // under parallel contention — a test that need not add load should not.
51
+ let rt: PragmaRuntime;
52
+ beforeAll(() => {
53
+ rt = bootRuntime(TEST_FLAGS);
54
+ });
55
+ afterAll(async () => {
56
+ (await rt.store.get()).store.dispose();
57
+ });
58
+
59
+ describe("documented examples resolve against the shipped graph (PROTECTED)", () => {
60
+ it("runs every `graph inspect` example as written", async () => {
61
+ const inspect = verb("graph inspect");
62
+ expect(inspect.examples?.length).toBeGreaterThan(0);
63
+
64
+ for (const [index] of (inspect.examples ?? []).entries()) {
65
+ const uri = exampleArg(inspect, index);
66
+ const result = (await inspect.run(
67
+ { [positionalOf(inspect)]: uri },
68
+ rt,
69
+ )) as InspectResult;
70
+ // The prefixed and absolute forms are two spellings of one subject.
71
+ expect(
72
+ result.uri,
73
+ `example ${index} (${uri}) did not resolve to the documented entity`,
74
+ ).toBe("https://ds.canonical.com/global.component.button");
75
+ expect(result.groups.length).toBeGreaterThan(0);
76
+ }
77
+ });
78
+
79
+ it("runs the `graph query` ASK example and gets a true answer", async () => {
80
+ // The old example returned `false` — syntactically fine, semantically a lie
81
+ // about the graph. Asserting the ANSWER is what catches that.
82
+ const query = verb("graph query");
83
+ const ask = (query.examples ?? []).findIndex((e) => e.cmd.includes("ASK"));
84
+ expect(ask, "no ASK example to execute").toBeGreaterThanOrEqual(0);
85
+
86
+ const result = (await query.run(
87
+ { [positionalOf(query)]: exampleArg(query, ask) },
88
+ rt,
89
+ )) as { type: string; result?: boolean };
90
+
91
+ expect(result.type).toBe("ask");
92
+ expect(result.result, "the documented ASK example answers false").toBe(
93
+ true,
94
+ );
95
+ });
96
+
97
+ it("runs the `graph query` SELECT example and gets rows", async () => {
98
+ const query = verb("graph query");
99
+ const result = (await query.run(
100
+ { [positionalOf(query)]: exampleArg(query, 0) },
101
+ rt,
102
+ )) as { type: string; bindings?: unknown[] };
103
+
104
+ expect(result.type).toBe("select");
105
+ expect(result.bindings?.length ?? 0).toBeGreaterThan(0);
106
+ });
107
+ });
@@ -3,7 +3,7 @@
3
3
  * (the raw SPARQL escape hatch, PR6). The covenant blesses both.
4
4
  */
5
5
 
6
- import type { CapabilityModule } from "../../kernel/spec/types.js";
6
+ import type { CapabilityModule } from "../../kernel/spec/index.js";
7
7
  import { resourceProvider } from "../resources/index.js";
8
8
  import { graphInspectVerb } from "./inspect.verb.js";
9
9
  import { graphQueryVerb } from "./query.verb.js";