@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
@@ -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";
@@ -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. */
@@ -15,6 +15,13 @@ describe("defaults — the validated distribution config (pragma.conf.ts)", () =
15
15
  // `collectColophon` reads exactly this object. Pin the shape and the two
16
16
  // stable fragments — the story's own subject and the maker line the old
17
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.
18
25
  expect(defaults.colophon?.markdown).toContain("domain-based toolchain");
19
26
  expect(defaults.colophon?.markdown).toContain(
20
27
  "Made by the Canonical Webteam — https://canonical.com.",
@@ -23,9 +30,21 @@ describe("defaults — the validated distribution config (pragma.conf.ts)", () =
23
30
  // Bodies, not documents: the renderer supplies the H1 from the name.
24
31
  expect(defaults.colophon?.markdown.startsWith("#")).toBe(false);
25
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);
26
45
  });
27
46
 
28
- it("ships the three canonical default packs (git+https sources)", () => {
47
+ it("ships the four canonical default packs (git+https sources)", () => {
29
48
  expect(
30
49
  defaults.packs?.map((pack) =>
31
50
  typeof pack === "string"
@@ -45,6 +64,10 @@ describe("defaults — the validated distribution config (pragma.conf.ts)", () =
45
64
  name: "@canonical/code-standards",
46
65
  source: "git+https://github.com/canonical/web-code-standards.git#main",
47
66
  },
67
+ {
68
+ name: "@canonical/ds-implementations",
69
+ source: "git+https://github.com/canonical/pragma.git#main",
70
+ },
48
71
  ]);
49
72
  });
50
73
 
@@ -55,7 +78,7 @@ describe("defaults — the validated distribution config (pragma.conf.ts)", () =
55
78
  const storyCounts = defaults.packs?.map((pack) =>
56
79
  typeof pack === "string" ? 0 : (pack.stories?.length ?? 0),
57
80
  );
58
- expect(storyCounts).toEqual([4, 0, 1]);
81
+ expect(storyCounts).toEqual([5, 0, 1, 1]);
59
82
  });
60
83
 
61
84
  it("declares no removed field — the validator would refuse to load one", () => {
@@ -2,9 +2,10 @@
2
2
  * Built-in configuration defaults — the validated distribution config.
3
3
  *
4
4
  * The lowest config layer is the distribution's own `pragma.conf.ts` (package
5
- * root), STATICALLY imported so `bun build --compile` inlines it (no fs read —
6
- * `evaluateProjectConfig` stats/imports from disk, impossible inside the
7
- * compiled binary) and validated through the same `parseRawConfig` as every
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
8
9
  * other layer. Statically imported by `readConfig` (itself dynamic-imported,
9
10
  * off the `--help`/`__complete` fast path) and by its own test, so the eager
10
11
  * validation and the zod import here add nothing to the storeless surfaces —
@@ -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";
@@ -34,7 +42,7 @@ import {
34
42
  import { join } from "node:path";
35
43
  import { pathToFileURL } from "node:url";
36
44
  import { PROJECT_CONFIG_FILENAME, VERSION } from "../../constants.js";
37
- import { PragmaError } from "../error/PragmaError.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,8 +111,23 @@ 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
133
  message: `Fix the error in your ${PROJECT_CONFIG_FILENAME} (it must evaluate to a default export), then try again.`,
@@ -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,98 +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 {
25
- BIN_NAME,
26
- ISSUES_URL,
27
- PROJECT_CONFIG_FILENAME,
28
- } from "../../constants.js";
29
- import { globalConfigPath } from "./paths.js";
30
-
31
- /** Seed content: an empty object, so nothing is pinned the user did not choose. */
32
- const SEED_CONFIG = "{}\n";
33
-
34
- /** Build the welcome note; the resolved path is shown so it is copyable. */
35
- function welcomeLines(path: string): string[] {
36
- return [
37
- `Hello! Thanks for taking the time to try the pre-release ${BIN_NAME} CLI.`,
38
- `Please file issues and feedback at ${ISSUES_URL}.`,
39
- `${BIN_NAME} stores its configuration in ${path} (just created with defaults).`,
40
- `A \`${PROJECT_CONFIG_FILENAME}\` in this directory or above it overrides it per project.`,
41
- "",
42
- ];
43
- }
44
-
45
- /**
46
- * 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.
47
10
  *
48
- * @returns Task yielding whether the config was created and its path.
49
- * @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.
50
16
  */
51
- export function firstRunTask(): Task<{ created: boolean; path: string }> {
52
- return gen(function* () {
53
- const path = globalConfigPath();
54
-
55
- if (yield* $(exists(path))) {
56
- return { created: false, path };
57
- }
58
-
59
- // Create first, then greet: if creation fails the effects throw before any
60
- // line is emitted, so onboarding degrades to the single stderr warning
61
- // rather than a "just created" banner alongside a failure.
62
- yield* $(mkdir(dirname(path), true));
63
- yield* $(writeFile(path, SEED_CONFIG));
64
17
 
65
- for (const line of welcomeLines(path)) {
66
- yield* $(info(line));
67
- }
68
-
69
- return { created: true, path };
70
- });
71
- }
18
+ import { existsSync } from "node:fs";
19
+ import { BIN_NAME, ISSUES_URL } from "../../constants.js";
20
+ import { globalConfigPath } from "./paths.js";
72
21
 
73
22
  /**
74
- * Run the first-run task, tolerating every failure.
75
- *
76
- * Onboarding must never break an invocation: a read-only home or a race with a
77
- * concurrent first run degrades to a single stderr warning and the invocation
78
- * 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.
79
24
  *
80
- * @param write - Stderr sink, injectable for tests.
81
- * @note Impure — filesystem effects + stderr.
25
+ * @returns The lines to print, or an empty array.
26
+ * @note Impure — probes the global config path.
82
27
  */
83
- export async function ensureFirstRun(
84
- write: (line: string) => void = (line) => process.stderr.write(`${line}\n`),
85
- ): Promise<void> {
86
- try {
87
- await runTask(firstRunTask(), {
88
- // Route log effects to stderr without the interpreter's [INFO] prefix —
89
- // this is a greeting, not diagnostics.
90
- onLog: (_level, message) => write(message),
91
- });
92
- } catch (error) {
93
- const reason = error instanceof Error ? error.message : String(error);
94
- write(
95
- `Warning: could not create the global ${BIN_NAME} config — ${reason}`,
96
- );
97
- }
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
+ ];
98
34
  }
@@ -9,7 +9,7 @@
9
9
 
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 {
@@ -59,7 +59,7 @@ describe("readConfig — layering + provenance", () => {
59
59
  expect(config.tier).toBe("core");
60
60
  expect(config.channel).toBe("experimental");
61
61
  expect(config.detail).toBe("detailed");
62
- expect(config.packs).toHaveLength(3); // from defaults
62
+ expect(config.packs).toHaveLength(4); // from defaults
63
63
 
64
64
  expect(origins).toMatchObject({
65
65
  tier: "project",
@@ -101,12 +101,15 @@ describe("readConfig — layering + provenance", () => {
101
101
  freshXdg();
102
102
  writeGlobal('{"help":"Global help"}');
103
103
  const dir = projectWith(
104
- 'export default { name: "acme", colophon: { markdown: "By Acme." }, issuesUrl: "https://acme.test/issues", tier: "core" };',
104
+ 'export default { name: "acme", logo: ["ACME"], colophon: { markdown: "By Acme." }, issuesUrl: "https://acme.test/issues", tier: "core" };',
105
105
  );
106
106
 
107
107
  const { config, origins } = await readConfig(dir);
108
108
 
109
109
  expect(config).not.toHaveProperty("name");
110
+ // `logo` is identity too: accepted by the shared schema, silent in a layer.
111
+ expect(config).not.toHaveProperty("logo");
112
+ expect(origins).not.toHaveProperty("logo");
110
113
  expect(config).not.toHaveProperty("help");
111
114
  expect(config).not.toHaveProperty("colophon");
112
115
  expect(config).not.toHaveProperty("issuesUrl");
@@ -461,7 +464,7 @@ describe("evaluateProjectConfig — mtime+VERSION cache", () => {
461
464
  freshXdg();
462
465
  // A malformed project config: references an undefined symbol → the module
463
466
  // throws at evaluation. Left unwrapped this collapsed to INTERNAL_ERROR
464
- // ("please report this issue") on EVERY command that reads config.
467
+ // ("report this issue") on EVERY command that reads config.
465
468
  const dir = projectWith("export default { tier: definitelyNotDefined };");
466
469
  const path = join(dir, "pragma.config.ts");
467
470
 
@@ -51,7 +51,7 @@ export async function readConfig(
51
51
  return { value: defaultValues[field], origin: "default" };
52
52
  };
53
53
 
54
- // `name`/`help`/`colophon`/`issuesUrl` are DELIBERATELY not picked: identity
54
+ // `name`/`help`/`logo`/`colophon`/`issuesUrl` are DELIBERATELY not picked: identity
55
55
  // is read from `pragma.conf.ts` statically (`src/constants.ts`), so merging a
56
56
  // layer's value here would report a provenance nothing honours.
57
57
  const tier = pick("tier");
@@ -16,7 +16,7 @@
16
16
  */
17
17
 
18
18
  import { z } from "zod";
19
- import { PragmaError } from "../error/PragmaError.js";
19
+ import { PragmaError } from "../error/index.js";
20
20
  import { CHANNELS, DETAIL_LEVELS, type RawConfig } from "./types.js";
21
21
 
22
22
  const packDeclarationSchema = z.union([
@@ -61,6 +61,8 @@ function declaredCompletion(value: unknown): Record<string, unknown> | null {
61
61
  export const rawConfigSchema = z.object({
62
62
  name: z.string().min(1).optional(),
63
63
  help: z.string().min(1).optional(),
64
+ // Identity, like `name`/`help`: the wordmark root `--help` opens with.
65
+ logo: z.array(z.string()).optional(),
64
66
  // Declared toolchain content: the `colophon` verb renders whatever the
65
67
  // distribution declares here (markdown body + optional condensed summary).
66
68
  colophon: z
@@ -109,7 +109,7 @@ export interface PragmaConfig {
109
109
  * wins during the merge.
110
110
  *
111
111
  * WIDER than {@link PragmaConfig}: the DISTRIBUTION layer (`pragma.conf.ts`)
112
- * is `satisfies RawConfig` and declares the four identity fields, which are
112
+ * is `satisfies RawConfig` and declares the five identity fields, which are
113
113
  * read statically and never merged. A global or project layer declaring one is
114
114
  * accepted by the validator and has no effect — `docs/reference/config.md`
115
115
  * says so, and `readConfig.test.ts` pins it.
@@ -117,6 +117,8 @@ export interface PragmaConfig {
117
117
  export interface RawConfig {
118
118
  readonly name?: string;
119
119
  readonly help?: string;
120
+ /** ASCII-art wordmark lines shown atop root `--help` (identity, like `name`). */
121
+ readonly logo?: readonly string[];
120
122
  readonly colophon?: ColophonDeclaration;
121
123
  readonly issuesUrl?: string;
122
124
  readonly tier?: string;
@@ -28,6 +28,11 @@
28
28
  * in a capability source — became content the config declares
29
29
  * (`pragma.conf.ts#colophon`), which is what made removing it checkable.
30
30
  *
31
+ * Beside the naming rules, the same scanner enforces the HOUSE VOICE rules for
32
+ * user-facing copy ({@link COPY_RULES}, authored as data in `copy.ts`) over
33
+ * both file sets — the kernel set above and `src/capabilities/**` — in the
34
+ * last describe of this file. See `copy.ts` for what each rule bans and why.
35
+ *
31
36
  * NOTE for a reader of an older revision: this docblock used to say the
32
37
  * `examples[].cmd` sweep and the `docs/reference/*.md` regen "have to move
33
38
  * together". They must be CONSISTENT, not simultaneous — the whole sweep was
@@ -41,6 +46,7 @@ import { fileURLToPath } from "node:url";
41
46
  import { describe, expect, it } from "vitest";
42
47
  import conf from "../../pragma.conf.js";
43
48
  import { BIN_NAME } from "../constants.js";
49
+ import { COPY_RULES } from "./copy.js";
44
50
 
45
51
  const here = dirname(fileURLToPath(import.meta.url));
46
52
  const root = resolve(here, "..");
@@ -250,13 +256,17 @@ function pushCopy(copy: string[], literal: string): void {
250
256
  * `file: literal` for every authored literal matching `pattern`, so a failure
251
257
  * names its offenders instead of only counting them.
252
258
  *
253
- * @param pattern - What kernel copy may not contain.
259
+ * @param pattern - What the copy may not contain.
260
+ * @param sources - The files to read; the kernel set by default.
254
261
  * @returns One entry per offending literal.
255
- * @note Impure — reads every kernel source.
262
+ * @note Impure — reads every listed source.
256
263
  */
257
- function findOffenders(pattern: RegExp): string[] {
264
+ function findOffenders(
265
+ pattern: RegExp,
266
+ sources: readonly string[] = files,
267
+ ): string[] {
258
268
  const found: string[] = [];
259
- for (const file of files) {
269
+ for (const file of sources) {
260
270
  for (const literal of readCopy(readFileSync(file, "utf-8"))) {
261
271
  if (pattern.test(literal)) {
262
272
  found.push(`${relative(root, file)}: ${literal}`);
@@ -451,3 +461,23 @@ describe("capability commands (PROTECTED)", () => {
451
461
  expect(offenders).toEqual([]);
452
462
  });
453
463
  });
464
+
465
+ describe("user-facing copy house style (PROTECTED)", () => {
466
+ // The voice rules ({@link COPY_RULES}) run over BOTH file sets the naming
467
+ // rules above read — the kernel set and the capability set — because voice,
468
+ // unlike the distribution's name, is not content anywhere: a capability's
469
+ // error is the same product speaking as a kernel diagnostic. `readCopy`
470
+ // keeps comments, regexes, specifiers and test files out of scope, so a
471
+ // rule fires only on a string a user can actually be shown.
472
+ //
473
+ // One `it` per rule, NAMED by the rule, so a red run states the rule that
474
+ // fired; the assertion message carries the fix. What a failure prints is the
475
+ // offender list plus those two strings — everything needed to correct the
476
+ // copy lives in this repo.
477
+ const allSources = [...files, ...capabilitySources];
478
+ for (const { pattern, rule, fix } of COPY_RULES) {
479
+ it(rule, () => {
480
+ expect(findOffenders(pattern, allSources), fix).toEqual([]);
481
+ });
482
+ }
483
+ });
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The house rules for user-facing copy, as data.
3
+ *
4
+ * Every string this CLI prints is one product speaking, and a product with one
5
+ * voice phrases one meaning one way. These descriptors name the phrasings that
6
+ * are out of that voice, why, and what to write instead; `copy.test.ts` runs
7
+ * them over every authored string literal in the tree — the same scanner and
8
+ * file sets as the naming rules there, so comments, regexes, module specifiers
9
+ * and test fixtures are never in scope. A failure quotes the offending literal,
10
+ * the rule, and the fix, and nothing else: everything a maintainer needs to
11
+ * correct the string lives in this file.
12
+ *
13
+ * Rules are DATA rather than assertions so the set can grow (or move into a
14
+ * shared standards package) without rewriting the guard, and so each rule's
15
+ * pattern, statement and fix are reviewed together as one unit. Precision is
16
+ * the set's credibility: a pattern that fires on domain vocabulary gets
17
+ * disabled in practice, so a carve-out is encoded in the pattern itself — with
18
+ * its reason — never in an exemption list beside it.
19
+ */
20
+
21
+ /** One banned phrasing: what copy may not contain, why, and the rewrite. */
22
+ export interface CopyRule {
23
+ /** What the copy must not contain. */
24
+ readonly pattern: RegExp;
25
+ /** The house rule, stated for a reader of THIS codebase. */
26
+ readonly rule: string;
27
+ /** How to fix an offending string. */
28
+ readonly fix: string;
29
+ }
30
+
31
+ /** The banned phrasings for user-facing copy. Enforced by `copy.test.ts`. */
32
+ export const COPY_RULES: readonly CopyRule[] = [
33
+ {
34
+ pattern: /\b(?:could not|failed to|unable to)\b/i,
35
+ rule: "User-facing copy says `cannot` — one phrasing for one meaning, so the CLI reads as one voice.",
36
+ fix: "Rewrite with `cannot` (present tense, no hedging), naming what is wrong rather than what was attempted.",
37
+ },
38
+ {
39
+ // `\w+n't` covers every negated contraction in one arm; the lookbehind
40
+ // carves out `do/don't`, which is domain vocabulary — the name of the
41
+ // paired good/bad example a coding standard ships — not conversational
42
+ // tone. The second arm lists the pronoun contractions, which have no
43
+ // shared suffix shape.
44
+ pattern:
45
+ /\b(?<!do\/)\w+n't\b|\b(?:you|we|they|it|that|there|here|what|let)'(?:re|ve|ll|s|d)\b|\bi'm\b/i,
46
+ rule: "No contractions in user-facing copy — instructions read as statements, not conversation.",
47
+ fix: "Spell the words out, or restructure the sentence to drop the second person.",
48
+ },
49
+ {
50
+ pattern: /\b(?:please|sorry|oops)\b/i,
51
+ rule: "The CLI does not apologise or plead; it states the fact and the action.",
52
+ fix: "Drop the pleading word and instruct directly: `Report this issue at <url>.`",
53
+ },
54
+ ];
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
+ import { ISSUES_URL } from "../../constants.js";
2
3
  import { errorEnvelope, successEnvelope } from "../render/envelope.js";
3
4
  import { PragmaError } from "./PragmaError.js";
4
5
  import { cliRecovery } from "./recovery.js";
@@ -56,7 +57,9 @@ describe("PragmaError factories", () => {
56
57
  it("internalError attaches a report hint", () => {
57
58
  const error = PragmaError.internalError("boom");
58
59
  expect(error.code).toBe("INTERNAL_ERROR");
59
- expect(error.recovery).toEqual({ message: "Please report this issue." });
60
+ expect(error.recovery).toEqual({
61
+ message: `Report this issue at ${ISSUES_URL}.`,
62
+ });
60
63
  });
61
64
  });
62
65
 
@@ -66,7 +69,7 @@ describe("serializeError", () => {
66
69
  expect(serializeError(error)).toEqual({
67
70
  code: "INTERNAL_ERROR",
68
71
  message: "Internal error: boom",
69
- recovery: { message: "Please report this issue." },
72
+ recovery: { message: `Report this issue at ${ISSUES_URL}.` },
70
73
  });
71
74
  });
72
75