@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,49 +1,73 @@
1
1
  /**
2
- * The `setup` verbs — the run-all self-verb plus the four CLI-only sub-verbs
3
- * (`mcp`/`completions`/`skills`/`lsp`).
2
+ * The `setup` verbs — the run-all self-verb plus the five CLI-only sub-verbs
3
+ * (`config`/`completions`/`lsp`/`mcp`/`skills`), every one of them derived from
4
+ * the target table.
4
5
  *
5
6
  * `setup` is the ONE covenant noun that is BOTH directly runnable and has
6
- * sub-verbs (see the buildProgram mixed-noun change). All five are storeless,
7
- * interactive mutations. The sub-verbs are `mcp: false` (the covenant marks
8
- * them so — `buildServer` skips them, `buildProgram` still registers them); only
9
- * the self-verb `setup` is an MCP tool. `destructive: false` (D4) keeps MCP from
10
- * advertising the `setup` tool as destructive.
7
+ * sub-verbs. All of them are storeless, interactive mutations. The sub-verbs are
8
+ * `mcp: false` (`buildServer` skips them, `buildProgram` still registers them);
9
+ * only the self-verb is an MCP tool. `destructive: false` keeps MCP from
10
+ * advertising the tool as destructive.
11
11
  *
12
- * ALL FIVE now flow through the SAME summon `execute` seam `create` uses: each
13
- * `run` synthesizes a `GeneratorDefinition` (detection up front, a pure
14
- * `generate`), picks the Ink wizard / auto / MCP strategy off `rt.interaction`,
15
- * and returns `execute` — so setup inherits the recap, live progress, colours,
16
- * and the shared cancel fixes. summon-core + the generator ops stay behind a
17
- * LAZY dynamic import (mirroring `create`'s `loadCreateRuntime`), so building the
18
- * command tree / `--help` / `__complete` — and `setup --yes` — load no
19
- * React/Ink. `params: []` on every verb keeps the command surface frozen.
12
+ * THE BAND DEFAULT IS GLOBAL. `--scope` used to default to `both`, and `both`
13
+ * runs each harness's own default band — which is `project` for most of the
14
+ * registry — so a bare `setup` scattered `.mcp.json`, `.gemini/settings.json`
15
+ * and `opencode.json` into whatever directory you happened to be standing in.
16
+ * The user band is what a machine-level installer configures; the project band
17
+ * is a deliberate, checked-in, team-shared choice, and is now chosen with
18
+ * `--local` rather than assumed.
19
+ *
20
+ * Every sub-verb registers the scope flags UNIFORMLY. That is what lets the band
21
+ * answer come from the table instead of per-verb flag wiring — previously
22
+ * `setup completions --local` died as an unknown option, while `setup mcp
23
+ * --local` worked, for no reason a user could see. Asking a target for a band it
24
+ * cannot honour is a usage error (exit 2) with the corrected command; asking the
25
+ * RUN-ALL for such a band merely filters, and the out-of-band target still shows
26
+ * as a named row.
27
+ *
28
+ * summon-core + the generator ops stay behind a LAZY dynamic import (mirroring
29
+ * `create`'s `loadCreateRuntime`), so building the command tree / `--help` /
30
+ * `__complete` — and `setup --yes` — load no React/Ink.
20
31
  */
21
32
 
22
33
  import type { GeneratorResult } from "@canonical/summon-core";
23
- import { $, gen, type Task } from "@canonical/task";
34
+ import { $, gen, pure, type Task } from "@canonical/task";
24
35
  import { BIN_NAME } from "../../constants.js";
25
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
36
+ import { PragmaError } from "../../kernel/error/index.js";
37
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
26
38
  import { asVerb } from "../../kernel/spec/asVerb.js";
27
39
  import type {
28
40
  CapabilityModule,
29
41
  ParamSpec,
30
42
  VerbSpec,
31
- } from "../../kernel/spec/types.js";
32
- import { setupFormatters } from "./setup.render.js";
33
- import type { ScopeSelection, SetupMode, SetupResult } from "./types.js";
43
+ } from "../../kernel/spec/index.js";
44
+ import { resolveSetupMode, setupModeInput } from "./mode.js";
45
+ import {
46
+ planExitFailed,
47
+ planTally,
48
+ type SetupPlan,
49
+ TARGET_IDS,
50
+ } from "./plan.js";
51
+ import { renderProgressLine, renderRecap } from "./plan.render.js";
52
+ import { renderDryRun, setupFormatters } from "./setup.render.js";
53
+ import type { ScopeBand, ScopeSelection, SetupMode } from "./types.js";
34
54
 
35
55
  /**
36
- * The `--scope` flag + its `--global`/`--local` boolean sugars, shared by the
37
- * band-aware verbs (`setup`/`mcp`/`skills`). `completions`/`lsp` never carry
38
- * them — they are single-band installers.
56
+ * The `--scope` flag + its `--global`/`--local` boolean sugars. Registered by
57
+ * EVERY setup verb, including the single-band ones: a flag that exists on some
58
+ * sub-verbs and not others is a grammar the user has to memorise, and the band
59
+ * a single-band target can honour is a question the target table answers.
60
+ *
61
+ * `--global` is a synonym of the default; it stays for scripts and for symmetry
62
+ * with `--local`.
39
63
  */
40
64
  const SCOPE_PARAMS: readonly ParamSpec[] = [
41
65
  {
42
66
  kind: "enum",
43
67
  name: "scope",
44
- doc: "Which config band(s) to configure: project, global, or both.",
68
+ doc: "Which config band(s) to configure: global (the default), project, or both.",
45
69
  values: ["project", "global", "both"],
46
- default: "both",
70
+ default: "global",
47
71
  },
48
72
  {
49
73
  kind: "boolean",
@@ -62,13 +86,46 @@ const SCOPE_PARAMS: readonly ParamSpec[] = [
62
86
  * The boolean sugars win over `--scope`; `--global` wins over `--local`.
63
87
  *
64
88
  * @param params - The coerced param bag.
65
- * @returns The resolved scope selection (defaults to `both`).
89
+ * @returns The resolved scope selection (defaults to `global`).
66
90
  */
67
91
  function resolveScope(params: Record<string, unknown>): ScopeSelection {
68
92
  if (params.global === true) return "global";
69
93
  if (params.local === true) return "project";
70
94
  const scope = params.scope;
71
- return scope === "global" || scope === "project" ? scope : "both";
95
+ return scope === "project" || scope === "both" ? scope : "global";
96
+ }
97
+
98
+ /**
99
+ * Reject a sub-verb asked for a band its target cannot hold.
100
+ *
101
+ * This is a usage error, not a skip: the user typed a contradiction, and
102
+ * correcting it is exactly what exit 2 means. The message names the band the
103
+ * target DOES have and prints the command that works, so the correction is one
104
+ * paste rather than one manual page.
105
+ *
106
+ * @param mode - The sub-verb's target, or `all`.
107
+ * @param scope - The resolved selection.
108
+ * @throws PragmaError INVALID_INPUT when the target has no such band.
109
+ */
110
+ async function assertBandIsPossible(
111
+ mode: SetupMode,
112
+ scope: ScopeSelection,
113
+ ): Promise<void> {
114
+ if (mode === "all" || scope === "both") return;
115
+ const { findTarget } = await import("./targets.js");
116
+ const target = findTarget(mode);
117
+ if (target === undefined || target.bands.includes(scope as ScopeBand)) return;
118
+ const only = target.bands[0] as ScopeBand;
119
+ const level = only === "global" ? "user-level" : "project-level";
120
+ const corrected =
121
+ only === "global"
122
+ ? `${BIN_NAME} setup ${mode}`
123
+ : `${BIN_NAME} setup ${mode} --local`;
124
+ throw new PragmaError({
125
+ code: "INVALID_INPUT",
126
+ message: `${mode} is ${level} — it has no ${scope} band.`,
127
+ recovery: { message: `Run: ${corrected}` },
128
+ });
72
129
  }
73
130
 
74
131
  /** The exposed-to-MCP capability the run-all self-verb declares. */
@@ -101,38 +158,59 @@ const SUB_CAPABILITY = {
101
158
 
102
159
  /**
103
160
  * The one summon↔pragma seam per setup invocation: lazily load summon-core + the
104
- * generator ops, build the plan (detection up front), pick the prompt strategy
105
- * off `rt.interaction`, wire `rt.exec`, and return `execute` mapped back onto
106
- * {@link SetupResult}.
161
+ * generator ops, detect and plan, resolve the interaction mode, wire `rt.exec`,
162
+ * and return the plan with its outcomes filled in.
107
163
  *
108
164
  * NOTE: `rt.exec` carries NO per-call `cwd`. Unlike `create` (whose generator
109
- * emits RELATIVE paths jailed to `rt.cwd`), setup's ops build ABSOLUTE effect
110
- * paths themselves ($HOME/…, resolve(cwd,…)); the interpreter leaves absolute
111
- * paths unchanged, so no per-call write root is threaded. No stamping either —
112
- * setup writes symlinks / config / scripts, not generated source.
165
+ * emits RELATIVE paths jailed to `rt.cwd`), setup's targets build ABSOLUTE
166
+ * effect paths themselves; the interpreter leaves absolute paths unchanged, so
167
+ * no per-call write root is threaded. No stamping either — setup writes
168
+ * symlinks, config and scripts, not generated source.
113
169
  *
114
- * @param mode - Which entry point (`all` or one sub-verb).
115
- * @param rt - The per-invocation runtime (mutated: `rt.exec` is set).
116
- * @returns The `Task<SetupResult>` the dispatcher/MCP handler interprets.
117
- * @note Impure — runs each step's real detection; may throw EMPTY_RESULTS
118
- * (direct `setup skills` with no skills) before returning a Task.
170
+ * @param mode - Which entry point (`all` or one target).
171
+ * @param rt - The per-invocation runtime (mutated: `rt.exec` and `rt.planData`).
172
+ * @param scope - The resolved band selection.
173
+ * @returns The `Task<SetupPlan>` the dispatcher/MCP handler interprets.
174
+ * @note Impure — runs every target's real detection before returning a Task.
119
175
  */
120
176
  async function runSetup(
121
177
  mode: SetupMode,
122
178
  rt: PragmaRuntime,
123
179
  scope: ScopeSelection,
124
- ): Promise<Task<SetupResult>> {
125
- // Lazy dynamic imports (R1 lazy-React discipline): summon-core's barrel is
180
+ ): Promise<Task<SetupPlan>> {
181
+ await assertBandIsPossible(mode, scope);
182
+
183
+ // Lazy dynamic imports (lazy-React discipline): summon-core's barrel is
126
184
  // React-free, and the non-TTY branch picks autoPrompt/mcpPrompt (never mounts
127
185
  // Ink), so `setup --yes` loads no React — the guard test enforces this.
128
- const [summon, ops] = await Promise.all([
186
+ const [summon, projection, ops] = await Promise.all([
129
187
  import("@canonical/summon-core"),
188
+ import("@canonical/summon-core/projection"),
130
189
  import("./operations/setupGenerator.js"),
131
190
  ]);
132
191
 
133
- const { generator, toResult } = await ops.buildSetupPlan(rt, mode, scope);
192
+ const input = setupModeInput(rt);
193
+ const run = await ops.buildSetupRun(rt, mode, scope, input.undo);
194
+ const interactionMode = resolveSetupMode(input, projection.decideInteraction);
195
+
196
+ // The dry-run seam: the kernel's `--dry-run` branch renders THIS instead of
197
+ // the raw effect dump, while its honest preview still runs underneath and
198
+ // still fails exactly when the real run would.
199
+ rt.planData = { ...run.plan, preview: true };
200
+
201
+ // Whether this invocation only PREVIEWS. The task below is driven either way
202
+ // — that is what makes the preview honest — so anything it says out loud has
203
+ // to know which of the two it is.
204
+ const previewing = interactionMode === "batch-dry-run";
205
+
206
+ // Adaptation (b): a non-interactive run without `--yes` previews rather than
207
+ // mutating. It is the same plan the dry-run prints, plus one hint line, at
208
+ // exit 0 — the invocation completed a real read-only unit of work.
209
+ if (interactionMode === "refuse") {
210
+ return pure<SetupPlan>({ ...run.plan, preview: true });
211
+ }
134
212
 
135
- const { isTTY, transport, yes, signal, abort } = rt.interaction ?? {
213
+ const { transport, yes, signal, abort } = rt.interaction ?? {
136
214
  isTTY: false,
137
215
  transport: "cli" as const,
138
216
  yes: true,
@@ -140,10 +218,14 @@ async function runSetup(
140
218
 
141
219
  // TTY without --yes → the Ink wizard (recap + live progress). Its callbacks
142
220
  // ride rt.exec; `onCancel` threads the run's abort in so an in-Ink Ctrl-C
143
- // during execution actually stops the writes (H2). No stamping (A5).
221
+ // during execution actually stops the writes.
144
222
  let task: Task<GeneratorResult>;
145
- if (isTTY && !yes) {
146
- const session = summon.inkPrompt(generator, { signal, onCancel: abort });
223
+ const wizard = interactionMode === "wizard";
224
+ if (wizard) {
225
+ const session = summon.inkPrompt(run.generator, {
226
+ signal,
227
+ onCancel: abort,
228
+ });
147
229
  rt.exec = {
148
230
  promptHandler: session.promptHandler,
149
231
  onEffectStart: session.onEffectStart,
@@ -152,7 +234,7 @@ async function runSetup(
152
234
  dispose: session.dispose,
153
235
  signal,
154
236
  };
155
- task = summon.execute(generator, {
237
+ task = summon.execute(run.generator, {
156
238
  prompt: session.promptHandler,
157
239
  params: {},
158
240
  signal,
@@ -166,56 +248,117 @@ async function runSetup(
166
248
  onLog: (_level, message) => process.stderr.write(`${message}\n`),
167
249
  signal,
168
250
  };
169
- task = summon.execute(generator, { prompt, params: {}, signal });
251
+ task = summon.execute(run.generator, { prompt, params: {}, signal });
170
252
  }
171
253
 
172
- // execute yields a GeneratorResult; map it back onto setup's tagged result
173
- // union (its --format json shape is frozen). The completion view is driven by
174
- // controller phase, not this value, so mapping after execute is invisible to
175
- // the wizard.
176
254
  return gen(function* () {
177
255
  const result = yield* $(task);
178
- return toResult(result.answers);
256
+ const applied = run.applied(result.answers);
257
+
258
+ // Progress: one line per row on stderr for an unattended run (the Ink
259
+ // session already draws them for the wizard). stdout stays the data stream.
260
+ //
261
+ // A dry run reports NOTHING here. Its honest preview drives this very task
262
+ // with writes recorded, so the progress lines ran for real and announced
263
+ // "✓ config — installed" above a plan that had installed nothing.
264
+ if (!previewing && (!wizard || yes)) {
265
+ const width = Math.max(...applied.rows.map((row) => row.target.length));
266
+ for (const row of applied.rows) {
267
+ if (row.outcome === undefined) continue;
268
+ rt.report?.(renderProgressLine(row, width));
269
+ }
270
+ }
271
+
272
+ // A failed row exits 1, and the recap is still shown — partial success is
273
+ // first class, so the run reports every row before naming the ones that did
274
+ // not happen. The recap goes to stderr here because the error renderer owns
275
+ // stdout on a failing run.
276
+ if (planExitFailed(applied)) {
277
+ rt.report?.(renderRecap(applied));
278
+ const failed = applied.rows.filter(
279
+ (row) => row.outcome?.status === "failed",
280
+ );
281
+
282
+ // ONE failure reports itself. The row already carries the cause it was
283
+ // given ("`bun` is not found on your PATH") and a remedy that runs on
284
+ // this machine; replacing them with a count would throw away the only
285
+ // two sentences that say what is wrong and what to do about it.
286
+ const only = failed.length === 1 ? failed[0] : undefined;
287
+ if (only?.outcome !== undefined) {
288
+ throw new PragmaError({
289
+ code: "UNSUPPORTED",
290
+ message: `${only.target}: ${only.outcome.note ?? "the step did not complete"}`,
291
+ ...(only.outcome.remedy === undefined
292
+ ? {}
293
+ : { recovery: { message: only.outcome.remedy } }),
294
+ });
295
+ }
296
+
297
+ // Several failures: name every one with its own cause, then point at the
298
+ // recap above. A bare list of target names would make the reader re-run
299
+ // each one to find out why it failed.
300
+ const named = failed
301
+ .map(
302
+ (row) =>
303
+ `${row.target} (${row.outcome?.note ?? "no cause recorded"})`,
304
+ )
305
+ .join("; ");
306
+ throw new PragmaError({
307
+ code: "UNSUPPORTED",
308
+ message: `${failed.length} of ${planTally(applied).accountable} targets did not complete: ${named}.`,
309
+ recovery: {
310
+ message: `The other targets are configured. Re-run the ones that did not complete: ${failed
311
+ .map((row) => `\`${BIN_NAME} setup ${row.target}\``)
312
+ .join(", ")}.`,
313
+ },
314
+ });
315
+ }
316
+ return applied;
179
317
  });
180
318
  }
181
319
 
182
320
  /** Build a setup verb bound to its {@link SetupMode}. */
183
321
  function setupVerb(
184
- path: VerbSpec<Record<string, unknown>, SetupResult>["path"],
322
+ path: VerbSpec<Record<string, unknown>, SetupPlan>["path"],
185
323
  summary: string,
186
324
  mode: SetupMode,
187
325
  capability: typeof SELF_CAPABILITY | typeof SUB_CAPABILITY,
188
- extras: Partial<VerbSpec<Record<string, unknown>, SetupResult>> = {},
189
- ): VerbSpec<Record<string, unknown>, SetupResult> {
326
+ extras: Partial<VerbSpec<Record<string, unknown>, SetupPlan>> = {},
327
+ ): VerbSpec<Record<string, unknown>, SetupPlan> {
190
328
  return {
191
329
  path,
192
330
  summary,
193
- params: [],
194
- output: { formatters: setupFormatters },
331
+ params: SCOPE_PARAMS,
332
+ output: {
333
+ formatters: setupFormatters,
334
+ // The kernel's dry-run branch renders the plan through this seam instead
335
+ // of dumping raw effects. Absent on every other verb, so nothing else
336
+ // changes shape.
337
+ formatPlan: (planData) => renderDryRun(planData as SetupPlan),
338
+ },
195
339
  capability,
196
340
  ...extras,
197
341
  run: (params, rt) =>
198
- runSetup(mode, rt, resolveScope(params)) as unknown as Task<SetupResult>,
342
+ runSetup(mode, rt, resolveScope(params)) as unknown as Task<SetupPlan>,
199
343
  };
200
344
  }
201
345
 
202
346
  const setupAllVerb = setupVerb(
203
347
  ["setup"],
204
- "Configure MCP, completions, skills, and the LSP for this project.",
348
+ "Configure the global config, completions, the LSP, MCP, and skills.",
205
349
  "all",
206
350
  SELF_CAPABILITY,
207
351
  {
208
- params: SCOPE_PARAMS,
209
- doc: "Runs the shell-completions, LSP, MCP, and skills installers as a single wizard: pick the steps, review the recap, then apply. The scope option targets the project band, the user/home band, or both.",
352
+ doc: "Plans every target in the selected band, then applies the ones you keep. The user/home band is the default; the scope option chooses the per-project band, or both. A run with no attended terminal prints the plan and applies nothing unless the run is confirmed.",
210
353
  examples: [
211
354
  { cmd: `${BIN_NAME} setup` },
212
355
  {
213
356
  cmd: `${BIN_NAME} setup --dry-run`,
214
- note: "preview every step's effects",
357
+ note: "print the plan, write nothing",
215
358
  },
216
359
  {
217
- cmd: `${BIN_NAME} setup --global`,
218
- note: "configure only the user/home band",
360
+ cmd: `${BIN_NAME} setup --local`,
361
+ note: "configure the project band instead",
219
362
  },
220
363
  {
221
364
  cmd: `${BIN_NAME} setup mcp`,
@@ -225,12 +368,18 @@ const setupAllVerb = setupVerb(
225
368
  },
226
369
  );
227
370
 
371
+ const configVerb = setupVerb(
372
+ ["setup", "config"],
373
+ "Create the global config file with its defaults.",
374
+ "config",
375
+ SUB_CAPABILITY,
376
+ );
377
+
228
378
  const mcpVerb = setupVerb(
229
379
  ["setup", "mcp"],
230
380
  `Register the ${BIN_NAME} MCP server in detected AI harnesses.`,
231
381
  "mcp",
232
382
  SUB_CAPABILITY,
233
- { params: SCOPE_PARAMS },
234
383
  );
235
384
 
236
385
  const completionsVerb = setupVerb(
@@ -245,7 +394,6 @@ const skillsVerb = setupVerb(
245
394
  "Symlink discovered skills into each AI harness.",
246
395
  "skills",
247
396
  SUB_CAPABILITY,
248
- { params: SCOPE_PARAMS },
249
397
  );
250
398
 
251
399
  const lspVerb = setupVerb(
@@ -255,14 +403,18 @@ const lspVerb = setupVerb(
255
403
  SUB_CAPABILITY,
256
404
  );
257
405
 
258
- /** The `setup` capability module (run-all self-verb + four CLI-only sub-verbs). */
406
+ /** The `setup` capability module (run-all self-verb + five CLI-only sub-verbs). */
259
407
  export const setupModule: CapabilityModule = {
260
408
  name: "setup",
261
409
  verbs: [
262
410
  asVerb(setupAllVerb),
263
- asVerb(mcpVerb),
411
+ asVerb(configVerb),
264
412
  asVerb(completionsVerb),
265
- asVerb(skillsVerb),
266
413
  asVerb(lspVerb),
414
+ asVerb(mcpVerb),
415
+ asVerb(skillsVerb),
267
416
  ],
268
417
  };
418
+
419
+ /** Re-exported so the covenant emitter and tests can name the target set. */
420
+ export { TARGET_IDS };
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Shell detection — the shell the user is RUNNING, not the one `/etc/passwd`
3
+ * records.
4
+ *
5
+ * The defect these pin: `$SHELL` is the LOGIN shell. It does not change when
6
+ * you start a different shell, so a user whose account says bash but who works
7
+ * in zsh was handed a bash completion script — and doctor then reported it
8
+ * green, for a shell they never open, while zsh had nothing. The failure is
9
+ * invisible until TAB does nothing months later, which is exactly why an
10
+ * unresolved shell must be reported rather than guessed.
11
+ */
12
+
13
+ import { afterEach, describe, expect, it } from "vitest";
14
+ import { detectShell, type ProcessEntry } from "./shell.js";
15
+
16
+ /** A fake process tree: pid → entry, walked exactly as /proc would be. */
17
+ const tree = (entries: Record<number, ProcessEntry>) => (pid: number) =>
18
+ entries[pid];
19
+
20
+ const prevShell = process.env.SHELL;
21
+ afterEach(() => {
22
+ process.env.SHELL = prevShell;
23
+ });
24
+
25
+ describe("the running shell wins over $SHELL", () => {
26
+ it("reports the shell that actually started this process", () => {
27
+ // The case from a real machine: login shell bash, working shell zsh.
28
+ process.env.SHELL = "/bin/bash";
29
+ const read = tree({
30
+ [process.ppid]: { name: "zsh", ppid: 100 },
31
+ 100: { name: "systemd", ppid: 1 },
32
+ });
33
+ expect(detectShell(read)).toEqual({ kind: "detected", shell: "zsh" });
34
+ });
35
+
36
+ it("walks past the wrappers a CLI is usually reached through", () => {
37
+ // `npm run` / `bunx` / a shim script put node or sh between the shell and
38
+ // us, so the immediate parent is almost never the answer.
39
+ process.env.SHELL = "/bin/bash";
40
+ const read = tree({
41
+ [process.ppid]: { name: "node", ppid: 200 },
42
+ 200: { name: "npm", ppid: 300 },
43
+ 300: { name: "fish", ppid: 400 },
44
+ });
45
+ expect(detectShell(read)).toEqual({ kind: "detected", shell: "fish" });
46
+ });
47
+
48
+ it("strips the login dash and any path", () => {
49
+ const read = tree({ [process.ppid]: { name: "-zsh", ppid: 1 } });
50
+ expect(detectShell(read)).toEqual({ kind: "detected", shell: "zsh" });
51
+ const path = tree({ [process.ppid]: { name: "/usr/bin/bash", ppid: 1 } });
52
+ expect(detectShell(path)).toEqual({ kind: "detected", shell: "bash" });
53
+ });
54
+ });
55
+
56
+ describe("an unresolved shell is reported, never guessed", () => {
57
+ it("is ambiguous when only $SHELL has an opinion", () => {
58
+ // No shell in the ancestry — a CI runner, an editor task, a daemon. The
59
+ // login shell names a session that may not exist, so it is not an answer.
60
+ process.env.SHELL = "/bin/bash";
61
+ const read = tree({
62
+ [process.ppid]: { name: "node", ppid: 900 },
63
+ 900: { name: "containerd", ppid: 1 },
64
+ });
65
+ expect(detectShell(read)).toEqual({ kind: "ambiguous", login: "bash" });
66
+ });
67
+
68
+ it("is unknown when nothing names a supported shell", () => {
69
+ process.env.SHELL = "/usr/bin/nu";
70
+ const read = tree({ [process.ppid]: { name: "init", ppid: 1 } });
71
+ expect(detectShell(read)).toEqual({ kind: "unknown" });
72
+ });
73
+
74
+ it("is unknown when $SHELL is unset and the tree is silent", () => {
75
+ process.env.SHELL = "";
76
+ const read = tree({ [process.ppid]: { name: "init", ppid: 1 } });
77
+ expect(detectShell(read)).toEqual({ kind: "unknown" });
78
+ });
79
+
80
+ it("gives up rather than walking an unbounded tree", () => {
81
+ // A cycle (or a very deep tree) must terminate.
82
+ process.env.SHELL = "";
83
+ const read = (pid: number): ProcessEntry => ({ name: "node", ppid: pid });
84
+ expect(detectShell(read)).toEqual({ kind: "unknown" });
85
+ });
86
+ });