@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
@@ -13,13 +13,66 @@
13
13
  * A denied `npm i -g` (EACCES), a registry/network failure, or any other
14
14
  * nonzero exit is a fixable ENVIRONMENT condition — NOT a pragma bug — so it is
15
15
  * classified UNSUPPORTED with an actionable recovery, never INTERNAL_ERROR's
16
- * "please report this issue". (A spawn error like ENOENT REJECTS the effect
16
+ * "report this issue". (A spawn error like ENOENT REJECTS the effect
17
17
  * instead of resolving, so it never reaches here.)
18
18
  */
19
19
 
20
- import { type ExecResult, fail, recover, type Task } from "@canonical/task";
21
- import { PragmaError } from "../../kernel/error/PragmaError.js";
22
- import type { Recovery } from "../../kernel/error/types.js";
20
+ import {
21
+ type ExecResult,
22
+ fail,
23
+ pure,
24
+ recover,
25
+ type Task,
26
+ } from "@canonical/task";
27
+ import type { Recovery } from "../../kernel/error/index.js";
28
+ import { PragmaError } from "../../kernel/error/index.js";
29
+
30
+ /**
31
+ * Route a {@link PragmaError} through the Task FAILURE CHANNEL (a `Fail` node
32
+ * carrying the error as `cause`) instead of a synchronous throw.
33
+ *
34
+ * The distinction is load-bearing: a synchronous throw from a bind/recover
35
+ * continuation ESCAPES the interpreter's trampoline entirely — no enclosing
36
+ * `recover` can see it — whereas a `Fail` node unwinds to the nearest recovery
37
+ * frame. Setup's run-all isolates each step with `recover` so one failed step
38
+ * cannot abort the rest (S1-1); that only works if step failures travel the
39
+ * failure channel. The boundary (`asPragmaError`) unwraps the carried cause,
40
+ * so a failure that escapes un-recovered still renders with its own code,
41
+ * message, and recovery — never the INTERNAL_ERROR catch-all.
42
+ */
43
+ export function failPragma(error: PragmaError): Task<never> {
44
+ return fail({ code: error.code, message: error.message, cause: error });
45
+ }
46
+
47
+ /**
48
+ * The failure-channel sibling of {@link assertExecOk}: yield `pure(undefined)`
49
+ * on exit 0, otherwise fail with an UNSUPPORTED {@link PragmaError} carrying
50
+ * the command, exit code, trimmed stderr, and the CALLER'S recovery — the
51
+ * recovery must name an action that works on this machine now, not the generic
52
+ * "permissions or network" guess.
53
+ *
54
+ * @param command - Human-readable command, surfaced in the error message.
55
+ * @param result - The {@link ExecResult} the `exec` effect yielded.
56
+ * @param recovery - The actionable, site-specific recovery.
57
+ * @returns A Task that succeeds on exit 0 and fails (recoverably) otherwise.
58
+ */
59
+ export function checkExecOk(
60
+ command: string,
61
+ result: ExecResult,
62
+ recovery: Recovery,
63
+ ): Task<void> {
64
+ if (result.exitCode === 0) return pure(undefined);
65
+ const stderr = result.stderr.trim();
66
+ return failPragma(
67
+ new PragmaError({
68
+ code: "UNSUPPORTED",
69
+ message: `\`${command}\` exited with code ${result.exitCode}.${
70
+ stderr ? `\n${stderr}` : ""
71
+ }`,
72
+ recovery,
73
+ }),
74
+ );
75
+ }
23
76
 
24
77
  /**
25
78
  * Raise UNSUPPORTED when an `exec` result carries a nonzero exit code.
@@ -40,7 +93,7 @@ export function assertExecOk(command: string, result: ExecResult): void {
40
93
  }`,
41
94
  recovery: {
42
95
  message:
43
- "The command failed — often a permissions or network issue. Check the output above and retry (for a global install, try elevated privileges).",
96
+ "Check the command's output above; a global install may need elevated privileges.",
44
97
  },
45
98
  });
46
99
  }
@@ -93,11 +146,16 @@ export function guardMissingBinary<A>(
93
146
  ): Task<A> {
94
147
  return recover(task, (error) => {
95
148
  if (isMissingBinaryError(error)) {
96
- throw new PragmaError({
97
- code: "UNSUPPORTED",
98
- message: `\`${bin}\` was not found on your PATH.`,
99
- recovery,
100
- });
149
+ // Failure CHANNEL, not a synchronous throw: an enclosing recover (the
150
+ // run-all's per-step isolation, S1-1) must be able to catch this, and
151
+ // the boundary unwraps the carried PragmaError when nothing does.
152
+ return failPragma(
153
+ new PragmaError({
154
+ code: "UNSUPPORTED",
155
+ message: `\`${bin}\` was not found on your PATH.`,
156
+ recovery,
157
+ }),
158
+ );
101
159
  }
102
160
  // Not a missing binary — re-raise unchanged (the interpreter rethrows it as
103
161
  // a TaskExecutionError, exactly as it would with no guard installed).
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The cross-capability shared surface — the few facts more than one capability
3
+ * needs and none of them owns.
4
+ *
5
+ * Everything here earned its place by being needed in two capabilities at
6
+ * once, and the cohesion principle is that shortness of the list. `shared/` is
7
+ * not a utility drawer: a helper used by exactly one capability belongs in
8
+ * that capability, and the moment something here has a single consumer again
9
+ * it should move back. What survives is the environment the CLI reports on but
10
+ * does not own — how it was installed, what the registry says about it,
11
+ * whether a subprocess it ran actually succeeded — plus the one piece of
12
+ * vocabulary (`BAND_LABELS`) that keeps `setup` and `doctor` calling the two
13
+ * config bands by the same names users meet in the flags.
14
+ *
15
+ * The exec guard is exported as the pair a caller needs together: `checkExecOk`
16
+ * to classify a result inside a Task and `assertExecOk` to throw on one
17
+ * outside, with `guardMissingBinary` wrapping the absent-binary case that
18
+ * neither should report as a pragma bug. The predicates they are built from
19
+ * stay internal — a caller reaching for the predicate instead of the guard is
20
+ * a caller about to reimplement the classification.
21
+ */
22
+
23
+ export {
24
+ assertExecOk,
25
+ checkExecOk,
26
+ guardMissingBinary,
27
+ } from "./assertExecOk.js";
28
+ export { BAND_LABELS } from "./bands.js";
29
+ export type { InstallSource } from "./packageManager.js";
30
+ export { detectInstallSource, pmUpdateCommand } from "./packageManager.js";
31
+ export type { RegistryCheckResult } from "./registry.js";
32
+ export { checkRegistryVersion, PRAGMA_PACKAGE } from "./registry.js";
@@ -0,0 +1,55 @@
1
+ /**
2
+ * The install-scope heuristic's two path questions.
3
+ *
4
+ * `detectInstallSource` itself reads `import.meta.url` and the real working
5
+ * directory, so the decision it makes is exercised here through the two pure
6
+ * helpers it composes — which is where every case that has ever been wrong
7
+ * lives.
8
+ */
9
+
10
+ import { describe, expect, it } from "vitest";
11
+ import { containsPath, findInstallRoot } from "./packageManager.js";
12
+
13
+ describe("findInstallRoot", () => {
14
+ it("yields the directory the package was installed into", () => {
15
+ expect(
16
+ findInstallRoot(
17
+ "/proj/node_modules/@canonical/pragma-cli/dist/src/bin.js",
18
+ ),
19
+ ).toBe("/proj");
20
+ });
21
+
22
+ it("takes the INNERMOST node_modules when they nest", () => {
23
+ expect(
24
+ findInstallRoot("/proj/node_modules/a/node_modules/b/dist/bin.js"),
25
+ ).toBe("/proj/node_modules/a");
26
+ });
27
+
28
+ it("reports no install root for a source checkout", () => {
29
+ expect(findInstallRoot("/work/pragma/packages/cli/pragma/src/bin.ts")).toBe(
30
+ undefined,
31
+ );
32
+ });
33
+ });
34
+
35
+ describe("containsPath", () => {
36
+ it("counts a directory as containing itself", () => {
37
+ expect(containsPath("/proj", "/proj")).toBe(true);
38
+ });
39
+
40
+ // The case a literal cwd-prefix test got wrong: an ordinary local install run
41
+ // from a subdirectory — which in a monorepo is the usual way to run it — was
42
+ // reported as a GLOBAL install.
43
+ it("counts a subdirectory as contained", () => {
44
+ expect(containsPath("/proj", "/proj/packages/foo")).toBe(true);
45
+ });
46
+
47
+ it("does not count a sibling that merely shares a prefix", () => {
48
+ expect(containsPath("/proj", "/proj-two")).toBe(false);
49
+ });
50
+
51
+ it("does not count an ancestor or an unrelated tree", () => {
52
+ expect(containsPath("/proj/packages/foo", "/proj")).toBe(false);
53
+ expect(containsPath("/usr/lib", "/home/u/proj")).toBe(false);
54
+ });
55
+ });
@@ -4,12 +4,15 @@
4
4
  *
5
5
  * Promotes the detector that lived inline in `info/collectInfo.ts`: the package
6
6
  * manager comes from npm's `npm_config_user_agent` (set by npm/pnpm/yarn/bun
7
- * when they run a script), the scope from whether the binary sits under
8
- * `node_modules`. With no agent we report the honest runtime rather than
9
- * guessing. The old shell's full package.json walk (`#package-manager`) is
7
+ * when they run a script), the scope from whether the installed entry sits
8
+ * under the CURRENT PROJECT. With no agent we report the honest runtime rather
9
+ * than guessing. The old shell's full package.json walk (`#package-manager`) is
10
10
  * dropped — only this heuristic and the update-command map survive.
11
11
  */
12
12
 
13
+ import { isAbsolute, relative, resolve, sep } from "node:path";
14
+ import { fileURLToPath } from "node:url";
15
+
13
16
  /** The install source: package manager and a display label. */
14
17
  export interface InstallSource {
15
18
  /** Package-manager name (`bun`/`npm`/`pnpm`/`yarn`), else the honest runtime. */
@@ -30,11 +33,64 @@ function packageManager(): string {
30
33
  * Detect how the binary was installed — package manager and scope.
31
34
  *
32
35
  * @returns The install source (pm, label).
33
- * @note Impure — reads `process.argv`/`process.env`.
36
+ * @note Impure — reads `import.meta.url`, the working directory, and `process.env`.
34
37
  */
38
+ /**
39
+ * The directory a package was installed INTO — the parent of the `node_modules`
40
+ * holding it, so `/proj/node_modules/@scope/x/dist/bin.js` yields `/proj`.
41
+ *
42
+ * The LAST occurrence, because nested `node_modules` mean the innermost one is
43
+ * the tree the entry actually lives in.
44
+ *
45
+ * @param entry - Absolute path to the running module.
46
+ * @returns The install root, or `undefined` when the entry is not installed at
47
+ * all (a source checkout, where no `node_modules` segment appears).
48
+ * @remarks Exported for its unit test; not part of the package's public surface.
49
+ */
50
+ export function findInstallRoot(entry: string): string | undefined {
51
+ const segments = entry.split(sep);
52
+ const index = segments.lastIndexOf("node_modules");
53
+ return index === -1 ? undefined : segments.slice(0, index).join(sep);
54
+ }
55
+
56
+ /**
57
+ * Whether `directory` contains `candidate`, or is it.
58
+ *
59
+ * Compared through `relative()` rather than a string prefix: a prefix test needs
60
+ * a hard-coded separator (wrong on Windows) and would call `/proj-two` a child
61
+ * of `/proj`.
62
+ *
63
+ * @param directory - The containing directory.
64
+ * @param candidate - The path to test.
65
+ * @returns True when `candidate` is `directory` or sits beneath it.
66
+ * @remarks Exported for its unit test; not part of the package's public surface.
67
+ */
68
+ export function containsPath(directory: string, candidate: string): boolean {
69
+ const offset = relative(directory, candidate);
70
+ return offset === "" || (!offset.startsWith("..") && !isAbsolute(offset));
71
+ }
72
+
35
73
  export function detectInstallSource(): InstallSource {
36
- const bin = process.argv[1] ?? "";
37
- const scope = bin.includes("node_modules") ? "local" : "global";
74
+ // The entry's own location, NOT `process.argv[1]`. Under the compiled binary
75
+ // argv[1] was the user's FIRST ARGUMENT (the executable was argv[0]), so the
76
+ // old `includes("node_modules")` test read a command word and answered
77
+ // "global" for almost everything. Shipping `node dist/src/bin.js` moves the
78
+ // entry path INTO argv[1], where it always contains `node_modules` — which
79
+ // would answer "local" for everything, the same bug facing the other way.
80
+ // `import.meta.url` is the honest source either way.
81
+ const entry = fileURLToPath(import.meta.url);
82
+ // LOCAL means the working directory sits inside the project this package was
83
+ // installed into — not merely that the entry sits under the cwd. Asking the
84
+ // narrower question called a perfectly ordinary local install "global" the
85
+ // moment the user ran it from a subdirectory, which in a monorepo is the
86
+ // usual case. Going the other way, deriving the install root also settles the
87
+ // $HOME-nested global prefixes (nvm, `~/.npm-global`): their root is the
88
+ // prefix, which contains no user project.
89
+ const root = findInstallRoot(entry);
90
+ const scope =
91
+ root !== undefined && containsPath(root, resolve(process.cwd()))
92
+ ? "local"
93
+ : "global";
38
94
  const pm = packageManager();
39
95
  return { pm, label: `${pm} (${scope})` };
40
96
  }
@@ -120,6 +120,19 @@ export function installedSkillsDir(): string {
120
120
  return join(dataHome, BIN_NAME, "skills");
121
121
  }
122
122
 
123
+ /**
124
+ * The project skills root: `<cwd>/.<bin>/skills` — skills that belong to THIS
125
+ * repository and travel with it. Named separately from {@link skillRoots}
126
+ * because the two roots are also the two setup BANDS: `setup skills --local`
127
+ * links this root into the project's harness directories, while the global band
128
+ * links {@link installedSkillsDir} into the user-level ones. Mixing them leaks
129
+ * machine state into a repository's directories, or applies one repository's
130
+ * skills machine-wide.
131
+ */
132
+ export function projectSkillsDir(cwd: string): string {
133
+ return join(cwd, `.${BIN_NAME}`, "skills");
134
+ }
135
+
123
136
  /**
124
137
  * The conventional roots skills are discovered from, in PRECEDENCE order: the
125
138
  * project root (`<cwd>/.<bin>/skills`) FIRST so a project-local skill overrides
@@ -128,7 +141,7 @@ export function installedSkillsDir(): string {
128
141
  * skills land on `sources update`).
129
142
  */
130
143
  export function skillRoots(cwd: string): string[] {
131
- return [join(cwd, `.${BIN_NAME}`, "skills"), installedSkillsDir()];
144
+ return [projectSkillsDir(cwd), installedSkillsDir()];
132
145
  }
133
146
 
134
147
  /** Immediate subdirectories of `root` (each a candidate skill folder). */
@@ -149,16 +162,24 @@ function subdirs(root: string): string[] {
149
162
  }
150
163
 
151
164
  /**
152
- * Discover every skill reachable from the conventional roots.
165
+ * Discover every skill reachable from an EXPLICIT list of roots, in precedence
166
+ * order (first-seen wins on a duplicate name).
153
167
  *
154
- * @param cwd - The project directory (project skills root).
168
+ * Split out of {@link discoverSkills} so a caller that owns one band can read
169
+ * exactly that band's root: `setup skills` links the project root into project
170
+ * harness directories and the installed root into user-level ones, and reading
171
+ * both roots for either band is what used to mix the two.
172
+ *
173
+ * @param roots - The roots to read, in precedence order.
155
174
  * @returns Discovered skills, sorted by name; malformed ones are skipped.
156
175
  * @note Impure — reads SKILL.md files.
157
176
  */
158
- export function discoverSkills(cwd: string): DiscoveredSkill[] {
177
+ export function discoverSkillsFrom(
178
+ roots: readonly string[],
179
+ ): DiscoveredSkill[] {
159
180
  const skills: DiscoveredSkill[] = [];
160
181
  const seen = new Set<string>();
161
- for (const root of skillRoots(cwd)) {
182
+ for (const root of roots) {
162
183
  for (const dir of subdirs(root)) {
163
184
  let content: string;
164
185
  try {
@@ -182,3 +203,14 @@ export function discoverSkills(cwd: string): DiscoveredSkill[] {
182
203
  a.name < b.name ? -1 : a.name > b.name ? 1 : 0,
183
204
  );
184
205
  }
206
+
207
+ /**
208
+ * Discover every skill reachable from the conventional roots.
209
+ *
210
+ * @param cwd - The project directory (project skills root).
211
+ * @returns Discovered skills, sorted by name; malformed ones are skipped.
212
+ * @note Impure — reads SKILL.md files.
213
+ */
214
+ export function discoverSkills(cwd: string): DiscoveredSkill[] {
215
+ return discoverSkillsFrom(skillRoots(cwd));
216
+ }
@@ -2,7 +2,7 @@
2
2
  * The `skill` capability module — storeless filesystem discovery.
3
3
  */
4
4
 
5
- import type { CapabilityModule } from "../../kernel/spec/types.js";
5
+ import type { CapabilityModule } from "../../kernel/spec/index.js";
6
6
  import { skillListVerb, skillLookupVerb } from "./verbs.js";
7
7
 
8
8
  /** The `skill` capability module (`list`, `lookup`). */
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { BIN_NAME } from "../../constants.js";
6
- import type { Formatters } from "../../kernel/spec/types.js";
6
+ import type { Formatters } from "../../kernel/spec/index.js";
7
7
  import type { DiscoveredSkill } from "./discover.js";
8
8
  import type { SkillLookup } from "./verbs.js";
9
9
 
@@ -12,15 +12,16 @@ const EMPTY_PLAIN = `No skills found.\nSkills come from design-system packs —
12
12
  const EMPTY_LLM = `## Skills (0)\n\nNo skills found. Skills come from design-system packs — add one to the project config's packs, run \`${BIN_NAME} sources update\`, then \`${BIN_NAME} setup skills\`.`;
13
13
 
14
14
  export const skillListFormatters: Formatters<DiscoveredSkill[]> = {
15
+ // Zero skills: plain stdout stays empty — the guidance is `emptyNotice`,
16
+ // which the dispatcher routes to stderr (exit 0) so a pipe reads no prose.
15
17
  plain: (skills) =>
16
- skills.length === 0
17
- ? EMPTY_PLAIN
18
- : skills
19
- .map(
20
- (s) =>
21
- `${s.name}${s.frontmatter.prompt ? " (prompt)" : ""} ${s.description}`,
22
- )
23
- .join("\n"),
18
+ skills
19
+ .map(
20
+ (s) =>
21
+ `${s.name}${s.frontmatter.prompt ? " (prompt)" : ""} ${s.description}`,
22
+ )
23
+ .join("\n"),
24
+ emptyNotice: (skills) => (skills.length === 0 ? EMPTY_PLAIN : undefined),
24
25
  llm: (skills) =>
25
26
  skills.length === 0
26
27
  ? EMPTY_LLM
@@ -85,11 +85,13 @@ describe("skill lookup (storeless)", () => {
85
85
  });
86
86
 
87
87
  describe("skill list empty-state (U5)", () => {
88
- it("plain output is non-blank and guides toward package sources", () => {
89
- const plain = skillListFormatters.plain([]);
90
- expect(plain).not.toBe("");
91
- expect(plain).toContain("No skills found");
92
- expect(plain).toContain("pragma sources update");
88
+ it("the empty notice (stderr's text) guides toward package sources", () => {
89
+ // Zero skills: plain stdout is empty (a pipe reads no prose) and the
90
+ // guidance rides the dispatcher's stderr via `emptyNotice`.
91
+ expect(skillListFormatters.plain([])).toBe("");
92
+ const notice = skillListFormatters.emptyNotice?.([]);
93
+ expect(notice).toContain("No skills found");
94
+ expect(notice).toContain("pragma sources update");
93
95
  });
94
96
 
95
97
  it("llm output announces zero and guides, json stays []", () => {
@@ -9,12 +9,11 @@
9
9
  import { readFileSync } from "node:fs";
10
10
  import { join } from "node:path";
11
11
  import { BIN_NAME } from "../../constants.js";
12
- import { PragmaError } from "../../kernel/error/PragmaError.js";
13
- import { cliRecovery } from "../../kernel/error/recovery.js";
12
+ import { cliRecovery, PragmaError } from "../../kernel/error/index.js";
14
13
  import { suggestNames } from "../../kernel/project/cli/suggestNames.js";
15
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
14
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
16
15
  import { asVerb } from "../../kernel/spec/asVerb.js";
17
- import type { VerbSpec } from "../../kernel/spec/types.js";
16
+ import type { VerbSpec } from "../../kernel/spec/index.js";
18
17
  import { type DiscoveredSkill, discoverSkills } from "./discover.js";
19
18
  import { skillListFormatters, skillLookupFormatters } from "./render.js";
20
19
 
@@ -12,12 +12,17 @@
12
12
 
13
13
  import { existsSync, readFileSync } from "node:fs";
14
14
  import { join } from "node:path";
15
- import type { PackDeclaration } from "../../kernel/config/types.js";
15
+ import type { PackDeclaration } from "../../kernel/config/index.js";
16
+ // DIRECT LEAF IMPORTS, not `graphpack/index.js`. The barrel re-exports
17
+ // `build.ts`/`read.ts` (pulling `@canonical/ke` and `@canonical/ke-graphql`)
18
+ // and `embedded.ts`, whose generated payload is ~1.9 MB. `sources status`
19
+ // reads two manifests and prints them; routing that through the barrel
20
+ // would make a status-only command initialise the whole pack stack.
16
21
  import { embeddedManifest } from "../../kernel/runtime/graphpack/embedded.js";
17
22
  import { readManifest } from "../../kernel/runtime/graphpack/manifest.js";
18
23
  import { INDEX_FILE } from "../../kernel/runtime/graphpack/types.js";
24
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
19
25
  import { resolveSources } from "../../kernel/runtime/resolveSources.js";
20
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
21
26
  import type { SourcesStatusData } from "./types.js";
22
27
 
23
28
  const entryName = (entry: PackDeclaration): string =>
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { asVerb } from "../../kernel/spec/asVerb.js";
7
- import type { CapabilityModule } from "../../kernel/spec/types.js";
7
+ import type { CapabilityModule } from "../../kernel/spec/index.js";
8
8
  import { statusVerb } from "./status.verb.js";
9
9
  import { updateVerb } from "./update.verb.js";
10
10
 
@@ -10,27 +10,51 @@
10
10
  * first), and the update Task stays reversible (each created link carries an
11
11
  * unlink undo).
12
12
  *
13
+ * Installing alone leaks, because planning walks the PACKAGES and so only ever
14
+ * visits a skill that still exists. When a package DROPS one (a `0.1.2` that
15
+ * shipped `component-specifier` upgrading to a `0.2.0` that does not), the link
16
+ * the previous update installed is never revisited and is left dangling at a
17
+ * target that no longer exists — which reads as a broken install rather than the
18
+ * intentional removal it is, and which `skill` commands can still list or try to
19
+ * open. So planning ALSO walks the installed root and prunes those, under a
20
+ * deliberately narrow rule: an entry is removed only when this run did not plan
21
+ * it AND it is a symlink whose target is gone. A real directory is a
22
+ * manually-installed skill and a still-resolving symlink is someone's own link;
23
+ * neither is this update's to delete.
24
+ *
13
25
  * Decisions run against REAL fs here so the update's `--dry-run` plan is
14
26
  * accurate; the composed Task performs only the symlink/delete effects.
15
27
  */
16
28
 
17
29
  import { existsSync, lstatSync, readdirSync, readlinkSync } from "node:fs";
18
30
  import { basename, join, resolve } from "node:path";
19
- import type { ResolvedPackage } from "../../kernel/runtime/refs/resolve.js";
31
+ import type { ResolvedPackage } from "../../kernel/runtime/refs/index.js";
20
32
  import { installedSkillsDir } from "../skill/discover.js";
21
33
 
22
34
  /** One planned skill symlink into the installed-skills root. */
23
35
  export interface SkillLinkAction {
24
- /** The package's skill folder — the symlink target. */
36
+ /**
37
+ * The symlink target: the package's skill folder for an install, or — on a
38
+ * `pruned` entry — the missing target the stale link still points at, kept so
39
+ * the prune's undo can put the link back exactly as it was.
40
+ */
25
41
  readonly target: string;
26
42
  /** `<installedSkillsDir>/<folderName>` — where the symlink is created. */
27
43
  readonly linkPath: string;
28
- /** created (absent), skipped (already correct / a real dir), or replaced. */
29
- readonly action: "created" | "skipped" | "replaced";
44
+ /**
45
+ * created (absent), skipped (already correct / a real dir), replaced, or
46
+ * pruned (an unplanned link whose target is gone — deleted, not re-created).
47
+ */
48
+ readonly action: "created" | "skipped" | "replaced" | "pruned";
30
49
  /** The skill folder name (the discovery key). */
31
50
  readonly folderName: string;
32
- /** The package the skill came from. */
33
- readonly packageName: string;
51
+ /**
52
+ * The package the skill came from. Absent on a `pruned` entry: a stale link
53
+ * records only a target path, and the package that installed it is precisely
54
+ * the one that no longer provides the skill — there is nothing honest left to
55
+ * attribute it to.
56
+ */
57
+ readonly packageName?: string;
34
58
  }
35
59
 
36
60
  /** What currently occupies a candidate link path. */
@@ -80,9 +104,58 @@ function packageSkillDirs(root: string): string[] {
80
104
  return out;
81
105
  }
82
106
 
107
+ /**
108
+ * Plan the removal of the links a package has since dropped.
109
+ *
110
+ * The install pass walks the packages, so it can only ever visit a skill that
111
+ * still exists; this pass walks the installed root, which is the ONLY place a
112
+ * dropped skill still shows up. An entry is pruned only when both hold: this run
113
+ * did not plan it, and it is a symlink whose target is gone. Both halves matter —
114
+ *
115
+ * - a real (non-symlink) entry is a manually-installed skill, which the install
116
+ * pass already refuses to clobber (`skipped`) and which this pass must refuse
117
+ * just as firmly: "unplanned" is exactly what a hand-placed skill looks like;
118
+ * - a symlink whose target still resolves is someone's own link into a checkout
119
+ * this command knows nothing about. Unplanned does not make it garbage, and an
120
+ * update that silently ate it would be a worse bug than the dangling link.
121
+ *
122
+ * A broken target, by contrast, cannot be anything but debris: nothing can read
123
+ * it, and re-creating it is a matter of re-running the update that installed it
124
+ * (which is also what this prune's undo does).
125
+ *
126
+ * @param dest - The installed-skills root.
127
+ * @param planned - Every folder name the install pass planned, whatever action.
128
+ * @returns One `pruned` action per stale link, for the plan and its preview.
129
+ * @note Impure — reads the installed root and stats each entry's target.
130
+ */
131
+ function planStaleLinkPrunes(
132
+ dest: string,
133
+ planned: ReadonlySet<string>,
134
+ ): SkillLinkAction[] {
135
+ let names: string[];
136
+ try {
137
+ names = readdirSync(dest);
138
+ } catch {
139
+ return []; // No installed root — nothing was ever installed to go stale.
140
+ }
141
+ const out: SkillLinkAction[] = [];
142
+ for (const folderName of names) {
143
+ if (planned.has(folderName)) continue;
144
+ const linkPath = resolve(dest, folderName);
145
+ const state = linkState(linkPath);
146
+ if (state.kind !== "symlink") continue;
147
+ // A relative target is stored relative to the link's OWN directory, which
148
+ // for an entry of the installed root is that root itself.
149
+ if (existsSync(resolve(dest, state.target))) continue;
150
+ out.push({ target: state.target, linkPath, action: "pruned", folderName });
151
+ }
152
+ return out;
153
+ }
154
+
83
155
  /**
84
156
  * Plan the symlink actions that install each resolved package's `skills/*` into
85
- * the installed-skills discovery root. First-seen wins on a folder-name clash
157
+ * the installed-skills discovery root, then the removals that retire the links
158
+ * a package has since dropped. First-seen wins on a folder-name clash
86
159
  * across packages. A real (non-symlink) entry at the link path is left untouched
87
160
  * (`skipped`) so a manually-installed skill is never clobbered.
88
161
  *
@@ -120,5 +193,9 @@ export function planSkillInstall(
120
193
  });
121
194
  }
122
195
  }
196
+ // `seen` is every folder name this run planned — the `skipped` ones included,
197
+ // so a name a package still provides is never a prune candidate even when the
198
+ // install pass decided to leave its entry alone.
199
+ actions.push(...planStaleLinkPrunes(dest, seen));
123
200
  return actions;
124
201
  }