@canonical/pragma-cli 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (798) hide show
  1. package/README.md +153 -30
  2. package/dist/.build-ok +0 -0
  3. package/dist/package.json +83 -0
  4. package/dist/pragma.conf.js +814 -0
  5. package/dist/pragma.conf.js.map +1 -0
  6. package/dist/src/bin.js +356 -0
  7. package/dist/src/bin.js.map +1 -0
  8. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  9. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  10. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  11. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  12. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  13. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  14. package/dist/src/capabilities/capabilities/hints.js +195 -0
  15. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  16. package/dist/src/capabilities/capabilities/index.js +11 -0
  17. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/types.js +11 -0
  19. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  20. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  21. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  22. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  23. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  24. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  25. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  26. package/dist/src/capabilities/colophon/index.js +5 -0
  27. package/dist/src/capabilities/colophon/index.js.map +1 -0
  28. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  29. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  30. package/dist/src/capabilities/colophon/types.js +10 -0
  31. package/dist/src/capabilities/colophon/types.js.map +1 -0
  32. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  33. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  34. package/dist/src/capabilities/config/field.render.js +22 -0
  35. package/dist/src/capabilities/config/field.render.js.map +1 -0
  36. package/dist/src/capabilities/config/fields.js +46 -0
  37. package/dist/src/capabilities/config/fields.js.map +1 -0
  38. package/dist/src/capabilities/config/get.verb.js +61 -0
  39. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  40. package/dist/src/capabilities/config/index.js +5 -0
  41. package/dist/src/capabilities/config/index.js.map +1 -0
  42. package/dist/src/capabilities/config/runField.js +59 -0
  43. package/dist/src/capabilities/config/runField.js.map +1 -0
  44. package/dist/src/capabilities/config/runGet.js +28 -0
  45. package/dist/src/capabilities/config/runGet.js.map +1 -0
  46. package/dist/src/capabilities/config/runSet.js +53 -0
  47. package/dist/src/capabilities/config/runSet.js.map +1 -0
  48. package/dist/src/capabilities/config/set.verb.js +66 -0
  49. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/show.render.js +84 -0
  51. package/dist/src/capabilities/config/show.render.js.map +1 -0
  52. package/dist/src/capabilities/config/show.verb.js +44 -0
  53. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  54. package/dist/src/capabilities/config/types.js +5 -0
  55. package/dist/src/capabilities/config/types.js.map +1 -0
  56. package/dist/src/capabilities/config/unset.verb.js +49 -0
  57. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  58. package/dist/src/capabilities/create/cliProjection.js +195 -0
  59. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  60. package/dist/src/capabilities/create/constants.js +47 -0
  61. package/dist/src/capabilities/create/constants.js.map +1 -0
  62. package/dist/src/capabilities/create/create.render.js +100 -0
  63. package/dist/src/capabilities/create/create.render.js.map +1 -0
  64. package/dist/src/capabilities/create/create.verb.js +438 -0
  65. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  66. package/dist/src/capabilities/create/createHelp.js +47 -0
  67. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  68. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  69. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  70. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  71. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  72. package/dist/src/capabilities/create/index.js +18 -0
  73. package/dist/src/capabilities/create/index.js.map +1 -0
  74. package/dist/src/capabilities/create/messages.js +16 -0
  75. package/dist/src/capabilities/create/messages.js.map +1 -0
  76. package/dist/src/capabilities/create/mount.js +293 -0
  77. package/dist/src/capabilities/create/mount.js.map +1 -0
  78. package/dist/src/capabilities/create/pathJail.js +65 -0
  79. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  80. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  81. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  82. package/dist/src/capabilities/create/types.js +2 -0
  83. package/dist/src/capabilities/create/types.js.map +1 -0
  84. package/dist/src/capabilities/distribution.js +40 -0
  85. package/dist/src/capabilities/distribution.js.map +1 -0
  86. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  87. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  88. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  89. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  90. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
  91. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  92. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  93. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  94. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  95. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  97. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  99. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
  101. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  102. package/dist/src/capabilities/doctor/doctor.render.js +185 -0
  103. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  104. package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
  105. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  106. package/dist/src/capabilities/doctor/index.js +5 -0
  107. package/dist/src/capabilities/doctor/index.js.map +1 -0
  108. package/dist/src/capabilities/doctor/runChecks.js +83 -0
  109. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  110. package/dist/src/capabilities/doctor/types.js +5 -0
  111. package/dist/src/capabilities/doctor/types.js.map +1 -0
  112. package/dist/src/capabilities/graph/index.js +19 -0
  113. package/dist/src/capabilities/graph/index.js.map +1 -0
  114. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  115. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  116. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  117. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  118. package/dist/src/capabilities/graph/query.render.js +73 -0
  119. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  120. package/dist/src/capabilities/graph/query.verb.js +49 -0
  121. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  122. package/dist/src/capabilities/graph/runQuery.js +41 -0
  123. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  124. package/dist/src/capabilities/index.js +56 -0
  125. package/dist/src/capabilities/index.js.map +1 -0
  126. package/dist/src/capabilities/info/collectInfo.js +66 -0
  127. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  128. package/dist/src/capabilities/info/index.js +5 -0
  129. package/dist/src/capabilities/info/index.js.map +1 -0
  130. package/dist/src/capabilities/info/info.render.js +53 -0
  131. package/dist/src/capabilities/info/info.render.js.map +1 -0
  132. package/dist/src/capabilities/info/info.verb.js +42 -0
  133. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  134. package/dist/src/capabilities/info/types.js +5 -0
  135. package/dist/src/capabilities/info/types.js.map +1 -0
  136. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  137. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  138. package/dist/src/capabilities/meta/index.js +13 -0
  139. package/dist/src/capabilities/meta/index.js.map +1 -0
  140. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  141. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  142. package/dist/src/capabilities/ontology/index.js +21 -0
  143. package/dist/src/capabilities/ontology/index.js.map +1 -0
  144. package/dist/src/capabilities/ontology/queries.js +123 -0
  145. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  146. package/dist/src/capabilities/ontology/render.js +66 -0
  147. package/dist/src/capabilities/ontology/render.js.map +1 -0
  148. package/dist/src/capabilities/ontology/verbs.js +181 -0
  149. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  150. package/dist/src/capabilities/prompt/index.js +16 -0
  151. package/dist/src/capabilities/prompt/index.js.map +1 -0
  152. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  153. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  154. package/dist/src/capabilities/prompt/types.js +10 -0
  155. package/dist/src/capabilities/prompt/types.js.map +1 -0
  156. package/dist/src/capabilities/prompt/verbs.js +93 -0
  157. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  158. package/dist/src/capabilities/resources/index.js +10 -0
  159. package/dist/src/capabilities/resources/index.js.map +1 -0
  160. package/dist/src/capabilities/resources/provider.js +423 -0
  161. package/dist/src/capabilities/resources/provider.js.map +1 -0
  162. package/dist/src/capabilities/setup/buildPlan.js +168 -0
  163. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  164. package/dist/src/capabilities/setup/index.js +5 -0
  165. package/dist/src/capabilities/setup/index.js.map +1 -0
  166. package/dist/src/capabilities/setup/mode.js +53 -0
  167. package/dist/src/capabilities/setup/mode.js.map +1 -0
  168. package/dist/src/capabilities/setup/operations/index.js +39 -0
  169. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  170. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  171. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  172. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  173. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  174. package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
  175. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  176. package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
  177. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  178. package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
  179. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
  181. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  182. package/dist/src/capabilities/setup/plan.js +128 -0
  183. package/dist/src/capabilities/setup/plan.js.map +1 -0
  184. package/dist/src/capabilities/setup/plan.render.js +193 -0
  185. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  186. package/dist/src/capabilities/setup/setup.render.js +54 -0
  187. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  188. package/dist/src/capabilities/setup/setup.verb.js +334 -0
  189. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  190. package/dist/src/capabilities/setup/shell.js +196 -0
  191. package/dist/src/capabilities/setup/shell.js.map +1 -0
  192. package/dist/src/capabilities/setup/targets.js +263 -0
  193. package/dist/src/capabilities/setup/targets.js.map +1 -0
  194. package/dist/src/capabilities/setup/types.js +5 -0
  195. package/dist/src/capabilities/setup/types.js.map +1 -0
  196. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  197. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  198. package/dist/src/capabilities/shared/bands.js +16 -0
  199. package/dist/src/capabilities/shared/bands.js.map +1 -0
  200. package/dist/src/capabilities/shared/index.js +26 -0
  201. package/dist/src/capabilities/shared/index.js.map +1 -0
  202. package/dist/src/capabilities/shared/packageManager.js +103 -0
  203. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  204. package/dist/src/capabilities/shared/registry.js +55 -0
  205. package/dist/src/capabilities/shared/registry.js.map +1 -0
  206. package/dist/src/capabilities/skill/discover.js +195 -0
  207. package/dist/src/capabilities/skill/discover.js.map +1 -0
  208. package/dist/src/capabilities/skill/index.js +10 -0
  209. package/dist/src/capabilities/skill/index.js.map +1 -0
  210. package/dist/src/capabilities/skill/render.js +49 -0
  211. package/dist/src/capabilities/skill/render.js.map +1 -0
  212. package/dist/src/capabilities/skill/verbs.js +83 -0
  213. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  214. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  215. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  216. package/dist/src/capabilities/sources/index.js +13 -0
  217. package/dist/src/capabilities/sources/index.js.map +1 -0
  218. package/dist/src/capabilities/sources/installSkills.js +167 -0
  219. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  220. package/dist/src/capabilities/sources/runUpdate.js +394 -0
  221. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  222. package/dist/src/capabilities/sources/status.render.js +64 -0
  223. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  224. package/dist/src/capabilities/sources/status.verb.js +40 -0
  225. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  226. package/dist/src/capabilities/sources/types.js +6 -0
  227. package/dist/src/capabilities/sources/types.js.map +1 -0
  228. package/dist/src/capabilities/sources/update.render.js +34 -0
  229. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  230. package/dist/src/capabilities/sources/update.verb.js +55 -0
  231. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  232. package/dist/src/capabilities/upgrade/index.js +5 -0
  233. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  234. package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
  235. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  236. package/dist/src/capabilities/upgrade/types.js +5 -0
  237. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  238. package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
  239. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  240. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  241. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  242. package/dist/src/capabilities/version/index.js +10 -0
  243. package/dist/src/capabilities/version/index.js.map +1 -0
  244. package/dist/src/capabilities/version/version.verb.js +36 -0
  245. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  246. package/dist/src/constants.js +82 -0
  247. package/dist/src/constants.js.map +1 -0
  248. package/dist/src/index.js +12 -0
  249. package/dist/src/index.js.map +1 -0
  250. package/dist/src/kernel/completion/complete.js +66 -0
  251. package/dist/src/kernel/completion/complete.js.map +1 -0
  252. package/dist/src/kernel/completion/emitScripts.js +92 -0
  253. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  254. package/dist/src/kernel/completion/entitySource.js +285 -0
  255. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  256. package/dist/src/kernel/completion/index.js +14 -0
  257. package/dist/src/kernel/completion/index.js.map +1 -0
  258. package/dist/src/kernel/completion/model.js +301 -0
  259. package/dist/src/kernel/completion/model.js.map +1 -0
  260. package/dist/src/kernel/completion/parse.js +253 -0
  261. package/dist/src/kernel/completion/parse.js.map +1 -0
  262. package/dist/src/kernel/completion/rank.js +101 -0
  263. package/dist/src/kernel/completion/rank.js.map +1 -0
  264. package/dist/src/kernel/completion/resolve.js +100 -0
  265. package/dist/src/kernel/completion/resolve.js.map +1 -0
  266. package/dist/src/kernel/completion/templates/bash.js +209 -0
  267. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  268. package/dist/src/kernel/completion/templates/fish.js +214 -0
  269. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  270. package/dist/src/kernel/completion/templates/index.js +23 -0
  271. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  272. package/dist/src/kernel/completion/templates/shared.js +98 -0
  273. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  274. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  275. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  276. package/dist/src/kernel/completion/types.js +13 -0
  277. package/dist/src/kernel/completion/types.js.map +1 -0
  278. package/dist/src/kernel/config/defaults.js +17 -0
  279. package/dist/src/kernel/config/defaults.js.map +1 -0
  280. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  281. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  282. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  283. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  284. package/dist/src/kernel/config/firstRun.js +34 -0
  285. package/dist/src/kernel/config/firstRun.js.map +1 -0
  286. package/dist/src/kernel/config/globalConfig.js +79 -0
  287. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  288. package/dist/src/kernel/config/index.js +16 -0
  289. package/dist/src/kernel/config/index.js.map +1 -0
  290. package/dist/src/kernel/config/paths.js +35 -0
  291. package/dist/src/kernel/config/paths.js.map +1 -0
  292. package/dist/src/kernel/config/readConfig.js +78 -0
  293. package/dist/src/kernel/config/readConfig.js.map +1 -0
  294. package/dist/src/kernel/config/schema.js +130 -0
  295. package/dist/src/kernel/config/schema.js.map +1 -0
  296. package/dist/src/kernel/config/types.js +19 -0
  297. package/dist/src/kernel/config/types.js.map +1 -0
  298. package/dist/src/kernel/config/writeConfigField.js +59 -0
  299. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  300. package/dist/src/kernel/copy.js +43 -0
  301. package/dist/src/kernel/copy.js.map +1 -0
  302. package/dist/src/kernel/error/PragmaError.js +149 -0
  303. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  304. package/dist/src/kernel/error/constants.js +40 -0
  305. package/dist/src/kernel/error/constants.js.map +1 -0
  306. package/dist/src/kernel/error/fromTaskError.js +96 -0
  307. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  308. package/dist/src/kernel/error/index.js +13 -0
  309. package/dist/src/kernel/error/index.js.map +1 -0
  310. package/dist/src/kernel/error/recovery.js +52 -0
  311. package/dist/src/kernel/error/recovery.js.map +1 -0
  312. package/dist/src/kernel/error/renderError.js +115 -0
  313. package/dist/src/kernel/error/renderError.js.map +1 -0
  314. package/dist/src/kernel/error/serialize.js +25 -0
  315. package/dist/src/kernel/error/serialize.js.map +1 -0
  316. package/dist/src/kernel/error/types.js +9 -0
  317. package/dist/src/kernel/error/types.js.map +1 -0
  318. package/dist/src/kernel/index.js +25 -0
  319. package/dist/src/kernel/index.js.map +1 -0
  320. package/dist/src/kernel/packs/collect.js +187 -0
  321. package/dist/src/kernel/packs/collect.js.map +1 -0
  322. package/dist/src/kernel/packs/compile.js +304 -0
  323. package/dist/src/kernel/packs/compile.js.map +1 -0
  324. package/dist/src/kernel/packs/disclosure.js +76 -0
  325. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  326. package/dist/src/kernel/packs/glob.js +38 -0
  327. package/dist/src/kernel/packs/glob.js.map +1 -0
  328. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  329. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  330. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  331. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  332. package/dist/src/kernel/packs/graphql/index.js +20 -0
  333. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  334. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  335. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  336. package/dist/src/kernel/packs/index.js +34 -0
  337. package/dist/src/kernel/packs/index.js.map +1 -0
  338. package/dist/src/kernel/packs/iri.js +110 -0
  339. package/dist/src/kernel/packs/iri.js.map +1 -0
  340. package/dist/src/kernel/packs/renderPack.js +129 -0
  341. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  342. package/dist/src/kernel/packs/resolveEntity.js +223 -0
  343. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  344. package/dist/src/kernel/packs/runBodies.js +87 -0
  345. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  346. package/dist/src/kernel/packs/sample.js +56 -0
  347. package/dist/src/kernel/packs/sample.js.map +1 -0
  348. package/dist/src/kernel/packs/schema.js +369 -0
  349. package/dist/src/kernel/packs/schema.js.map +1 -0
  350. package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
  351. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  352. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  353. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  354. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
  355. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  356. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  357. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  358. package/dist/src/kernel/packs/sparql/index.js +31 -0
  359. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  360. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  361. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  362. package/dist/src/kernel/packs/types.js +30 -0
  363. package/dist/src/kernel/packs/types.js.map +1 -0
  364. package/dist/src/kernel/packs/uniqueness.js +30 -0
  365. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  366. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  367. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  368. package/dist/src/kernel/project/cli/constants.js +27 -0
  369. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  370. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  371. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  372. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  373. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  374. package/dist/src/kernel/project/cli/globalFlags.js +216 -0
  375. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  376. package/dist/src/kernel/project/cli/helpFormat.js +59 -0
  377. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  378. package/dist/src/kernel/project/cli/index.js +14 -0
  379. package/dist/src/kernel/project/cli/index.js.map +1 -0
  380. package/dist/src/kernel/project/cli/rootHelp.js +197 -0
  381. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  382. package/dist/src/kernel/project/cli/suggest.js +75 -0
  383. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  384. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  385. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  386. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  387. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  388. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  389. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  390. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  391. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  392. package/dist/src/kernel/project/mcp/index.js +8 -0
  393. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  394. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  395. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  396. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  397. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  398. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  399. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  401. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  403. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
  405. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/serve.js +35 -0
  407. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  408. package/dist/src/kernel/render/compactUri.js +24 -0
  409. package/dist/src/kernel/render/compactUri.js.map +1 -0
  410. package/dist/src/kernel/render/contracts.js +10 -0
  411. package/dist/src/kernel/render/contracts.js.map +1 -0
  412. package/dist/src/kernel/render/disclosure.js +34 -0
  413. package/dist/src/kernel/render/disclosure.js.map +1 -0
  414. package/dist/src/kernel/render/envelope.js +30 -0
  415. package/dist/src/kernel/render/envelope.js.map +1 -0
  416. package/dist/src/kernel/render/formatters.js +27 -0
  417. package/dist/src/kernel/render/formatters.js.map +1 -0
  418. package/dist/src/kernel/render/index.js +15 -0
  419. package/dist/src/kernel/render/index.js.map +1 -0
  420. package/dist/src/kernel/render/prefixes.js +46 -0
  421. package/dist/src/kernel/render/prefixes.js.map +1 -0
  422. package/dist/src/kernel/render/renderers.js +468 -0
  423. package/dist/src/kernel/render/renderers.js.map +1 -0
  424. package/dist/src/kernel/render/style.js +85 -0
  425. package/dist/src/kernel/render/style.js.map +1 -0
  426. package/dist/src/kernel/render/turtle.js +194 -0
  427. package/dist/src/kernel/render/turtle.js.map +1 -0
  428. package/dist/src/kernel/render/writeStdout.js +43 -0
  429. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  430. package/dist/src/kernel/runtime/boot.js +49 -0
  431. package/dist/src/kernel/runtime/boot.js.map +1 -0
  432. package/dist/src/kernel/runtime/facade.js +39 -0
  433. package/dist/src/kernel/runtime/facade.js.map +1 -0
  434. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  435. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  436. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  437. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  438. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  439. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  440. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  441. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  442. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  443. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  444. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  445. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  446. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  447. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  449. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  451. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  453. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  455. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  457. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  459. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  460. package/dist/src/kernel/runtime/index.js +8 -0
  461. package/dist/src/kernel/runtime/index.js.map +1 -0
  462. package/dist/src/kernel/runtime/loadSession.js +34 -0
  463. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  464. package/dist/src/kernel/runtime/paths.js +78 -0
  465. package/dist/src/kernel/runtime/paths.js.map +1 -0
  466. package/dist/src/kernel/runtime/probe.js +37 -0
  467. package/dist/src/kernel/runtime/probe.js.map +1 -0
  468. package/dist/src/kernel/runtime/readEntity.js +363 -0
  469. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  470. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  471. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  472. package/dist/src/kernel/runtime/refs/index.js +29 -0
  473. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  474. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  475. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  476. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  477. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  478. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  479. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  480. package/dist/src/kernel/runtime/store.js +75 -0
  481. package/dist/src/kernel/runtime/store.js.map +1 -0
  482. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  483. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  484. package/dist/src/kernel/runtime/types.js +11 -0
  485. package/dist/src/kernel/runtime/types.js.map +1 -0
  486. package/dist/src/kernel/spec/asVerb.js +21 -0
  487. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  488. package/dist/src/kernel/spec/emitReference.js +578 -0
  489. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  490. package/dist/src/kernel/spec/emitSurface.js +202 -0
  491. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  492. package/dist/src/kernel/spec/index.js +11 -0
  493. package/dist/src/kernel/spec/index.js.map +1 -0
  494. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  495. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  496. package/dist/src/kernel/spec/types.js +14 -0
  497. package/dist/src/kernel/spec/types.js.map +1 -0
  498. package/dist/src/kernel/spec/validate.js +110 -0
  499. package/dist/src/kernel/spec/validate.js.map +1 -0
  500. package/dist/src/kernel/vocabulary.js +97 -0
  501. package/dist/src/kernel/vocabulary.js.map +1 -0
  502. package/dist/src/types.js +11 -0
  503. package/dist/src/types.js.map +1 -0
  504. package/package.json +20 -22
  505. package/pragma.conf.ts +249 -60
  506. package/src/bin.ts +267 -82
  507. package/src/capabilities/block.parity.test.ts +6 -3
  508. package/src/capabilities/capabilities/capabilities.render.ts +1 -1
  509. package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
  510. package/src/capabilities/capabilities/catalog.ts +3 -3
  511. package/src/capabilities/capabilities/hints.ts +32 -7
  512. package/src/capabilities/capabilities/index.ts +1 -1
  513. package/src/capabilities/colophon/collectColophon.ts +35 -24
  514. package/src/capabilities/colophon/colophon.render.ts +25 -1
  515. package/src/capabilities/colophon/colophon.test.ts +42 -21
  516. package/src/capabilities/colophon/colophon.verb.ts +4 -4
  517. package/src/capabilities/config/collectConfigShow.test.ts +1 -0
  518. package/src/capabilities/config/collectConfigShow.ts +3 -3
  519. package/src/capabilities/config/field.render.ts +4 -5
  520. package/src/capabilities/config/fields.ts +17 -10
  521. package/src/capabilities/config/get.verb.ts +70 -0
  522. package/src/capabilities/config/getUnset.test.ts +264 -0
  523. package/src/capabilities/config/index.ts +5 -1
  524. package/src/capabilities/config/runField.ts +40 -22
  525. package/src/capabilities/config/runGet.ts +34 -0
  526. package/src/capabilities/config/runSet.ts +35 -9
  527. package/src/capabilities/config/set.test.ts +48 -14
  528. package/src/capabilities/config/set.verb.ts +8 -7
  529. package/src/capabilities/config/show.render.ts +1 -1
  530. package/src/capabilities/config/show.verb.ts +9 -6
  531. package/src/capabilities/config/types.ts +18 -4
  532. package/src/capabilities/config/unset.verb.ts +58 -0
  533. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  534. package/src/capabilities/create/byteEquality.test.ts +25 -11
  535. package/src/capabilities/create/cliProjection.ts +227 -0
  536. package/src/capabilities/create/constants.ts +36 -61
  537. package/src/capabilities/create/create.mcp.test.ts +89 -5
  538. package/src/capabilities/create/create.render.ts +71 -7
  539. package/src/capabilities/create/create.test.ts +433 -219
  540. package/src/capabilities/create/create.verb.ts +297 -328
  541. package/src/capabilities/create/createGrammar.test.ts +865 -0
  542. package/src/capabilities/create/createHelp.ts +71 -0
  543. package/src/capabilities/create/createSurface.generated.ts +400 -0
  544. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  545. package/src/capabilities/create/cwdJail.test.ts +24 -5
  546. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  547. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  548. package/src/capabilities/create/index.ts +7 -4
  549. package/src/capabilities/create/messages.ts +18 -0
  550. package/src/capabilities/create/mount.ts +391 -0
  551. package/src/capabilities/create/pathJail.test.ts +90 -0
  552. package/src/capabilities/create/pathJail.ts +8 -5
  553. package/src/capabilities/create/pickGenerator.ts +23 -35
  554. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  555. package/src/capabilities/create/types.ts +20 -0
  556. package/src/capabilities/distribution.test.ts +3 -1
  557. package/src/capabilities/distribution.ts +10 -15
  558. package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
  559. package/src/capabilities/doctor/checks/checkPackageRefs.ts +6 -4
  560. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
  561. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +72 -27
  562. package/src/capabilities/doctor/checks/checkShellCompletions.ts +59 -13
  563. package/src/capabilities/doctor/checks/index.ts +27 -0
  564. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  565. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  566. package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
  567. package/src/capabilities/doctor/doctor.render.test.ts +18 -7
  568. package/src/capabilities/doctor/doctor.render.ts +43 -19
  569. package/src/capabilities/doctor/doctor.test.ts +123 -34
  570. package/src/capabilities/doctor/doctor.verb.ts +3 -3
  571. package/src/capabilities/doctor/runChecks.ts +62 -63
  572. package/src/capabilities/doctor/types.ts +20 -4
  573. package/src/capabilities/emptyRecovery.test.ts +13 -8
  574. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  575. package/src/capabilities/graph/index.ts +1 -1
  576. package/src/capabilities/graph/inspect.render.ts +70 -22
  577. package/src/capabilities/graph/inspect.test.ts +260 -5
  578. package/src/capabilities/graph/inspect.verb.ts +18 -6
  579. package/src/capabilities/graph/query.render.ts +15 -3
  580. package/src/capabilities/graph/query.verb.ts +3 -3
  581. package/src/capabilities/graph/runQuery.ts +2 -3
  582. package/src/capabilities/index.ts +3 -1
  583. package/src/capabilities/info/collectInfo.ts +5 -4
  584. package/src/capabilities/info/info.render.ts +1 -1
  585. package/src/capabilities/info/info.verb.ts +1 -1
  586. package/src/capabilities/lazy.test.ts +32 -0
  587. package/src/capabilities/meta/complete.verb.ts +1 -1
  588. package/src/capabilities/meta/index.ts +1 -1
  589. package/src/capabilities/meta/mcp.verb.ts +10 -8
  590. package/src/capabilities/ontology/index.ts +15 -11
  591. package/src/capabilities/ontology/ontology.test.ts +6 -55
  592. package/src/capabilities/ontology/queries.ts +2 -2
  593. package/src/capabilities/ontology/render.ts +3 -4
  594. package/src/capabilities/ontology/verbs.ts +27 -68
  595. package/src/capabilities/prompt/index.ts +2 -2
  596. package/src/capabilities/prompt/prompt.render.ts +6 -2
  597. package/src/capabilities/prompt/types.ts +1 -1
  598. package/src/capabilities/prompt/verbs.ts +4 -5
  599. package/src/capabilities/reference.test.ts +63 -0
  600. package/src/capabilities/resources/provider.ts +342 -85
  601. package/src/capabilities/resources/resources.test.ts +355 -59
  602. package/src/capabilities/setup/buildPlan.ts +236 -0
  603. package/src/capabilities/setup/index.ts +7 -7
  604. package/src/capabilities/setup/mode.ts +74 -0
  605. package/src/capabilities/setup/operations/index.ts +74 -0
  606. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  607. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  608. package/src/capabilities/setup/operations/setupGenerator.ts +396 -326
  609. package/src/capabilities/setup/operations/setupLsp.ts +329 -68
  610. package/src/capabilities/setup/operations/setupMcp.ts +137 -97
  611. package/src/capabilities/setup/operations/setupSkills.ts +336 -108
  612. package/src/capabilities/setup/plan.render.ts +241 -0
  613. package/src/capabilities/setup/plan.ts +236 -0
  614. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  615. package/src/capabilities/setup/setup.render.test.ts +281 -73
  616. package/src/capabilities/setup/setup.render.ts +45 -77
  617. package/src/capabilities/setup/setup.test.ts +972 -209
  618. package/src/capabilities/setup/setup.verb.ts +223 -71
  619. package/src/capabilities/setup/shell.test.ts +86 -0
  620. package/src/capabilities/setup/shell.ts +137 -11
  621. package/src/capabilities/setup/targets.ts +367 -0
  622. package/src/capabilities/setup/types.ts +18 -57
  623. package/src/capabilities/shared/assertExecOk.ts +68 -10
  624. package/src/capabilities/shared/index.ts +32 -0
  625. package/src/capabilities/shared/packageManager.test.ts +55 -0
  626. package/src/capabilities/shared/packageManager.ts +62 -6
  627. package/src/capabilities/skill/discover.ts +37 -5
  628. package/src/capabilities/skill/index.ts +1 -1
  629. package/src/capabilities/skill/render.ts +10 -9
  630. package/src/capabilities/skill/skill.test.ts +7 -5
  631. package/src/capabilities/skill/verbs.ts +3 -4
  632. package/src/capabilities/sources/collectStatus.ts +7 -2
  633. package/src/capabilities/sources/index.ts +1 -1
  634. package/src/capabilities/sources/installSkills.ts +84 -7
  635. package/src/capabilities/sources/runUpdate.ts +53 -21
  636. package/src/capabilities/sources/sources.test.ts +154 -2
  637. package/src/capabilities/sources/status.render.ts +1 -1
  638. package/src/capabilities/sources/status.verb.ts +1 -1
  639. package/src/capabilities/sources/update.render.ts +1 -1
  640. package/src/capabilities/sources/update.verb.ts +1 -1
  641. package/src/capabilities/surface.test.ts +134 -17
  642. package/src/capabilities/upgrade/runUpgrade.ts +8 -8
  643. package/src/capabilities/upgrade/upgrade.render.ts +4 -5
  644. package/src/capabilities/upgrade/upgrade.test.ts +3 -3
  645. package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
  646. package/src/capabilities/version/index.ts +12 -0
  647. package/src/capabilities/version/version.test.ts +66 -0
  648. package/src/capabilities/version/version.verb.ts +39 -0
  649. package/src/constants.ts +31 -1
  650. package/src/identity.test.ts +40 -25
  651. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
  652. package/src/kernel/completion/complete.test.ts +12 -2
  653. package/src/kernel/completion/complete.ts +1 -1
  654. package/src/kernel/completion/emitScripts.ts +1 -1
  655. package/src/kernel/completion/entitySource.test.ts +1 -1
  656. package/src/kernel/completion/entitySource.ts +21 -8
  657. package/src/kernel/completion/model.test.ts +164 -12
  658. package/src/kernel/completion/model.ts +94 -14
  659. package/src/kernel/completion/parse.test.ts +4 -7
  660. package/src/kernel/completion/parse.ts +15 -0
  661. package/src/kernel/completion/resolve.test.ts +0 -1
  662. package/src/kernel/completion/safety.test.ts +34 -26
  663. package/src/kernel/completion/shellDrive.test.ts +28 -9
  664. package/src/kernel/completion/templates/bash.ts +7 -2
  665. package/src/kernel/completion/templates/index.ts +23 -0
  666. package/src/kernel/completion/types.ts +7 -0
  667. package/src/kernel/config/defaults.test.ts +25 -2
  668. package/src/kernel/config/defaults.ts +4 -3
  669. package/src/kernel/config/evaluateProjectConfig.ts +31 -8
  670. package/src/kernel/config/firstRun.test.ts +44 -38
  671. package/src/kernel/config/firstRun.ts +24 -88
  672. package/src/kernel/config/index.ts +1 -1
  673. package/src/kernel/config/readConfig.test.ts +6 -3
  674. package/src/kernel/config/readConfig.ts +1 -1
  675. package/src/kernel/config/schema.ts +3 -1
  676. package/src/kernel/config/types.ts +3 -1
  677. package/src/kernel/copy.test.ts +34 -4
  678. package/src/kernel/copy.ts +54 -0
  679. package/src/kernel/error/PragmaError.test.ts +5 -2
  680. package/src/kernel/error/PragmaError.ts +4 -2
  681. package/src/kernel/error/constants.ts +7 -5
  682. package/src/kernel/error/fromTaskError.ts +28 -6
  683. package/src/kernel/error/recovery.ts +14 -0
  684. package/src/kernel/error/renderError.ts +42 -1
  685. package/src/kernel/error/types.ts +21 -1
  686. package/src/kernel/index.ts +26 -0
  687. package/src/kernel/packs/collect.ts +12 -16
  688. package/src/kernel/packs/compile.test.ts +130 -1
  689. package/src/kernel/packs/compile.ts +93 -3
  690. package/src/kernel/packs/disclosure.ts +2 -2
  691. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  692. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
  693. package/src/kernel/packs/graphql/index.ts +20 -0
  694. package/src/kernel/packs/index.ts +40 -0
  695. package/src/kernel/packs/iri.test.ts +73 -0
  696. package/src/kernel/packs/iri.ts +66 -14
  697. package/src/kernel/packs/renderPack.ts +24 -5
  698. package/src/kernel/packs/resolveEntity.test.ts +213 -0
  699. package/src/kernel/packs/resolveEntity.ts +112 -18
  700. package/src/kernel/packs/runBodies.ts +2 -3
  701. package/src/kernel/packs/sample.ts +1 -1
  702. package/src/kernel/packs/schema.ts +18 -1
  703. package/src/kernel/packs/sparql/applyFilters.ts +16 -17
  704. package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
  705. package/src/kernel/packs/sparql/index.ts +37 -0
  706. package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
  707. package/src/kernel/packs/sparql/runSelect.ts +3 -4
  708. package/src/kernel/packs/toolDescription.test.ts +42 -3
  709. package/src/kernel/packs/types.ts +13 -0
  710. package/src/kernel/packs/uniqueness.ts +1 -1
  711. package/src/kernel/project/cli/buildProgram.test.ts +147 -12
  712. package/src/kernel/project/cli/buildProgram.ts +77 -18
  713. package/src/kernel/project/cli/constants.ts +34 -0
  714. package/src/kernel/project/cli/dispatch.test.ts +160 -3
  715. package/src/kernel/project/cli/dispatch.ts +222 -42
  716. package/src/kernel/project/cli/exitCodes.ts +1 -1
  717. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  718. package/src/kernel/project/cli/globalFlags.ts +130 -30
  719. package/src/kernel/project/cli/helpFormat.ts +13 -0
  720. package/src/kernel/project/cli/rootHelp.ts +41 -12
  721. package/src/kernel/project/cli/suggest.test.ts +33 -1
  722. package/src/kernel/project/cli/suggest.ts +25 -1
  723. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  724. package/src/kernel/project/cli/verbHelp.ts +23 -7
  725. package/src/kernel/project/mcp/buildServer.ts +7 -4
  726. package/src/kernel/project/mcp/envelope.ts +2 -2
  727. package/src/kernel/project/mcp/instructions.ts +2 -2
  728. package/src/kernel/project/mcp/mcpError.ts +1 -1
  729. package/src/kernel/project/mcp/parity.test.ts +5 -2
  730. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  731. package/src/kernel/project/mcp/prompts/source.ts +2 -2
  732. package/src/kernel/project/mcp/registerVerb.ts +35 -9
  733. package/src/kernel/project/mcp/serve.ts +2 -2
  734. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  735. package/src/kernel/render/contracts.ts +21 -0
  736. package/src/kernel/render/envelope.ts +2 -3
  737. package/src/kernel/render/formatters.ts +1 -1
  738. package/src/kernel/render/renderers.test.ts +243 -6
  739. package/src/kernel/render/renderers.ts +222 -20
  740. package/src/kernel/render/style.test.ts +75 -24
  741. package/src/kernel/render/style.ts +31 -1
  742. package/src/kernel/render/turtle.ts +222 -0
  743. package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
  744. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
  745. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
  746. package/src/kernel/runtime/graphpack/embedded.ts +3 -3
  747. package/src/kernel/runtime/graphpack/manifest.ts +1 -1
  748. package/src/kernel/runtime/graphpack/read.ts +1 -2
  749. package/src/kernel/runtime/loadSession.ts +1 -1
  750. package/src/kernel/runtime/probe.ts +6 -6
  751. package/src/kernel/runtime/readEntity.ts +472 -28
  752. package/src/kernel/runtime/refs/index.ts +39 -0
  753. package/src/kernel/runtime/refs/parseRef.ts +2 -2
  754. package/src/kernel/runtime/refs/resolve.ts +4 -4
  755. package/src/kernel/runtime/storeReadiness.ts +1 -2
  756. package/src/kernel/runtime/types.ts +15 -1
  757. package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
  758. package/src/kernel/spec/emitReference.ts +105 -30
  759. package/src/kernel/spec/emitSurface.ts +48 -6
  760. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  761. package/src/kernel/spec/types.ts +248 -4
  762. package/src/testing/behavioral/docExamples.test.ts +14 -0
  763. package/src/testing/behavioral/errorMatrix.mcp.test.ts +2 -2
  764. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  765. package/src/testing/behavioral/journeys.cli.test.ts +1 -1
  766. package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
  767. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  768. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  769. package/src/testing/behavioral/journeys.packageStories.test.ts +4 -4
  770. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  771. package/src/testing/behavioral/mcpSurface.test.ts +1 -1
  772. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  773. package/src/testing/eval/cases/effectful.ts +3 -2
  774. package/src/testing/fixtures/blockGraph.ts +79 -0
  775. package/src/testing/fixtures/graph/canonical.ts +88 -2
  776. package/src/testing/fixtures/graph/defaultPack.ts +1 -1
  777. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  778. package/src/testing/helpers/projectMcp.ts +32 -6
  779. package/src/testing/helpers/runCli.ts +35 -18
  780. package/src/testing/perf/budgets.test.ts +20 -9
  781. package/src/testing/perf/budgets.ts +58 -9
  782. package/src/testing/perf/codegen.test.ts +126 -0
  783. package/src/testing/perf/globalSetup.test.ts +286 -0
  784. package/src/testing/perf/globalSetup.ts +505 -23
  785. package/src/testing/perf/measure.test.ts +38 -0
  786. package/src/testing/perf/measure.ts +23 -4
  787. package/src/testing/setupXdgIsolation.ts +81 -21
  788. package/src/testing/tempRoot.globalSetup.ts +122 -0
  789. package/dist/pragma +0 -0
  790. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
  791. package/src/capabilities/create/templates.embedded.generated.ts +0 -28
  792. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
  793. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  794. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
  795. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
  796. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  797. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  798. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
@@ -1,12 +1,14 @@
1
1
  /**
2
- * Shell detection + completion-script install paths (ported from the old
3
- * shell's `setup/helpers/detectShell` + `completionScripts` path helpers).
2
+ * Shell detection + completion-script install paths.
4
3
  *
5
- * The covenant `setup completions` sub-verb carries NO flags, so shell selection
6
- * is detection-only (the old `--zsh`/`--bash`/`--fish` force-flags are dropped).
4
+ * Shell selection is detection-only, and detection means the shell the user is
5
+ * RUNNING — read from the process tree — not the login shell `$SHELL` records.
6
+ * The two differ constantly and the difference is invisible until TAB fails.
7
7
  * `$HOME` is read at call time so tests can isolate it.
8
8
  */
9
9
 
10
+ import { execFileSync } from "node:child_process";
11
+ import { existsSync, readFileSync } from "node:fs";
10
12
  import { homedir } from "node:os";
11
13
  import { join } from "node:path";
12
14
  import { BIN_NAME } from "../../constants.js";
@@ -21,15 +23,139 @@ const SHELL_MAP: Record<string, ShellId> = {
21
23
  };
22
24
 
23
25
  /**
24
- * Detect the user's shell from `$SHELL`.
26
+ * What detection concluded about the shell the user is actually in.
25
27
  *
26
- * @returns The detected shell, or `null` when `$SHELL` is unset/unrecognized.
27
- * @note Impure — reads `process.env.SHELL`.
28
+ * `ambiguous` is a first-class answer, not a failure to try harder. Installing
29
+ * for the wrong shell is INVISIBLE: the file is written, `doctor` goes green,
30
+ * and the user finds out when they press TAB months later and nothing happens.
31
+ * A named skip that says what was seen is worth more than a confident guess.
28
32
  */
29
- export function detectShell(): ShellId | null {
30
- const shell = process.env.SHELL ?? "";
31
- const basename = shell.split("/").pop() ?? "";
32
- return SHELL_MAP[basename] ?? null;
33
+ export type ShellDetection =
34
+ | { readonly kind: "detected"; readonly shell: ShellId }
35
+ | {
36
+ readonly kind: "ambiguous";
37
+ /** What `$SHELL` claims, when it names a shell we support. */
38
+ readonly login: ShellId;
39
+ }
40
+ | { readonly kind: "unknown" };
41
+
42
+ /** One process in the ancestry: what it is called, and who started it. */
43
+ export interface ProcessEntry {
44
+ readonly name: string;
45
+ readonly ppid: number;
46
+ }
47
+
48
+ /** Look up one process. Injected in tests so the tree is deterministic. */
49
+ export type ProcessReader = (pid: number) => ProcessEntry | undefined;
50
+
51
+ /** How far up the process tree to look before giving up. */
52
+ const MAX_ANCESTRY = 8;
53
+
54
+ /**
55
+ * The command name and parent of a pid, read from `/proc` (Linux).
56
+ *
57
+ * `/proc/<pid>/stat` is `pid (comm) state ppid …`, and `comm` may itself
58
+ * contain spaces and parentheses — so the fields are taken after the LAST
59
+ * `)`, never by splitting the whole line.
60
+ *
61
+ * @param pid - The process to inspect.
62
+ * @returns Its command name and parent pid, or undefined when unreadable.
63
+ * @note Impure — reads /proc.
64
+ */
65
+ function procEntry(pid: number): { name: string; ppid: number } | undefined {
66
+ try {
67
+ const stat = readFileSync(`/proc/${pid}/stat`, "utf8");
68
+ const close = stat.lastIndexOf(")");
69
+ const open = stat.indexOf("(");
70
+ if (close < 0 || open < 0) return undefined;
71
+ const name = stat.slice(open + 1, close);
72
+ const rest = stat.slice(close + 2).split(" ");
73
+ const ppid = Number.parseInt(rest[1] ?? "", 10);
74
+ return Number.isFinite(ppid) ? { name, ppid } : undefined;
75
+ } catch {
76
+ return undefined;
77
+ }
78
+ }
79
+
80
+ /**
81
+ * The same lookup for platforms without `/proc`, via one `ps` call.
82
+ *
83
+ * @param pid - The process to inspect.
84
+ * @returns Its command name and parent pid, or undefined.
85
+ * @note Impure — spawns `ps`.
86
+ */
87
+ function psEntry(pid: number): { name: string; ppid: number } | undefined {
88
+ try {
89
+ const out = execFileSync("ps", ["-o", "ppid=,comm=", "-p", String(pid)], {
90
+ encoding: "utf8",
91
+ timeout: 2000,
92
+ stdio: ["ignore", "pipe", "ignore"],
93
+ }).trim();
94
+ const match = /^(\d+)\s+(.*)$/.exec(out);
95
+ if (match === null) return undefined;
96
+ return { name: match[2] ?? "", ppid: Number.parseInt(match[1] ?? "", 10) };
97
+ } catch {
98
+ return undefined;
99
+ }
100
+ }
101
+
102
+ /** Normalize a process name to a shell id: `-zsh`, `/bin/bash`, `zsh` all map. */
103
+ function asShell(name: string): ShellId | undefined {
104
+ const base = (name.split("/").pop() ?? "").replace(/^-/, "");
105
+ return SHELL_MAP[base];
106
+ }
107
+
108
+ /**
109
+ * Walk the process ancestry looking for the shell this invocation is running
110
+ * inside.
111
+ *
112
+ * The walk matters: a CLI reached through `npm run`, `bunx`, or a wrapper
113
+ * script has `node` or `sh` as its immediate parent, and the user's actual
114
+ * shell is a level or two further up.
115
+ *
116
+ * @returns The shell found, or undefined.
117
+ * @note Impure — reads the process table.
118
+ */
119
+ function runningShell(read?: ProcessReader): ShellId | undefined {
120
+ const entryOf = read ?? (existsSync("/proc") ? procEntry : psEntry);
121
+ let pid = process.ppid;
122
+ for (let step = 0; step < MAX_ANCESTRY && pid > 1; step += 1) {
123
+ const entry = entryOf(pid);
124
+ if (entry === undefined) return undefined;
125
+ const shell = asShell(entry.name);
126
+ if (shell !== undefined) return shell;
127
+ pid = entry.ppid;
128
+ }
129
+ return undefined;
130
+ }
131
+
132
+ /**
133
+ * Detect the shell the user is actually running in.
134
+ *
135
+ * This reads the PROCESS TREE, not `$SHELL`. `$SHELL` is the login shell
136
+ * recorded in `/etc/passwd`; it is not changed by starting a different shell,
137
+ * so a user whose account says `bash` but who lives in `zsh` was silently
138
+ * given a bash script — and `doctor` then reported `✓ Shell completions: bash
139
+ * up to date and resolving`, a green check for a shell they never open, while
140
+ * the shell they do use had nothing.
141
+ *
142
+ * `$SHELL` survives only as a CONTRADICTION detector. When the process tree
143
+ * gives no answer (a CI runner, an editor task, a daemon), a `$SHELL` value is
144
+ * a guess about a session that may not exist, so the answer is `ambiguous` and
145
+ * the caller is expected to say so rather than pick.
146
+ *
147
+ * @param read - Injected process-table reader; defaults to the real one.
148
+ * @returns What could be established about the running shell.
149
+ * @note Impure — reads the process table and `$SHELL`.
150
+ */
151
+ export function detectShell(read?: ProcessReader): ShellDetection {
152
+ const running = runningShell(read);
153
+ if (running !== undefined) return { kind: "detected", shell: running };
154
+
155
+ const login = SHELL_MAP[(process.env.SHELL ?? "").split("/").pop() ?? ""];
156
+ return login === undefined
157
+ ? { kind: "unknown" }
158
+ : { kind: "ambiguous", login };
33
159
  }
34
160
 
35
161
  /**
@@ -0,0 +1,367 @@
1
+ /**
2
+ * THE target table — the one list `setup` and `doctor` both read.
3
+ *
4
+ * Five rows, each with a band column. This table drives the `setup <target>`
5
+ * sub-verbs, the wizard's choices, the `--dry-run` plan, the progress lines, the
6
+ * recap, the doctor rows, and each doctor row's `fix:` line. Adding a sixth
7
+ * target is one row here — not a new sub-verb, a new check, a new recap branch
8
+ * and a new fix string that four separate files have to agree about.
9
+ *
10
+ * A row owns: its identity (`id` is BOTH the sub-verb argument and the doctor
11
+ * row name, so `mcp` and `setup mcp` visibly share a token), which bands it can
12
+ * be installed into, how to DETECT its current state, how to PLAN a run from
13
+ * that detection, and how to COMPOSE the forward and removal effects. Detection
14
+ * runs once per invocation and feeds every reader, so setup and doctor cannot
15
+ * disagree about what they looked at.
16
+ *
17
+ * What a row does NOT own is diagnosis. `doctor/runChecks.ts` maps a row's
18
+ * detection onto a check result itself: the completions check needs helpers that
19
+ * live under `doctor/`, and importing them here would make the two directories
20
+ * import each other. The bijection is unaffected — doctor enumerates THIS table
21
+ * and derives every row name and `fix:` line from it.
22
+ *
23
+ * This module is reached only through the verb's lazy dynamic import (and
24
+ * doctor's), so nothing here lands on the `--help`/`__complete` fast path.
25
+ */
26
+
27
+ import type { Task } from "@canonical/task";
28
+ import { BIN_NAME } from "../../constants.js";
29
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
30
+ import {
31
+ type CompletionsDetection,
32
+ composeCompletions,
33
+ composeCompletionsRemoval,
34
+ detectCompletions,
35
+ } from "./operations/setupCompletions.js";
36
+ import {
37
+ type ConfigDetection,
38
+ composeConfigFile,
39
+ composeConfigRemoval,
40
+ detectConfigFile,
41
+ } from "./operations/setupConfig.js";
42
+ import {
43
+ composeLsp,
44
+ composeLspRemoval,
45
+ detectLsp,
46
+ LSP_SKIP_REMEDY,
47
+ type LspDetection,
48
+ lspEditorNames,
49
+ lspSkipReason,
50
+ lspUninstallRemedy,
51
+ } from "./operations/setupLsp.js";
52
+ import {
53
+ composeMcp,
54
+ composeMcpRemoval,
55
+ detectMcp,
56
+ type McpDetection,
57
+ mcpGroupState,
58
+ ownedMcpGroups,
59
+ selectedGroups,
60
+ } from "./operations/setupMcp.js";
61
+ import {
62
+ composeSkills,
63
+ composeSkillsRemoval,
64
+ detectSkills,
65
+ ownedSkillLinks,
66
+ type SkillsDetection,
67
+ skillsSkipReason,
68
+ } from "./operations/setupSkills.js";
69
+ import {
70
+ type PlanAction,
71
+ type PlanChildRow,
72
+ type SetupPlan,
73
+ shortenPath,
74
+ type TargetId,
75
+ } from "./plan.js";
76
+ import type { ScopeBand } from "./types.js";
77
+
78
+ /** What a target contributes to one plan row, before selection is applied. */
79
+ export interface TargetDraft {
80
+ readonly action: PlanAction;
81
+ readonly detail: string;
82
+ /** REQUIRED when the action is `skip`. */
83
+ readonly reason?: string;
84
+ readonly children?: readonly PlanChildRow[];
85
+ /** An action that works on THIS machine NOW, or absent. */
86
+ readonly remedy?: string;
87
+ }
88
+
89
+ /** The context a draft is rendered against — the plan's two named roots. */
90
+ export type Roots = SetupPlan["roots"];
91
+
92
+ /**
93
+ * One row of the table, generic over its own detection type. Every consumer
94
+ * treats the detection as opaque and hands it straight back to the same row,
95
+ * which is what lets five unrelated detections share one loop.
96
+ */
97
+ export interface TargetDefinition<D> {
98
+ readonly id: TargetId;
99
+ /** Human title, used where a sentence needs one; the id is the row name. */
100
+ readonly title: string;
101
+ readonly bands: readonly ScopeBand[];
102
+ /** Real reads, up front, once per (target, band) per invocation. */
103
+ detect(rt: PragmaRuntime, band: ScopeBand): Promise<D>;
104
+ /** What a forward run would do. */
105
+ plan(detection: D, band: ScopeBand, roots: Roots): TargetDraft;
106
+ /** What a removal would do — composed from what detection says we own. */
107
+ removalPlan(detection: D, band: ScopeBand, roots: Roots): TargetDraft;
108
+ /**
109
+ * The forward effects. `chosen` is the row's per-child selection (MCP file
110
+ * paths); a row without children ignores it.
111
+ */
112
+ compose(detection: D, chosen?: readonly string[]): Task<void>;
113
+ /** The removal effects: forward re-assertion carrying the reversal as `undo`. */
114
+ composeRemoval(detection: D): Task<void>;
115
+ }
116
+
117
+ /** A table row with its detection type erased — how every consumer holds one. */
118
+ export type AnyTarget = TargetDefinition<never>;
119
+
120
+ /** Erase a row's detection type so the five rows can share one array. */
121
+ const defineTarget = <D>(target: TargetDefinition<D>): AnyTarget =>
122
+ target as unknown as AnyTarget;
123
+
124
+ // =============================================================================
125
+ // The rows
126
+ // =============================================================================
127
+
128
+ const configTarget = defineTarget<ConfigDetection>({
129
+ id: "config",
130
+ title: "Global configuration",
131
+ bands: ["global"],
132
+ detect: () => detectConfigFile(),
133
+ plan: (d, _band, roots) => {
134
+ const path = shortenPath(d.path, roots);
135
+ if (!d.exists) return { action: "install", detail: path };
136
+ return { action: "none", detail: `${path} — present` };
137
+ },
138
+ removalPlan: (d, _band, roots) => {
139
+ const path = shortenPath(d.path, roots);
140
+ if (!d.exists) return { action: "none", detail: `${path} — absent` };
141
+ if (!d.isSeed) {
142
+ return {
143
+ action: "skip",
144
+ detail: path,
145
+ reason: "kept — it holds your settings",
146
+ };
147
+ }
148
+ return { action: "remove", detail: path };
149
+ },
150
+ compose: (d) => composeConfigFile(d),
151
+ composeRemoval: (d) => composeConfigRemoval(d),
152
+ });
153
+
154
+ const completionsTarget = defineTarget<CompletionsDetection>({
155
+ id: "completions",
156
+ title: "Shell completions",
157
+ bands: ["global"],
158
+ detect: (rt) => detectCompletions(rt.cwd),
159
+ plan: (d, _band, roots) => {
160
+ // Never guess a shell. Installing for the wrong one is invisible until the
161
+ // user presses TAB and nothing happens, so an unresolved shell is a named
162
+ // skip whose remedy is the one action that DOES settle it.
163
+ if (d.detection.kind === "ambiguous") {
164
+ return {
165
+ action: "skip",
166
+ detail: "the running shell cannot be identified",
167
+ reason: `the running shell cannot be identified — SHELL names ${d.detection.login}, which is the login shell, not necessarily the one in use`,
168
+ remedy: `run \`${BIN_NAME} setup completions\` from the shell you want completions in`,
169
+ };
170
+ }
171
+ if (d.detection.kind === "unknown" || d.shell === null || d.path === null) {
172
+ return {
173
+ action: "skip",
174
+ detail: "no supported shell detected",
175
+ reason: "no bash, zsh, or fish was found in this process tree",
176
+ remedy: `run \`${BIN_NAME} setup completions\` from bash, zsh, or fish`,
177
+ };
178
+ }
179
+ // The script spawns the binary for every name context. Installing one that
180
+ // cannot reach it writes a file that silently does nothing.
181
+ if (!d.binOnPath) {
182
+ return {
183
+ action: "skip",
184
+ detail: `${BIN_NAME} is not on PATH`,
185
+ reason: `the completion script runs \`${BIN_NAME}\`, which this shell cannot find on PATH`,
186
+ remedy: `put \`${BIN_NAME}\` on your PATH, then run this again`,
187
+ };
188
+ }
189
+ const where = `${d.shell} → ${shortenPath(d.path, roots)}`;
190
+ if (d.state === "installed") return { action: "none", detail: where };
191
+ return {
192
+ action: d.state === "stale" ? "update" : "install",
193
+ detail: where,
194
+ };
195
+ },
196
+ removalPlan: (d, _band, roots) => {
197
+ if (d.path === null || d.state === "absent") {
198
+ return { action: "none", detail: "no script installed" };
199
+ }
200
+ return { action: "remove", detail: shortenPath(d.path, roots) };
201
+ },
202
+ compose: (d) => composeCompletions(d),
203
+ composeRemoval: (d) => composeCompletionsRemoval(d),
204
+ });
205
+
206
+ const lspTarget = defineTarget<LspDetection>({
207
+ id: "lsp",
208
+ title: "Terrazzo LSP extension",
209
+ bands: ["global"],
210
+ detect: (rt) => detectLsp(rt.cwd),
211
+ plan: (d) => {
212
+ if (d.state === "unknown") {
213
+ return {
214
+ action: "skip",
215
+ detail: lspSkipReason(d),
216
+ reason: lspSkipReason(d),
217
+ remedy: LSP_SKIP_REMEDY,
218
+ };
219
+ }
220
+ // One child per detected editor, exactly like the mcp row's files: a
221
+ // machine with several VS Code forks on PATH should not have the extension
222
+ // pushed into all of them because they happen to be installed.
223
+ const children: PlanChildRow[] = d.editors.map((e) => ({
224
+ key: e.editor.cli,
225
+ label: `${e.editor.cli} — ${e.editor.name}`,
226
+ action: e.installed ? ("unchanged" as const) : ("add" as const),
227
+ }));
228
+ if (d.state === "installed") {
229
+ return {
230
+ action: "none",
231
+ detail: `installed (${lspEditorNames(d).join(", ")})`,
232
+ children,
233
+ };
234
+ }
235
+ const pending = d.editors.filter((e) => !e.installed);
236
+ return {
237
+ action: "install",
238
+ detail: `${pending.length} ${pending.length === 1 ? "editor" : "editors"}`,
239
+ children,
240
+ };
241
+ },
242
+ removalPlan: (d) => ({
243
+ action: "skip",
244
+ detail: "not removed",
245
+ reason: "an extension install cannot be reversed from here",
246
+ remedy:
247
+ lspUninstallRemedy(d) ??
248
+ "no editor CLI is on PATH — uninstall it from your editor",
249
+ }),
250
+ compose: (d, chosen) => composeLsp(d, chosen),
251
+ composeRemoval: (d) => composeLspRemoval(d),
252
+ });
253
+
254
+ /** One MCP file as a plan child: its path, the harnesses sharing it, its state. */
255
+ const mcpChild = (
256
+ d: McpDetection,
257
+ group: McpDetection["groups"][number],
258
+ roots: Roots,
259
+ ): PlanChildRow => {
260
+ const state = mcpGroupState(d, group.path);
261
+ return {
262
+ key: group.path,
263
+ label: shortenPath(group.path, roots),
264
+ action:
265
+ state === "configured"
266
+ ? "unchanged"
267
+ : state === "drifted"
268
+ ? "update"
269
+ : "add",
270
+ };
271
+ };
272
+
273
+ const mcpTarget = defineTarget<McpDetection>({
274
+ id: "mcp",
275
+ title: "MCP server registration",
276
+ bands: ["global", "project"],
277
+ detect: (rt, band) => detectMcp(rt, band),
278
+ plan: (d, band, roots) => {
279
+ if (d.groups.length === 0) {
280
+ return {
281
+ action: "skip",
282
+ detail: "no harness config location in this band",
283
+ reason:
284
+ band === "project"
285
+ ? "no AI harness in this project writes a per-repository config"
286
+ : "no detected AI harness declares a user-level config location",
287
+ };
288
+ }
289
+ const children = d.groups.map((group) => mcpChild(d, group, roots));
290
+ const pending = children.filter((c) => c.action !== "unchanged");
291
+ return {
292
+ action: pending.length === 0 ? "none" : "update",
293
+ detail: `${d.groups.length} ${d.groups.length === 1 ? "file" : "files"}`,
294
+ children,
295
+ };
296
+ },
297
+ removalPlan: (d, _band, roots) => {
298
+ const owned = ownedMcpGroups(d);
299
+ if (owned.length === 0) {
300
+ return { action: "none", detail: "no entry to remove" };
301
+ }
302
+ return {
303
+ action: "remove",
304
+ detail: `${owned.length} ${owned.length === 1 ? "file" : "files"}`,
305
+ children: owned.map((group) => ({
306
+ key: group.path,
307
+ label: shortenPath(group.path, roots),
308
+ action: "update" as const,
309
+ })),
310
+ };
311
+ },
312
+ compose: (d, chosen) =>
313
+ composeMcp(d, chosen ? selectedGroups(d, chosen) : d.groups),
314
+ composeRemoval: (d) => composeMcpRemoval(d),
315
+ });
316
+
317
+ const skillsTarget = defineTarget<SkillsDetection>({
318
+ id: "skills",
319
+ title: "Skill symlinks",
320
+ bands: ["global", "project"],
321
+ detect: (rt, band) => detectSkills(rt, band),
322
+ plan: (d, band, roots) => {
323
+ if (!d.available) {
324
+ const reason = skillsSkipReason(shortenPath(d.sourceRoot, roots), band);
325
+ return { action: "skip", detail: reason, reason };
326
+ }
327
+ const dirs = d.targets.map((t) => shortenPath(t.dir, roots)).join(", ");
328
+ const where = `${d.skillCount} ${d.skillCount === 1 ? "skill" : "skills"} → ${d.targets.length} ${d.targets.length === 1 ? "dir" : "dirs"} (${dirs})`;
329
+ const pending = d.actions.filter((a) => a.action !== "skipped");
330
+ return { action: pending.length === 0 ? "none" : "link", detail: where };
331
+ },
332
+ removalPlan: (d, _band, roots) => {
333
+ const owned = ownedSkillLinks(d);
334
+ if (owned.length === 0) {
335
+ return { action: "none", detail: "no link to remove" };
336
+ }
337
+ const dirs = [...new Set(owned.map((a) => shortenPath(a.linkPath, roots)))];
338
+ return {
339
+ action: "remove",
340
+ detail: `${owned.length} ${owned.length === 1 ? "link" : "links"}`,
341
+ children: dirs.map((dir) => ({
342
+ key: dir,
343
+ label: dir,
344
+ action: "update" as const,
345
+ })),
346
+ };
347
+ },
348
+ compose: (d) => composeSkills(d),
349
+ composeRemoval: (d) => composeSkillsRemoval(d),
350
+ });
351
+
352
+ /** THE table, in display order. */
353
+ export const TARGETS: readonly AnyTarget[] = [
354
+ configTarget,
355
+ completionsTarget,
356
+ lspTarget,
357
+ mcpTarget,
358
+ skillsTarget,
359
+ ];
360
+
361
+ /** Look a row up by id. */
362
+ export const findTarget = (id: string): AnyTarget | undefined =>
363
+ TARGETS.find((target) => target.id === id);
364
+
365
+ /** Whether a target can be installed into a band. */
366
+ export const supportsBand = (target: AnyTarget, band: ScopeBand): boolean =>
367
+ target.bands.includes(band);
@@ -2,14 +2,18 @@
2
2
  * Data shapes for `pragma setup` and its sub-verbs.
3
3
  */
4
4
 
5
- import type { ShellId } from "./shell.js";
6
-
7
5
  /**
8
6
  * Which setup entry point is running: the run-all self-verb or one sub-verb.
9
7
  * Lives here (a leaf type module) so `setup.verb.ts` can name it WITHOUT a
10
8
  * static import of the generator ops — keeping them dynamic-only (lazy-React).
11
9
  */
12
- export type SetupMode = "all" | "completions" | "lsp" | "mcp" | "skills";
10
+ export type SetupMode =
11
+ | "all"
12
+ | "config"
13
+ | "completions"
14
+ | "lsp"
15
+ | "mcp"
16
+ | "skills";
13
17
 
14
18
  /**
15
19
  * One of the two config bands: the per-user/home `global` band or the per-repo
@@ -20,9 +24,11 @@ export type SetupMode = "all" | "completions" | "lsp" | "mcp" | "skills";
20
24
  export type ScopeBand = "project" | "global";
21
25
 
22
26
  /**
23
- * The resolved `--scope` selection: which config band(s) a run touches. `both`
24
- * (the default) runs each detected harness's default band; `global`/`project`
25
- * run only that band. Structurally mirrors the harnesses `ScopeSelection`.
27
+ * The resolved `--scope` selection: which config band(s) a run touches.
28
+ * `global` is the DEFAULT — the user/home band a machine-level installer
29
+ * configures; `project` is the opt-in per-repository band; `both` is the
30
+ * explicit "run each band in one invocation". Structurally mirrors the
31
+ * harnesses `ScopeSelection`.
26
32
  */
27
33
  export type ScopeSelection = "project" | "global" | "both";
28
34
 
@@ -35,18 +41,6 @@ export type ScopeSelection = "project" | "global" | "both";
35
41
  */
36
42
  export type McpTargetState = "absent" | "configured" | "drifted";
37
43
 
38
- /**
39
- * One configured MCP target in a result: the file that was written, which band
40
- * it belongs to, the harness name(s) that share it, and its prior
41
- * {@link McpTargetState} (so the recap can report new vs updated vs unchanged).
42
- */
43
- export interface ConfiguredTarget {
44
- readonly name: string;
45
- readonly band: ScopeBand;
46
- readonly path: string;
47
- readonly state: McpTargetState;
48
- }
49
-
50
44
  /**
51
45
  * The prior on-disk state of the shell-completion script, read up front by
52
46
  * `detectCompletions`: `absent` (no script), `installed` (a byte-identical
@@ -56,44 +50,11 @@ export interface ConfiguredTarget {
56
50
  export type CompletionsState = "absent" | "installed" | "stale";
57
51
 
58
52
  /**
59
- * The detected state of the Terrazzo LSP VS Code extension, probed up front by
60
- * `detectLsp`: `installed` (already present — a re-run skips it), `absent` (not
61
- * present, so the installer runs), or `unknown` (the `code` CLI is not on PATH,
62
- * so we cannot enumerate and the installer runs regardless).
53
+ * The detected state of the Terrazzo LSP extension across the VS Code-family
54
+ * editors on this machine, probed up front by `detectLsp`: `installed` (every
55
+ * editor whose CLI is on PATH already has it — a re-run skips), `absent` (at
56
+ * least one detected editor is missing it, so the sideload runs for those), or
57
+ * `unknown` (NO editor CLI was found on PATH — the step is a named skip, since
58
+ * there is nothing to install into).
63
59
  */
64
60
  export type LspState = "installed" | "absent" | "unknown";
65
-
66
- /** One symlink create/skip/replace action performed during skill setup. */
67
- export interface SymlinkAction {
68
- readonly skillName: string;
69
- readonly target: string;
70
- readonly linkPath: string;
71
- readonly action: "created" | "skipped" | "replaced";
72
- readonly harnessName: string;
73
- }
74
-
75
- /** Aggregate result of `pragma setup skills`. */
76
- export interface SetupSkillsResult {
77
- readonly actions: readonly SymlinkAction[];
78
- readonly harnessCount: number;
79
- readonly skillCount: number;
80
- readonly warnings: readonly string[];
81
- }
82
-
83
- /** The result of one setup verb, tagged by which verb produced it. */
84
- export type SetupResult =
85
- | {
86
- readonly kind: "completions";
87
- readonly shell: ShellId | null;
88
- readonly path: string | null;
89
- readonly installed: boolean;
90
- readonly state: CompletionsState;
91
- }
92
- | { readonly kind: "lsp"; readonly state: LspState }
93
- | {
94
- readonly kind: "mcp";
95
- readonly configured: readonly string[];
96
- readonly targets: readonly ConfiguredTarget[];
97
- }
98
- | { readonly kind: "skills"; readonly result: SetupSkillsResult }
99
- | { readonly kind: "all"; readonly steps: readonly string[] };