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