@canonical/pragma-cli 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (892) hide show
  1. package/README.md +153 -30
  2. package/dist/.build-ok +0 -0
  3. package/dist/package.json +83 -0
  4. package/dist/pragma.conf.js +814 -0
  5. package/dist/pragma.conf.js.map +1 -0
  6. package/dist/src/bin.js +356 -0
  7. package/dist/src/bin.js.map +1 -0
  8. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  9. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  10. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  11. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  12. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  13. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  14. package/dist/src/capabilities/capabilities/hints.js +195 -0
  15. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  16. package/dist/src/capabilities/capabilities/index.js +11 -0
  17. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/types.js +11 -0
  19. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  20. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  21. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  22. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  23. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  24. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  25. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  26. package/dist/src/capabilities/colophon/index.js +5 -0
  27. package/dist/src/capabilities/colophon/index.js.map +1 -0
  28. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  29. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  30. package/dist/src/capabilities/colophon/types.js +10 -0
  31. package/dist/src/capabilities/colophon/types.js.map +1 -0
  32. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  33. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  34. package/dist/src/capabilities/config/field.render.js +22 -0
  35. package/dist/src/capabilities/config/field.render.js.map +1 -0
  36. package/dist/src/capabilities/config/fields.js +46 -0
  37. package/dist/src/capabilities/config/fields.js.map +1 -0
  38. package/dist/src/capabilities/config/get.verb.js +61 -0
  39. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  40. package/dist/src/capabilities/config/index.js +5 -0
  41. package/dist/src/capabilities/config/index.js.map +1 -0
  42. package/dist/src/capabilities/config/runField.js +59 -0
  43. package/dist/src/capabilities/config/runField.js.map +1 -0
  44. package/dist/src/capabilities/config/runGet.js +28 -0
  45. package/dist/src/capabilities/config/runGet.js.map +1 -0
  46. package/dist/src/capabilities/config/runSet.js +53 -0
  47. package/dist/src/capabilities/config/runSet.js.map +1 -0
  48. package/dist/src/capabilities/config/set.verb.js +66 -0
  49. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/show.render.js +84 -0
  51. package/dist/src/capabilities/config/show.render.js.map +1 -0
  52. package/dist/src/capabilities/config/show.verb.js +44 -0
  53. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  54. package/dist/src/capabilities/config/types.js +5 -0
  55. package/dist/src/capabilities/config/types.js.map +1 -0
  56. package/dist/src/capabilities/config/unset.verb.js +49 -0
  57. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  58. package/dist/src/capabilities/create/cliProjection.js +195 -0
  59. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  60. package/dist/src/capabilities/create/constants.js +47 -0
  61. package/dist/src/capabilities/create/constants.js.map +1 -0
  62. package/dist/src/capabilities/create/create.render.js +100 -0
  63. package/dist/src/capabilities/create/create.render.js.map +1 -0
  64. package/dist/src/capabilities/create/create.verb.js +438 -0
  65. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  66. package/dist/src/capabilities/create/createHelp.js +47 -0
  67. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  68. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  69. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  70. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  71. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  72. package/dist/src/capabilities/create/index.js +18 -0
  73. package/dist/src/capabilities/create/index.js.map +1 -0
  74. package/dist/src/capabilities/create/messages.js +16 -0
  75. package/dist/src/capabilities/create/messages.js.map +1 -0
  76. package/dist/src/capabilities/create/mount.js +293 -0
  77. package/dist/src/capabilities/create/mount.js.map +1 -0
  78. package/dist/src/capabilities/create/pathJail.js +65 -0
  79. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  80. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  81. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  82. package/dist/src/capabilities/create/types.js +2 -0
  83. package/dist/src/capabilities/create/types.js.map +1 -0
  84. package/dist/src/capabilities/distribution.js +40 -0
  85. package/dist/src/capabilities/distribution.js.map +1 -0
  86. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  87. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  88. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  89. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  90. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
  91. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  92. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  93. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  94. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  95. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  97. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  99. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
  101. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  102. package/dist/src/capabilities/doctor/doctor.render.js +185 -0
  103. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  104. package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
  105. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  106. package/dist/src/capabilities/doctor/index.js +5 -0
  107. package/dist/src/capabilities/doctor/index.js.map +1 -0
  108. package/dist/src/capabilities/doctor/runChecks.js +83 -0
  109. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  110. package/dist/src/capabilities/doctor/types.js +5 -0
  111. package/dist/src/capabilities/doctor/types.js.map +1 -0
  112. package/dist/src/capabilities/graph/index.js +19 -0
  113. package/dist/src/capabilities/graph/index.js.map +1 -0
  114. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  115. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  116. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  117. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  118. package/dist/src/capabilities/graph/query.render.js +73 -0
  119. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  120. package/dist/src/capabilities/graph/query.verb.js +49 -0
  121. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  122. package/dist/src/capabilities/graph/runQuery.js +41 -0
  123. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  124. package/dist/src/capabilities/index.js +56 -0
  125. package/dist/src/capabilities/index.js.map +1 -0
  126. package/dist/src/capabilities/info/collectInfo.js +66 -0
  127. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  128. package/dist/src/capabilities/info/index.js +5 -0
  129. package/dist/src/capabilities/info/index.js.map +1 -0
  130. package/dist/src/capabilities/info/info.render.js +53 -0
  131. package/dist/src/capabilities/info/info.render.js.map +1 -0
  132. package/dist/src/capabilities/info/info.verb.js +42 -0
  133. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  134. package/dist/src/capabilities/info/types.js +5 -0
  135. package/dist/src/capabilities/info/types.js.map +1 -0
  136. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  137. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  138. package/dist/src/capabilities/meta/index.js +13 -0
  139. package/dist/src/capabilities/meta/index.js.map +1 -0
  140. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  141. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  142. package/dist/src/capabilities/ontology/index.js +21 -0
  143. package/dist/src/capabilities/ontology/index.js.map +1 -0
  144. package/dist/src/capabilities/ontology/queries.js +123 -0
  145. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  146. package/dist/src/capabilities/ontology/render.js +66 -0
  147. package/dist/src/capabilities/ontology/render.js.map +1 -0
  148. package/dist/src/capabilities/ontology/verbs.js +181 -0
  149. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  150. package/dist/src/capabilities/prompt/index.js +16 -0
  151. package/dist/src/capabilities/prompt/index.js.map +1 -0
  152. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  153. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  154. package/dist/src/capabilities/prompt/types.js +10 -0
  155. package/dist/src/capabilities/prompt/types.js.map +1 -0
  156. package/dist/src/capabilities/prompt/verbs.js +93 -0
  157. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  158. package/dist/src/capabilities/resources/index.js +10 -0
  159. package/dist/src/capabilities/resources/index.js.map +1 -0
  160. package/dist/src/capabilities/resources/provider.js +423 -0
  161. package/dist/src/capabilities/resources/provider.js.map +1 -0
  162. package/dist/src/capabilities/setup/buildPlan.js +168 -0
  163. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  164. package/dist/src/capabilities/setup/index.js +5 -0
  165. package/dist/src/capabilities/setup/index.js.map +1 -0
  166. package/dist/src/capabilities/setup/mode.js +53 -0
  167. package/dist/src/capabilities/setup/mode.js.map +1 -0
  168. package/dist/src/capabilities/setup/operations/index.js +39 -0
  169. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  170. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  171. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  172. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  173. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  174. package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
  175. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  176. package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
  177. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  178. package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
  179. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
  181. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  182. package/dist/src/capabilities/setup/plan.js +128 -0
  183. package/dist/src/capabilities/setup/plan.js.map +1 -0
  184. package/dist/src/capabilities/setup/plan.render.js +193 -0
  185. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  186. package/dist/src/capabilities/setup/setup.render.js +54 -0
  187. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  188. package/dist/src/capabilities/setup/setup.verb.js +334 -0
  189. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  190. package/dist/src/capabilities/setup/shell.js +196 -0
  191. package/dist/src/capabilities/setup/shell.js.map +1 -0
  192. package/dist/src/capabilities/setup/targets.js +263 -0
  193. package/dist/src/capabilities/setup/targets.js.map +1 -0
  194. package/dist/src/capabilities/setup/types.js +5 -0
  195. package/dist/src/capabilities/setup/types.js.map +1 -0
  196. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  197. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  198. package/dist/src/capabilities/shared/bands.js +16 -0
  199. package/dist/src/capabilities/shared/bands.js.map +1 -0
  200. package/dist/src/capabilities/shared/index.js +26 -0
  201. package/dist/src/capabilities/shared/index.js.map +1 -0
  202. package/dist/src/capabilities/shared/packageManager.js +103 -0
  203. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  204. package/dist/src/capabilities/shared/registry.js +55 -0
  205. package/dist/src/capabilities/shared/registry.js.map +1 -0
  206. package/dist/src/capabilities/skill/discover.js +195 -0
  207. package/dist/src/capabilities/skill/discover.js.map +1 -0
  208. package/dist/src/capabilities/skill/index.js +10 -0
  209. package/dist/src/capabilities/skill/index.js.map +1 -0
  210. package/dist/src/capabilities/skill/render.js +49 -0
  211. package/dist/src/capabilities/skill/render.js.map +1 -0
  212. package/dist/src/capabilities/skill/verbs.js +83 -0
  213. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  214. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  215. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  216. package/dist/src/capabilities/sources/index.js +13 -0
  217. package/dist/src/capabilities/sources/index.js.map +1 -0
  218. package/dist/src/capabilities/sources/installSkills.js +167 -0
  219. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  220. package/dist/src/capabilities/sources/runUpdate.js +394 -0
  221. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  222. package/dist/src/capabilities/sources/status.render.js +64 -0
  223. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  224. package/dist/src/capabilities/sources/status.verb.js +40 -0
  225. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  226. package/dist/src/capabilities/sources/types.js +6 -0
  227. package/dist/src/capabilities/sources/types.js.map +1 -0
  228. package/dist/src/capabilities/sources/update.render.js +34 -0
  229. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  230. package/dist/src/capabilities/sources/update.verb.js +55 -0
  231. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  232. package/dist/src/capabilities/upgrade/index.js +5 -0
  233. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  234. package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
  235. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  236. package/dist/src/capabilities/upgrade/types.js +5 -0
  237. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  238. package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
  239. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  240. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  241. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  242. package/dist/src/capabilities/version/index.js +10 -0
  243. package/dist/src/capabilities/version/index.js.map +1 -0
  244. package/dist/src/capabilities/version/version.verb.js +36 -0
  245. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  246. package/dist/src/constants.js +82 -0
  247. package/dist/src/constants.js.map +1 -0
  248. package/dist/src/index.js +12 -0
  249. package/dist/src/index.js.map +1 -0
  250. package/dist/src/kernel/completion/complete.js +66 -0
  251. package/dist/src/kernel/completion/complete.js.map +1 -0
  252. package/dist/src/kernel/completion/emitScripts.js +92 -0
  253. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  254. package/dist/src/kernel/completion/entitySource.js +285 -0
  255. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  256. package/dist/src/kernel/completion/index.js +14 -0
  257. package/dist/src/kernel/completion/index.js.map +1 -0
  258. package/dist/src/kernel/completion/model.js +301 -0
  259. package/dist/src/kernel/completion/model.js.map +1 -0
  260. package/dist/src/kernel/completion/parse.js +253 -0
  261. package/dist/src/kernel/completion/parse.js.map +1 -0
  262. package/dist/src/kernel/completion/rank.js +101 -0
  263. package/dist/src/kernel/completion/rank.js.map +1 -0
  264. package/dist/src/kernel/completion/resolve.js +100 -0
  265. package/dist/src/kernel/completion/resolve.js.map +1 -0
  266. package/dist/src/kernel/completion/templates/bash.js +209 -0
  267. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  268. package/dist/src/kernel/completion/templates/fish.js +214 -0
  269. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  270. package/dist/src/kernel/completion/templates/index.js +23 -0
  271. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  272. package/dist/src/kernel/completion/templates/shared.js +98 -0
  273. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  274. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  275. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  276. package/dist/src/kernel/completion/types.js +13 -0
  277. package/dist/src/kernel/completion/types.js.map +1 -0
  278. package/dist/src/kernel/config/defaults.js +17 -0
  279. package/dist/src/kernel/config/defaults.js.map +1 -0
  280. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  281. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  282. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  283. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  284. package/dist/src/kernel/config/firstRun.js +34 -0
  285. package/dist/src/kernel/config/firstRun.js.map +1 -0
  286. package/dist/src/kernel/config/globalConfig.js +79 -0
  287. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  288. package/dist/src/kernel/config/index.js +16 -0
  289. package/dist/src/kernel/config/index.js.map +1 -0
  290. package/dist/src/kernel/config/paths.js +35 -0
  291. package/dist/src/kernel/config/paths.js.map +1 -0
  292. package/dist/src/kernel/config/readConfig.js +78 -0
  293. package/dist/src/kernel/config/readConfig.js.map +1 -0
  294. package/dist/src/kernel/config/schema.js +130 -0
  295. package/dist/src/kernel/config/schema.js.map +1 -0
  296. package/dist/src/kernel/config/types.js +19 -0
  297. package/dist/src/kernel/config/types.js.map +1 -0
  298. package/dist/src/kernel/config/writeConfigField.js +59 -0
  299. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  300. package/dist/src/kernel/copy.js +43 -0
  301. package/dist/src/kernel/copy.js.map +1 -0
  302. package/dist/src/kernel/error/PragmaError.js +149 -0
  303. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  304. package/dist/src/kernel/error/constants.js +40 -0
  305. package/dist/src/kernel/error/constants.js.map +1 -0
  306. package/dist/src/kernel/error/fromTaskError.js +96 -0
  307. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  308. package/dist/src/kernel/error/index.js +13 -0
  309. package/dist/src/kernel/error/index.js.map +1 -0
  310. package/dist/src/kernel/error/recovery.js +52 -0
  311. package/dist/src/kernel/error/recovery.js.map +1 -0
  312. package/dist/src/kernel/error/renderError.js +115 -0
  313. package/dist/src/kernel/error/renderError.js.map +1 -0
  314. package/dist/src/kernel/error/serialize.js +25 -0
  315. package/dist/src/kernel/error/serialize.js.map +1 -0
  316. package/dist/src/kernel/error/types.js +9 -0
  317. package/dist/src/kernel/error/types.js.map +1 -0
  318. package/dist/src/kernel/index.js +25 -0
  319. package/dist/src/kernel/index.js.map +1 -0
  320. package/dist/src/kernel/packs/collect.js +187 -0
  321. package/dist/src/kernel/packs/collect.js.map +1 -0
  322. package/dist/src/kernel/packs/compile.js +304 -0
  323. package/dist/src/kernel/packs/compile.js.map +1 -0
  324. package/dist/src/kernel/packs/disclosure.js +76 -0
  325. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  326. package/dist/src/kernel/packs/glob.js +38 -0
  327. package/dist/src/kernel/packs/glob.js.map +1 -0
  328. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  329. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  330. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  331. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  332. package/dist/src/kernel/packs/graphql/index.js +20 -0
  333. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  334. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  335. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  336. package/dist/src/kernel/packs/index.js +34 -0
  337. package/dist/src/kernel/packs/index.js.map +1 -0
  338. package/dist/src/kernel/packs/iri.js +110 -0
  339. package/dist/src/kernel/packs/iri.js.map +1 -0
  340. package/dist/src/kernel/packs/renderPack.js +129 -0
  341. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  342. package/dist/src/kernel/packs/resolveEntity.js +223 -0
  343. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  344. package/dist/src/kernel/packs/runBodies.js +87 -0
  345. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  346. package/dist/src/kernel/packs/sample.js +56 -0
  347. package/dist/src/kernel/packs/sample.js.map +1 -0
  348. package/dist/src/kernel/packs/schema.js +369 -0
  349. package/dist/src/kernel/packs/schema.js.map +1 -0
  350. package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
  351. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  352. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  353. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  354. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
  355. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  356. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  357. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  358. package/dist/src/kernel/packs/sparql/index.js +31 -0
  359. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  360. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  361. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  362. package/dist/src/kernel/packs/types.js +30 -0
  363. package/dist/src/kernel/packs/types.js.map +1 -0
  364. package/dist/src/kernel/packs/uniqueness.js +30 -0
  365. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  366. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  367. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  368. package/dist/src/kernel/project/cli/constants.js +27 -0
  369. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  370. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  371. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  372. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  373. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  374. package/dist/src/kernel/project/cli/globalFlags.js +216 -0
  375. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  376. package/dist/src/kernel/project/cli/helpFormat.js +59 -0
  377. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  378. package/dist/src/kernel/project/cli/index.js +14 -0
  379. package/dist/src/kernel/project/cli/index.js.map +1 -0
  380. package/dist/src/kernel/project/cli/rootHelp.js +197 -0
  381. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  382. package/dist/src/kernel/project/cli/suggest.js +75 -0
  383. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  384. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  385. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  386. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  387. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  388. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  389. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  390. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  391. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  392. package/dist/src/kernel/project/mcp/index.js +8 -0
  393. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  394. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  395. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  396. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  397. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  398. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  399. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  401. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  403. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
  405. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/serve.js +35 -0
  407. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  408. package/dist/src/kernel/render/compactUri.js +24 -0
  409. package/dist/src/kernel/render/compactUri.js.map +1 -0
  410. package/dist/src/kernel/render/contracts.js +10 -0
  411. package/dist/src/kernel/render/contracts.js.map +1 -0
  412. package/dist/src/kernel/render/disclosure.js +34 -0
  413. package/dist/src/kernel/render/disclosure.js.map +1 -0
  414. package/dist/src/kernel/render/envelope.js +30 -0
  415. package/dist/src/kernel/render/envelope.js.map +1 -0
  416. package/dist/src/kernel/render/formatters.js +27 -0
  417. package/dist/src/kernel/render/formatters.js.map +1 -0
  418. package/dist/src/kernel/render/index.js +15 -0
  419. package/dist/src/kernel/render/index.js.map +1 -0
  420. package/dist/src/kernel/render/prefixes.js +46 -0
  421. package/dist/src/kernel/render/prefixes.js.map +1 -0
  422. package/dist/src/kernel/render/renderers.js +468 -0
  423. package/dist/src/kernel/render/renderers.js.map +1 -0
  424. package/dist/src/kernel/render/style.js +85 -0
  425. package/dist/src/kernel/render/style.js.map +1 -0
  426. package/dist/src/kernel/render/turtle.js +194 -0
  427. package/dist/src/kernel/render/turtle.js.map +1 -0
  428. package/dist/src/kernel/render/writeStdout.js +43 -0
  429. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  430. package/dist/src/kernel/runtime/boot.js +49 -0
  431. package/dist/src/kernel/runtime/boot.js.map +1 -0
  432. package/dist/src/kernel/runtime/facade.js +39 -0
  433. package/dist/src/kernel/runtime/facade.js.map +1 -0
  434. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  435. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  436. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  437. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  438. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  439. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  440. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  441. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  442. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  443. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  444. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  445. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  446. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  447. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  449. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  451. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  453. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  455. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  457. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  459. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  460. package/dist/src/kernel/runtime/index.js +8 -0
  461. package/dist/src/kernel/runtime/index.js.map +1 -0
  462. package/dist/src/kernel/runtime/loadSession.js +34 -0
  463. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  464. package/dist/src/kernel/runtime/paths.js +78 -0
  465. package/dist/src/kernel/runtime/paths.js.map +1 -0
  466. package/dist/src/kernel/runtime/probe.js +37 -0
  467. package/dist/src/kernel/runtime/probe.js.map +1 -0
  468. package/dist/src/kernel/runtime/readEntity.js +363 -0
  469. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  470. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  471. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  472. package/dist/src/kernel/runtime/refs/index.js +29 -0
  473. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  474. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  475. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  476. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  477. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  478. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  479. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  480. package/dist/src/kernel/runtime/store.js +75 -0
  481. package/dist/src/kernel/runtime/store.js.map +1 -0
  482. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  483. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  484. package/dist/src/kernel/runtime/types.js +11 -0
  485. package/dist/src/kernel/runtime/types.js.map +1 -0
  486. package/dist/src/kernel/spec/asVerb.js +21 -0
  487. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  488. package/dist/src/kernel/spec/emitReference.js +578 -0
  489. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  490. package/dist/src/kernel/spec/emitSurface.js +202 -0
  491. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  492. package/dist/src/kernel/spec/index.js +11 -0
  493. package/dist/src/kernel/spec/index.js.map +1 -0
  494. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  495. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  496. package/dist/src/kernel/spec/types.js +14 -0
  497. package/dist/src/kernel/spec/types.js.map +1 -0
  498. package/dist/src/kernel/spec/validate.js +110 -0
  499. package/dist/src/kernel/spec/validate.js.map +1 -0
  500. package/dist/src/kernel/vocabulary.js +97 -0
  501. package/dist/src/kernel/vocabulary.js.map +1 -0
  502. package/dist/src/types.js +11 -0
  503. package/dist/src/types.js.map +1 -0
  504. package/package.json +25 -24
  505. package/pragma.conf.ts +853 -0
  506. package/src/bin.ts +276 -82
  507. package/src/capabilities/block.parity.test.ts +253 -0
  508. package/src/capabilities/capabilities/capabilities.render.ts +4 -3
  509. package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
  510. package/src/capabilities/capabilities/catalog.ts +20 -12
  511. package/src/capabilities/capabilities/hints.ts +43 -24
  512. package/src/capabilities/capabilities/index.ts +1 -1
  513. package/src/capabilities/colophon/collectColophon.ts +50 -24
  514. package/src/capabilities/colophon/colophon.render.ts +25 -1
  515. package/src/capabilities/colophon/colophon.test.ts +42 -21
  516. package/src/capabilities/colophon/colophon.verb.ts +9 -5
  517. package/src/capabilities/colophon/types.ts +16 -7
  518. package/src/capabilities/config/collectConfigShow.test.ts +58 -0
  519. package/src/capabilities/config/collectConfigShow.ts +43 -6
  520. package/src/capabilities/config/field.render.ts +4 -5
  521. package/src/capabilities/config/fields.ts +17 -37
  522. package/src/capabilities/config/get.verb.ts +70 -0
  523. package/src/capabilities/config/getUnset.test.ts +264 -0
  524. package/src/capabilities/config/index.ts +5 -1
  525. package/src/capabilities/config/runField.ts +40 -22
  526. package/src/capabilities/config/runGet.ts +34 -0
  527. package/src/capabilities/config/runSet.ts +35 -9
  528. package/src/capabilities/config/set.test.ts +48 -14
  529. package/src/capabilities/config/set.verb.ts +14 -9
  530. package/src/capabilities/config/show.render.test.ts +77 -5
  531. package/src/capabilities/config/show.render.ts +8 -13
  532. package/src/capabilities/config/show.verb.ts +13 -9
  533. package/src/capabilities/config/types.ts +26 -4
  534. package/src/capabilities/config/unset.verb.ts +58 -0
  535. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  536. package/src/capabilities/create/byteEquality.test.ts +95 -103
  537. package/src/capabilities/create/cliProjection.ts +227 -0
  538. package/src/capabilities/create/constants.ts +50 -0
  539. package/src/capabilities/create/create.mcp.test.ts +91 -7
  540. package/src/capabilities/create/create.render.ts +71 -7
  541. package/src/capabilities/create/create.test.ts +523 -162
  542. package/src/capabilities/create/create.verb.ts +361 -321
  543. package/src/capabilities/create/createGrammar.test.ts +865 -0
  544. package/src/capabilities/create/createHelp.ts +71 -0
  545. package/src/capabilities/create/createSurface.generated.ts +400 -0
  546. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  547. package/src/capabilities/create/cwdJail.test.ts +24 -5
  548. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  549. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  550. package/src/capabilities/create/index.ts +9 -14
  551. package/src/capabilities/create/messages.ts +18 -0
  552. package/src/capabilities/create/mount.ts +391 -0
  553. package/src/capabilities/create/pathJail.test.ts +90 -0
  554. package/src/capabilities/create/pathJail.ts +8 -5
  555. package/src/capabilities/create/pickGenerator.ts +40 -46
  556. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  557. package/src/capabilities/create/types.ts +29 -5
  558. package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
  559. package/src/capabilities/distribution.test.ts +122 -0
  560. package/src/capabilities/distribution.ts +54 -0
  561. package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
  562. package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
  563. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
  564. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
  565. package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
  566. package/src/capabilities/doctor/checks/index.ts +27 -0
  567. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  568. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  569. package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
  570. package/src/capabilities/doctor/doctor.render.test.ts +24 -13
  571. package/src/capabilities/doctor/doctor.render.ts +45 -20
  572. package/src/capabilities/doctor/doctor.test.ts +158 -40
  573. package/src/capabilities/doctor/doctor.verb.ts +9 -5
  574. package/src/capabilities/doctor/runChecks.ts +65 -66
  575. package/src/capabilities/doctor/types.ts +21 -5
  576. package/src/capabilities/emptyRecovery.test.ts +44 -22
  577. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  578. package/src/capabilities/graph/index.ts +1 -1
  579. package/src/capabilities/graph/inspect.render.ts +70 -22
  580. package/src/capabilities/graph/inspect.test.ts +260 -5
  581. package/src/capabilities/graph/inspect.verb.ts +18 -5
  582. package/src/capabilities/graph/query.render.ts +15 -3
  583. package/src/capabilities/graph/query.verb.ts +5 -4
  584. package/src/capabilities/graph/runQuery.ts +9 -7
  585. package/src/capabilities/index.ts +25 -19
  586. package/src/capabilities/info/collectInfo.ts +15 -10
  587. package/src/capabilities/info/info.render.ts +4 -3
  588. package/src/capabilities/info/info.verb.ts +4 -3
  589. package/src/capabilities/lazy.test.ts +125 -2
  590. package/src/capabilities/meta/complete.verb.ts +1 -1
  591. package/src/capabilities/meta/index.ts +1 -1
  592. package/src/capabilities/meta/mcp.verb.ts +10 -8
  593. package/src/capabilities/ontology/index.ts +15 -11
  594. package/src/capabilities/ontology/ontology.test.ts +6 -55
  595. package/src/capabilities/ontology/queries.ts +2 -2
  596. package/src/capabilities/ontology/render.ts +3 -4
  597. package/src/capabilities/ontology/verbs.ts +42 -83
  598. package/src/capabilities/prompt/index.ts +2 -2
  599. package/src/capabilities/prompt/prompt.render.ts +6 -2
  600. package/src/capabilities/prompt/prompt.test.ts +12 -6
  601. package/src/capabilities/prompt/types.ts +1 -1
  602. package/src/capabilities/prompt/verbs.ts +26 -14
  603. package/src/capabilities/reference.test.ts +63 -0
  604. package/src/capabilities/resources/provider.ts +367 -91
  605. package/src/capabilities/resources/resources.test.ts +411 -59
  606. package/src/capabilities/setup/buildPlan.ts +236 -0
  607. package/src/capabilities/setup/index.ts +7 -7
  608. package/src/capabilities/setup/mode.ts +74 -0
  609. package/src/capabilities/setup/operations/index.ts +74 -0
  610. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  611. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  612. package/src/capabilities/setup/operations/setupGenerator.ts +397 -320
  613. package/src/capabilities/setup/operations/setupLsp.ts +329 -68
  614. package/src/capabilities/setup/operations/setupMcp.ts +137 -97
  615. package/src/capabilities/setup/operations/setupSkills.ts +336 -108
  616. package/src/capabilities/setup/plan.render.ts +241 -0
  617. package/src/capabilities/setup/plan.ts +236 -0
  618. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  619. package/src/capabilities/setup/setup.render.test.ts +281 -73
  620. package/src/capabilities/setup/setup.render.ts +45 -77
  621. package/src/capabilities/setup/setup.test.ts +972 -209
  622. package/src/capabilities/setup/setup.verb.ts +233 -74
  623. package/src/capabilities/setup/shell.test.ts +86 -0
  624. package/src/capabilities/setup/shell.ts +166 -14
  625. package/src/capabilities/setup/targets.ts +367 -0
  626. package/src/capabilities/setup/types.ts +18 -57
  627. package/src/capabilities/shared/assertExecOk.ts +68 -10
  628. package/src/capabilities/shared/index.ts +32 -0
  629. package/src/capabilities/shared/packageManager.test.ts +55 -0
  630. package/src/capabilities/shared/packageManager.ts +62 -6
  631. package/src/capabilities/skill/discover.ts +47 -9
  632. package/src/capabilities/skill/index.ts +1 -1
  633. package/src/capabilities/skill/render.ts +14 -14
  634. package/src/capabilities/skill/skill.test.ts +7 -5
  635. package/src/capabilities/skill/verbs.ts +9 -10
  636. package/src/capabilities/sources/collectStatus.ts +61 -51
  637. package/src/capabilities/sources/index.ts +2 -2
  638. package/src/capabilities/sources/installSkills.ts +86 -9
  639. package/src/capabilities/sources/runUpdate.ts +164 -141
  640. package/src/capabilities/sources/sources.test.ts +265 -119
  641. package/src/capabilities/sources/status.render.test.ts +53 -24
  642. package/src/capabilities/sources/status.render.ts +25 -30
  643. package/src/capabilities/sources/status.verb.ts +16 -9
  644. package/src/capabilities/sources/types.ts +18 -25
  645. package/src/capabilities/sources/update.render.ts +10 -3
  646. package/src/capabilities/sources/update.verb.ts +13 -24
  647. package/src/capabilities/surface.test.ts +165 -25
  648. package/src/capabilities/tier.parity.test.ts +144 -0
  649. package/src/capabilities/upgrade/runUpgrade.ts +8 -8
  650. package/src/capabilities/upgrade/upgrade.render.ts +4 -5
  651. package/src/capabilities/upgrade/upgrade.test.ts +3 -3
  652. package/src/capabilities/upgrade/upgrade.verb.ts +8 -4
  653. package/src/capabilities/version/index.ts +12 -0
  654. package/src/capabilities/version/version.test.ts +66 -0
  655. package/src/capabilities/version/version.verb.ts +39 -0
  656. package/src/constants.test.ts +8 -6
  657. package/src/constants.ts +78 -22
  658. package/src/identity.test.ts +348 -0
  659. package/src/index.ts +2 -2
  660. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
  661. package/src/kernel/completion/complete.test.ts +12 -2
  662. package/src/kernel/completion/complete.ts +1 -1
  663. package/src/kernel/completion/emitScripts.test.ts +1 -1
  664. package/src/kernel/completion/emitScripts.ts +5 -3
  665. package/src/kernel/completion/entitySource.test.ts +185 -41
  666. package/src/kernel/completion/entitySource.ts +133 -110
  667. package/src/kernel/completion/model.test.ts +165 -13
  668. package/src/kernel/completion/model.ts +105 -14
  669. package/src/kernel/completion/parse.test.ts +4 -7
  670. package/src/kernel/completion/parse.ts +15 -0
  671. package/src/kernel/completion/resolve.test.ts +0 -1
  672. package/src/kernel/completion/safety.test.ts +104 -50
  673. package/src/kernel/completion/shellDrive.test.ts +611 -0
  674. package/src/kernel/completion/templates/bash.ts +7 -2
  675. package/src/kernel/completion/templates/fish.ts +28 -6
  676. package/src/kernel/completion/templates/index.ts +23 -0
  677. package/src/kernel/completion/types.ts +10 -3
  678. package/src/kernel/config/defaults.test.ts +108 -0
  679. package/src/kernel/config/defaults.ts +13 -23
  680. package/src/kernel/config/evaluateProjectConfig.ts +33 -11
  681. package/src/kernel/config/findProjectConfig.ts +4 -3
  682. package/src/kernel/config/firstRun.test.ts +44 -38
  683. package/src/kernel/config/firstRun.ts +24 -81
  684. package/src/kernel/config/globalConfig.ts +2 -2
  685. package/src/kernel/config/index.ts +5 -6
  686. package/src/kernel/config/paths.ts +17 -17
  687. package/src/kernel/config/readConfig.test.ts +246 -7
  688. package/src/kernel/config/readConfig.ts +8 -8
  689. package/src/kernel/config/schema.test.ts +50 -0
  690. package/src/kernel/config/schema.ts +100 -11
  691. package/src/kernel/config/types.ts +75 -19
  692. package/src/kernel/copy.test.ts +483 -0
  693. package/src/kernel/copy.ts +54 -0
  694. package/src/kernel/error/PragmaError.test.ts +6 -3
  695. package/src/kernel/error/PragmaError.ts +4 -2
  696. package/src/kernel/error/constants.ts +7 -4
  697. package/src/kernel/error/fromTaskError.ts +28 -6
  698. package/src/kernel/error/index.ts +1 -1
  699. package/src/kernel/error/recovery.test.ts +22 -45
  700. package/src/kernel/error/recovery.ts +36 -27
  701. package/src/kernel/error/renderError.ts +42 -1
  702. package/src/kernel/error/types.ts +25 -4
  703. package/src/kernel/index.ts +26 -0
  704. package/src/kernel/packs/collect.test.ts +195 -11
  705. package/src/kernel/packs/collect.ts +212 -61
  706. package/src/kernel/packs/compile.test.ts +293 -8
  707. package/src/kernel/packs/compile.ts +108 -15
  708. package/src/kernel/packs/disclosure.test.ts +5 -2
  709. package/src/kernel/packs/disclosure.ts +2 -2
  710. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  711. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
  712. package/src/kernel/packs/graphql/index.ts +20 -0
  713. package/src/kernel/packs/graphqlSource.test.ts +6 -3
  714. package/src/kernel/packs/index.ts +40 -0
  715. package/src/kernel/packs/iri.test.ts +73 -0
  716. package/src/kernel/packs/iri.ts +70 -20
  717. package/src/kernel/packs/renderPack.ts +28 -7
  718. package/src/kernel/packs/resolveEntity.test.ts +213 -0
  719. package/src/kernel/packs/resolveEntity.ts +132 -34
  720. package/src/kernel/packs/runBodies.ts +16 -16
  721. package/src/kernel/packs/sample.ts +1 -1
  722. package/src/kernel/packs/schema.ts +114 -11
  723. package/src/kernel/packs/sparql/applyFilters.ts +16 -17
  724. package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
  725. package/src/kernel/packs/sparql/index.ts +37 -0
  726. package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
  727. package/src/kernel/packs/sparql/runSelect.ts +75 -37
  728. package/src/kernel/packs/toolDescription.test.ts +52 -5
  729. package/src/kernel/packs/types.ts +52 -4
  730. package/src/kernel/packs/uniqueness.ts +5 -5
  731. package/src/kernel/project/cli/buildProgram.test.ts +157 -17
  732. package/src/kernel/project/cli/buildProgram.ts +77 -18
  733. package/src/kernel/project/cli/constants.ts +34 -0
  734. package/src/kernel/project/cli/dispatch.test.ts +227 -3
  735. package/src/kernel/project/cli/dispatch.ts +250 -48
  736. package/src/kernel/project/cli/exitCodes.ts +1 -1
  737. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  738. package/src/kernel/project/cli/globalFlags.ts +130 -30
  739. package/src/kernel/project/cli/helpFormat.ts +14 -1
  740. package/src/kernel/project/cli/rootHelp.ts +140 -111
  741. package/src/kernel/project/cli/suggest.test.ts +33 -1
  742. package/src/kernel/project/cli/suggest.ts +25 -1
  743. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  744. package/src/kernel/project/cli/verbHelp.ts +23 -7
  745. package/src/kernel/project/mcp/buildServer.ts +18 -10
  746. package/src/kernel/project/mcp/envelope.ts +2 -2
  747. package/src/kernel/project/mcp/instructions.ts +12 -7
  748. package/src/kernel/project/mcp/mcpError.ts +1 -1
  749. package/src/kernel/project/mcp/parity.test.ts +42 -1
  750. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  751. package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
  752. package/src/kernel/project/mcp/prompts/provider.ts +22 -8
  753. package/src/kernel/project/mcp/prompts/source.ts +69 -68
  754. package/src/kernel/project/mcp/registerVerb.ts +56 -11
  755. package/src/kernel/project/mcp/serve.ts +13 -5
  756. package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
  757. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  758. package/src/kernel/render/contracts.ts +21 -0
  759. package/src/kernel/render/disclosure.ts +4 -2
  760. package/src/kernel/render/envelope.ts +2 -3
  761. package/src/kernel/render/formatters.ts +1 -1
  762. package/src/kernel/render/prefixes.test.ts +36 -0
  763. package/src/kernel/render/prefixes.ts +40 -13
  764. package/src/kernel/render/renderers.test.ts +244 -7
  765. package/src/kernel/render/renderers.ts +222 -20
  766. package/src/kernel/render/style.test.ts +75 -24
  767. package/src/kernel/render/style.ts +31 -1
  768. package/src/kernel/render/turtle.ts +222 -0
  769. package/src/kernel/runtime/graphpack/build.ts +29 -3
  770. package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
  771. package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
  772. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
  773. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
  775. package/src/kernel/runtime/graphpack/embedded.ts +39 -13
  776. package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
  777. package/src/kernel/runtime/graphpack/hash.ts +3 -2
  778. package/src/kernel/runtime/graphpack/index.ts +1 -1
  779. package/src/kernel/runtime/graphpack/manifest.ts +114 -12
  780. package/src/kernel/runtime/graphpack/read.ts +5 -11
  781. package/src/kernel/runtime/graphpack/schemas.ts +74 -0
  782. package/src/kernel/runtime/graphpack/stories.ts +84 -0
  783. package/src/kernel/runtime/graphpack/types.ts +61 -48
  784. package/src/kernel/runtime/loadSession.ts +1 -1
  785. package/src/kernel/runtime/paths.ts +64 -15
  786. package/src/kernel/runtime/probe.test.ts +8 -4
  787. package/src/kernel/runtime/probe.ts +6 -6
  788. package/src/kernel/runtime/readEntity.ts +477 -32
  789. package/src/kernel/runtime/refs/gitOps.ts +1 -19
  790. package/src/kernel/runtime/refs/index.ts +39 -0
  791. package/src/kernel/runtime/refs/parseRef.ts +8 -8
  792. package/src/kernel/runtime/refs/resolve.ts +82 -66
  793. package/src/kernel/runtime/resolveSources.test.ts +63 -24
  794. package/src/kernel/runtime/resolveSources.ts +36 -25
  795. package/src/kernel/runtime/storeReadiness.ts +10 -10
  796. package/src/kernel/runtime/storeless.test.ts +1 -1
  797. package/src/kernel/runtime/types.ts +15 -1
  798. package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
  799. package/src/kernel/spec/emitReference.test.ts +3 -3
  800. package/src/kernel/spec/emitReference.ts +242 -34
  801. package/src/kernel/spec/emitSurface.ts +57 -11
  802. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  803. package/src/kernel/spec/surfaceConformance.ts +8 -0
  804. package/src/kernel/spec/types.ts +277 -13
  805. package/src/kernel/spec/validate.ts +2 -1
  806. package/src/kernel/vocabulary.test.ts +164 -0
  807. package/src/kernel/vocabulary.ts +146 -0
  808. package/src/testing/PARITY_GAPS.ts +8 -2
  809. package/src/testing/behavioral/README.md +3 -3
  810. package/src/testing/behavioral/completion.test.ts +19 -6
  811. package/src/testing/behavioral/docExamples.test.ts +14 -0
  812. package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
  813. package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
  814. package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
  815. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  816. package/src/testing/behavioral/harness.foundation.test.ts +14 -5
  817. package/src/testing/behavioral/journeys.cli.test.ts +117 -76
  818. package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
  819. package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
  820. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  821. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  822. package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +9 -6
  823. package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
  824. package/src/testing/behavioral/liveReadSurface.ts +4 -3
  825. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  826. package/src/testing/behavioral/mcpSurface.test.ts +10 -5
  827. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  828. package/src/testing/behavioral/staleCommands.test.ts +10 -0
  829. package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
  830. package/src/testing/eval/cases/assembly.ts +13 -6
  831. package/src/testing/eval/cases/effectful.ts +28 -15
  832. package/src/testing/eval/cases/readNouns.ts +22 -20
  833. package/src/testing/eval/cases/stable.ts +5 -1
  834. package/src/testing/eval/eval.test.ts +7 -1
  835. package/src/testing/fixtures/blockGraph.ts +79 -0
  836. package/src/testing/fixtures/fixtureCapability.ts +45 -1
  837. package/src/testing/fixtures/graph/canonical.ts +94 -5
  838. package/src/testing/fixtures/graph/defaultPack.ts +7 -6
  839. package/src/testing/fixtures/graph/owlExport.ts +7 -5
  840. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  841. package/src/testing/helpers/fixtureGraph.ts +33 -16
  842. package/src/testing/helpers/packRuntime.ts +2 -3
  843. package/src/testing/helpers/projectCli.ts +2 -1
  844. package/src/testing/helpers/projectMcp.ts +38 -6
  845. package/src/testing/helpers/runCli.ts +35 -18
  846. package/src/testing/perf/budgets.test.ts +24 -9
  847. package/src/testing/perf/budgets.ts +76 -12
  848. package/src/testing/perf/codegen.test.ts +126 -0
  849. package/src/testing/perf/globalSetup.test.ts +286 -0
  850. package/src/testing/perf/globalSetup.ts +611 -14
  851. package/src/testing/perf/measure.test.ts +38 -0
  852. package/src/testing/perf/measure.ts +23 -4
  853. package/src/testing/setupXdgIsolation.ts +81 -21
  854. package/src/testing/tempRoot.globalSetup.ts +122 -0
  855. package/src/types.ts +2 -2
  856. package/dist/pragma +0 -0
  857. package/src/capabilities/block/blockList.test.ts +0 -79
  858. package/src/capabilities/block/blockList.verb.ts +0 -163
  859. package/src/capabilities/block/index.ts +0 -25
  860. package/src/capabilities/block/pack.ts +0 -166
  861. package/src/capabilities/block/parity.test.ts +0 -187
  862. package/src/capabilities/block/tierChain.ts +0 -78
  863. package/src/capabilities/colophon/pragmaColophon.ts +0 -66
  864. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
  865. package/src/capabilities/create/templates.embedded.generated.ts +0 -53
  866. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
  867. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  868. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
  869. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
  870. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  871. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  872. package/src/capabilities/modifier/index.ts +0 -15
  873. package/src/capabilities/modifier/pack.ts +0 -64
  874. package/src/capabilities/standard/index.ts +0 -18
  875. package/src/capabilities/standard/pack.ts +0 -128
  876. package/src/capabilities/tier/index.ts +0 -19
  877. package/src/capabilities/tier/lookup.render.test.ts +0 -72
  878. package/src/capabilities/tier/lookup.render.ts +0 -59
  879. package/src/capabilities/tier/lookup.test.ts +0 -83
  880. package/src/capabilities/tier/lookup.verb.ts +0 -44
  881. package/src/capabilities/tier/pack.ts +0 -28
  882. package/src/capabilities/tier/runLookup.ts +0 -87
  883. package/src/capabilities/token/addConfig.render.ts +0 -27
  884. package/src/capabilities/token/addConfig.test.ts +0 -62
  885. package/src/capabilities/token/addConfig.verb.ts +0 -40
  886. package/src/capabilities/token/index.ts +0 -19
  887. package/src/capabilities/token/pack.ts +0 -58
  888. package/src/capabilities/token/runAddConfig.ts +0 -95
  889. package/src/kernel/completion/bashDrive.test.ts +0 -73
  890. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
  891. package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
  892. package/src/kernel/runtime/lock.ts +0 -90
@@ -8,7 +8,9 @@
8
8
  * via a command substitution — fish treats substitution results as literal
9
9
  * candidates (split on newlines, never evaluated). Each name rule ANDs a
10
10
  * `__<bin>_minchars` guard into its condition, so the exec waits for `minChars`
11
- * typed chars. No `eval`, no backticks.
11
+ * typed chars, and a name-source POSITIONAL also ANDs `__<bin>_notflag` — fish
12
+ * evaluates every matching rule rather than one exclusive branch, so without it
13
+ * a structural `--<TAB>` would spawn the delegate too. No `eval`, no backticks.
12
14
  *
13
15
  * Static-tier coarseness (the resolver is exact): positional value rules are
14
16
  * not index-gated, and a mixed self-verb + sub-verb noun only offers its
@@ -23,6 +25,11 @@ function fnBase(binName: string): string {
23
25
  return `__${binName.replace(/[^A-Za-z0-9_]/g, "_")}`;
24
26
  }
25
27
 
28
+ /** AND a guard into a rule's condition (or start one with it). */
29
+ function and(condition: string | undefined, guard: string): string {
30
+ return condition ? `${condition}; and ${guard}` : guard;
31
+ }
32
+
26
33
  /** AND a `minChars` guard into a name rule's condition (or start one). */
27
34
  function withMinChars(
28
35
  fn: string,
@@ -30,8 +37,7 @@ function withMinChars(
30
37
  minChars: number,
31
38
  ): string | undefined {
32
39
  if (minChars <= 0) return condition;
33
- const guard = `${fn}_minchars ${minChars}`;
34
- return condition ? `${condition}; and ${guard}` : guard;
40
+ return and(condition, `${fn}_minchars ${minChars}`);
35
41
  }
36
42
 
37
43
  /** The rule fragment completing one flag of a view (or a global flag). */
@@ -93,9 +99,20 @@ function positionalRule(
93
99
  if (positional.source.kind === "names") names = true;
94
100
  if (positional.source.kind === "files") files = true;
95
101
  }
96
- // A name source gates its exec on `minChars`; a values/files positional keeps
97
- // the bare position condition so it still completes on bare TAB.
98
- const cond = names ? withMinChars(fn, condition, minChars) : condition;
102
+ // A name source gates its exec on `minChars` AND on the current token not
103
+ // being a flag; a values/files positional keeps the bare position condition
104
+ // so it still completes on bare TAB.
105
+ //
106
+ // The `_notflag` half is what keeps a purely STRUCTURAL `--<TAB>` free of
107
+ // exec. fish evaluates every `complete` rule matching a position, so without
108
+ // it this positional rule fires alongside the flag-name rules the moment the
109
+ // token clears `minChars` — and `--` is two characters. That cost a process
110
+ // spawn per TAB on a flag name AND put the delegate's answer in the user's
111
+ // candidate list. bash and zsh route the same context through one exclusive
112
+ // `case` arm and exec nothing; this is how fish joins them.
113
+ const cond = names
114
+ ? withMinChars(fn, and(condition, `${fn}_notflag`), minChars)
115
+ : condition;
99
116
  const parts = [`complete -c ${binName} -n "${cond}"`];
100
117
  if (names) {
101
118
  parts.push(`-a "(${binName} __complete -- (${fn}_words) 2>/dev/null)"`);
@@ -147,6 +164,11 @@ export function fishScript(
147
164
  "end",
148
165
  ]
149
166
  : []),
167
+ // True when the token being completed is not a flag, so a name-source
168
+ // positional rule stays out of a structural `--<TAB>`.
169
+ `function ${fn}_notflag`,
170
+ " not string match -q -- '-*' (commandline -ct)",
171
+ "end",
150
172
  `function ${fn}_at`,
151
173
  " set -l cmd (commandline -opc)",
152
174
  " set -l noun ''",
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The static shell-completion templates — one emitter per shell, all fed by
3
+ * the same completion model.
4
+ *
5
+ * The three exports are the domain: each takes the model and returns the text
6
+ * of a script `setup completions` writes to disk. They are grouped because
7
+ * they are interchangeable answers to one question — which shell is this — and
8
+ * because they must stay in step: a fact the model carries has to be
9
+ * expressible in all three, so a change to one is a change to all three.
10
+ *
11
+ * What the barrel does NOT expose is the rendering layer underneath
12
+ * (`shared.ts`): the per-verb views, the token allowlist re-assertion, the
13
+ * name/flag list derivations. Those exist so the scripts cannot disagree about
14
+ * structure, and they are safe only in the emit context they were built for —
15
+ * every token they return has been re-checked against the safety allowlist on
16
+ * its way into script text. Offering them across the domain boundary would
17
+ * offer a way to compose that text without that check, which is the one thing
18
+ * this domain exists to make impossible.
19
+ */
20
+
21
+ export { bashScript } from "./bash.js";
22
+ export { fishScript } from "./fish.js";
23
+ export { zshScript } from "./zsh.js";
@@ -26,7 +26,7 @@ export type CompletionSource =
26
26
  /** A closed value set (enum params) — inlined by the static tier. */
27
27
  | { readonly kind: "values"; readonly values: readonly string[] }
28
28
  /**
29
- * Names of a storeless source (index/skills/tiers/prompts/prefixes) — the
29
+ * Names of a storeless source (index/skills/prefixes) — the
30
30
  * dynamic tier reads them via the seam and ranks them with `match`/case. The
31
31
  * static scripts exec `__complete` for every name source, one code path.
32
32
  */
@@ -77,6 +77,13 @@ export interface VerbEntry {
77
77
  readonly flags: readonly FlagEntry[];
78
78
  /** The verb's positionals, in declared order. */
79
79
  readonly positionals: readonly PositionalEntry[];
80
+ /**
81
+ * Segment pseudo-verbs beneath this verb (a module-mounted subtree, from
82
+ * `CapabilityModule.cliProjection.completionChildren`), each with its own
83
+ * flags/positionals/children. The parse walk descends into a matching
84
+ * child before flag/positional resolution.
85
+ */
86
+ readonly children?: readonly VerbEntry[];
80
87
  }
81
88
 
82
89
  /** One noun with its self-verb (if any) and sub-verbs. */
@@ -135,8 +142,8 @@ export interface CompletionRequest {
135
142
 
136
143
  /**
137
144
  * The dynamic-tier seam: reads candidate names for a `{kind:"names"}` source.
138
- * One source-dispatched reader serves every family — index, skills, tiers,
139
- * prompts, prefixes — so the resolver ranks them uniformly. The default
145
+ * One source-dispatched reader serves every family — index, skills, prefixes —
146
+ * so the resolver ranks them uniformly. The default
140
147
  * ({@link import("./entitySource.js").emptyNameSource}) yields nothing, so
141
148
  * structural completion never pays a read; {@link
142
149
  * import("./entitySource.js").indexCompletionEnv} wires the storeless sources.
@@ -0,0 +1,108 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import defaults from "./defaults.js";
3
+
4
+ describe("defaults — the validated distribution config (pragma.conf.ts)", () => {
5
+ it("ships the distribution identity", () => {
6
+ expect(defaults.name).toBe("pragma");
7
+ expect(defaults.help).toBe("Explore the design system");
8
+ expect(defaults.issuesUrl).toBe(
9
+ "https://github.com/canonical/pragma/issues",
10
+ );
11
+ });
12
+
13
+ it("declares the toolchain colophon as content (markdown body + summary)", () => {
14
+ // The narrative is a DECLARATION the `colophon` verb renders, not code:
15
+ // `collectColophon` reads exactly this object. Pin the shape and the two
16
+ // stable fragments — the story's own subject and the maker line the old
17
+ // one-line `colophon` string carried (folded in when the field went live).
18
+ //
19
+ // DOMAIN FIRST: this section is deliberately a one-liner that hands off to
20
+ // `docs/architecture.md`. `pragma colophon` renders it ABOVE the active
21
+ // pack's domain colophon, and a reader reaching for the colophon wants the
22
+ // design system, not the toolchain that serves it. The length pin is the
23
+ // ruling: architecture prose belongs in the docs, not in front of the
24
+ // domain every reader came for.
25
+ expect(defaults.colophon?.markdown).toContain("domain-based toolchain");
26
+ expect(defaults.colophon?.markdown).toContain(
27
+ "Made by the Canonical Webteam — https://canonical.com.",
28
+ );
29
+ expect(defaults.colophon?.summary).toContain("domain-based toolchain");
30
+ // Bodies, not documents: the renderer supplies the H1 from the name.
31
+ expect(defaults.colophon?.markdown.startsWith("#")).toBe(false);
32
+ expect(defaults.colophon?.summary?.startsWith("#")).toBe(false);
33
+ // The handoff, and the brevity that makes it honest (see the note above).
34
+ // It is a URL, not a repo path: `docs/` is outside the package's `files`
35
+ // allowlist and is not copied into `dist`, so a path would name a file no
36
+ // installed user has. A bare `docs/architecture.md` must fail here.
37
+ expect(defaults.colophon?.markdown).toContain(
38
+ "https://github.com/canonical/pragma/blob/main/packages/cli/pragma/docs/architecture.md",
39
+ );
40
+ expect(defaults.colophon?.summary).toContain(
41
+ "https://github.com/canonical/pragma/blob/main/packages/cli/pragma/docs/architecture.md",
42
+ );
43
+ expect(defaults.colophon?.markdown.length).toBeLessThan(400);
44
+ expect(defaults.colophon?.summary?.length).toBeLessThan(400);
45
+ });
46
+
47
+ it("ships the four canonical default packs (git+https sources)", () => {
48
+ expect(
49
+ defaults.packs?.map((pack) =>
50
+ typeof pack === "string"
51
+ ? pack
52
+ : { name: pack.name, source: pack.source },
53
+ ),
54
+ ).toEqual([
55
+ {
56
+ name: "@canonical/design-system",
57
+ source: "git+https://github.com/canonical/design-system.git#main",
58
+ },
59
+ {
60
+ name: "@canonical/anatomy-dsl",
61
+ source: "git+https://github.com/canonical/anatomy-dsl.git#main",
62
+ },
63
+ {
64
+ name: "@canonical/code-standards",
65
+ source: "git+https://github.com/canonical/web-code-standards.git#main",
66
+ },
67
+ {
68
+ name: "@canonical/ds-implementations",
69
+ source: "git+https://github.com/canonical/pragma.git#main",
70
+ },
71
+ ]);
72
+ });
73
+
74
+ it("carries the declared read stories through validation, on their packs", () => {
75
+ // The zod layer must not strip `stories` (unknown keys ARE stripped for
76
+ // forward compatibility). Content is owned by `capabilities/distribution.test.ts`;
77
+ // this pins only that the field survives `parseRawConfig` on the right pack.
78
+ const storyCounts = defaults.packs?.map((pack) =>
79
+ typeof pack === "string" ? 0 : (pack.stories?.length ?? 0),
80
+ );
81
+ expect(storyCounts).toEqual([5, 0, 1, 1]);
82
+ });
83
+
84
+ it("declares no removed field — the validator would refuse to load one", () => {
85
+ // `generators` was deleted (L-OPEN-1 ruling): validated, layered, and read
86
+ // by nothing. The distribution config goes through the same strict
87
+ // `parseRawConfig` as every layer, so a `generators:` reintroduced here
88
+ // would fail the eager validation at import — this pins the honest state.
89
+ expect(defaults).not.toHaveProperty("generators");
90
+ });
91
+
92
+ it("declares the domain namespaces the store is built with and the CLI resolves", () => {
93
+ // Two consumers, one declaration. (1) The config layer wins every prefix
94
+ // harvest, so this is what keeps `ds:` entity names stable when the design
95
+ // system declares `ds:` with two IRIs. (2) It is the domain half of
96
+ // `DEFAULT_PREFIX_MAP`, so it also decides which prefixed names a lookup
97
+ // can expand — `cs:` is here for that reader.
98
+ expect(defaults.prefixes).toEqual({
99
+ ds: "https://ds.canonical.com/",
100
+ cs: "http://pragma.canonical.com/codestandards#",
101
+ });
102
+ });
103
+
104
+ it("ships the normal channel and standard detail level", () => {
105
+ expect(defaults.channel).toBe("normal");
106
+ expect(defaults.detail).toBe("standard");
107
+ });
108
+ });
@@ -1,28 +1,18 @@
1
1
  /**
2
- * Built-in configuration defaults (D6 — TS, not JSON).
2
+ * Built-in configuration defaults — the validated distribution config.
3
3
  *
4
- * The lowest config layer. Authored as a typed module so an invalid edit fails
5
- * at type-check rather than at runtime, and so the default `packages` sources
6
- * live in one place. Sources verified against the v1 `config/defaults.json`.
4
+ * The lowest config layer is the distribution's own `pragma.conf.ts` (package
5
+ * root), STATICALLY imported so it travels with the emitted modules (no fs read
6
+ * — `evaluateProjectConfig` stats/imports from disk, which is right for a
7
+ * consumer's config and wrong for the distribution's own) and validated through
8
+ * the same `parseRawConfig` as every
9
+ * other layer. Statically imported by `readConfig` (itself dynamic-imported,
10
+ * off the `--help`/`__complete` fast path) and by its own test, so the eager
11
+ * validation and the zod import here add nothing to the storeless surfaces —
12
+ * the lazy.test.ts module-graph probe covers that boundary.
7
13
  */
8
14
 
9
- import type { PragmaConfig } from "./types.js";
15
+ import rawConfig from "../../../pragma.conf.js";
16
+ import { parseRawConfig } from "./schema.js";
10
17
 
11
- export default {
12
- channel: "normal",
13
- detail: "standard",
14
- packages: [
15
- {
16
- name: "@canonical/design-system",
17
- source: "git+https://github.com/canonical/design-system.git#main",
18
- },
19
- {
20
- name: "@canonical/anatomy-dsl",
21
- source: "git+https://github.com/canonical/anatomy-dsl.git#main",
22
- },
23
- {
24
- name: "@canonical/code-standards",
25
- source: "git+https://github.com/canonical/web-code-standards.git#main",
26
- },
27
- ],
28
- } satisfies PragmaConfig;
18
+ export default parseRawConfig(rawConfig, "pragma.conf.ts");
@@ -16,11 +16,19 @@
16
16
  *
17
17
  * LIMITATION (accepted, per the review fold): a *transitively*-imported file
18
18
  * (e.g. `./pkgs.ts`) edited without touching the entry's mtime is not detected
19
- * across processes. The fix that would catch it — `bun build --bundle` the config
20
- * and key on the bundle hash — is unavailable: Bun's bundler cannot run inside
21
- * the `bun build --compile` binary (no source filesystem at `/$bunfs/root`), and
22
- * bundling on every load would also blow the warm-load budget. Touch the entry
23
- * (or bump VERSION) to force a rebuild.
19
+ * across processes. The fix that would catch it — bundling the config and keying
20
+ * on the bundle hash — would blow the warm-load budget on every load. Touch the
21
+ * entry (or bump VERSION) to force a rebuild.
22
+ *
23
+ * THE CONFIG IS THE CONSUMER'S OWN TYPESCRIPT, and this is the one place the
24
+ * distribution executes code it did not author. `pragma` ships on a `node`
25
+ * shebang, so that import is served by node's type STRIPPING — which erases
26
+ * annotations and refuses syntax that would need real emit (`enum`, `namespace`,
27
+ * parameter properties). Those are rejected with `ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX`,
28
+ * which {@link evaluateProjectConfig} names specifically rather than letting it
29
+ * arrive as an anonymous load failure. The `engines` floor (node >= 22.18) is what
30
+ * makes stripping default-on — and the range excludes 23.0-23.5, which satisfy
31
+ * a bare `>=22.18` but predate the 23.x line's own default-on release (23.6).
24
32
  */
25
33
 
26
34
  import { createHash } from "node:crypto";
@@ -33,8 +41,8 @@ import {
33
41
  } from "node:fs";
34
42
  import { join } from "node:path";
35
43
  import { pathToFileURL } from "node:url";
36
- import { VERSION } from "../../constants.js";
37
- import { PragmaError } from "../error/PragmaError.js";
44
+ import { PROJECT_CONFIG_FILENAME, VERSION } from "../../constants.js";
45
+ import { PragmaError } from "../error/index.js";
38
46
  import { configCacheDir } from "./paths.js";
39
47
  import { parseRawConfig } from "./schema.js";
40
48
  import type { RawConfig } from "./types.js";
@@ -94,7 +102,7 @@ export async function evaluateProjectConfig(path: string): Promise<RawConfig> {
94
102
  const url = `${pathToFileURL(path).href}?v=${key}`;
95
103
  // Evaluating real TypeScript can throw for reasons `parseRawConfig` never sees:
96
104
  // a syntax error, a bad import, or a top-level throw in the config module. Left
97
- // unwrapped, that raw throw collapses to INTERNAL_ERROR ("please report this
105
+ // unwrapped, that raw throw collapses to INTERNAL_ERROR ("report this
98
106
  // issue") on EVERY command that reads config. Name it: a CONFIG_ERROR that
99
107
  // identifies the offending file and the underlying reason.
100
108
  let module: { default?: unknown };
@@ -103,12 +111,26 @@ export async function evaluateProjectConfig(path: string): Promise<RawConfig> {
103
111
  } catch (error) {
104
112
  if (error instanceof PragmaError) throw error;
105
113
  const reason = error instanceof Error ? error.message : String(error);
114
+ // Node strips types rather than compiling them, so a config using syntax that
115
+ // needs real emit fails here with a message naming neither the constraint nor
116
+ // the fix. Say both — this is a supported config that simply must be written
117
+ // in erasable TypeScript, and the author has no other way to learn that.
118
+ const { code } = (error ?? {}) as { code?: unknown };
119
+ if (code === "ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX") {
120
+ throw PragmaError.configError(
121
+ `Your ${PROJECT_CONFIG_FILENAME} uses TypeScript syntax that cannot be erased: ${reason}`,
122
+ {
123
+ recovery: {
124
+ message: `Rewrite it in erasable TypeScript — types, interfaces and \`satisfies\` are fine; \`enum\`, \`namespace\` and constructor parameter properties are not. A plain object literal with a \`default\` export always works.`,
125
+ },
126
+ },
127
+ );
128
+ }
106
129
  throw PragmaError.configError(
107
- `Could not load project config ${path}: ${reason}`,
130
+ `Cannot load project config ${path}: ${reason}`,
108
131
  {
109
132
  recovery: {
110
- message:
111
- "Fix the error in your pragma.config.ts (it must evaluate to a default export), then try again.",
133
+ message: `Fix the error in your ${PROJECT_CONFIG_FILENAME} (it must evaluate to a default export), then try again.`,
112
134
  },
113
135
  },
114
136
  );
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Locate the nearest project config by walking up from `cwd`.
3
3
  *
4
- * Looks for `pragma.config.ts` (or, as a compiled-binary fallback,
5
- * `pragma.config.js`) at or above `cwd`. The walk is bounded: it stops after
4
+ * Looks for `<bin>.config.ts` (or, as a compiled-binary fallback,
5
+ * `<bin>.config.js`) at or above `cwd`. The walk is bounded: it stops after
6
6
  * the first directory containing `.git` (the repo root), after the home
7
7
  * directory, and at the filesystem root — a config outside the repo or home
8
8
  * never leaks in. Ported from the v1 `findProjectConfigPath`.
@@ -11,9 +11,10 @@
11
11
  import { existsSync } from "node:fs";
12
12
  import { homedir } from "node:os";
13
13
  import { dirname, join, resolve } from "node:path";
14
+ import { BIN_NAME, PROJECT_CONFIG_FILENAME } from "../../constants.js";
14
15
 
15
16
  /** Candidate project-config filenames, in preference order. */
16
- const CANDIDATES = ["pragma.config.ts", "pragma.config.js"] as const;
17
+ const CANDIDATES = [PROJECT_CONFIG_FILENAME, `${BIN_NAME}.config.js`] as const;
17
18
 
18
19
  /**
19
20
  * Find the nearest project config file at or above `cwd`.
@@ -1,60 +1,66 @@
1
- import { existsSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
1
+ /**
2
+ * The setup hint — the read-only replacement for first-run seeding.
3
+ *
4
+ * Onboarding used to WRITE: a pipeline step ran before dispatch on every
5
+ * non-help invocation and created the global config, so `skill list` — a read —
6
+ * mutated the machine before the user had consented to anything. Seeding is now
7
+ * the `config` setup target, created inside a consented run. What is left is a
8
+ * stateless hint, and the property that matters most about it is the one these
9
+ * tests pin: reading it writes nothing.
10
+ */
11
+
12
+ import {
13
+ existsSync,
14
+ mkdirSync,
15
+ mkdtempSync,
16
+ readdirSync,
17
+ writeFileSync,
18
+ } from "node:fs";
2
19
  import { tmpdir } from "node:os";
3
- import { join } from "node:path";
20
+ import { dirname, join } from "node:path";
4
21
  import { afterEach, describe, expect, it } from "vitest";
5
- import { ensureFirstRun, firstRunTask } from "./firstRun.js";
22
+ import { setupHintLines } from "./firstRun.js";
6
23
  import { globalConfigPath } from "./paths.js";
7
24
 
8
25
  const originalConfigHome = process.env.XDG_CONFIG_HOME;
9
26
 
10
- function freshConfigHome(): void {
11
- process.env.XDG_CONFIG_HOME = mkdtempSync(join(tmpdir(), "pragma-first-"));
27
+ function freshConfigHome(): string {
28
+ const dir = mkdtempSync(join(tmpdir(), "pragma-first-"));
29
+ process.env.XDG_CONFIG_HOME = dir;
30
+ return dir;
12
31
  }
13
32
 
14
33
  afterEach(() => {
15
34
  process.env.XDG_CONFIG_HOME = originalConfigHome;
16
35
  });
17
36
 
18
- describe("first run", () => {
19
- it("greets on stderr and seeds the global config", async () => {
37
+ describe("the setup hint", () => {
38
+ it("names the pre-release and the command that configures the machine", () => {
20
39
  freshConfigHome();
21
- const path = globalConfigPath();
22
- const lines: string[] = [];
23
-
24
- await ensureFirstRun((line) => lines.push(line));
25
-
26
- expect(existsSync(path)).toBe(true);
27
- expect(readFileSync(path, "utf-8")).toBe("{}\n");
28
- expect(lines[0]).toContain("Hello!");
29
- expect(lines.some((line) => line.includes(path))).toBe(true);
30
- // Snapshot the note with the volatile path masked.
31
- expect(
32
- lines.map((line) => line.replace(path, "<CONFIG>")),
33
- ).toMatchSnapshot();
40
+ const lines = setupHintLines();
41
+ expect(lines.some((line) => line.includes("pre-release"))).toBe(true);
42
+ expect(lines.some((line) => line.includes("pragma setup"))).toBe(true);
34
43
  });
35
44
 
36
- it("is idempotent — no greeting when the config already exists", async () => {
37
- freshConfigHome();
38
- await ensureFirstRun(() => {});
45
+ it("writes NOTHING — presence of the config is the state, not a marker", () => {
46
+ // A marker file would itself be a pre-consent write, which is the exact
47
+ // defect being removed. The probe must leave the config home untouched.
48
+ const dir = freshConfigHome();
49
+ expect(existsSync(globalConfigPath())).toBe(false);
39
50
 
40
- const second: string[] = [];
41
- await ensureFirstRun((line) => second.push(line));
42
- expect(second).toEqual([]);
51
+ setupHintLines();
52
+ setupHintLines();
43
53
 
44
- const task = firstRunTask();
45
- expect(task).toBeDefined();
54
+ expect(readdirSync(dir)).toEqual([]);
55
+ expect(existsSync(globalConfigPath())).toBe(false);
46
56
  });
47
57
 
48
- it("tolerates a creation failure with a single warning", async () => {
58
+ it("goes quiet once the config exists", () => {
49
59
  freshConfigHome();
50
- // Make the pragma config directory path a file so mkdir fails.
51
- writeFileSync(join(process.env.XDG_CONFIG_HOME as string, "pragma"), "x");
52
- const lines: string[] = [];
53
-
54
- await expect(
55
- ensureFirstRun((line) => lines.push(line)),
56
- ).resolves.toBeUndefined();
57
- expect(lines).toHaveLength(1);
58
- expect(lines[0]).toContain("Warning: could not create");
60
+ const path = globalConfigPath();
61
+ mkdirSync(dirname(path), { recursive: true });
62
+ writeFileSync(path, "{}\n");
63
+
64
+ expect(setupHintLines()).toEqual([]);
59
65
  });
60
66
  });
@@ -1,91 +1,34 @@
1
1
  /**
2
- * First-run onboarding — welcome note + global config creation.
2
+ * The setup hint — the read-only replacement for first-run seeding.
3
3
  *
4
- * On the first invocation (detected by the absence of the global config file),
5
- * greet on STDERR and seed `$XDG_CONFIG_HOME/pragma/config.json` with `{}` so
6
- * every field keeps its built-in default and `config show` reports honest
7
- * provenance. Modeled as a {@link Task} so the effects stay declarative and
8
- * testable. The banner goes to stderr — stdout belongs to command output
9
- * (`--format json`, MCP stdio) and must never be corrupted. Ported from the v1
10
- * first-run pipeline; runs before dispatch and tolerates every failure.
11
- */
12
-
13
- import { dirname } from "node:path";
14
- import {
15
- $,
16
- exists,
17
- gen,
18
- info,
19
- mkdir,
20
- type Task,
21
- writeFile,
22
- } from "@canonical/task";
23
- import { runTask } from "@canonical/task/node";
24
- import { globalConfigPath } from "./paths.js";
25
-
26
- /** Seed content: an empty object, so nothing is pinned the user did not choose. */
27
- const SEED_CONFIG = "{}\n";
28
-
29
- /** Build the welcome note; the resolved path is shown so it is copyable. */
30
- function welcomeLines(path: string): string[] {
31
- return [
32
- "Hello! Thanks for taking the time to try the pre-release pragma CLI.",
33
- "Please file issues and feedback at https://github.com/canonical/pragma/issues.",
34
- `Pragma stores its configuration in ${path} (just created with defaults).`,
35
- "A `pragma.config.ts` in this directory or above it overrides it per project.",
36
- "",
37
- ];
38
- }
39
-
40
- /**
41
- * The first-run task: create the global config, announcing it on first run.
4
+ * Onboarding used to WRITE. A pipeline step ran before dispatch on every
5
+ * non-help invocation and created `$XDG_CONFIG_HOME/<bin>/config.json`, so
6
+ * `skill list` — a read — mutated the machine before the user had consented to
7
+ * anything, and a banner interleaved itself into the output of runs that were
8
+ * mutating something else entirely. The config layers already treat the missing
9
+ * file as "every field at its built-in default", so the write bought nothing.
42
10
  *
43
- * @returns Task yielding whether the config was created and its path.
44
- * @note Impure — checks/creates the global config file, emits log effects.
11
+ * Seeding is now a setup target, created inside a consented run. What is left
12
+ * here is a STATELESS hint: shown when the global config file is absent, on
13
+ * read-only surfaces only. There is no marker file — a marker is itself a
14
+ * pre-consent write, which is the exact defect being removed — because the
15
+ * presence of the config IS the state.
45
16
  */
46
- export function firstRunTask(): Task<{ created: boolean; path: string }> {
47
- return gen(function* () {
48
- const path = globalConfigPath();
49
-
50
- if (yield* $(exists(path))) {
51
- return { created: false, path };
52
- }
53
-
54
- // Create first, then greet: if creation fails the effects throw before any
55
- // line is emitted, so onboarding degrades to the single stderr warning
56
- // rather than a "just created" banner alongside a failure.
57
- yield* $(mkdir(dirname(path), true));
58
- yield* $(writeFile(path, SEED_CONFIG));
59
17
 
60
- for (const line of welcomeLines(path)) {
61
- yield* $(info(line));
62
- }
63
-
64
- return { created: true, path };
65
- });
66
- }
18
+ import { existsSync } from "node:fs";
19
+ import { BIN_NAME, ISSUES_URL } from "../../constants.js";
20
+ import { globalConfigPath } from "./paths.js";
67
21
 
68
22
  /**
69
- * Run the first-run task, tolerating every failure.
70
- *
71
- * Onboarding must never break an invocation: a read-only home or a race with a
72
- * concurrent first run degrades to a single stderr warning and the invocation
73
- * proceeds (the config layers treat a missing global file as defaults anyway).
23
+ * The hint lines for a machine that has not been set up, or none when it has.
74
24
  *
75
- * @param write - Stderr sink, injectable for tests.
76
- * @note Impure — filesystem effects + stderr.
25
+ * @returns The lines to print, or an empty array.
26
+ * @note Impure — probes the global config path.
77
27
  */
78
- export async function ensureFirstRun(
79
- write: (line: string) => void = (line) => process.stderr.write(`${line}\n`),
80
- ): Promise<void> {
81
- try {
82
- await runTask(firstRunTask(), {
83
- // Route log effects to stderr without the interpreter's [INFO] prefix —
84
- // this is a greeting, not diagnostics.
85
- onLog: (_level, message) => write(message),
86
- });
87
- } catch (error) {
88
- const reason = error instanceof Error ? error.message : String(error);
89
- write(`Warning: could not create the global pragma config — ${reason}`);
90
- }
28
+ export function setupHintLines(): string[] {
29
+ if (existsSync(globalConfigPath())) return [];
30
+ return [
31
+ `${BIN_NAME} is pre-release — report issues at ${ISSUES_URL}.`,
32
+ `Run \`${BIN_NAME} setup\` to configure this machine.`,
33
+ ];
91
34
  }
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Read the global machine config: `$XDG_CONFIG_HOME/pragma/config.json`.
3
3
  *
4
- * The global layer holds cross-project machine state (channel, detail, tier,
5
- * prompts). A missing or empty file contributes no values — the layer simply
4
+ * The global layer holds cross-project machine state (channel, detail, tier).
5
+ * A missing or empty file contributes no values — the layer simply
6
6
  * does not participate in the merge. A *malformed* file (a torn write) must
7
7
  * never brick every command (the old loud `CONFIG_ERROR` throw) nor be silently
8
8
  * discarded (writeConfigField's old reset-to-`{}`): it is backed up to a
@@ -3,17 +3,16 @@
3
3
  *
4
4
  * `schema.ts` (zod) is intentionally not re-exported here: it is imported
5
5
  * directly and lazily by the readers, keeping this barrel — and any storeless
6
- * consumer — off the zod fast path.
6
+ * consumer — off the zod fast path. `defaults` is likewise not re-exported:
7
+ * it statically imports the distribution config and the validating schema.
7
8
  */
8
9
 
9
- export { default as defaults } from "./defaults.js";
10
10
  export { evaluateProjectConfig } from "./evaluateProjectConfig.js";
11
11
  export { findProjectConfig } from "./findProjectConfig.js";
12
- export { ensureFirstRun, firstRunTask } from "./firstRun.js";
12
+ export { setupHintLines } from "./firstRun.js";
13
13
  export type { GlobalConfigRead } from "./globalConfig.js";
14
14
  export { readGlobalConfig } from "./globalConfig.js";
15
15
  export {
16
- cacheDir,
17
16
  configCacheDir,
18
17
  configDir,
19
18
  globalConfigPath,
@@ -26,8 +25,8 @@ export type {
26
25
  ConfigLayers,
27
26
  ConfigOrigin,
28
27
  ConfigOrigins,
29
- PackageDeclaration,
30
- PackageEntry,
28
+ PackDeclaration,
29
+ PackSource,
31
30
  PragmaConfig,
32
31
  RawConfig,
33
32
  } from "./types.js";