@canonical/pragma-cli 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (892) hide show
  1. package/README.md +153 -30
  2. package/dist/.build-ok +0 -0
  3. package/dist/package.json +83 -0
  4. package/dist/pragma.conf.js +814 -0
  5. package/dist/pragma.conf.js.map +1 -0
  6. package/dist/src/bin.js +356 -0
  7. package/dist/src/bin.js.map +1 -0
  8. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  9. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  10. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  11. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  12. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  13. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  14. package/dist/src/capabilities/capabilities/hints.js +195 -0
  15. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  16. package/dist/src/capabilities/capabilities/index.js +11 -0
  17. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/types.js +11 -0
  19. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  20. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  21. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  22. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  23. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  24. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  25. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  26. package/dist/src/capabilities/colophon/index.js +5 -0
  27. package/dist/src/capabilities/colophon/index.js.map +1 -0
  28. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  29. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  30. package/dist/src/capabilities/colophon/types.js +10 -0
  31. package/dist/src/capabilities/colophon/types.js.map +1 -0
  32. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  33. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  34. package/dist/src/capabilities/config/field.render.js +22 -0
  35. package/dist/src/capabilities/config/field.render.js.map +1 -0
  36. package/dist/src/capabilities/config/fields.js +46 -0
  37. package/dist/src/capabilities/config/fields.js.map +1 -0
  38. package/dist/src/capabilities/config/get.verb.js +61 -0
  39. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  40. package/dist/src/capabilities/config/index.js +5 -0
  41. package/dist/src/capabilities/config/index.js.map +1 -0
  42. package/dist/src/capabilities/config/runField.js +59 -0
  43. package/dist/src/capabilities/config/runField.js.map +1 -0
  44. package/dist/src/capabilities/config/runGet.js +28 -0
  45. package/dist/src/capabilities/config/runGet.js.map +1 -0
  46. package/dist/src/capabilities/config/runSet.js +53 -0
  47. package/dist/src/capabilities/config/runSet.js.map +1 -0
  48. package/dist/src/capabilities/config/set.verb.js +66 -0
  49. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/show.render.js +84 -0
  51. package/dist/src/capabilities/config/show.render.js.map +1 -0
  52. package/dist/src/capabilities/config/show.verb.js +44 -0
  53. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  54. package/dist/src/capabilities/config/types.js +5 -0
  55. package/dist/src/capabilities/config/types.js.map +1 -0
  56. package/dist/src/capabilities/config/unset.verb.js +49 -0
  57. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  58. package/dist/src/capabilities/create/cliProjection.js +195 -0
  59. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  60. package/dist/src/capabilities/create/constants.js +47 -0
  61. package/dist/src/capabilities/create/constants.js.map +1 -0
  62. package/dist/src/capabilities/create/create.render.js +100 -0
  63. package/dist/src/capabilities/create/create.render.js.map +1 -0
  64. package/dist/src/capabilities/create/create.verb.js +438 -0
  65. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  66. package/dist/src/capabilities/create/createHelp.js +47 -0
  67. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  68. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  69. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  70. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  71. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  72. package/dist/src/capabilities/create/index.js +18 -0
  73. package/dist/src/capabilities/create/index.js.map +1 -0
  74. package/dist/src/capabilities/create/messages.js +16 -0
  75. package/dist/src/capabilities/create/messages.js.map +1 -0
  76. package/dist/src/capabilities/create/mount.js +293 -0
  77. package/dist/src/capabilities/create/mount.js.map +1 -0
  78. package/dist/src/capabilities/create/pathJail.js +65 -0
  79. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  80. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  81. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  82. package/dist/src/capabilities/create/types.js +2 -0
  83. package/dist/src/capabilities/create/types.js.map +1 -0
  84. package/dist/src/capabilities/distribution.js +40 -0
  85. package/dist/src/capabilities/distribution.js.map +1 -0
  86. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  87. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  88. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  89. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  90. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
  91. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  92. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  93. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  94. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  95. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  97. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  99. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
  101. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  102. package/dist/src/capabilities/doctor/doctor.render.js +185 -0
  103. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  104. package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
  105. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  106. package/dist/src/capabilities/doctor/index.js +5 -0
  107. package/dist/src/capabilities/doctor/index.js.map +1 -0
  108. package/dist/src/capabilities/doctor/runChecks.js +83 -0
  109. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  110. package/dist/src/capabilities/doctor/types.js +5 -0
  111. package/dist/src/capabilities/doctor/types.js.map +1 -0
  112. package/dist/src/capabilities/graph/index.js +19 -0
  113. package/dist/src/capabilities/graph/index.js.map +1 -0
  114. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  115. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  116. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  117. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  118. package/dist/src/capabilities/graph/query.render.js +73 -0
  119. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  120. package/dist/src/capabilities/graph/query.verb.js +49 -0
  121. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  122. package/dist/src/capabilities/graph/runQuery.js +41 -0
  123. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  124. package/dist/src/capabilities/index.js +56 -0
  125. package/dist/src/capabilities/index.js.map +1 -0
  126. package/dist/src/capabilities/info/collectInfo.js +66 -0
  127. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  128. package/dist/src/capabilities/info/index.js +5 -0
  129. package/dist/src/capabilities/info/index.js.map +1 -0
  130. package/dist/src/capabilities/info/info.render.js +53 -0
  131. package/dist/src/capabilities/info/info.render.js.map +1 -0
  132. package/dist/src/capabilities/info/info.verb.js +42 -0
  133. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  134. package/dist/src/capabilities/info/types.js +5 -0
  135. package/dist/src/capabilities/info/types.js.map +1 -0
  136. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  137. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  138. package/dist/src/capabilities/meta/index.js +13 -0
  139. package/dist/src/capabilities/meta/index.js.map +1 -0
  140. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  141. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  142. package/dist/src/capabilities/ontology/index.js +21 -0
  143. package/dist/src/capabilities/ontology/index.js.map +1 -0
  144. package/dist/src/capabilities/ontology/queries.js +123 -0
  145. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  146. package/dist/src/capabilities/ontology/render.js +66 -0
  147. package/dist/src/capabilities/ontology/render.js.map +1 -0
  148. package/dist/src/capabilities/ontology/verbs.js +181 -0
  149. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  150. package/dist/src/capabilities/prompt/index.js +16 -0
  151. package/dist/src/capabilities/prompt/index.js.map +1 -0
  152. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  153. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  154. package/dist/src/capabilities/prompt/types.js +10 -0
  155. package/dist/src/capabilities/prompt/types.js.map +1 -0
  156. package/dist/src/capabilities/prompt/verbs.js +93 -0
  157. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  158. package/dist/src/capabilities/resources/index.js +10 -0
  159. package/dist/src/capabilities/resources/index.js.map +1 -0
  160. package/dist/src/capabilities/resources/provider.js +423 -0
  161. package/dist/src/capabilities/resources/provider.js.map +1 -0
  162. package/dist/src/capabilities/setup/buildPlan.js +168 -0
  163. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  164. package/dist/src/capabilities/setup/index.js +5 -0
  165. package/dist/src/capabilities/setup/index.js.map +1 -0
  166. package/dist/src/capabilities/setup/mode.js +53 -0
  167. package/dist/src/capabilities/setup/mode.js.map +1 -0
  168. package/dist/src/capabilities/setup/operations/index.js +39 -0
  169. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  170. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  171. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  172. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  173. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  174. package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
  175. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  176. package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
  177. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  178. package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
  179. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
  181. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  182. package/dist/src/capabilities/setup/plan.js +128 -0
  183. package/dist/src/capabilities/setup/plan.js.map +1 -0
  184. package/dist/src/capabilities/setup/plan.render.js +193 -0
  185. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  186. package/dist/src/capabilities/setup/setup.render.js +54 -0
  187. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  188. package/dist/src/capabilities/setup/setup.verb.js +334 -0
  189. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  190. package/dist/src/capabilities/setup/shell.js +196 -0
  191. package/dist/src/capabilities/setup/shell.js.map +1 -0
  192. package/dist/src/capabilities/setup/targets.js +263 -0
  193. package/dist/src/capabilities/setup/targets.js.map +1 -0
  194. package/dist/src/capabilities/setup/types.js +5 -0
  195. package/dist/src/capabilities/setup/types.js.map +1 -0
  196. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  197. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  198. package/dist/src/capabilities/shared/bands.js +16 -0
  199. package/dist/src/capabilities/shared/bands.js.map +1 -0
  200. package/dist/src/capabilities/shared/index.js +26 -0
  201. package/dist/src/capabilities/shared/index.js.map +1 -0
  202. package/dist/src/capabilities/shared/packageManager.js +103 -0
  203. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  204. package/dist/src/capabilities/shared/registry.js +55 -0
  205. package/dist/src/capabilities/shared/registry.js.map +1 -0
  206. package/dist/src/capabilities/skill/discover.js +195 -0
  207. package/dist/src/capabilities/skill/discover.js.map +1 -0
  208. package/dist/src/capabilities/skill/index.js +10 -0
  209. package/dist/src/capabilities/skill/index.js.map +1 -0
  210. package/dist/src/capabilities/skill/render.js +49 -0
  211. package/dist/src/capabilities/skill/render.js.map +1 -0
  212. package/dist/src/capabilities/skill/verbs.js +83 -0
  213. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  214. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  215. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  216. package/dist/src/capabilities/sources/index.js +13 -0
  217. package/dist/src/capabilities/sources/index.js.map +1 -0
  218. package/dist/src/capabilities/sources/installSkills.js +167 -0
  219. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  220. package/dist/src/capabilities/sources/runUpdate.js +394 -0
  221. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  222. package/dist/src/capabilities/sources/status.render.js +64 -0
  223. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  224. package/dist/src/capabilities/sources/status.verb.js +40 -0
  225. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  226. package/dist/src/capabilities/sources/types.js +6 -0
  227. package/dist/src/capabilities/sources/types.js.map +1 -0
  228. package/dist/src/capabilities/sources/update.render.js +34 -0
  229. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  230. package/dist/src/capabilities/sources/update.verb.js +55 -0
  231. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  232. package/dist/src/capabilities/upgrade/index.js +5 -0
  233. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  234. package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
  235. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  236. package/dist/src/capabilities/upgrade/types.js +5 -0
  237. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  238. package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
  239. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  240. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  241. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  242. package/dist/src/capabilities/version/index.js +10 -0
  243. package/dist/src/capabilities/version/index.js.map +1 -0
  244. package/dist/src/capabilities/version/version.verb.js +36 -0
  245. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  246. package/dist/src/constants.js +82 -0
  247. package/dist/src/constants.js.map +1 -0
  248. package/dist/src/index.js +12 -0
  249. package/dist/src/index.js.map +1 -0
  250. package/dist/src/kernel/completion/complete.js +66 -0
  251. package/dist/src/kernel/completion/complete.js.map +1 -0
  252. package/dist/src/kernel/completion/emitScripts.js +92 -0
  253. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  254. package/dist/src/kernel/completion/entitySource.js +285 -0
  255. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  256. package/dist/src/kernel/completion/index.js +14 -0
  257. package/dist/src/kernel/completion/index.js.map +1 -0
  258. package/dist/src/kernel/completion/model.js +301 -0
  259. package/dist/src/kernel/completion/model.js.map +1 -0
  260. package/dist/src/kernel/completion/parse.js +253 -0
  261. package/dist/src/kernel/completion/parse.js.map +1 -0
  262. package/dist/src/kernel/completion/rank.js +101 -0
  263. package/dist/src/kernel/completion/rank.js.map +1 -0
  264. package/dist/src/kernel/completion/resolve.js +100 -0
  265. package/dist/src/kernel/completion/resolve.js.map +1 -0
  266. package/dist/src/kernel/completion/templates/bash.js +209 -0
  267. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  268. package/dist/src/kernel/completion/templates/fish.js +214 -0
  269. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  270. package/dist/src/kernel/completion/templates/index.js +23 -0
  271. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  272. package/dist/src/kernel/completion/templates/shared.js +98 -0
  273. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  274. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  275. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  276. package/dist/src/kernel/completion/types.js +13 -0
  277. package/dist/src/kernel/completion/types.js.map +1 -0
  278. package/dist/src/kernel/config/defaults.js +17 -0
  279. package/dist/src/kernel/config/defaults.js.map +1 -0
  280. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  281. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  282. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  283. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  284. package/dist/src/kernel/config/firstRun.js +34 -0
  285. package/dist/src/kernel/config/firstRun.js.map +1 -0
  286. package/dist/src/kernel/config/globalConfig.js +79 -0
  287. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  288. package/dist/src/kernel/config/index.js +16 -0
  289. package/dist/src/kernel/config/index.js.map +1 -0
  290. package/dist/src/kernel/config/paths.js +35 -0
  291. package/dist/src/kernel/config/paths.js.map +1 -0
  292. package/dist/src/kernel/config/readConfig.js +78 -0
  293. package/dist/src/kernel/config/readConfig.js.map +1 -0
  294. package/dist/src/kernel/config/schema.js +130 -0
  295. package/dist/src/kernel/config/schema.js.map +1 -0
  296. package/dist/src/kernel/config/types.js +19 -0
  297. package/dist/src/kernel/config/types.js.map +1 -0
  298. package/dist/src/kernel/config/writeConfigField.js +59 -0
  299. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  300. package/dist/src/kernel/copy.js +43 -0
  301. package/dist/src/kernel/copy.js.map +1 -0
  302. package/dist/src/kernel/error/PragmaError.js +149 -0
  303. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  304. package/dist/src/kernel/error/constants.js +40 -0
  305. package/dist/src/kernel/error/constants.js.map +1 -0
  306. package/dist/src/kernel/error/fromTaskError.js +96 -0
  307. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  308. package/dist/src/kernel/error/index.js +13 -0
  309. package/dist/src/kernel/error/index.js.map +1 -0
  310. package/dist/src/kernel/error/recovery.js +52 -0
  311. package/dist/src/kernel/error/recovery.js.map +1 -0
  312. package/dist/src/kernel/error/renderError.js +115 -0
  313. package/dist/src/kernel/error/renderError.js.map +1 -0
  314. package/dist/src/kernel/error/serialize.js +25 -0
  315. package/dist/src/kernel/error/serialize.js.map +1 -0
  316. package/dist/src/kernel/error/types.js +9 -0
  317. package/dist/src/kernel/error/types.js.map +1 -0
  318. package/dist/src/kernel/index.js +25 -0
  319. package/dist/src/kernel/index.js.map +1 -0
  320. package/dist/src/kernel/packs/collect.js +187 -0
  321. package/dist/src/kernel/packs/collect.js.map +1 -0
  322. package/dist/src/kernel/packs/compile.js +304 -0
  323. package/dist/src/kernel/packs/compile.js.map +1 -0
  324. package/dist/src/kernel/packs/disclosure.js +76 -0
  325. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  326. package/dist/src/kernel/packs/glob.js +38 -0
  327. package/dist/src/kernel/packs/glob.js.map +1 -0
  328. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  329. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  330. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  331. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  332. package/dist/src/kernel/packs/graphql/index.js +20 -0
  333. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  334. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  335. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  336. package/dist/src/kernel/packs/index.js +34 -0
  337. package/dist/src/kernel/packs/index.js.map +1 -0
  338. package/dist/src/kernel/packs/iri.js +110 -0
  339. package/dist/src/kernel/packs/iri.js.map +1 -0
  340. package/dist/src/kernel/packs/renderPack.js +129 -0
  341. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  342. package/dist/src/kernel/packs/resolveEntity.js +223 -0
  343. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  344. package/dist/src/kernel/packs/runBodies.js +87 -0
  345. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  346. package/dist/src/kernel/packs/sample.js +56 -0
  347. package/dist/src/kernel/packs/sample.js.map +1 -0
  348. package/dist/src/kernel/packs/schema.js +369 -0
  349. package/dist/src/kernel/packs/schema.js.map +1 -0
  350. package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
  351. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  352. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  353. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  354. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
  355. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  356. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  357. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  358. package/dist/src/kernel/packs/sparql/index.js +31 -0
  359. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  360. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  361. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  362. package/dist/src/kernel/packs/types.js +30 -0
  363. package/dist/src/kernel/packs/types.js.map +1 -0
  364. package/dist/src/kernel/packs/uniqueness.js +30 -0
  365. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  366. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  367. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  368. package/dist/src/kernel/project/cli/constants.js +27 -0
  369. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  370. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  371. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  372. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  373. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  374. package/dist/src/kernel/project/cli/globalFlags.js +216 -0
  375. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  376. package/dist/src/kernel/project/cli/helpFormat.js +59 -0
  377. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  378. package/dist/src/kernel/project/cli/index.js +14 -0
  379. package/dist/src/kernel/project/cli/index.js.map +1 -0
  380. package/dist/src/kernel/project/cli/rootHelp.js +197 -0
  381. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  382. package/dist/src/kernel/project/cli/suggest.js +75 -0
  383. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  384. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  385. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  386. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  387. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  388. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  389. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  390. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  391. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  392. package/dist/src/kernel/project/mcp/index.js +8 -0
  393. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  394. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  395. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  396. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  397. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  398. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  399. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  401. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  403. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
  405. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/serve.js +35 -0
  407. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  408. package/dist/src/kernel/render/compactUri.js +24 -0
  409. package/dist/src/kernel/render/compactUri.js.map +1 -0
  410. package/dist/src/kernel/render/contracts.js +10 -0
  411. package/dist/src/kernel/render/contracts.js.map +1 -0
  412. package/dist/src/kernel/render/disclosure.js +34 -0
  413. package/dist/src/kernel/render/disclosure.js.map +1 -0
  414. package/dist/src/kernel/render/envelope.js +30 -0
  415. package/dist/src/kernel/render/envelope.js.map +1 -0
  416. package/dist/src/kernel/render/formatters.js +27 -0
  417. package/dist/src/kernel/render/formatters.js.map +1 -0
  418. package/dist/src/kernel/render/index.js +15 -0
  419. package/dist/src/kernel/render/index.js.map +1 -0
  420. package/dist/src/kernel/render/prefixes.js +46 -0
  421. package/dist/src/kernel/render/prefixes.js.map +1 -0
  422. package/dist/src/kernel/render/renderers.js +468 -0
  423. package/dist/src/kernel/render/renderers.js.map +1 -0
  424. package/dist/src/kernel/render/style.js +85 -0
  425. package/dist/src/kernel/render/style.js.map +1 -0
  426. package/dist/src/kernel/render/turtle.js +194 -0
  427. package/dist/src/kernel/render/turtle.js.map +1 -0
  428. package/dist/src/kernel/render/writeStdout.js +43 -0
  429. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  430. package/dist/src/kernel/runtime/boot.js +49 -0
  431. package/dist/src/kernel/runtime/boot.js.map +1 -0
  432. package/dist/src/kernel/runtime/facade.js +39 -0
  433. package/dist/src/kernel/runtime/facade.js.map +1 -0
  434. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  435. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  436. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  437. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  438. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  439. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  440. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  441. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  442. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  443. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  444. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  445. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  446. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  447. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  449. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  451. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  453. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  455. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  457. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  459. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  460. package/dist/src/kernel/runtime/index.js +8 -0
  461. package/dist/src/kernel/runtime/index.js.map +1 -0
  462. package/dist/src/kernel/runtime/loadSession.js +34 -0
  463. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  464. package/dist/src/kernel/runtime/paths.js +78 -0
  465. package/dist/src/kernel/runtime/paths.js.map +1 -0
  466. package/dist/src/kernel/runtime/probe.js +37 -0
  467. package/dist/src/kernel/runtime/probe.js.map +1 -0
  468. package/dist/src/kernel/runtime/readEntity.js +363 -0
  469. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  470. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  471. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  472. package/dist/src/kernel/runtime/refs/index.js +29 -0
  473. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  474. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  475. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  476. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  477. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  478. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  479. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  480. package/dist/src/kernel/runtime/store.js +75 -0
  481. package/dist/src/kernel/runtime/store.js.map +1 -0
  482. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  483. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  484. package/dist/src/kernel/runtime/types.js +11 -0
  485. package/dist/src/kernel/runtime/types.js.map +1 -0
  486. package/dist/src/kernel/spec/asVerb.js +21 -0
  487. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  488. package/dist/src/kernel/spec/emitReference.js +578 -0
  489. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  490. package/dist/src/kernel/spec/emitSurface.js +202 -0
  491. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  492. package/dist/src/kernel/spec/index.js +11 -0
  493. package/dist/src/kernel/spec/index.js.map +1 -0
  494. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  495. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  496. package/dist/src/kernel/spec/types.js +14 -0
  497. package/dist/src/kernel/spec/types.js.map +1 -0
  498. package/dist/src/kernel/spec/validate.js +110 -0
  499. package/dist/src/kernel/spec/validate.js.map +1 -0
  500. package/dist/src/kernel/vocabulary.js +97 -0
  501. package/dist/src/kernel/vocabulary.js.map +1 -0
  502. package/dist/src/types.js +11 -0
  503. package/dist/src/types.js.map +1 -0
  504. package/package.json +25 -24
  505. package/pragma.conf.ts +853 -0
  506. package/src/bin.ts +276 -82
  507. package/src/capabilities/block.parity.test.ts +253 -0
  508. package/src/capabilities/capabilities/capabilities.render.ts +4 -3
  509. package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
  510. package/src/capabilities/capabilities/catalog.ts +20 -12
  511. package/src/capabilities/capabilities/hints.ts +43 -24
  512. package/src/capabilities/capabilities/index.ts +1 -1
  513. package/src/capabilities/colophon/collectColophon.ts +50 -24
  514. package/src/capabilities/colophon/colophon.render.ts +25 -1
  515. package/src/capabilities/colophon/colophon.test.ts +42 -21
  516. package/src/capabilities/colophon/colophon.verb.ts +9 -5
  517. package/src/capabilities/colophon/types.ts +16 -7
  518. package/src/capabilities/config/collectConfigShow.test.ts +58 -0
  519. package/src/capabilities/config/collectConfigShow.ts +43 -6
  520. package/src/capabilities/config/field.render.ts +4 -5
  521. package/src/capabilities/config/fields.ts +17 -37
  522. package/src/capabilities/config/get.verb.ts +70 -0
  523. package/src/capabilities/config/getUnset.test.ts +264 -0
  524. package/src/capabilities/config/index.ts +5 -1
  525. package/src/capabilities/config/runField.ts +40 -22
  526. package/src/capabilities/config/runGet.ts +34 -0
  527. package/src/capabilities/config/runSet.ts +35 -9
  528. package/src/capabilities/config/set.test.ts +48 -14
  529. package/src/capabilities/config/set.verb.ts +14 -9
  530. package/src/capabilities/config/show.render.test.ts +77 -5
  531. package/src/capabilities/config/show.render.ts +8 -13
  532. package/src/capabilities/config/show.verb.ts +13 -9
  533. package/src/capabilities/config/types.ts +26 -4
  534. package/src/capabilities/config/unset.verb.ts +58 -0
  535. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  536. package/src/capabilities/create/byteEquality.test.ts +95 -103
  537. package/src/capabilities/create/cliProjection.ts +227 -0
  538. package/src/capabilities/create/constants.ts +50 -0
  539. package/src/capabilities/create/create.mcp.test.ts +91 -7
  540. package/src/capabilities/create/create.render.ts +71 -7
  541. package/src/capabilities/create/create.test.ts +523 -162
  542. package/src/capabilities/create/create.verb.ts +361 -321
  543. package/src/capabilities/create/createGrammar.test.ts +865 -0
  544. package/src/capabilities/create/createHelp.ts +71 -0
  545. package/src/capabilities/create/createSurface.generated.ts +400 -0
  546. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  547. package/src/capabilities/create/cwdJail.test.ts +24 -5
  548. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  549. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  550. package/src/capabilities/create/index.ts +9 -14
  551. package/src/capabilities/create/messages.ts +18 -0
  552. package/src/capabilities/create/mount.ts +391 -0
  553. package/src/capabilities/create/pathJail.test.ts +90 -0
  554. package/src/capabilities/create/pathJail.ts +8 -5
  555. package/src/capabilities/create/pickGenerator.ts +40 -46
  556. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  557. package/src/capabilities/create/types.ts +29 -5
  558. package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
  559. package/src/capabilities/distribution.test.ts +122 -0
  560. package/src/capabilities/distribution.ts +54 -0
  561. package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
  562. package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
  563. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
  564. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
  565. package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
  566. package/src/capabilities/doctor/checks/index.ts +27 -0
  567. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  568. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  569. package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
  570. package/src/capabilities/doctor/doctor.render.test.ts +24 -13
  571. package/src/capabilities/doctor/doctor.render.ts +45 -20
  572. package/src/capabilities/doctor/doctor.test.ts +158 -40
  573. package/src/capabilities/doctor/doctor.verb.ts +9 -5
  574. package/src/capabilities/doctor/runChecks.ts +65 -66
  575. package/src/capabilities/doctor/types.ts +21 -5
  576. package/src/capabilities/emptyRecovery.test.ts +44 -22
  577. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  578. package/src/capabilities/graph/index.ts +1 -1
  579. package/src/capabilities/graph/inspect.render.ts +70 -22
  580. package/src/capabilities/graph/inspect.test.ts +260 -5
  581. package/src/capabilities/graph/inspect.verb.ts +18 -5
  582. package/src/capabilities/graph/query.render.ts +15 -3
  583. package/src/capabilities/graph/query.verb.ts +5 -4
  584. package/src/capabilities/graph/runQuery.ts +9 -7
  585. package/src/capabilities/index.ts +25 -19
  586. package/src/capabilities/info/collectInfo.ts +15 -10
  587. package/src/capabilities/info/info.render.ts +4 -3
  588. package/src/capabilities/info/info.verb.ts +4 -3
  589. package/src/capabilities/lazy.test.ts +125 -2
  590. package/src/capabilities/meta/complete.verb.ts +1 -1
  591. package/src/capabilities/meta/index.ts +1 -1
  592. package/src/capabilities/meta/mcp.verb.ts +10 -8
  593. package/src/capabilities/ontology/index.ts +15 -11
  594. package/src/capabilities/ontology/ontology.test.ts +6 -55
  595. package/src/capabilities/ontology/queries.ts +2 -2
  596. package/src/capabilities/ontology/render.ts +3 -4
  597. package/src/capabilities/ontology/verbs.ts +42 -83
  598. package/src/capabilities/prompt/index.ts +2 -2
  599. package/src/capabilities/prompt/prompt.render.ts +6 -2
  600. package/src/capabilities/prompt/prompt.test.ts +12 -6
  601. package/src/capabilities/prompt/types.ts +1 -1
  602. package/src/capabilities/prompt/verbs.ts +26 -14
  603. package/src/capabilities/reference.test.ts +63 -0
  604. package/src/capabilities/resources/provider.ts +367 -91
  605. package/src/capabilities/resources/resources.test.ts +411 -59
  606. package/src/capabilities/setup/buildPlan.ts +236 -0
  607. package/src/capabilities/setup/index.ts +7 -7
  608. package/src/capabilities/setup/mode.ts +74 -0
  609. package/src/capabilities/setup/operations/index.ts +74 -0
  610. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  611. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  612. package/src/capabilities/setup/operations/setupGenerator.ts +397 -320
  613. package/src/capabilities/setup/operations/setupLsp.ts +329 -68
  614. package/src/capabilities/setup/operations/setupMcp.ts +137 -97
  615. package/src/capabilities/setup/operations/setupSkills.ts +336 -108
  616. package/src/capabilities/setup/plan.render.ts +241 -0
  617. package/src/capabilities/setup/plan.ts +236 -0
  618. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  619. package/src/capabilities/setup/setup.render.test.ts +281 -73
  620. package/src/capabilities/setup/setup.render.ts +45 -77
  621. package/src/capabilities/setup/setup.test.ts +972 -209
  622. package/src/capabilities/setup/setup.verb.ts +233 -74
  623. package/src/capabilities/setup/shell.test.ts +86 -0
  624. package/src/capabilities/setup/shell.ts +166 -14
  625. package/src/capabilities/setup/targets.ts +367 -0
  626. package/src/capabilities/setup/types.ts +18 -57
  627. package/src/capabilities/shared/assertExecOk.ts +68 -10
  628. package/src/capabilities/shared/index.ts +32 -0
  629. package/src/capabilities/shared/packageManager.test.ts +55 -0
  630. package/src/capabilities/shared/packageManager.ts +62 -6
  631. package/src/capabilities/skill/discover.ts +47 -9
  632. package/src/capabilities/skill/index.ts +1 -1
  633. package/src/capabilities/skill/render.ts +14 -14
  634. package/src/capabilities/skill/skill.test.ts +7 -5
  635. package/src/capabilities/skill/verbs.ts +9 -10
  636. package/src/capabilities/sources/collectStatus.ts +61 -51
  637. package/src/capabilities/sources/index.ts +2 -2
  638. package/src/capabilities/sources/installSkills.ts +86 -9
  639. package/src/capabilities/sources/runUpdate.ts +164 -141
  640. package/src/capabilities/sources/sources.test.ts +265 -119
  641. package/src/capabilities/sources/status.render.test.ts +53 -24
  642. package/src/capabilities/sources/status.render.ts +25 -30
  643. package/src/capabilities/sources/status.verb.ts +16 -9
  644. package/src/capabilities/sources/types.ts +18 -25
  645. package/src/capabilities/sources/update.render.ts +10 -3
  646. package/src/capabilities/sources/update.verb.ts +13 -24
  647. package/src/capabilities/surface.test.ts +165 -25
  648. package/src/capabilities/tier.parity.test.ts +144 -0
  649. package/src/capabilities/upgrade/runUpgrade.ts +8 -8
  650. package/src/capabilities/upgrade/upgrade.render.ts +4 -5
  651. package/src/capabilities/upgrade/upgrade.test.ts +3 -3
  652. package/src/capabilities/upgrade/upgrade.verb.ts +8 -4
  653. package/src/capabilities/version/index.ts +12 -0
  654. package/src/capabilities/version/version.test.ts +66 -0
  655. package/src/capabilities/version/version.verb.ts +39 -0
  656. package/src/constants.test.ts +8 -6
  657. package/src/constants.ts +78 -22
  658. package/src/identity.test.ts +348 -0
  659. package/src/index.ts +2 -2
  660. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
  661. package/src/kernel/completion/complete.test.ts +12 -2
  662. package/src/kernel/completion/complete.ts +1 -1
  663. package/src/kernel/completion/emitScripts.test.ts +1 -1
  664. package/src/kernel/completion/emitScripts.ts +5 -3
  665. package/src/kernel/completion/entitySource.test.ts +185 -41
  666. package/src/kernel/completion/entitySource.ts +133 -110
  667. package/src/kernel/completion/model.test.ts +165 -13
  668. package/src/kernel/completion/model.ts +105 -14
  669. package/src/kernel/completion/parse.test.ts +4 -7
  670. package/src/kernel/completion/parse.ts +15 -0
  671. package/src/kernel/completion/resolve.test.ts +0 -1
  672. package/src/kernel/completion/safety.test.ts +104 -50
  673. package/src/kernel/completion/shellDrive.test.ts +611 -0
  674. package/src/kernel/completion/templates/bash.ts +7 -2
  675. package/src/kernel/completion/templates/fish.ts +28 -6
  676. package/src/kernel/completion/templates/index.ts +23 -0
  677. package/src/kernel/completion/types.ts +10 -3
  678. package/src/kernel/config/defaults.test.ts +108 -0
  679. package/src/kernel/config/defaults.ts +13 -23
  680. package/src/kernel/config/evaluateProjectConfig.ts +33 -11
  681. package/src/kernel/config/findProjectConfig.ts +4 -3
  682. package/src/kernel/config/firstRun.test.ts +44 -38
  683. package/src/kernel/config/firstRun.ts +24 -81
  684. package/src/kernel/config/globalConfig.ts +2 -2
  685. package/src/kernel/config/index.ts +5 -6
  686. package/src/kernel/config/paths.ts +17 -17
  687. package/src/kernel/config/readConfig.test.ts +246 -7
  688. package/src/kernel/config/readConfig.ts +8 -8
  689. package/src/kernel/config/schema.test.ts +50 -0
  690. package/src/kernel/config/schema.ts +100 -11
  691. package/src/kernel/config/types.ts +75 -19
  692. package/src/kernel/copy.test.ts +483 -0
  693. package/src/kernel/copy.ts +54 -0
  694. package/src/kernel/error/PragmaError.test.ts +6 -3
  695. package/src/kernel/error/PragmaError.ts +4 -2
  696. package/src/kernel/error/constants.ts +7 -4
  697. package/src/kernel/error/fromTaskError.ts +28 -6
  698. package/src/kernel/error/index.ts +1 -1
  699. package/src/kernel/error/recovery.test.ts +22 -45
  700. package/src/kernel/error/recovery.ts +36 -27
  701. package/src/kernel/error/renderError.ts +42 -1
  702. package/src/kernel/error/types.ts +25 -4
  703. package/src/kernel/index.ts +26 -0
  704. package/src/kernel/packs/collect.test.ts +195 -11
  705. package/src/kernel/packs/collect.ts +212 -61
  706. package/src/kernel/packs/compile.test.ts +293 -8
  707. package/src/kernel/packs/compile.ts +108 -15
  708. package/src/kernel/packs/disclosure.test.ts +5 -2
  709. package/src/kernel/packs/disclosure.ts +2 -2
  710. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  711. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
  712. package/src/kernel/packs/graphql/index.ts +20 -0
  713. package/src/kernel/packs/graphqlSource.test.ts +6 -3
  714. package/src/kernel/packs/index.ts +40 -0
  715. package/src/kernel/packs/iri.test.ts +73 -0
  716. package/src/kernel/packs/iri.ts +70 -20
  717. package/src/kernel/packs/renderPack.ts +28 -7
  718. package/src/kernel/packs/resolveEntity.test.ts +213 -0
  719. package/src/kernel/packs/resolveEntity.ts +132 -34
  720. package/src/kernel/packs/runBodies.ts +16 -16
  721. package/src/kernel/packs/sample.ts +1 -1
  722. package/src/kernel/packs/schema.ts +114 -11
  723. package/src/kernel/packs/sparql/applyFilters.ts +16 -17
  724. package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
  725. package/src/kernel/packs/sparql/index.ts +37 -0
  726. package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
  727. package/src/kernel/packs/sparql/runSelect.ts +75 -37
  728. package/src/kernel/packs/toolDescription.test.ts +52 -5
  729. package/src/kernel/packs/types.ts +52 -4
  730. package/src/kernel/packs/uniqueness.ts +5 -5
  731. package/src/kernel/project/cli/buildProgram.test.ts +157 -17
  732. package/src/kernel/project/cli/buildProgram.ts +77 -18
  733. package/src/kernel/project/cli/constants.ts +34 -0
  734. package/src/kernel/project/cli/dispatch.test.ts +227 -3
  735. package/src/kernel/project/cli/dispatch.ts +250 -48
  736. package/src/kernel/project/cli/exitCodes.ts +1 -1
  737. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  738. package/src/kernel/project/cli/globalFlags.ts +130 -30
  739. package/src/kernel/project/cli/helpFormat.ts +14 -1
  740. package/src/kernel/project/cli/rootHelp.ts +140 -111
  741. package/src/kernel/project/cli/suggest.test.ts +33 -1
  742. package/src/kernel/project/cli/suggest.ts +25 -1
  743. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  744. package/src/kernel/project/cli/verbHelp.ts +23 -7
  745. package/src/kernel/project/mcp/buildServer.ts +18 -10
  746. package/src/kernel/project/mcp/envelope.ts +2 -2
  747. package/src/kernel/project/mcp/instructions.ts +12 -7
  748. package/src/kernel/project/mcp/mcpError.ts +1 -1
  749. package/src/kernel/project/mcp/parity.test.ts +42 -1
  750. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  751. package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
  752. package/src/kernel/project/mcp/prompts/provider.ts +22 -8
  753. package/src/kernel/project/mcp/prompts/source.ts +69 -68
  754. package/src/kernel/project/mcp/registerVerb.ts +56 -11
  755. package/src/kernel/project/mcp/serve.ts +13 -5
  756. package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
  757. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  758. package/src/kernel/render/contracts.ts +21 -0
  759. package/src/kernel/render/disclosure.ts +4 -2
  760. package/src/kernel/render/envelope.ts +2 -3
  761. package/src/kernel/render/formatters.ts +1 -1
  762. package/src/kernel/render/prefixes.test.ts +36 -0
  763. package/src/kernel/render/prefixes.ts +40 -13
  764. package/src/kernel/render/renderers.test.ts +244 -7
  765. package/src/kernel/render/renderers.ts +222 -20
  766. package/src/kernel/render/style.test.ts +75 -24
  767. package/src/kernel/render/style.ts +31 -1
  768. package/src/kernel/render/turtle.ts +222 -0
  769. package/src/kernel/runtime/graphpack/build.ts +29 -3
  770. package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
  771. package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
  772. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
  773. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
  775. package/src/kernel/runtime/graphpack/embedded.ts +39 -13
  776. package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
  777. package/src/kernel/runtime/graphpack/hash.ts +3 -2
  778. package/src/kernel/runtime/graphpack/index.ts +1 -1
  779. package/src/kernel/runtime/graphpack/manifest.ts +114 -12
  780. package/src/kernel/runtime/graphpack/read.ts +5 -11
  781. package/src/kernel/runtime/graphpack/schemas.ts +74 -0
  782. package/src/kernel/runtime/graphpack/stories.ts +84 -0
  783. package/src/kernel/runtime/graphpack/types.ts +61 -48
  784. package/src/kernel/runtime/loadSession.ts +1 -1
  785. package/src/kernel/runtime/paths.ts +64 -15
  786. package/src/kernel/runtime/probe.test.ts +8 -4
  787. package/src/kernel/runtime/probe.ts +6 -6
  788. package/src/kernel/runtime/readEntity.ts +477 -32
  789. package/src/kernel/runtime/refs/gitOps.ts +1 -19
  790. package/src/kernel/runtime/refs/index.ts +39 -0
  791. package/src/kernel/runtime/refs/parseRef.ts +8 -8
  792. package/src/kernel/runtime/refs/resolve.ts +82 -66
  793. package/src/kernel/runtime/resolveSources.test.ts +63 -24
  794. package/src/kernel/runtime/resolveSources.ts +36 -25
  795. package/src/kernel/runtime/storeReadiness.ts +10 -10
  796. package/src/kernel/runtime/storeless.test.ts +1 -1
  797. package/src/kernel/runtime/types.ts +15 -1
  798. package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
  799. package/src/kernel/spec/emitReference.test.ts +3 -3
  800. package/src/kernel/spec/emitReference.ts +242 -34
  801. package/src/kernel/spec/emitSurface.ts +57 -11
  802. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  803. package/src/kernel/spec/surfaceConformance.ts +8 -0
  804. package/src/kernel/spec/types.ts +277 -13
  805. package/src/kernel/spec/validate.ts +2 -1
  806. package/src/kernel/vocabulary.test.ts +164 -0
  807. package/src/kernel/vocabulary.ts +146 -0
  808. package/src/testing/PARITY_GAPS.ts +8 -2
  809. package/src/testing/behavioral/README.md +3 -3
  810. package/src/testing/behavioral/completion.test.ts +19 -6
  811. package/src/testing/behavioral/docExamples.test.ts +14 -0
  812. package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
  813. package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
  814. package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
  815. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  816. package/src/testing/behavioral/harness.foundation.test.ts +14 -5
  817. package/src/testing/behavioral/journeys.cli.test.ts +117 -76
  818. package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
  819. package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
  820. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  821. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  822. package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +9 -6
  823. package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
  824. package/src/testing/behavioral/liveReadSurface.ts +4 -3
  825. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  826. package/src/testing/behavioral/mcpSurface.test.ts +10 -5
  827. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  828. package/src/testing/behavioral/staleCommands.test.ts +10 -0
  829. package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
  830. package/src/testing/eval/cases/assembly.ts +13 -6
  831. package/src/testing/eval/cases/effectful.ts +28 -15
  832. package/src/testing/eval/cases/readNouns.ts +22 -20
  833. package/src/testing/eval/cases/stable.ts +5 -1
  834. package/src/testing/eval/eval.test.ts +7 -1
  835. package/src/testing/fixtures/blockGraph.ts +79 -0
  836. package/src/testing/fixtures/fixtureCapability.ts +45 -1
  837. package/src/testing/fixtures/graph/canonical.ts +94 -5
  838. package/src/testing/fixtures/graph/defaultPack.ts +7 -6
  839. package/src/testing/fixtures/graph/owlExport.ts +7 -5
  840. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  841. package/src/testing/helpers/fixtureGraph.ts +33 -16
  842. package/src/testing/helpers/packRuntime.ts +2 -3
  843. package/src/testing/helpers/projectCli.ts +2 -1
  844. package/src/testing/helpers/projectMcp.ts +38 -6
  845. package/src/testing/helpers/runCli.ts +35 -18
  846. package/src/testing/perf/budgets.test.ts +24 -9
  847. package/src/testing/perf/budgets.ts +76 -12
  848. package/src/testing/perf/codegen.test.ts +126 -0
  849. package/src/testing/perf/globalSetup.test.ts +286 -0
  850. package/src/testing/perf/globalSetup.ts +611 -14
  851. package/src/testing/perf/measure.test.ts +38 -0
  852. package/src/testing/perf/measure.ts +23 -4
  853. package/src/testing/setupXdgIsolation.ts +81 -21
  854. package/src/testing/tempRoot.globalSetup.ts +122 -0
  855. package/src/types.ts +2 -2
  856. package/dist/pragma +0 -0
  857. package/src/capabilities/block/blockList.test.ts +0 -79
  858. package/src/capabilities/block/blockList.verb.ts +0 -163
  859. package/src/capabilities/block/index.ts +0 -25
  860. package/src/capabilities/block/pack.ts +0 -166
  861. package/src/capabilities/block/parity.test.ts +0 -187
  862. package/src/capabilities/block/tierChain.ts +0 -78
  863. package/src/capabilities/colophon/pragmaColophon.ts +0 -66
  864. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
  865. package/src/capabilities/create/templates.embedded.generated.ts +0 -53
  866. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
  867. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  868. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
  869. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
  870. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  871. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  872. package/src/capabilities/modifier/index.ts +0 -15
  873. package/src/capabilities/modifier/pack.ts +0 -64
  874. package/src/capabilities/standard/index.ts +0 -18
  875. package/src/capabilities/standard/pack.ts +0 -128
  876. package/src/capabilities/tier/index.ts +0 -19
  877. package/src/capabilities/tier/lookup.render.test.ts +0 -72
  878. package/src/capabilities/tier/lookup.render.ts +0 -59
  879. package/src/capabilities/tier/lookup.test.ts +0 -83
  880. package/src/capabilities/tier/lookup.verb.ts +0 -44
  881. package/src/capabilities/tier/pack.ts +0 -28
  882. package/src/capabilities/tier/runLookup.ts +0 -87
  883. package/src/capabilities/token/addConfig.render.ts +0 -27
  884. package/src/capabilities/token/addConfig.test.ts +0 -62
  885. package/src/capabilities/token/addConfig.verb.ts +0 -40
  886. package/src/capabilities/token/index.ts +0 -19
  887. package/src/capabilities/token/pack.ts +0 -58
  888. package/src/capabilities/token/runAddConfig.ts +0 -95
  889. package/src/kernel/completion/bashDrive.test.ts +0 -73
  890. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
  891. package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
  892. package/src/kernel/runtime/lock.ts +0 -90
@@ -1,21 +1,19 @@
1
1
  /**
2
- * Synthesize `setup` (and each sub-verb) as a summon `GeneratorDefinition`, so
3
- * they all flow through the SAME `execute` seam `create` uses — inheriting the
4
- * Ink wizard, the recap/confirm gate, live progress, colours, and the shared
5
- * cancel fixes (H1/H2/H3/M1) by construction. Replaces the old readline
6
- * `promptStrategy` + `setupAll`.
2
+ * Synthesize a setup invocation as a summon `GeneratorDefinition` driven by the
3
+ * TARGET TABLE, so the run-all and every sub-verb flow through the same
4
+ * `execute` seam `create` uses — inheriting the Ink wizard, the recap/confirm
5
+ * gate, live progress, colours, and the shared cancel fixes by construction.
7
6
  *
8
- * The shape mirrors `create`: detection runs FOR REAL up front (in each
9
- * `detectX`), then a PURE `generate` composes only the effects for the SELECTED
10
- * steps. `generate` must stay side-effect-free — `execute` and the wizard invoke
11
- * it more than once (the confirm-gate preview + the build), so all real reads
12
- * belong in detection, never in `generate`.
7
+ * The shape mirrors `create`: detection runs FOR REAL up front (once per
8
+ * target/band, in `detectTargets`), then a PURE `generate` composes only the
9
+ * effects for the SELECTED rows. `generate` must stay re-interpretable —
10
+ * `execute` invokes it more than once (the confirm-gate preview and the build) —
11
+ * so it is composed from combinators and does no reads of its own.
13
12
  *
14
- * The `--scope` selection is threaded through detection AND step-offering so
15
- * `listAvailableSteps` only offers steps whose band the scope runs, and the MCP
16
- * step targets exactly the deduped files for that scope. Per-file narrowing is
17
- * opt-in (Item 6): the "all" default never springs a per-file question — it
18
- * configures every deduped file.
13
+ * The wizard is the PLAN'S EDITOR, not a parallel path: its choices are the plan
14
+ * rows, and what it edits is each row's `selected` flag. There is exactly one
15
+ * list of things this command can do, and the preview, the wizard, the progress
16
+ * lines and the recap are four views of it.
19
17
  *
20
18
  * This module carries NO static import of `@canonical/summon-core` VALUES or of
21
19
  * React/Ink — it only `import type`s the generator shape and builds plain object
@@ -27,96 +25,148 @@ import type {
27
25
  GeneratorDefinition,
28
26
  PromptDefinition,
29
27
  } from "@canonical/summon-core";
30
- import { sequence_, type Task, when } from "@canonical/task";
31
- import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
32
- import { guardMissingBinary } from "../../shared/assertExecOk.js";
33
- import type {
34
- LspState,
35
- ScopeSelection,
36
- SetupMode,
37
- SetupResult,
38
- } from "../types.js";
39
28
  import {
40
- type CompletionsDetection,
41
- composeCompletions,
42
- detectCompletions,
43
- } from "./setupCompletions.js";
44
- import { composeLsp, detectLsp, type LspDetection } from "./setupLsp.js";
29
+ flatMap,
30
+ pure,
31
+ recover,
32
+ sequence_,
33
+ type Task,
34
+ type TaskError,
35
+ warn,
36
+ } from "@canonical/task";
37
+ import { BIN_NAME } from "../../../constants.js";
38
+ import { PragmaError } from "../../../kernel/error/index.js";
39
+ import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
45
40
  import {
46
- composeMcp,
47
- detectMcp,
48
- type McpDetection,
49
- mcpConfigured,
50
- mcpGroupState,
51
- mcpTargets,
52
- selectedGroups,
53
- } from "./setupMcp.js";
41
+ buildPlan,
42
+ type DetectedRow,
43
+ detectionFailure,
44
+ detectTargets,
45
+ draftFor,
46
+ resolveRoots,
47
+ } from "../buildPlan.js";
54
48
  import {
55
- composeSkills,
56
- detectSkills,
57
- type SkillsDetection,
58
- skillsEmptyError,
59
- toSkillsResult,
60
- } from "./setupSkills.js";
49
+ isActionable,
50
+ type PlanChildRow,
51
+ type PlanOutcome,
52
+ type PlanRow,
53
+ type SetupPlan,
54
+ TARGET_IDS,
55
+ type TargetId,
56
+ withRows,
57
+ } from "../plan.js";
58
+ import type { ScopeBand, ScopeSelection, SetupMode } from "../types.js";
59
+
60
+ /** The answer key the run-all's row multiselect writes. */
61
+ const ROWS_ANSWER = "targets";
61
62
 
62
- /** The run-all steps, in composition (and display) order. */
63
- type StepId = "completions" | "lsp" | "mcp" | "skills";
63
+ /** The answer key the opt-in per-file MCP narrowing writes. */
64
+ const MCP_FILES_ANSWER = "mcpTargets";
65
+
66
+ /** The answer key the opt-in per-editor LSP narrowing writes. */
67
+ const LSP_EDITORS_ANSWER = "lspEditors";
68
+
69
+ /** Which answer key carries a target's per-child selection, if it has one. */
70
+ const CHILD_ANSWER: Partial<Record<TargetId, string>> = {
71
+ mcp: MCP_FILES_ANSWER,
72
+ lsp: LSP_EDITORS_ANSWER,
73
+ };
74
+
75
+ /** A row's identity in an answer bag: band-qualified, so `both` stays unambiguous. */
76
+ const rowKey = (band: ScopeBand, target: TargetId): string =>
77
+ `${band}:${target}`;
64
78
 
65
79
  /**
66
- * A ready-to-run setup plan: the synthesized generator (fed to `inkPrompt` /
67
- * `execute`) plus a mapper from the completed answers back onto setup's tagged
68
- * {@link SetupResult} output union (its `--format json` shape is frozen).
80
+ * A ready-to-run setup invocation: the plan as detected, the synthesized
81
+ * generator, and a projection from the completed answers back onto the plan with
82
+ * outcomes filled in — the recap, and the `--format json` body.
69
83
  */
70
- export interface SetupPlan {
84
+ export interface SetupRun {
85
+ readonly plan: SetupPlan;
71
86
  readonly generator: GeneratorDefinition;
72
- readonly toResult: (answers: Record<string, unknown>) => SetupResult;
87
+ /** The plan with the wizard's selection and the run's outcomes applied. */
88
+ applied(answers: Record<string, unknown>): SetupPlan;
73
89
  }
74
90
 
75
- /** The union of every step's detection, gathered up front for the run-all. */
76
- interface SetupDetection {
77
- readonly completions: CompletionsDetection;
78
- readonly lsp: LspDetection;
79
- readonly mcp: McpDetection;
80
- readonly skills: SkillsDetection;
81
- }
91
+ /**
92
+ * Where a failed row's error lands during interpretation.
93
+ *
94
+ * Per-row failure isolation needs somewhere to put "row X failed with Y", and
95
+ * `execute` yields only the generator's answers and effects — the value of the
96
+ * composed task is discarded. So the recover handlers record here, and the head
97
+ * of the sequence CLEARS it: `generate` is invoked fresh per interpretation, so
98
+ * the clear runs first on every drive and the last drive (the real one, which
99
+ * follows `execute`'s mocked preview) is the one whose records survive. The
100
+ * composition itself stays pure and re-interpretable — nothing is captured in
101
+ * the task, only written while it runs.
102
+ */
103
+ class OutcomeSink {
104
+ private readonly errors = new Map<string, TaskError>();
82
105
 
83
- /** Read `answers.steps` (the run-all multiselect) as a string array. */
84
- const readSteps = (answers: Record<string, unknown>): string[] =>
85
- Array.isArray(answers.steps) ? (answers.steps as string[]) : [];
106
+ /** Forget every recorded failure — run at the head of each interpretation. */
107
+ clear(): void {
108
+ this.errors.clear();
109
+ }
86
110
 
87
- /** Read `answers.mcpTargets` (selected file paths), falling back to ALL files. */
88
- const resolveMcpPaths = (
89
- d: McpDetection,
90
- answers: Record<string, unknown>,
91
- ): string[] =>
92
- Array.isArray(answers.mcpTargets)
93
- ? (answers.mcpTargets as string[])
94
- : d.groups.map((g) => g.path);
111
+ record(key: string, error: TaskError): void {
112
+ this.errors.set(key, error);
113
+ }
95
114
 
96
- /** The groups the user chose (or all, under the "all" default). */
97
- const selectChosenGroups = (
98
- d: McpDetection,
99
- answers: Record<string, unknown>,
100
- ) => selectedGroups(d, resolveMcpPaths(d, answers));
115
+ get(key: string): TaskError | undefined {
116
+ return this.errors.get(key);
117
+ }
118
+
119
+ get failureCount(): number {
120
+ return this.errors.size;
121
+ }
122
+ }
123
+
124
+ /** The {@link PragmaError} a row failure carries, or a wrapper around it. */
125
+ const rowPragmaError = (error: TaskError): PragmaError =>
126
+ error.cause instanceof PragmaError
127
+ ? error.cause
128
+ : new PragmaError({ code: "UNSUPPORTED", message: error.message });
101
129
 
102
130
  /**
103
- * The LSP-install step, guarded at its use site. An absent `bunx` (no Bun on
104
- * PATH) REJECTS the exec with ENOENT, which would otherwise collapse to
105
- * INTERNAL_ERROR ("please report this issue") at the CLI/MCP boundary;
106
- * `guardMissingBinary` names it a UNSUPPORTED "`bunx` not found on PATH" with an
107
- * actionable install recovery instead. Preview-transparent — a dry-run mocks the
108
- * exec (no spawn) — and re-runnable (the guard is a `recover`, and `composeLsp`
109
- * is combinator-built), so it survives `execute`'s double interpretation.
131
+ * Run the chosen rows with per-row failure isolation. The rows are independent
132
+ * installers, so one unsatisfiable prerequisite must not consume the others: a
133
+ * sequenced composition let a failing editor sideload abort the run before MCP
134
+ * or skills ever executed, so on every machine without a usable editor CLI the
135
+ * single advertised onboarding command configured nothing that mattered.
136
+ *
137
+ * Each row runs under a `recover` frame: the failure is reported inline (a
138
+ * `warn` right where it happened), recorded on the sink, and the remaining rows
139
+ * still run. The aggregate outcome is decided afterwards by the caller reading
140
+ * the sink — a run whose every failure is recorded does NOT rethrow, because the
141
+ * recap is the report and the exit code comes from the plan's own rule.
142
+ *
143
+ * Only failures travelling the task FAILURE CHANNEL are isolable — a synchronous
144
+ * throw bypasses the trampoline's recovery frames — which is why the row bodies
145
+ * raise via `checkExecOk`/`failPragma`, never a bare throw. Interruption bypasses
146
+ * recovery by interpreter invariant, so Ctrl-C still stops the whole run.
110
147
  */
111
- const composeGuardedLsp = (rt: PragmaRuntime, state: LspState): Task<void> =>
112
- guardMissingBinary(
113
- "bunx",
114
- {
115
- message:
116
- "Install Bun (https://bun.sh) to provide `bunx`, then run this again.",
117
- },
118
- composeLsp(rt.cwd, state),
119
- );
148
+ const runRowsIsolated = (
149
+ sink: OutcomeSink,
150
+ rows: readonly { key: string; task: Task<void> }[],
151
+ ): Task<void> =>
152
+ flatMap(pure(undefined), (): Task<void> => {
153
+ sink.clear();
154
+ return sequence_(
155
+ rows.map(({ key, task }) =>
156
+ recover(task, (error) =>
157
+ flatMap(
158
+ warn(
159
+ `The ${key.split(":")[1]} step did not complete — continuing with the remaining targets.`,
160
+ ),
161
+ () => {
162
+ sink.record(key, error);
163
+ return pure(undefined);
164
+ },
165
+ ),
166
+ ),
167
+ ),
168
+ );
169
+ });
120
170
 
121
171
  /** Build a generator's `meta` (no stamping — the version is just header text). */
122
172
  const buildMeta = (
@@ -125,279 +175,306 @@ const buildMeta = (
125
175
  ): GeneratorDefinition["meta"] => ({
126
176
  name: title,
127
177
  displayName: title,
128
- description: "Configure pragma for this project",
178
+ description: `Configure ${BIN_NAME} on this machine`,
129
179
  version: rt.version,
130
180
  });
131
181
 
132
- /** The opt-in "customize which files" gate (Item 6) — defaults to false. */
182
+ /** Read a multiselect answer as a string array. */
183
+ const readList = (
184
+ answers: Record<string, unknown>,
185
+ key: string,
186
+ ): string[] | undefined =>
187
+ Array.isArray(answers[key]) ? (answers[key] as string[]) : undefined;
188
+
189
+ /**
190
+ * The wizard's row multiselect — its choices ARE the plan rows. Actionable rows
191
+ * are pre-selected; an already-current row is offered DE-selected, so a re-run
192
+ * never proposes to rewrite what is already correct. A skip row is not a choice
193
+ * at all (summon's choice shape has no disabled state) but stays a visible row
194
+ * in the plan and the recap, carrying its reason.
195
+ */
196
+ const buildRowsPrompt = (plan: SetupPlan): PromptDefinition => {
197
+ const choices = plan.rows
198
+ .filter((row) => row.action !== "skip")
199
+ .map((row) => ({
200
+ label: `${row.target} — ${row.detail}${row.action === "none" ? " (already configured)" : ""}`,
201
+ value: rowKey(row.band, row.target),
202
+ }));
203
+ return {
204
+ name: ROWS_ANSWER,
205
+ type: "multiselect",
206
+ message: "Which targets would you like to configure?",
207
+ choices,
208
+ default: plan.rows
209
+ .filter((row) => row.selected)
210
+ .map((row) => rowKey(row.band, row.target)),
211
+ };
212
+ };
213
+
214
+ /** The opt-in "customize which files" gate — defaults to false. */
133
215
  const buildCustomizePrompt = (
134
216
  when?: PromptDefinition["when"],
135
217
  ): PromptDefinition => ({
136
218
  name: "customize",
137
219
  type: "confirm",
138
- message: "Customize which files pragma configures?",
220
+ message: `Customize which files ${BIN_NAME} configures?`,
139
221
  default: false,
140
222
  when,
141
223
  });
142
224
 
143
- /** The suffix a group's prior state adds to its multiselect label. */
144
- const mcpStateSuffix = (d: McpDetection, path: string): string => {
145
- switch (mcpGroupState(d, path)) {
146
- case "configured":
147
- return " — already configured";
148
- case "drifted":
149
- return " — needs update";
150
- default:
151
- return "";
152
- }
153
- };
154
-
155
225
  /**
156
- * The per-file MCP multiselect — one row per deduped {@link TargetGroup} file.
157
- * A row's label carries its prior state, and an already-`configured` file is
158
- * DEFAULT-DESELECTED (so a re-run does not re-offer to rewrite what is already
159
- * current); `absent`/`drifted` files stay selected by default.
226
+ * The per-file MCP multiselect — one row per deduplicated config file, across
227
+ * every band the run covers. An already-current file is DEFAULT-DESELECTED; a
228
+ * file that is absent or drifted stays selected. Retained unchanged from the
229
+ * landed opt-in narrowing: it is row-level CHILD selection, which is exactly
230
+ * what the plan's child rows are.
160
231
  */
161
- const buildMcpTargetsPrompt = (
162
- d: McpDetection,
232
+ const buildChildPrompt = (
233
+ plan: SetupPlan,
234
+ target: TargetId,
235
+ message: string,
163
236
  when?: PromptDefinition["when"],
164
- ): PromptDefinition => ({
165
- name: "mcpTargets",
166
- type: "multiselect",
167
- message: "Configure MCP for which files?",
168
- when,
169
- choices: d.groups.map((g) => ({
170
- label: `${g.path} — ${g.harnessNames.join(", ")} [${g.scope}]${mcpStateSuffix(d, g.path)}`,
171
- value: g.path,
172
- })),
173
- default: d.groups
174
- .filter((g) => mcpGroupState(d, g.path) !== "configured")
175
- .map((g) => g.path),
176
- });
237
+ ): PromptDefinition => {
238
+ const children = childrenOf(plan, target);
239
+ return {
240
+ name: CHILD_ANSWER[target] as string,
241
+ type: "multiselect",
242
+ message,
243
+ when,
244
+ choices: children.map((child) => ({
245
+ label: `${child.label} — ${child.action}`,
246
+ value: child.key,
247
+ })),
248
+ default: children
249
+ .filter((child) => child.action !== "unchanged")
250
+ .map((child) => child.key),
251
+ };
252
+ };
177
253
 
178
- // =============================================================================
179
- // Detection
180
- // =============================================================================
254
+ /** Every child row a target contributes, across the bands in the plan. */
255
+ const childrenOf = (
256
+ plan: SetupPlan,
257
+ target: TargetId,
258
+ ): readonly PlanChildRow[] =>
259
+ plan.rows
260
+ .filter((row) => row.target === target)
261
+ .flatMap((row) => row.children ?? []);
181
262
 
182
- /** Gather EVERY step's detection up front (real reads), for the run-all. */
183
- async function gatherDetection(
184
- rt: PragmaRuntime,
185
- scope: ScopeSelection,
186
- ): Promise<SetupDetection> {
187
- const [completions, lsp, mcp, skills] = await Promise.all([
188
- detectCompletions(rt.cwd),
189
- detectLsp(rt.cwd),
190
- detectMcp(rt, scope),
191
- detectSkills(rt),
192
- ]);
193
- return { completions, lsp, mcp, skills };
194
- }
263
+ /** Whether a row was chosen: by the wizard's answer, else by its own default. */
264
+ const isChosen = (
265
+ row: PlanRow,
266
+ chosen: readonly string[] | undefined,
267
+ ): boolean =>
268
+ row.action !== "skip" &&
269
+ (chosen === undefined
270
+ ? row.selected
271
+ : chosen.includes(rowKey(row.band, row.target)));
195
272
 
196
273
  /**
197
- * The steps worth OFFERING, given detection AND the scope selection. An
198
- * undetectable step is omitted so the run-all degrades gracefully instead of
199
- * throwing a mid-wizard EMPTY_RESULTS; a step whose band the scope does not run
200
- * is omitted too (completions/lsp are global-band, skills are project-band, MCP
201
- * spans both via its resolved groups). Threading `scope` here is what makes
202
- * `setup --local` skip completions+lsp and `setup --global` skip skills — the
203
- * MCP groups are already scoped by {@link detectMcp}.
274
+ * What a row DID, as a past-tense word. The row's detail says what and where;
275
+ * the note says what happened to it, so a progress line and a recap line read
276
+ * as sentences rather than as two halves of one.
277
+ */
278
+ const ACTION_NOTES: Record<string, string> = {
279
+ install: "installed",
280
+ update: "updated",
281
+ link: "linked",
282
+ remove: "removed",
283
+ };
284
+
285
+ /**
286
+ * The `2 added, 1 updated` note a row's children produce — counted over the
287
+ * children the run KEPT, not the ones it was offered.
288
+ *
289
+ * `kept` is the row's own child answer: the MCP files, or the LSP editors, the
290
+ * wizard narrowed to. Counting the plan's children instead recapped `2 added`
291
+ * for a run the user had just narrowed to one file, so the plan and the result
292
+ * described different work. Absent (`undefined`) means the narrowing prompt was
293
+ * never answered, which is the same thing the compose bodies read as "all".
204
294
  *
205
- * @param detected - Every step's up-front detection.
206
- * @param scope - The resolved `--scope` selection (project/global/both).
207
- * @returns The offerable steps, in composition/display order.
295
+ * @param row - The plan row.
296
+ * @param kept - The child keys the run retained, or `undefined` for all.
297
+ * @returns The counts note, or `undefined` when the row has no children.
208
298
  */
209
- function listAvailableSteps(
210
- detected: SetupDetection,
211
- scope: ScopeSelection,
212
- ): { label: string; value: StepId }[] {
213
- const hasProject = scope !== "global";
214
- const hasGlobal = scope !== "project";
215
- const choices: { label: string; value: StepId }[] = [];
216
- if (detected.completions.shell && hasGlobal) {
217
- choices.push({
218
- label: `Shell completions (${detected.completions.shell})`,
219
- value: "completions",
220
- });
221
- }
222
- if (hasGlobal) {
223
- choices.push({ label: "Terrazzo LSP extension", value: "lsp" });
224
- }
225
- if (detected.mcp.groups.length > 0) {
226
- choices.push({
227
- label: `MCP config (${detected.mcp.groups.length} file(s))`,
228
- value: "mcp",
229
- });
230
- }
231
- if (detected.skills.available && hasProject) {
232
- choices.push({
233
- label: `Link skills (${detected.skills.skillCount})`,
234
- value: "skills",
235
- });
236
- }
237
- return choices;
299
+ function childNote(
300
+ row: PlanRow,
301
+ kept: readonly string[] | undefined,
302
+ ): string | undefined {
303
+ const children = (row.children ?? []).filter(
304
+ (child) => kept === undefined || kept.includes(child.key),
305
+ );
306
+ if (children.length === 0) return undefined;
307
+ const count = (action: string): number =>
308
+ children.filter((child) => child.action === action).length;
309
+ const parts = [
310
+ count("add") > 0 ? `${count("add")} added` : "",
311
+ count("update") > 0 ? `${count("update")} updated` : "",
312
+ count("unchanged") > 0 ? `${count("unchanged")} unchanged` : "",
313
+ ].filter((part) => part.length > 0);
314
+ return parts.length > 0 ? parts.join(", ") : undefined;
238
315
  }
239
316
 
240
- // =============================================================================
241
- // Plan builders
242
- // =============================================================================
243
-
244
317
  /**
245
- * The run-all self-verb: a step multiselect + per-step composition. The resolved
246
- * `scope` narrows BOTH the offered steps (via {@link listAvailableSteps}) and the
247
- * MCP target groups (already scoped by {@link detectMcp}), so `--local` omits the
248
- * global-band completions+lsp and `--global` omits the project-band skills.
318
+ * Build one invocation: detect, plan, synthesize the generator, and expose the
319
+ * projection back onto the plan.
320
+ *
321
+ * @param rt - The per-invocation runtime.
322
+ * @param mode - The entry point: the run-all, or one target.
323
+ * @param scope - The resolved band selection.
324
+ * @param removal - Compose the removal (`--undo`) instead of the install.
325
+ * @returns The plan, the generator, and the answers-to-plan projection.
326
+ * @note Impure — runs every selected target's real detection.
249
327
  */
250
- function buildRunAllPlan(
328
+ export async function buildSetupRun(
251
329
  rt: PragmaRuntime,
252
- detected: SetupDetection,
330
+ mode: SetupMode,
253
331
  scope: ScopeSelection,
254
- ): SetupPlan {
255
- const steps = listAvailableSteps(detected, scope);
256
- const prompts: PromptDefinition[] = [
257
- {
258
- name: "steps",
259
- type: "multiselect",
260
- message: "Which steps would you like to run?",
261
- choices: steps,
262
- default: steps.map((c) => c.value), // --yes / non-TTY ⇒ every step
263
- },
264
- ];
265
- // Item 6: per-file narrowing is opt-in. The "customize?" gate (default false)
266
- // only surfaces when MCP is chosen and there is more than one file; the
267
- // per-file multiselect only surfaces after an explicit yes — so the "all"
268
- // default configures every deduped file without an extra question.
269
- if (detected.mcp.groups.length > 0) {
270
- prompts.push(
271
- buildCustomizePrompt((a) => readSteps(a).includes("mcp")),
272
- buildMcpTargetsPrompt(
273
- detected.mcp,
274
- (a) => a.customize === true && readSteps(a).includes("mcp"),
275
- ),
276
- );
332
+ removal = false,
333
+ ): Promise<SetupRun> {
334
+ const ids: TargetId[] = mode === "all" ? [...TARGET_IDS] : [mode as TargetId];
335
+ const roots = await resolveRoots(rt);
336
+ const detected = await detectTargets(rt, ids, scope);
337
+ const plan = buildPlan(scope, roots, detected, ids, removal);
338
+ const sink = new OutcomeSink();
339
+
340
+ const prompts: PromptDefinition[] = [];
341
+ if (mode === "all") prompts.push(buildRowsPrompt(plan));
342
+ // A target is worth narrowing only when it has more than one child to choose
343
+ // between. `mcp` offers its config files; `lsp` offers the editors on PATH —
344
+ // a machine with several VS Code forks should not have the extension pushed
345
+ // into all of them just because they are installed.
346
+ const narrowable = (
347
+ [
348
+ ["mcp", "Configure MCP for which files?"],
349
+ ["lsp", "Install the extension into which editors?"],
350
+ ] as const
351
+ ).filter(([target]) => !removal && childrenOf(plan, target).length > 1);
352
+
353
+ if (narrowable.length > 0) {
354
+ const anyChosen = (answers: Record<string, unknown>): boolean => {
355
+ const chosen = readList(answers, ROWS_ANSWER);
356
+ return narrowable.some(([target]) =>
357
+ plan.rows.some((row) => row.target === target && isChosen(row, chosen)),
358
+ );
359
+ };
360
+ prompts.push(buildCustomizePrompt(anyChosen));
361
+ for (const [target, message] of narrowable) {
362
+ const rowChosen = (answers: Record<string, unknown>): boolean => {
363
+ const chosen = readList(answers, ROWS_ANSWER);
364
+ return plan.rows.some(
365
+ (row) => row.target === target && isChosen(row, chosen),
366
+ );
367
+ };
368
+ prompts.push(
369
+ buildChildPrompt(
370
+ plan,
371
+ target,
372
+ message,
373
+ (answers) => answers.customize === true && rowChosen(answers),
374
+ ),
375
+ );
376
+ }
277
377
  }
278
378
 
279
- // `generate` MUST be pure and re-runnable — `execute` interprets it twice (the
280
- // confirm-gate preview + the build) — so it composes with `when`/`sequence_`
281
- // (immutable) rather than a single-use `gen`, and does NO detection (all real
282
- // reads already happened up front). Composing an unchosen step is harmless:
283
- // `when(false, …)` discards the (side-effect-free) task it was handed.
379
+ /** The detection behind a row, for composing and for re-reading its draft. */
380
+ const detectionFor = (row: PlanRow): DetectedRow | undefined =>
381
+ detected.find((d) => d.target.id === row.target && d.band === row.band);
382
+
284
383
  const generator: GeneratorDefinition = {
285
- meta: buildMeta(rt, "pragma setup"),
384
+ meta: buildMeta(
385
+ rt,
386
+ mode === "all" ? `${BIN_NAME} setup` : `${BIN_NAME} setup ${mode}`,
387
+ ),
286
388
  prompts,
287
389
  generate: (answers) => {
288
- const chosen = readSteps(answers);
289
- return sequence_([
290
- when(
291
- chosen.includes("completions"),
292
- composeCompletions(detected.completions),
293
- ),
294
- when(chosen.includes("lsp"), composeGuardedLsp(rt, detected.lsp.state)),
295
- when(
296
- chosen.includes("mcp"),
297
- composeMcp(detected.mcp, selectChosenGroups(detected.mcp, answers)),
298
- ),
299
- when(chosen.includes("skills"), composeSkills(detected.skills)),
300
- ]);
390
+ const chosen = readList(answers, ROWS_ANSWER);
391
+ const tasks = plan.rows.flatMap((row) => {
392
+ if (!isChosen(row, chosen)) return [];
393
+ const hit = detectionFor(row);
394
+ if (hit === undefined) return [];
395
+ // Each target reads ITS OWN child answer. One shared list was handing
396
+ // MCP file paths to every other target's compose.
397
+ const key = CHILD_ANSWER[row.target];
398
+ const children = key === undefined ? undefined : readList(answers, key);
399
+ const task = removal
400
+ ? hit.target.composeRemoval(hit.detection)
401
+ : hit.target.compose(hit.detection, children);
402
+ return [{ key: rowKey(row.band, row.target), task }];
403
+ });
404
+ return runRowsIsolated(sink, tasks);
301
405
  },
302
406
  };
303
407
 
304
- return {
305
- generator,
306
- toResult: (answers) => ({ kind: "all", steps: readSteps(answers) }),
307
- };
308
- }
309
-
310
- /** A single-step generator (no run-all multiselect) for one sub-verb. */
311
- function buildSingleStep(
312
- rt: PragmaRuntime,
313
- title: string,
314
- prompts: PromptDefinition[],
315
- generate: (answers: Record<string, unknown>) => Task<void>,
316
- ): GeneratorDefinition {
317
- return { meta: buildMeta(rt, title), prompts, generate };
318
- }
319
-
320
- /**
321
- * Build the plan for an entry point. Detection runs here (up front); the
322
- * returned generator's `generate` is pure. The `skills` sub-verb throws
323
- * EMPTY_RESULTS before returning a plan when nothing is discoverable (its direct
324
- * contract), whereas the run-all simply omits an undetectable step.
325
- *
326
- * @param rt - The per-invocation runtime.
327
- * @param mode - The entry point (`all` or one sub-verb).
328
- * @param scope - The resolved `--scope` selection (project/global/both).
329
- * @returns The generator + result mapper.
330
- * @throws PragmaError EMPTY_RESULTS for a direct `setup skills` with no skills.
331
- * @note Impure — performs each step's real detection.
332
- */
333
- export async function buildSetupPlan(
334
- rt: PragmaRuntime,
335
- mode: SetupMode,
336
- scope: ScopeSelection,
337
- ): Promise<SetupPlan> {
338
- switch (mode) {
339
- case "all":
340
- return buildRunAllPlan(rt, await gatherDetection(rt, scope), scope);
341
-
342
- case "completions": {
343
- const d = await detectCompletions(rt.cwd);
408
+ /** The outcome one row ended in, read off the sink and its own draft. */
409
+ const outcomeFor = (
410
+ row: PlanRow,
411
+ chosen: readonly string[] | undefined,
412
+ answers: Record<string, unknown>,
413
+ ): PlanOutcome | undefined => {
414
+ const hit = detectionFor(row);
415
+ // A row whose DETECTION threw has no draft to read and nothing to compose,
416
+ // and it is not a skip: the target was requested and did not happen. It
417
+ // reports `failed` with its own cause, exactly as a failed compose does, so
418
+ // the run names it instead of reporting a clean sweep over its siblings.
419
+ const failure = hit === undefined ? undefined : detectionFailure(hit);
420
+ if (failure !== undefined) return { status: "failed", note: failure };
421
+ const draft = hit === undefined ? undefined : draftFor(hit, roots, removal);
422
+ if (row.action === "skip") {
344
423
  return {
345
- generator: buildSingleStep(rt, "pragma setup completions", [], () =>
346
- composeCompletions(d),
347
- ),
348
- toResult: () => ({
349
- kind: "completions",
350
- shell: d.shell,
351
- path: d.path,
352
- installed: d.shell !== null,
353
- state: d.state,
354
- }),
424
+ status: "skipped",
425
+ ...(draft?.remedy === undefined ? {} : { remedy: draft.remedy }),
355
426
  };
356
427
  }
357
-
358
- case "lsp": {
359
- const d = await detectLsp(rt.cwd);
428
+ // An already-current row reports `noop` whether or not it was selected. It
429
+ // is offered DE-selected (there is nothing to do to it), and returning no
430
+ // outcome at all left a converged re-run with a plan-shaped output that
431
+ // claimed nothing had run — while the row still rendered a bare green ✓.
432
+ // Convergence is a real result: one quiet line per row, zero writes.
433
+ if (row.action === "none") return { status: "noop", note: "unchanged" };
434
+ if (!isChosen(row, chosen)) return undefined;
435
+ const error = sink.get(rowKey(row.band, row.target));
436
+ if (error !== undefined) {
437
+ const pragma = rowPragmaError(error);
360
438
  return {
361
- generator: buildSingleStep(rt, "pragma setup lsp", [], () =>
362
- composeGuardedLsp(rt, d.state),
363
- ),
364
- toResult: () => ({ kind: "lsp", state: d.state }),
439
+ status: "failed",
440
+ note: pragma.message,
441
+ ...(pragma.recovery?.message === undefined
442
+ ? {}
443
+ : { remedy: pragma.recovery.message }),
365
444
  };
366
445
  }
446
+ if (!isActionable(row.action)) return { status: "noop" };
447
+ // A removal never borrows the forward child summary: its children are the
448
+ // files the entry is being taken OUT of, and counting them as "1 updated"
449
+ // described the opposite of what the run had just done.
450
+ const childKey = CHILD_ANSWER[row.target];
451
+ const kept =
452
+ childKey === undefined ? undefined : readList(answers, childKey);
453
+ const note = removal
454
+ ? ACTION_NOTES[row.action]
455
+ : (childNote(row, kept) ?? ACTION_NOTES[row.action]);
456
+ return {
457
+ status: removal ? "removed" : "done",
458
+ ...(note === undefined ? {} : { note }),
459
+ };
460
+ };
367
461
 
368
- case "mcp": {
369
- const d = await detectMcp(rt, scope);
370
- const prompts: PromptDefinition[] =
371
- d.groups.length > 0
372
- ? [
373
- buildCustomizePrompt(),
374
- buildMcpTargetsPrompt(d, (a) => a.customize === true),
375
- ]
376
- : [];
377
- return {
378
- generator: buildSingleStep(rt, "pragma setup mcp", prompts, (answers) =>
379
- composeMcp(d, selectChosenGroups(d, answers)),
380
- ),
381
- toResult: (answers) => {
382
- const sel = selectChosenGroups(d, answers);
462
+ return {
463
+ plan,
464
+ generator,
465
+ applied: (answers) => {
466
+ const chosen = readList(answers, ROWS_ANSWER);
467
+ return withRows(
468
+ plan,
469
+ plan.rows.map((row): PlanRow => {
470
+ const outcome = outcomeFor(row, chosen, answers);
383
471
  return {
384
- kind: "mcp",
385
- configured: mcpConfigured(sel),
386
- targets: mcpTargets(d, sel),
472
+ ...row,
473
+ selected: isChosen(row, chosen),
474
+ ...(outcome === undefined ? {} : { outcome }),
387
475
  };
388
- },
389
- };
390
- }
391
-
392
- case "skills": {
393
- const d = await detectSkills(rt);
394
- if (!d.available) throw skillsEmptyError();
395
- return {
396
- generator: buildSingleStep(rt, "pragma setup skills", [], () =>
397
- composeSkills(d),
398
- ),
399
- toResult: () => ({ kind: "skills", result: toSkillsResult(d) }),
400
- };
401
- }
402
- }
476
+ }),
477
+ );
478
+ },
479
+ };
403
480
  }