@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
@@ -105,6 +105,121 @@ describe("buildProgram — default-true boolean negation (B9)", () => {
105
105
  });
106
106
  });
107
107
 
108
+ describe("buildProgram — one spelling per flag", () => {
109
+ it("registers no short option anywhere in the tree", () => {
110
+ const program = projectCli([fixtureModule]);
111
+ const walk = (cmd: import("commander").Command): void => {
112
+ expect(cmd.options.some((o) => o.short !== undefined)).toBe(false);
113
+ for (const child of cmd.commands) walk(child);
114
+ };
115
+ walk(program);
116
+ });
117
+
118
+ it("still answers --help while -v/-h reject as unknown options", async () => {
119
+ const spyErr = vi
120
+ .spyOn(process.stderr, "write")
121
+ .mockImplementation(() => true);
122
+ const spyOut = vi
123
+ .spyOn(process.stdout, "write")
124
+ .mockImplementation(() => true);
125
+ await expect(
126
+ projectCli([fixtureModule]).parseAsync(["widget", "--help"], {
127
+ from: "user",
128
+ }),
129
+ ).rejects.toMatchObject({ code: "commander.helpDisplayed" });
130
+ await expect(
131
+ projectCli([fixtureModule]).parseAsync(["widget", "list", "-h"], {
132
+ from: "user",
133
+ }),
134
+ ).rejects.toMatchObject({ code: "commander.unknownOption" });
135
+ await expect(
136
+ projectCli([fixtureModule]).parseAsync(["widget", "list", "-v"], {
137
+ from: "user",
138
+ }),
139
+ ).rejects.toMatchObject({ code: "commander.unknownOption" });
140
+ spyErr.mockRestore();
141
+ spyOut.mockRestore();
142
+ });
143
+ });
144
+
145
+ describe("buildProgram — repeatable filter flags", () => {
146
+ /** A verb with a repeatable enum filter and a repeatable string filter. */
147
+ const filterVerb: VerbSpec = {
148
+ path: ["thing", "list"],
149
+ summary: "thing list summary",
150
+ params: [
151
+ {
152
+ kind: "enum",
153
+ name: "category",
154
+ doc: "Filter by category.",
155
+ values: ["css", "git"],
156
+ repeatable: true,
157
+ },
158
+ { kind: "string", name: "tag", doc: "Filter by tag.", repeatable: true },
159
+ ],
160
+ output: {
161
+ formatters: {
162
+ plain: (d) => JSON.stringify(d),
163
+ llm: (d) => JSON.stringify(d),
164
+ json: (d) => JSON.stringify(d),
165
+ },
166
+ },
167
+ capability: { needsStore: false, mutates: false, mcp: { expose: true } },
168
+ run: async (params) => params,
169
+ };
170
+
171
+ /** Parse argv and capture the option bag the action receives. */
172
+ async function optsFor(argv: string[]): Promise<Record<string, unknown>> {
173
+ let seen: Record<string, unknown> = {};
174
+ const program = projectCli([
175
+ {
176
+ name: "thing",
177
+ verbs: [
178
+ {
179
+ ...filterVerb,
180
+ run: async (params) => {
181
+ seen = params;
182
+ return null;
183
+ },
184
+ },
185
+ ],
186
+ },
187
+ ]);
188
+ await program.parseAsync(["thing", "list", ...argv], { from: "user" });
189
+ return seen;
190
+ }
191
+
192
+ it("accumulates a repeated filter into the union, never last-wins", async () => {
193
+ const params = await optsFor([
194
+ "--category",
195
+ "css",
196
+ "--category",
197
+ "git",
198
+ "--tag",
199
+ "a",
200
+ "--tag",
201
+ "b",
202
+ ]);
203
+ expect(params.category).toEqual(["css", "git"]);
204
+ expect(params.tag).toEqual(["a", "b"]);
205
+ });
206
+
207
+ it("keeps a single occurrence a one-element array and validates enum values", async () => {
208
+ const params = await optsFor(["--category", "css"]);
209
+ expect(params.category).toEqual(["css"]);
210
+ const program = projectCli([{ name: "thing", verbs: [filterVerb] }]);
211
+ const spy = vi
212
+ .spyOn(process.stderr, "write")
213
+ .mockImplementation(() => true);
214
+ await expect(
215
+ program.parseAsync(["thing", "list", "--category", "bogus"], {
216
+ from: "user",
217
+ }),
218
+ ).rejects.toMatchObject({ code: "commander.invalidArgument" });
219
+ spy.mockRestore();
220
+ });
221
+ });
222
+
108
223
  describe("buildProgram — early exits", () => {
109
224
  it("throws commander.version for --version, writing the version", async () => {
110
225
  const program = projectCli([fixtureModule]);
@@ -372,22 +487,36 @@ describe("buildProgram — sub-verb-only noun invoked bare (U2)", () => {
372
487
  });
373
488
 
374
489
  describe("formatRootHelp — grouping", () => {
375
- const help = formatRootHelp("pragma", "pragma test", [
376
- makeVerb(["info"]),
377
- makeVerb(["config", "show"]),
378
- makeVerb(["block", "list"]),
379
- ]);
380
-
381
- it("shows the task-oriented section titles for live nouns", () => {
382
- expect(help).toContain("Explore the design system");
490
+ const help = formatRootHelp(
491
+ "pragma",
492
+ "pragma test",
493
+ [
494
+ makeVerb(["info"]),
495
+ makeVerb(["config", "show"]),
496
+ makeVerb(["block", "list"]),
497
+ ],
498
+ "1.2.3",
499
+ "https://example.test/issues",
500
+ );
501
+
502
+ it("leads with the uncurated nouns, untitled, under the usage line", () => {
503
+ // `block` is not in the kernel's curated table, so it leads the page with
504
+ // no heading of its own — the header already carries the blurb, and the
505
+ // kernel has no name for the domain. The kernel's own nouns keep their
506
+ // task-oriented sections.
507
+ expect(help).toMatch(/^Usage: pragma .*\n\n {2}block\b/m);
383
508
  expect(help).toContain("Set up & maintain");
509
+ // The blurb appears exactly once: in the header.
510
+ expect(help.match(/pragma test/g)).toHaveLength(1);
384
511
  });
385
512
 
386
- it("lists the live nouns and always-available mcp", () => {
513
+ it("lists the live nouns, and only those", () => {
387
514
  expect(help).toContain("block");
388
515
  expect(help).toContain("config");
389
516
  expect(help).toContain("info");
390
- expect(help).toContain("mcp");
517
+ // `mcp` is curated for PLACEMENT, not conjured into existence: a registry
518
+ // without an mcp verb has no mcp row.
519
+ expect(help).not.toContain("mcp");
391
520
  });
392
521
 
393
522
  it("drops nouns that are not present", () => {
@@ -404,24 +533,35 @@ describe("formatRootHelp — grouping", () => {
404
533
 
405
534
  it("renders the unified root page (restyle golden)", () => {
406
535
  expect(help).toMatchInlineSnapshot(`
407
- "pragma — pragma test
536
+ " _
537
+ /' \`\\
538
+ /' )
539
+ /' (___,/'____ ____ ____ ,__________ ____
540
+ /' )' )--/' ) /' ) /' ) ) /' )
541
+ /' /' /' /' /' /' /' /' /' /' /'
542
+ (,/' /' (___,/(__(___,/(__/' /' /(__(___,/(__
543
+ /'
544
+ / /'
545
+ (___,/'
546
+
547
+ pragma v1.2.3 — pragma test
548
+
549
+ This is a preview version. Issues and suggestions: https://example.test/issues
408
550
 
409
551
  Usage: pragma <command> [subcommand] [flags]
410
552
 
411
- Explore the design system
412
- block Inspect components & patterns and their anatomy
553
+ block block list summary
413
554
 
414
555
  Set up & maintain
415
556
  config Read and write pragma configuration
416
557
  info Show version, config, and update status
417
558
 
418
- For AI agents
419
- mcp Start the MCP server over stdio
420
-
421
559
  Global flags
422
560
  --format <plain|llm|json> Select output format (llm = condensed Markdown for agents)
423
561
  --detail <level> Progressive-disclosure level (summary, standard, detailed)
424
- --verbose Diagnostic output on stderr
562
+ --no-headers Hide the table header row in plain output
563
+ --quiet Suppress success and progress output (errors still print)
564
+ --verbose Diagnostic output on stderr (sources update)
425
565
  --help Show help (works on any command)
426
566
  --version Show the CLI version
427
567
 
@@ -11,11 +11,17 @@
11
11
  * the v1 cli-core `registerAll`, retargeted at the grammar.
12
12
  */
13
13
 
14
- import { Command, Option } from "commander";
15
- import { BIN_NAME, PROGRAM_DESCRIPTION, VERSION } from "../../../constants.js";
16
- import type { GlobalFlags } from "../../runtime/types.js";
17
- import { kebabCase } from "../../spec/emitSurface.js";
18
- import type { ParamSpec, VerbSpec } from "../../spec/types.js";
14
+ import { Command, InvalidArgumentError, Option } from "commander";
15
+ import {
16
+ BIN_NAME,
17
+ ISSUES_URL,
18
+ PROGRAM_DESCRIPTION,
19
+ VERSION,
20
+ } from "../../../constants.js";
21
+ import type { GlobalFlags } from "../../runtime/index.js";
22
+ import { kebabCase } from "../../spec/index.js";
23
+ import type { CliProjection, ParamSpec, VerbSpec } from "../../spec/types.js";
24
+ import { MUTATION_FLAG_DOCS, negationFlagDoc } from "./constants.js";
19
25
  import { dispatch } from "./dispatch.js";
20
26
  import { formatRootHelp } from "./rootHelp.js";
21
27
  import { formatNounHelp, formatVerbHelp } from "./verbHelp.js";
@@ -30,6 +36,15 @@ export interface BuildProgramOptions {
30
36
  readonly description?: string;
31
37
  /** Version string for `--version`. */
32
38
  readonly version?: string;
39
+ /** Where root help's preview notice sends feedback. */
40
+ readonly issuesUrl?: string;
41
+ /**
42
+ * Module-owned noun mounts (see `CapabilityModule.cliProjection`), keyed by
43
+ * noun. A mounted noun's parent command is created here exactly once and
44
+ * handed to the module's `mount` — the module owns everything beneath it;
45
+ * its verbs stay the binding-level grammar for help/surface/completion.
46
+ */
47
+ readonly mounts?: ReadonlyMap<string, CliProjection>;
33
48
  }
34
49
 
35
50
  /** The positional usage token for a param (`<name>` / `[name]`, variadic `...`). */
@@ -61,7 +76,30 @@ function registerParams(command: Command, verb: VerbSpec): void {
61
76
  for (const param of verb.params) {
62
77
  if (param.positional) continue;
63
78
  const spec = flagSpec(param);
64
- if (param.kind === "enum") {
79
+ if (
80
+ (param.kind === "enum" || param.kind === "string") &&
81
+ param.repeatable === true
82
+ ) {
83
+ // A repeatable flag ACCUMULATES — Commander's default keeps only the
84
+ // last occurrence, which silently drops data. The collector validates
85
+ // an enum's values itself, since a custom parser replaces the parser
86
+ // `.choices()` would install.
87
+ command.addOption(
88
+ new Option(spec, param.doc).argParser(
89
+ (value: string, previous: string[] | undefined) => {
90
+ if (
91
+ param.kind === "enum" &&
92
+ !(param.values as readonly string[]).includes(value)
93
+ ) {
94
+ throw new InvalidArgumentError(
95
+ `Allowed choices are ${param.values.join(", ")}.`,
96
+ );
97
+ }
98
+ return [...(previous ?? []), value];
99
+ },
100
+ ),
101
+ );
102
+ } else if (param.kind === "enum") {
65
103
  const option = new Option(spec, param.doc).choices([...param.values]);
66
104
  if (param.default !== undefined) option.default(param.default);
67
105
  command.addOption(option);
@@ -70,23 +108,28 @@ function registerParams(command: Command, verb: VerbSpec): void {
70
108
  } else {
71
109
  command.option(spec, param.doc);
72
110
  }
73
- // B9: a default-`true` boolean is otherwise undisableable — the grammar has
74
- // no negation form, so `create`'s sibling booleans (--ssr/--with-styles/…)
75
- // could never be turned off. Register a paired `--no-<flag>` so they can:
111
+ // B9: a default-`true` boolean is otherwise undisableable — the grammar
112
+ // has no negation form, so a kernel-registered default-true boolean could
113
+ // never be turned off. Register a paired `--no-<flag>` so it can:
76
114
  // Commander keeps the `true` default and lets `--no-<flag>` set it false
77
- // (verified: an unset default-false boolean is left alone). This is a CLI
78
- // PARSE convenience, never a ParamSpec — `emitSurface`/MCP/the covenant are
79
- // untouched — so the frozen flag list stands and negation stays additive.
115
+ // (verified: an unset default-false boolean is left alone). For verbs
116
+ // registered HERE this is a CLI PARSE convenience, never a ParamSpec —
117
+ // `emitSurface`/MCP/the covenant keep the positive kebab token and
118
+ // negation stays additive. A MOUNTED noun (`create`) never reaches this
119
+ // loop: its leaves register through the projection's `buildOptionInfo`,
120
+ // where a default-true confirm registers ONLY the `--no-` form — so its
121
+ // covenant/reference tokens come from the module's registered-syntax
122
+ // seam, not this convention (L-CIS-2).
80
123
  if (param.kind === "boolean" && param.default === true) {
81
124
  const flag = kebabCase(param.name);
82
- command.option(`--no-${flag}`, `Disable --${flag} (on by default).`);
125
+ command.option(`--no-${flag}`, negationFlagDoc(flag));
83
126
  }
84
127
  }
85
128
 
86
129
  if (verb.capability.mutates) {
87
- command.option("--dry-run", "Preview effects without applying them");
88
- command.option("--undo", "Reverse a previous run of this command");
89
- command.option("--yes", "Apply without an interactive confirmation");
130
+ for (const { flag, doc } of MUTATION_FLAG_DOCS) {
131
+ command.option(flag, doc);
132
+ }
90
133
  }
91
134
  }
92
135
 
@@ -241,15 +284,21 @@ export function buildProgram(
241
284
  const programName = options.programName ?? BIN_NAME;
242
285
  const description = options.description ?? PROGRAM_DESCRIPTION;
243
286
  const version = options.version ?? VERSION;
287
+ const issuesUrl = options.issuesUrl ?? ISSUES_URL;
244
288
  const live = verbs.filter((verb) => !verb.hidden);
245
289
 
246
290
  const program = new Command();
247
291
  program.name(programName).description(description);
248
- program.version(version, "-v, --version");
292
+ // One spelling per flag: no shorts. `--version` drops `-v` (which reads as
293
+ // *verbose* everywhere else), and the help option is `--help` alone —
294
+ // subcommands created from here on inherit it (Commander copies the help
295
+ // option into children at creation), including a mounted subtree's.
296
+ program.version(version, "--version");
297
+ program.helpOption("--help", "Show help (works on any command)");
249
298
  program.enablePositionalOptions();
250
299
  program.exitOverride();
251
300
  useDesignedHelp(program, () =>
252
- formatRootHelp(programName, description, live),
301
+ formatRootHelp(programName, description, live, version, issuesUrl),
253
302
  );
254
303
 
255
304
  const groups = new Map<string, VerbSpec[]>();
@@ -264,6 +313,16 @@ export function buildProgram(
264
313
  const selfVerbs = bucket.filter((v) => v.path.length === 1);
265
314
  const subVerbs = bucket.filter((v) => v.path.length > 1);
266
315
 
316
+ // A module-owned mount replaces the generic per-verb attachment for its
317
+ // noun: create the parent once, hand it over, move on.
318
+ const mounted = options.mounts?.get(noun);
319
+ if (mounted) {
320
+ const parent = program.command(noun);
321
+ parent.enablePositionalOptions();
322
+ mounted.mount(parent, { globalFlags: options.globalFlags, programName });
323
+ continue;
324
+ }
325
+
267
326
  // Pure self-verb noun(s) — attach each leaf directly to the root, as before.
268
327
  if (subVerbs.length === 0) {
269
328
  for (const verb of selfVerbs) {
@@ -0,0 +1,34 @@
1
+ /**
2
+ * CLI projector constants — the flag/doc pairs that must read identically
3
+ * wherever they surface.
4
+ *
5
+ * The mutation flags are auto-injected onto every mutating verb by
6
+ * `registerParams` (and by the mounted create subtree's own registration),
7
+ * and `formatVerbHelp` renders them in the Flags block; a default-true
8
+ * boolean's `--no-` negation is likewise both registered and rendered. Help
9
+ * and registration deriving from the SAME rows here is what keeps a page
10
+ * from denying a flag that parses — the defect this file exists to prevent.
11
+ */
12
+
13
+ /** One auto-injected flag: the token and the doc both surfaces print. */
14
+ export interface FlagDoc {
15
+ readonly flag: string;
16
+ readonly doc: string;
17
+ }
18
+
19
+ /** The three mutation flags every mutating verb accepts, in display order. */
20
+ export const MUTATION_FLAG_DOCS: readonly FlagDoc[] = [
21
+ { flag: "--dry-run", doc: "Preview effects without applying them" },
22
+ { flag: "--undo", doc: "Reverse a previous run of this command" },
23
+ { flag: "--yes", doc: "Apply without an interactive confirmation" },
24
+ ];
25
+
26
+ /**
27
+ * The doc for the `--no-<flag>` negation a default-true boolean registers.
28
+ *
29
+ * @param kebab - The positive flag's kebab token (no dashes).
30
+ * @returns The doc string registration and help share.
31
+ */
32
+ export function negationFlagDoc(kebab: string): string {
33
+ return `Disable --${kebab} (on by default).`;
34
+ }
@@ -1,10 +1,17 @@
1
- import { fail, succeed } from "@canonical/task";
1
+ import { existsSync, mkdtempSync, readdirSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { $, fail, gen, log, mkdir, succeed, writeFile } from "@canonical/task";
2
5
  import { afterEach, describe, expect, it, vi } from "vitest";
6
+ import { fixturePreviewModule } from "../../../testing/fixtures/fixtureCapability.js";
3
7
  import { PragmaError } from "../../error/PragmaError.js";
4
8
  import { bootRuntime } from "../../runtime/boot.js";
5
9
  import type { GlobalFlags } from "../../runtime/types.js";
6
10
  import type { ParamSpec, VerbSpec } from "../../spec/types.js";
7
- import { dispatch, executeVerb, extractParams } from "./dispatch.js";
11
+ import { cliIsTTY, dispatch, executeVerb, extractParams } from "./dispatch.js";
12
+
13
+ /** The read-then-write mutation the honest-preview guards drive. */
14
+ const graft = fixturePreviewModule.verbs[0] as VerbSpec;
8
15
 
9
16
  const PLAIN: GlobalFlags = {
10
17
  llm: false,
@@ -143,6 +150,46 @@ describe("executeVerb — mutations", () => {
143
150
  expect(outcome.stdout).toContain("Dry run");
144
151
  });
145
152
 
153
+ it("a verb with NO formatPlan renders the effect dump, byte for byte", async () => {
154
+ // The `formatPlan` seam is opt-in, and opting out is the majority case.
155
+ // These are the exact bytes the kernel produced before any verb had a
156
+ // renderer of its own — the whole literal, not a substring — so a verb
157
+ // that declares nothing can never be re-rendered by accident.
158
+ const dumped: VerbSpec = {
159
+ ...make,
160
+ run: () =>
161
+ gen(function* () {
162
+ yield* $(log("info", "starting"));
163
+ yield* $(mkdir("out"));
164
+ yield* $(writeFile("out/thing.txt", "hello"));
165
+ return { dumped: true };
166
+ }),
167
+ };
168
+ const outcome = await executeVerb(
169
+ dumped,
170
+ {},
171
+ { dryRun: true, undo: false, yes: false },
172
+ bootRuntime(PLAIN, mkdtempSync(join(tmpdir(), "pragma-dump-"))),
173
+ );
174
+ expect(outcome.stdout).toBe(
175
+ "Dry run — planned effects:\n" +
176
+ " - Log [info]: starting\n" +
177
+ " - Created out/\n" +
178
+ " - Write file: out/thing.txt (5 bytes)\n",
179
+ );
180
+ expect(outcome.exitCode).toBe(0);
181
+ });
182
+
183
+ it("an empty plan renders the no-effects line, byte for byte", async () => {
184
+ const outcome = await executeVerb(
185
+ make,
186
+ {},
187
+ { dryRun: true, undo: false, yes: false },
188
+ bootRuntime(PLAIN),
189
+ );
190
+ expect(outcome.stdout).toBe("Dry run — no effects.\n");
191
+ });
192
+
146
193
  it("reports undo count under --undo", async () => {
147
194
  const outcome = await executeVerb(
148
195
  make,
@@ -154,6 +201,104 @@ describe("executeVerb — mutations", () => {
154
201
  });
155
202
  });
156
203
 
204
+ describe("--quiet — success is silent, failure is not", () => {
205
+ // The rule the flag has to keep: everything muted is success-path narration
206
+ // (the calm zero-record notice, a mutation's stage lines). Error rendering
207
+ // does not route through either seam, so no failure can hide behind it.
208
+ const QUIET: GlobalFlags = { ...PLAIN, quiet: true };
209
+ const savedExit = process.exitCode;
210
+ afterEach(() => {
211
+ process.exitCode = savedExit;
212
+ });
213
+
214
+ const emptyList: VerbSpec = {
215
+ ...echo,
216
+ params: [],
217
+ output: {
218
+ formatters: {
219
+ ...passthroughFormatters,
220
+ plain: () => "",
221
+ emptyNotice: () => "No results.",
222
+ },
223
+ },
224
+ run: async () => [],
225
+ };
226
+
227
+ it("mutes the empty-state notice but keeps stdout and the exit code", async () => {
228
+ const loud = await executeVerb(
229
+ emptyList,
230
+ {},
231
+ { dryRun: false, undo: false, yes: false },
232
+ bootRuntime(PLAIN),
233
+ );
234
+ expect(loud.stderr).toBe("No results.\n");
235
+
236
+ const quiet = await executeVerb(
237
+ emptyList,
238
+ {},
239
+ { dryRun: false, undo: false, yes: false },
240
+ bootRuntime(QUIET),
241
+ );
242
+ expect(quiet.stderr).toBeUndefined();
243
+ expect(quiet.stdout).toBe(loud.stdout);
244
+ expect(quiet.exitCode).toBe(0);
245
+ });
246
+
247
+ it("mutes a mutation's progress lines", async () => {
248
+ const reporting: VerbSpec = {
249
+ ...make,
250
+ run: (_params, runtime) => {
251
+ runtime.report?.("Resolving the pack…");
252
+ return succeed({ made: true });
253
+ },
254
+ };
255
+ const errs: string[] = [];
256
+ const spy = vi
257
+ .spyOn(process.stderr, "write")
258
+ .mockImplementation((chunk: string | Uint8Array) => {
259
+ errs.push(String(chunk));
260
+ return true;
261
+ });
262
+ await executeVerb(
263
+ reporting,
264
+ {},
265
+ { dryRun: false, undo: false, yes: true },
266
+ bootRuntime(PLAIN),
267
+ );
268
+ const loud = errs.join("");
269
+ errs.length = 0;
270
+ await executeVerb(
271
+ reporting,
272
+ {},
273
+ { dryRun: false, undo: false, yes: true },
274
+ bootRuntime(QUIET),
275
+ );
276
+ spy.mockRestore();
277
+ expect(loud).toContain("Resolving the pack…");
278
+ expect(errs.join("")).toBe("");
279
+ });
280
+
281
+ it("still renders the error, with its exit code", async () => {
282
+ const failing: VerbSpec = {
283
+ ...echo,
284
+ run: async () => {
285
+ throw PragmaError.notFound("thing", "Nope");
286
+ },
287
+ };
288
+ const errs: string[] = [];
289
+ const spy = vi
290
+ .spyOn(process.stderr, "write")
291
+ .mockImplementation((chunk: string | Uint8Array) => {
292
+ errs.push(String(chunk));
293
+ return true;
294
+ });
295
+ await dispatch(failing, ["x"], {}, QUIET);
296
+ spy.mockRestore();
297
+ expect(errs.join("")).toContain('thing "Nope" not found.');
298
+ expect(process.exitCode).toBe(1);
299
+ });
300
+ });
301
+
157
302
  describe("dispatch — errors", () => {
158
303
  const savedExit = process.exitCode;
159
304
  afterEach(() => {
@@ -183,7 +328,7 @@ describe("dispatch — errors", () => {
183
328
  it("renders a declined confirm gate as a clean cancellation, not a bug report", async () => {
184
329
  // A TTY user declining execute()'s "Proceed?" gate fails the task with
185
330
  // GENERATOR_CANCELLED; the boundary must treat it as a clean cancel, never
186
- // the scary INTERNAL_ERROR "please report this issue" / exit 1.
331
+ // the scary INTERNAL_ERROR "report this issue" / exit 1.
187
332
  const cancelling: VerbSpec = {
188
333
  ...make,
189
334
  run: () => fail({ code: "GENERATOR_CANCELLED", message: "Cancelled." }),
@@ -233,6 +378,66 @@ describe("dispatch — errors", () => {
233
378
  });
234
379
  });
235
380
 
381
+ describe("--dry-run is honest (PRA-104)", () => {
382
+ const savedExit = process.exitCode;
383
+ afterEach(() => {
384
+ process.exitCode = savedExit;
385
+ });
386
+
387
+ /** Capture stderr for one dispatch. */
388
+ const dispatchCapturing = async (
389
+ positionals: readonly string[],
390
+ opts: Record<string, unknown>,
391
+ ): Promise<string> => {
392
+ const errs: string[] = [];
393
+ const spy = vi
394
+ .spyOn(process.stderr, "write")
395
+ .mockImplementation((chunk: string | Uint8Array) => {
396
+ errs.push(String(chunk));
397
+ return true;
398
+ });
399
+ process.exitCode = 0;
400
+ try {
401
+ await dispatch(graft, positionals, opts, PLAIN);
402
+ } finally {
403
+ spy.mockRestore();
404
+ }
405
+ return errs.join("");
406
+ };
407
+
408
+ it("exits NONZERO when the mutation's first read would fail for real", async () => {
409
+ // The structural false positive: this same call used to print a full plan
410
+ // and exit 0, while the run without --dry-run died on the missing file.
411
+ const missing = join(mkdtempSync(join(tmpdir(), "pragma-graft-")), "gone");
412
+ const out = await dispatchCapturing([missing], { dryRun: true });
413
+ expect(process.exitCode).toBe(1);
414
+ expect(out).toContain(missing);
415
+ expect(existsSync(`${missing}.grafted`)).toBe(false);
416
+ });
417
+
418
+ it("still plans, exits 0, and writes nothing when the read would succeed", async () => {
419
+ const dir = mkdtempSync(join(tmpdir(), "pragma-graft-"));
420
+ const source = join(dir, "present.txt");
421
+ writeFileSync(source, "content\n");
422
+ const outs: string[] = [];
423
+ const spy = vi
424
+ .spyOn(process.stdout, "write")
425
+ .mockImplementation((chunk: string | Uint8Array) => {
426
+ outs.push(String(chunk));
427
+ return true;
428
+ });
429
+ process.exitCode = 0;
430
+ try {
431
+ await dispatch(graft, [source], { dryRun: true }, PLAIN);
432
+ } finally {
433
+ spy.mockRestore();
434
+ }
435
+ expect(process.exitCode).toBe(0);
436
+ expect(outs.join("")).toContain(`Write file: ${source}.grafted`);
437
+ expect(readdirSync(dir)).toEqual(["present.txt"]);
438
+ });
439
+ });
440
+
236
441
  describe("executeVerb — interactivity gate (H3)", () => {
237
442
  const setTTY = (
238
443
  stream: NodeJS.ReadStream | NodeJS.WriteStream,
@@ -285,4 +490,23 @@ describe("executeVerb — interactivity gate (H3)", () => {
285
490
  );
286
491
  expect(sink.isTTY).toBe(true);
287
492
  });
493
+
494
+ it("cliIsTTY IS the stdin+stderr conjunction — the one gate both callers read", () => {
495
+ // The mount's create decision reads the same exported function this
496
+ // describe drives through executeVerb, so pinning the truth table here
497
+ // pins BOTH callers (nothing is left to keep two copies in step).
498
+ const cases: Array<[boolean, boolean, boolean, boolean]> = [
499
+ [true, true, false, true], // stdout is irrelevant…
500
+ [true, true, true, true],
501
+ [false, true, true, false], // …stdin is required…
502
+ [true, false, true, false], // …and so is stderr.
503
+ [false, false, false, false],
504
+ ];
505
+ for (const [stdin, stderr, stdout, expected] of cases) {
506
+ setTTY(process.stdin, stdin);
507
+ setTTY(process.stderr, stderr);
508
+ setTTY(process.stdout, stdout);
509
+ expect(cliIsTTY(), `stdin=${stdin} stderr=${stderr}`).toBe(expected);
510
+ }
511
+ });
288
512
  });