@canonical/pragma-cli 0.34.0 → 0.36.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 (832) hide show
  1. package/README.md +153 -30
  2. package/bundled-skills/add-standard/SKILL.md +338 -0
  3. package/bundled-skills/adoption-a1-styles/SKILL.md +269 -0
  4. package/bundled-skills/adoption-a2-components/SKILL.md +291 -0
  5. package/bundled-skills/adoption-a3-forms/SKILL.md +260 -0
  6. package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +406 -0
  7. package/bundled-skills/anatomy-author/SKILL.md +1226 -0
  8. package/bundled-skills/design-auditor/SKILL.md +455 -0
  9. package/bundled-skills/implement-component/SKILL.md +333 -0
  10. package/bundled-skills/specify-component/SKILL.md +331 -0
  11. package/bundled-skills/specify-pattern/SKILL.md +292 -0
  12. package/dist/.build-ok +0 -0
  13. package/dist/package.json +84 -0
  14. package/dist/pragma.conf.js +1016 -0
  15. package/dist/pragma.conf.js.map +1 -0
  16. package/dist/src/bin.js +356 -0
  17. package/dist/src/bin.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  19. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  20. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  21. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  22. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  23. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  24. package/dist/src/capabilities/capabilities/hints.js +195 -0
  25. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  26. package/dist/src/capabilities/capabilities/index.js +11 -0
  27. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  28. package/dist/src/capabilities/capabilities/types.js +11 -0
  29. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  30. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  31. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  32. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  33. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  34. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  35. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  36. package/dist/src/capabilities/colophon/index.js +5 -0
  37. package/dist/src/capabilities/colophon/index.js.map +1 -0
  38. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  39. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  40. package/dist/src/capabilities/colophon/types.js +10 -0
  41. package/dist/src/capabilities/colophon/types.js.map +1 -0
  42. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  43. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  44. package/dist/src/capabilities/config/field.render.js +22 -0
  45. package/dist/src/capabilities/config/field.render.js.map +1 -0
  46. package/dist/src/capabilities/config/fields.js +46 -0
  47. package/dist/src/capabilities/config/fields.js.map +1 -0
  48. package/dist/src/capabilities/config/get.verb.js +61 -0
  49. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/index.js +5 -0
  51. package/dist/src/capabilities/config/index.js.map +1 -0
  52. package/dist/src/capabilities/config/runField.js +59 -0
  53. package/dist/src/capabilities/config/runField.js.map +1 -0
  54. package/dist/src/capabilities/config/runGet.js +28 -0
  55. package/dist/src/capabilities/config/runGet.js.map +1 -0
  56. package/dist/src/capabilities/config/runSet.js +53 -0
  57. package/dist/src/capabilities/config/runSet.js.map +1 -0
  58. package/dist/src/capabilities/config/set.verb.js +66 -0
  59. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  60. package/dist/src/capabilities/config/show.render.js +84 -0
  61. package/dist/src/capabilities/config/show.render.js.map +1 -0
  62. package/dist/src/capabilities/config/show.verb.js +44 -0
  63. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  64. package/dist/src/capabilities/config/types.js +5 -0
  65. package/dist/src/capabilities/config/types.js.map +1 -0
  66. package/dist/src/capabilities/config/unset.verb.js +49 -0
  67. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  68. package/dist/src/capabilities/create/cliProjection.js +195 -0
  69. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  70. package/dist/src/capabilities/create/constants.js +47 -0
  71. package/dist/src/capabilities/create/constants.js.map +1 -0
  72. package/dist/src/capabilities/create/create.render.js +100 -0
  73. package/dist/src/capabilities/create/create.render.js.map +1 -0
  74. package/dist/src/capabilities/create/create.verb.js +438 -0
  75. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  76. package/dist/src/capabilities/create/createHelp.js +47 -0
  77. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  78. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  79. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  80. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  81. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  82. package/dist/src/capabilities/create/index.js +18 -0
  83. package/dist/src/capabilities/create/index.js.map +1 -0
  84. package/dist/src/capabilities/create/messages.js +16 -0
  85. package/dist/src/capabilities/create/messages.js.map +1 -0
  86. package/dist/src/capabilities/create/mount.js +294 -0
  87. package/dist/src/capabilities/create/mount.js.map +1 -0
  88. package/dist/src/capabilities/create/pathJail.js +65 -0
  89. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  90. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  91. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  92. package/dist/src/capabilities/create/types.js +2 -0
  93. package/dist/src/capabilities/create/types.js.map +1 -0
  94. package/dist/src/capabilities/distribution.js +40 -0
  95. package/dist/src/capabilities/distribution.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  97. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  99. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +148 -0
  101. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  102. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  103. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  104. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  105. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  106. package/dist/src/capabilities/doctor/checks/harnessInventory.js +195 -0
  107. package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -0
  108. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  109. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  110. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  111. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  112. package/dist/src/capabilities/doctor/checks/targetHealth.js +349 -0
  113. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  114. package/dist/src/capabilities/doctor/doctor.render.js +164 -0
  115. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  116. package/dist/src/capabilities/doctor/doctor.verb.js +49 -0
  117. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  118. package/dist/src/capabilities/doctor/index.js +5 -0
  119. package/dist/src/capabilities/doctor/index.js.map +1 -0
  120. package/dist/src/capabilities/doctor/runChecks.js +86 -0
  121. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  122. package/dist/src/capabilities/doctor/types.js +5 -0
  123. package/dist/src/capabilities/doctor/types.js.map +1 -0
  124. package/dist/src/capabilities/graph/index.js +19 -0
  125. package/dist/src/capabilities/graph/index.js.map +1 -0
  126. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  127. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  128. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  129. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  130. package/dist/src/capabilities/graph/query.render.js +73 -0
  131. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  132. package/dist/src/capabilities/graph/query.verb.js +49 -0
  133. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  134. package/dist/src/capabilities/graph/runQuery.js +41 -0
  135. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  136. package/dist/src/capabilities/index.js +56 -0
  137. package/dist/src/capabilities/index.js.map +1 -0
  138. package/dist/src/capabilities/info/collectInfo.js +72 -0
  139. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  140. package/dist/src/capabilities/info/index.js +5 -0
  141. package/dist/src/capabilities/info/index.js.map +1 -0
  142. package/dist/src/capabilities/info/info.render.js +57 -0
  143. package/dist/src/capabilities/info/info.render.js.map +1 -0
  144. package/dist/src/capabilities/info/info.verb.js +42 -0
  145. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  146. package/dist/src/capabilities/info/types.js +5 -0
  147. package/dist/src/capabilities/info/types.js.map +1 -0
  148. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  149. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  150. package/dist/src/capabilities/meta/index.js +13 -0
  151. package/dist/src/capabilities/meta/index.js.map +1 -0
  152. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  153. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  154. package/dist/src/capabilities/ontology/index.js +21 -0
  155. package/dist/src/capabilities/ontology/index.js.map +1 -0
  156. package/dist/src/capabilities/ontology/queries.js +123 -0
  157. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  158. package/dist/src/capabilities/ontology/render.js +66 -0
  159. package/dist/src/capabilities/ontology/render.js.map +1 -0
  160. package/dist/src/capabilities/ontology/verbs.js +181 -0
  161. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  162. package/dist/src/capabilities/prompt/index.js +16 -0
  163. package/dist/src/capabilities/prompt/index.js.map +1 -0
  164. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  165. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  166. package/dist/src/capabilities/prompt/types.js +10 -0
  167. package/dist/src/capabilities/prompt/types.js.map +1 -0
  168. package/dist/src/capabilities/prompt/verbs.js +93 -0
  169. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  170. package/dist/src/capabilities/resources/index.js +10 -0
  171. package/dist/src/capabilities/resources/index.js.map +1 -0
  172. package/dist/src/capabilities/resources/provider.js +423 -0
  173. package/dist/src/capabilities/resources/provider.js.map +1 -0
  174. package/dist/src/capabilities/setup/buildPlan.js +172 -0
  175. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  176. package/dist/src/capabilities/setup/index.js +5 -0
  177. package/dist/src/capabilities/setup/index.js.map +1 -0
  178. package/dist/src/capabilities/setup/mode.js +53 -0
  179. package/dist/src/capabilities/setup/mode.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/index.js +39 -0
  181. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  182. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  183. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  184. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  185. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  186. package/dist/src/capabilities/setup/operations/setupGenerator.js +390 -0
  187. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  188. package/dist/src/capabilities/setup/operations/setupLsp.js +329 -0
  189. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  190. package/dist/src/capabilities/setup/operations/setupMcp.js +253 -0
  191. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  192. package/dist/src/capabilities/setup/operations/setupSkills.js +594 -0
  193. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  194. package/dist/src/capabilities/setup/plan.js +128 -0
  195. package/dist/src/capabilities/setup/plan.js.map +1 -0
  196. package/dist/src/capabilities/setup/plan.render.js +271 -0
  197. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  198. package/dist/src/capabilities/setup/setup.render.js +54 -0
  199. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  200. package/dist/src/capabilities/setup/setup.verb.js +387 -0
  201. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  202. package/dist/src/capabilities/setup/shell.js +196 -0
  203. package/dist/src/capabilities/setup/shell.js.map +1 -0
  204. package/dist/src/capabilities/setup/targets.js +328 -0
  205. package/dist/src/capabilities/setup/targets.js.map +1 -0
  206. package/dist/src/capabilities/setup/types.js +5 -0
  207. package/dist/src/capabilities/setup/types.js.map +1 -0
  208. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  209. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  210. package/dist/src/capabilities/shared/index.js +27 -0
  211. package/dist/src/capabilities/shared/index.js.map +1 -0
  212. package/dist/src/capabilities/shared/packageManager.js +349 -0
  213. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  214. package/dist/src/capabilities/shared/registry.js +55 -0
  215. package/dist/src/capabilities/shared/registry.js.map +1 -0
  216. package/dist/src/capabilities/skill/discover.js +281 -0
  217. package/dist/src/capabilities/skill/discover.js.map +1 -0
  218. package/dist/src/capabilities/skill/index.js +10 -0
  219. package/dist/src/capabilities/skill/index.js.map +1 -0
  220. package/dist/src/capabilities/skill/render.js +49 -0
  221. package/dist/src/capabilities/skill/render.js.map +1 -0
  222. package/dist/src/capabilities/skill/verbs.js +83 -0
  223. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  224. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  225. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  226. package/dist/src/capabilities/sources/index.js +13 -0
  227. package/dist/src/capabilities/sources/index.js.map +1 -0
  228. package/dist/src/capabilities/sources/installSkills.js +309 -0
  229. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  230. package/dist/src/capabilities/sources/runUpdate.js +460 -0
  231. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  232. package/dist/src/capabilities/sources/status.render.js +64 -0
  233. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  234. package/dist/src/capabilities/sources/status.verb.js +40 -0
  235. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  236. package/dist/src/capabilities/sources/types.js +6 -0
  237. package/dist/src/capabilities/sources/types.js.map +1 -0
  238. package/dist/src/capabilities/sources/update.render.js +34 -0
  239. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  240. package/dist/src/capabilities/sources/update.verb.js +55 -0
  241. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  242. package/dist/src/capabilities/upgrade/index.js +5 -0
  243. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  244. package/dist/src/capabilities/upgrade/runUpgrade.js +135 -0
  245. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  246. package/dist/src/capabilities/upgrade/types.js +5 -0
  247. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  248. package/dist/src/capabilities/upgrade/upgrade.render.js +52 -0
  249. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  250. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  251. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  252. package/dist/src/capabilities/version/index.js +10 -0
  253. package/dist/src/capabilities/version/index.js.map +1 -0
  254. package/dist/src/capabilities/version/version.verb.js +36 -0
  255. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  256. package/dist/src/constants.js +87 -0
  257. package/dist/src/constants.js.map +1 -0
  258. package/dist/src/index.js +12 -0
  259. package/dist/src/index.js.map +1 -0
  260. package/dist/src/kernel/completion/complete.js +66 -0
  261. package/dist/src/kernel/completion/complete.js.map +1 -0
  262. package/dist/src/kernel/completion/emitScripts.js +92 -0
  263. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  264. package/dist/src/kernel/completion/entitySource.js +285 -0
  265. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  266. package/dist/src/kernel/completion/index.js +14 -0
  267. package/dist/src/kernel/completion/index.js.map +1 -0
  268. package/dist/src/kernel/completion/model.js +301 -0
  269. package/dist/src/kernel/completion/model.js.map +1 -0
  270. package/dist/src/kernel/completion/parse.js +253 -0
  271. package/dist/src/kernel/completion/parse.js.map +1 -0
  272. package/dist/src/kernel/completion/rank.js +101 -0
  273. package/dist/src/kernel/completion/rank.js.map +1 -0
  274. package/dist/src/kernel/completion/resolve.js +100 -0
  275. package/dist/src/kernel/completion/resolve.js.map +1 -0
  276. package/dist/src/kernel/completion/templates/bash.js +209 -0
  277. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  278. package/dist/src/kernel/completion/templates/fish.js +214 -0
  279. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  280. package/dist/src/kernel/completion/templates/index.js +23 -0
  281. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  282. package/dist/src/kernel/completion/templates/shared.js +98 -0
  283. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  284. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  285. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  286. package/dist/src/kernel/completion/types.js +13 -0
  287. package/dist/src/kernel/completion/types.js.map +1 -0
  288. package/dist/src/kernel/config/defaults.js +17 -0
  289. package/dist/src/kernel/config/defaults.js.map +1 -0
  290. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  291. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  292. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  293. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  294. package/dist/src/kernel/config/firstRun.js +34 -0
  295. package/dist/src/kernel/config/firstRun.js.map +1 -0
  296. package/dist/src/kernel/config/globalConfig.js +79 -0
  297. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  298. package/dist/src/kernel/config/index.js +16 -0
  299. package/dist/src/kernel/config/index.js.map +1 -0
  300. package/dist/src/kernel/config/paths.js +35 -0
  301. package/dist/src/kernel/config/paths.js.map +1 -0
  302. package/dist/src/kernel/config/readConfig.js +78 -0
  303. package/dist/src/kernel/config/readConfig.js.map +1 -0
  304. package/dist/src/kernel/config/schema.js +130 -0
  305. package/dist/src/kernel/config/schema.js.map +1 -0
  306. package/dist/src/kernel/config/types.js +19 -0
  307. package/dist/src/kernel/config/types.js.map +1 -0
  308. package/dist/src/kernel/config/writeConfigField.js +59 -0
  309. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  310. package/dist/src/kernel/copy.js +43 -0
  311. package/dist/src/kernel/copy.js.map +1 -0
  312. package/dist/src/kernel/error/PragmaError.js +149 -0
  313. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  314. package/dist/src/kernel/error/constants.js +40 -0
  315. package/dist/src/kernel/error/constants.js.map +1 -0
  316. package/dist/src/kernel/error/fromTaskError.js +96 -0
  317. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  318. package/dist/src/kernel/error/index.js +13 -0
  319. package/dist/src/kernel/error/index.js.map +1 -0
  320. package/dist/src/kernel/error/recovery.js +52 -0
  321. package/dist/src/kernel/error/recovery.js.map +1 -0
  322. package/dist/src/kernel/error/renderError.js +115 -0
  323. package/dist/src/kernel/error/renderError.js.map +1 -0
  324. package/dist/src/kernel/error/serialize.js +25 -0
  325. package/dist/src/kernel/error/serialize.js.map +1 -0
  326. package/dist/src/kernel/error/types.js +9 -0
  327. package/dist/src/kernel/error/types.js.map +1 -0
  328. package/dist/src/kernel/index.js +34 -0
  329. package/dist/src/kernel/index.js.map +1 -0
  330. package/dist/src/kernel/interactivity.js +68 -0
  331. package/dist/src/kernel/interactivity.js.map +1 -0
  332. package/dist/src/kernel/packs/collect.js +187 -0
  333. package/dist/src/kernel/packs/collect.js.map +1 -0
  334. package/dist/src/kernel/packs/compile.js +304 -0
  335. package/dist/src/kernel/packs/compile.js.map +1 -0
  336. package/dist/src/kernel/packs/disclosure.js +76 -0
  337. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  338. package/dist/src/kernel/packs/glob.js +38 -0
  339. package/dist/src/kernel/packs/glob.js.map +1 -0
  340. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  341. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  342. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  343. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  344. package/dist/src/kernel/packs/graphql/index.js +20 -0
  345. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  346. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  347. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  348. package/dist/src/kernel/packs/index.js +34 -0
  349. package/dist/src/kernel/packs/index.js.map +1 -0
  350. package/dist/src/kernel/packs/iri.js +110 -0
  351. package/dist/src/kernel/packs/iri.js.map +1 -0
  352. package/dist/src/kernel/packs/renderPack.js +129 -0
  353. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  354. package/dist/src/kernel/packs/resolveEntity.js +274 -0
  355. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  356. package/dist/src/kernel/packs/runBodies.js +140 -0
  357. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  358. package/dist/src/kernel/packs/sample.js +56 -0
  359. package/dist/src/kernel/packs/sample.js.map +1 -0
  360. package/dist/src/kernel/packs/schema.js +421 -0
  361. package/dist/src/kernel/packs/schema.js.map +1 -0
  362. package/dist/src/kernel/packs/sparql/applyFilters.js +167 -0
  363. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  364. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  365. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  366. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +480 -0
  367. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  368. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  369. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  370. package/dist/src/kernel/packs/sparql/index.js +31 -0
  371. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  372. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  373. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  374. package/dist/src/kernel/packs/types.js +30 -0
  375. package/dist/src/kernel/packs/types.js.map +1 -0
  376. package/dist/src/kernel/packs/uniqueness.js +30 -0
  377. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  378. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  379. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  380. package/dist/src/kernel/project/cli/constants.js +27 -0
  381. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  382. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  383. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  384. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  385. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  386. package/dist/src/kernel/project/cli/globalFlags.js +219 -0
  387. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  388. package/dist/src/kernel/project/cli/helpFormat.js +58 -0
  389. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  390. package/dist/src/kernel/project/cli/index.js +14 -0
  391. package/dist/src/kernel/project/cli/index.js.map +1 -0
  392. package/dist/src/kernel/project/cli/rootHelp.js +227 -0
  393. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  394. package/dist/src/kernel/project/cli/suggest.js +75 -0
  395. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  396. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  397. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  398. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  399. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  401. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  403. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/index.js +8 -0
  405. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  407. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  408. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  409. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  410. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  411. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  412. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  413. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  414. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  415. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  416. package/dist/src/kernel/project/mcp/registerVerb.js +315 -0
  417. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  418. package/dist/src/kernel/project/mcp/serve.js +35 -0
  419. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  420. package/dist/src/kernel/render/compactUri.js +24 -0
  421. package/dist/src/kernel/render/compactUri.js.map +1 -0
  422. package/dist/src/kernel/render/contracts.js +10 -0
  423. package/dist/src/kernel/render/contracts.js.map +1 -0
  424. package/dist/src/kernel/render/disclosure.js +34 -0
  425. package/dist/src/kernel/render/disclosure.js.map +1 -0
  426. package/dist/src/kernel/render/envelope.js +30 -0
  427. package/dist/src/kernel/render/envelope.js.map +1 -0
  428. package/dist/src/kernel/render/formatters.js +27 -0
  429. package/dist/src/kernel/render/formatters.js.map +1 -0
  430. package/dist/src/kernel/render/index.js +15 -0
  431. package/dist/src/kernel/render/index.js.map +1 -0
  432. package/dist/src/kernel/render/prefixes.js +46 -0
  433. package/dist/src/kernel/render/prefixes.js.map +1 -0
  434. package/dist/src/kernel/render/renderers.js +468 -0
  435. package/dist/src/kernel/render/renderers.js.map +1 -0
  436. package/dist/src/kernel/render/style.js +105 -0
  437. package/dist/src/kernel/render/style.js.map +1 -0
  438. package/dist/src/kernel/render/turtle.js +194 -0
  439. package/dist/src/kernel/render/turtle.js.map +1 -0
  440. package/dist/src/kernel/render/vocabulary.js +174 -0
  441. package/dist/src/kernel/render/vocabulary.js.map +1 -0
  442. package/dist/src/kernel/render/writeStdout.js +43 -0
  443. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  444. package/dist/src/kernel/runtime/boot.js +49 -0
  445. package/dist/src/kernel/runtime/boot.js.map +1 -0
  446. package/dist/src/kernel/runtime/facade.js +39 -0
  447. package/dist/src/kernel/runtime/facade.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  449. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  451. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  453. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  455. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  457. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  459. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  460. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  461. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  462. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  463. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  464. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  465. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  466. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  467. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  468. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  469. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  470. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  471. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  472. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  473. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  474. package/dist/src/kernel/runtime/index.js +8 -0
  475. package/dist/src/kernel/runtime/index.js.map +1 -0
  476. package/dist/src/kernel/runtime/loadSession.js +34 -0
  477. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  478. package/dist/src/kernel/runtime/paths.js +78 -0
  479. package/dist/src/kernel/runtime/paths.js.map +1 -0
  480. package/dist/src/kernel/runtime/probe.js +37 -0
  481. package/dist/src/kernel/runtime/probe.js.map +1 -0
  482. package/dist/src/kernel/runtime/readEntity.js +363 -0
  483. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  484. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  485. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  486. package/dist/src/kernel/runtime/refs/index.js +29 -0
  487. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  488. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  489. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  490. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  491. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  492. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  493. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  494. package/dist/src/kernel/runtime/store.js +75 -0
  495. package/dist/src/kernel/runtime/store.js.map +1 -0
  496. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  497. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  498. package/dist/src/kernel/runtime/types.js +11 -0
  499. package/dist/src/kernel/runtime/types.js.map +1 -0
  500. package/dist/src/kernel/spec/asVerb.js +21 -0
  501. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  502. package/dist/src/kernel/spec/emitReference.js +578 -0
  503. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  504. package/dist/src/kernel/spec/emitSurface.js +202 -0
  505. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  506. package/dist/src/kernel/spec/index.js +11 -0
  507. package/dist/src/kernel/spec/index.js.map +1 -0
  508. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  509. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  510. package/dist/src/kernel/spec/types.js +14 -0
  511. package/dist/src/kernel/spec/types.js.map +1 -0
  512. package/dist/src/kernel/spec/validate.js +110 -0
  513. package/dist/src/kernel/spec/validate.js.map +1 -0
  514. package/dist/src/kernel/vocabulary.js +97 -0
  515. package/dist/src/kernel/vocabulary.js.map +1 -0
  516. package/dist/src/types.js +11 -0
  517. package/dist/src/types.js.map +1 -0
  518. package/package.json +22 -23
  519. package/pragma.conf.ts +486 -90
  520. package/src/bin.ts +274 -82
  521. package/src/capabilities/block.parity.test.ts +29 -12
  522. package/src/capabilities/block.shipped.exec.test.ts +282 -0
  523. package/src/capabilities/block.tierRank.exec.test.ts +300 -0
  524. package/src/capabilities/capabilities/capabilities.render.ts +1 -1
  525. package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
  526. package/src/capabilities/capabilities/catalog.ts +3 -3
  527. package/src/capabilities/capabilities/hints.ts +32 -7
  528. package/src/capabilities/capabilities/index.ts +1 -1
  529. package/src/capabilities/colophon/collectColophon.ts +35 -24
  530. package/src/capabilities/colophon/colophon.render.ts +24 -1
  531. package/src/capabilities/colophon/colophon.test.ts +42 -21
  532. package/src/capabilities/colophon/colophon.verb.ts +4 -4
  533. package/src/capabilities/config/collectConfigShow.test.ts +1 -0
  534. package/src/capabilities/config/collectConfigShow.ts +3 -3
  535. package/src/capabilities/config/field.render.ts +4 -5
  536. package/src/capabilities/config/fields.ts +17 -10
  537. package/src/capabilities/config/get.verb.ts +70 -0
  538. package/src/capabilities/config/getUnset.test.ts +264 -0
  539. package/src/capabilities/config/index.ts +5 -1
  540. package/src/capabilities/config/runField.ts +40 -22
  541. package/src/capabilities/config/runGet.ts +34 -0
  542. package/src/capabilities/config/runSet.ts +35 -9
  543. package/src/capabilities/config/set.test.ts +48 -14
  544. package/src/capabilities/config/set.verb.ts +8 -7
  545. package/src/capabilities/config/show.render.ts +1 -1
  546. package/src/capabilities/config/show.verb.ts +9 -6
  547. package/src/capabilities/config/types.ts +18 -4
  548. package/src/capabilities/config/unset.verb.ts +58 -0
  549. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  550. package/src/capabilities/create/byteEquality.test.ts +25 -11
  551. package/src/capabilities/create/cliProjection.ts +227 -0
  552. package/src/capabilities/create/constants.ts +36 -61
  553. package/src/capabilities/create/create.mcp.test.ts +89 -5
  554. package/src/capabilities/create/create.render.ts +71 -7
  555. package/src/capabilities/create/create.test.ts +433 -219
  556. package/src/capabilities/create/create.verb.ts +297 -328
  557. package/src/capabilities/create/createGrammar.test.ts +865 -0
  558. package/src/capabilities/create/createHelp.ts +71 -0
  559. package/src/capabilities/create/createSurface.generated.ts +400 -0
  560. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  561. package/src/capabilities/create/cwdJail.test.ts +24 -5
  562. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  563. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  564. package/src/capabilities/create/index.ts +7 -4
  565. package/src/capabilities/create/messages.ts +18 -0
  566. package/src/capabilities/create/mount.ts +391 -0
  567. package/src/capabilities/create/pathJail.test.ts +90 -0
  568. package/src/capabilities/create/pathJail.ts +8 -5
  569. package/src/capabilities/create/pickGenerator.ts +23 -35
  570. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  571. package/src/capabilities/create/types.ts +20 -0
  572. package/src/capabilities/distribution.parity.test.ts +4 -0
  573. package/src/capabilities/distribution.test.ts +3 -1
  574. package/src/capabilities/distribution.ts +10 -15
  575. package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
  576. package/src/capabilities/doctor/checks/checkPackageRefs.ts +75 -8
  577. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
  578. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +76 -29
  579. package/src/capabilities/doctor/checks/checkShellCompletions.ts +63 -17
  580. package/src/capabilities/doctor/checks/harnessInventory.test.ts +219 -0
  581. package/src/capabilities/doctor/checks/harnessInventory.ts +298 -0
  582. package/src/capabilities/doctor/checks/index.ts +27 -0
  583. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  584. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  585. package/src/capabilities/doctor/checks/targetHealth.ts +444 -0
  586. package/src/capabilities/doctor/doctor.render.test.ts +125 -38
  587. package/src/capabilities/doctor/doctor.render.ts +74 -74
  588. package/src/capabilities/doctor/doctor.test.ts +338 -37
  589. package/src/capabilities/doctor/doctor.verb.ts +8 -3
  590. package/src/capabilities/doctor/runChecks.ts +65 -63
  591. package/src/capabilities/doctor/types.ts +22 -15
  592. package/src/capabilities/emptyRecovery.test.ts +21 -8
  593. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  594. package/src/capabilities/graph/index.ts +1 -1
  595. package/src/capabilities/graph/inspect.render.ts +70 -22
  596. package/src/capabilities/graph/inspect.test.ts +260 -5
  597. package/src/capabilities/graph/inspect.verb.ts +18 -6
  598. package/src/capabilities/graph/query.render.ts +15 -3
  599. package/src/capabilities/graph/query.verb.ts +3 -3
  600. package/src/capabilities/graph/runQuery.ts +2 -3
  601. package/src/capabilities/index.ts +3 -1
  602. package/src/capabilities/info/collectInfo.ts +13 -5
  603. package/src/capabilities/info/info.render.ts +7 -3
  604. package/src/capabilities/info/info.test.ts +37 -1
  605. package/src/capabilities/info/info.verb.ts +1 -1
  606. package/src/capabilities/info/types.ts +10 -2
  607. package/src/capabilities/lazy.test.ts +32 -0
  608. package/src/capabilities/meta/complete.verb.ts +1 -1
  609. package/src/capabilities/meta/index.ts +1 -1
  610. package/src/capabilities/meta/mcp.verb.ts +10 -8
  611. package/src/capabilities/ontology/index.ts +15 -11
  612. package/src/capabilities/ontology/ontology.test.ts +6 -55
  613. package/src/capabilities/ontology/queries.ts +2 -2
  614. package/src/capabilities/ontology/render.ts +3 -4
  615. package/src/capabilities/ontology/verbs.ts +27 -68
  616. package/src/capabilities/prompt/index.ts +2 -2
  617. package/src/capabilities/prompt/prompt.render.ts +6 -2
  618. package/src/capabilities/prompt/types.ts +1 -1
  619. package/src/capabilities/prompt/verbs.ts +4 -5
  620. package/src/capabilities/reference.test.ts +63 -0
  621. package/src/capabilities/renderVocabularySync.test.ts +82 -0
  622. package/src/capabilities/resources/provider.ts +342 -85
  623. package/src/capabilities/resources/resources.test.ts +355 -59
  624. package/src/capabilities/scopeTypeSync.test.ts +29 -15
  625. package/src/capabilities/setup/buildPlan.ts +240 -0
  626. package/src/capabilities/setup/index.ts +7 -7
  627. package/src/capabilities/setup/mode.ts +74 -0
  628. package/src/capabilities/setup/operations/index.ts +79 -0
  629. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  630. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  631. package/src/capabilities/setup/operations/setupGenerator.ts +478 -334
  632. package/src/capabilities/setup/operations/setupLsp.ts +420 -67
  633. package/src/capabilities/setup/operations/setupMcp.ts +238 -127
  634. package/src/capabilities/setup/operations/setupSkills.ts +667 -105
  635. package/src/capabilities/setup/plan.render.ts +336 -0
  636. package/src/capabilities/setup/plan.ts +241 -0
  637. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  638. package/src/capabilities/setup/setup.render.test.ts +297 -75
  639. package/src/capabilities/setup/setup.render.ts +45 -77
  640. package/src/capabilities/setup/setup.test.ts +1819 -225
  641. package/src/capabilities/setup/setup.verb.ts +288 -78
  642. package/src/capabilities/setup/shell.test.ts +86 -0
  643. package/src/capabilities/setup/shell.ts +137 -11
  644. package/src/capabilities/setup/targets.ts +435 -0
  645. package/src/capabilities/setup/types.ts +23 -70
  646. package/src/capabilities/shared/assertExecOk.ts +68 -10
  647. package/src/capabilities/shared/index.ts +43 -0
  648. package/src/capabilities/shared/packageManager.test.ts +470 -0
  649. package/src/capabilities/shared/packageManager.ts +425 -34
  650. package/src/capabilities/skill/bundledSkills.test.ts +347 -0
  651. package/src/capabilities/skill/discover.ts +131 -10
  652. package/src/capabilities/skill/index.ts +1 -1
  653. package/src/capabilities/skill/render.ts +10 -9
  654. package/src/capabilities/skill/skill.test.ts +22 -7
  655. package/src/capabilities/skill/verbs.ts +3 -4
  656. package/src/capabilities/sources/collectStatus.ts +7 -2
  657. package/src/capabilities/sources/index.ts +1 -1
  658. package/src/capabilities/sources/installSkills.ts +265 -10
  659. package/src/capabilities/sources/runUpdate.ts +131 -23
  660. package/src/capabilities/sources/sources.test.ts +382 -2
  661. package/src/capabilities/sources/status.render.ts +1 -1
  662. package/src/capabilities/sources/status.verb.ts +1 -1
  663. package/src/capabilities/sources/update.render.ts +1 -1
  664. package/src/capabilities/sources/update.verb.ts +4 -4
  665. package/src/capabilities/surface.test.ts +136 -19
  666. package/src/capabilities/upgrade/runUpgrade.ts +53 -14
  667. package/src/capabilities/upgrade/types.ts +10 -2
  668. package/src/capabilities/upgrade/upgrade.render.ts +13 -7
  669. package/src/capabilities/upgrade/upgrade.test.ts +75 -3
  670. package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
  671. package/src/capabilities/version/index.ts +12 -0
  672. package/src/capabilities/version/version.test.ts +66 -0
  673. package/src/capabilities/version/version.verb.ts +39 -0
  674. package/src/constants.ts +36 -1
  675. package/src/identity.test.ts +57 -29
  676. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
  677. package/src/kernel/completion/complete.test.ts +12 -2
  678. package/src/kernel/completion/complete.ts +1 -1
  679. package/src/kernel/completion/emitScripts.ts +1 -1
  680. package/src/kernel/completion/entitySource.test.ts +16 -3
  681. package/src/kernel/completion/entitySource.ts +21 -8
  682. package/src/kernel/completion/model.test.ts +164 -12
  683. package/src/kernel/completion/model.ts +94 -14
  684. package/src/kernel/completion/parse.test.ts +4 -7
  685. package/src/kernel/completion/parse.ts +15 -0
  686. package/src/kernel/completion/resolve.test.ts +0 -1
  687. package/src/kernel/completion/safety.test.ts +50 -35
  688. package/src/kernel/completion/shellDrive.test.ts +28 -9
  689. package/src/kernel/completion/templates/bash.ts +7 -2
  690. package/src/kernel/completion/templates/index.ts +23 -0
  691. package/src/kernel/completion/types.ts +7 -0
  692. package/src/kernel/config/defaults.test.ts +27 -3
  693. package/src/kernel/config/defaults.ts +4 -3
  694. package/src/kernel/config/evaluateProjectConfig.ts +31 -8
  695. package/src/kernel/config/firstRun.test.ts +44 -38
  696. package/src/kernel/config/firstRun.ts +24 -88
  697. package/src/kernel/config/index.ts +1 -1
  698. package/src/kernel/config/readConfig.test.ts +6 -3
  699. package/src/kernel/config/readConfig.ts +1 -1
  700. package/src/kernel/config/schema.ts +3 -1
  701. package/src/kernel/config/types.ts +3 -1
  702. package/src/kernel/copy.test.ts +34 -4
  703. package/src/kernel/copy.ts +54 -0
  704. package/src/kernel/error/PragmaError.test.ts +5 -2
  705. package/src/kernel/error/PragmaError.ts +4 -2
  706. package/src/kernel/error/constants.ts +7 -5
  707. package/src/kernel/error/fromTaskError.ts +28 -6
  708. package/src/kernel/error/recovery.ts +14 -0
  709. package/src/kernel/error/renderError.ts +42 -1
  710. package/src/kernel/error/types.ts +21 -1
  711. package/src/kernel/index.ts +35 -0
  712. package/src/kernel/interactivity.test.ts +76 -0
  713. package/src/kernel/interactivity.ts +69 -0
  714. package/src/kernel/packs/collect.ts +12 -16
  715. package/src/kernel/packs/compile.test.ts +222 -1
  716. package/src/kernel/packs/compile.ts +93 -3
  717. package/src/kernel/packs/disclosure.ts +2 -2
  718. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  719. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
  720. package/src/kernel/packs/graphql/index.ts +20 -0
  721. package/src/kernel/packs/index.ts +40 -0
  722. package/src/kernel/packs/iri.test.ts +73 -0
  723. package/src/kernel/packs/iri.ts +66 -14
  724. package/src/kernel/packs/renderPack.ts +25 -6
  725. package/src/kernel/packs/resolveEntity.test.ts +274 -0
  726. package/src/kernel/packs/resolveEntity.ts +200 -42
  727. package/src/kernel/packs/runBodies.ts +86 -22
  728. package/src/kernel/packs/sample.ts +1 -1
  729. package/src/kernel/packs/schema.ts +78 -5
  730. package/src/kernel/packs/sparql/applyFilters.ts +136 -16
  731. package/src/kernel/packs/sparql/buildLookupQuery.test.ts +290 -0
  732. package/src/kernel/packs/sparql/buildLookupQuery.ts +367 -17
  733. package/src/kernel/packs/sparql/index.ts +37 -0
  734. package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
  735. package/src/kernel/packs/sparql/runSelect.ts +3 -4
  736. package/src/kernel/packs/toolDescription.test.ts +77 -4
  737. package/src/kernel/packs/types.ts +136 -0
  738. package/src/kernel/packs/uniqueness.ts +1 -1
  739. package/src/kernel/project/cli/buildProgram.test.ts +218 -12
  740. package/src/kernel/project/cli/buildProgram.ts +84 -18
  741. package/src/kernel/project/cli/constants.ts +34 -0
  742. package/src/kernel/project/cli/dispatch.test.ts +160 -2
  743. package/src/kernel/project/cli/dispatch.ts +226 -45
  744. package/src/kernel/project/cli/exitCodes.ts +1 -1
  745. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  746. package/src/kernel/project/cli/globalFlags.ts +134 -31
  747. package/src/kernel/project/cli/helpFormat.ts +14 -2
  748. package/src/kernel/project/cli/rootHelp.ts +74 -12
  749. package/src/kernel/project/cli/suggest.test.ts +33 -1
  750. package/src/kernel/project/cli/suggest.ts +25 -1
  751. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  752. package/src/kernel/project/cli/verbHelp.ts +23 -7
  753. package/src/kernel/project/mcp/buildServer.ts +7 -4
  754. package/src/kernel/project/mcp/envelope.ts +2 -2
  755. package/src/kernel/project/mcp/instructions.ts +2 -2
  756. package/src/kernel/project/mcp/mcpError.ts +1 -1
  757. package/src/kernel/project/mcp/parity.test.ts +5 -2
  758. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  759. package/src/kernel/project/mcp/prompts/source.ts +2 -2
  760. package/src/kernel/project/mcp/registerVerb.ts +55 -10
  761. package/src/kernel/project/mcp/serve.ts +2 -2
  762. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  763. package/src/kernel/render/contracts.ts +21 -0
  764. package/src/kernel/render/envelope.ts +2 -3
  765. package/src/kernel/render/formatters.ts +1 -1
  766. package/src/kernel/render/renderers.test.ts +243 -6
  767. package/src/kernel/render/renderers.ts +222 -20
  768. package/src/kernel/render/style.test.ts +75 -24
  769. package/src/kernel/render/style.ts +59 -6
  770. package/src/kernel/render/turtle.ts +222 -0
  771. package/src/kernel/render/vocabulary.ts +276 -0
  772. package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
  773. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
  775. package/src/kernel/runtime/graphpack/embedded.ts +3 -3
  776. package/src/kernel/runtime/graphpack/manifest.ts +1 -1
  777. package/src/kernel/runtime/graphpack/read.ts +1 -2
  778. package/src/kernel/runtime/loadSession.ts +1 -1
  779. package/src/kernel/runtime/probe.ts +6 -6
  780. package/src/kernel/runtime/readEntity.ts +472 -28
  781. package/src/kernel/runtime/refs/index.ts +39 -0
  782. package/src/kernel/runtime/refs/parseRef.ts +2 -2
  783. package/src/kernel/runtime/refs/resolve.ts +4 -4
  784. package/src/kernel/runtime/storeReadiness.ts +1 -2
  785. package/src/kernel/runtime/types.ts +15 -1
  786. package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
  787. package/src/kernel/spec/emitReference.ts +105 -30
  788. package/src/kernel/spec/emitSurface.ts +48 -6
  789. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  790. package/src/kernel/spec/types.ts +277 -4
  791. package/src/testing/PARITY_GAPS.ts +9 -3
  792. package/src/testing/behavioral/docExamples.test.ts +16 -0
  793. package/src/testing/behavioral/errorMatrix.mcp.test.ts +112 -9
  794. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  795. package/src/testing/behavioral/journeys.cli.test.ts +1 -1
  796. package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
  797. package/src/testing/behavioral/journeys.firstInstall.test.ts +7 -2
  798. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  799. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  800. package/src/testing/behavioral/journeys.packageStories.test.ts +10 -7
  801. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  802. package/src/testing/behavioral/mcpSurface.test.ts +1 -1
  803. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  804. package/src/testing/eval/__snapshots__/eval.test.ts.snap +26 -1
  805. package/src/testing/eval/cases/effectful.ts +3 -2
  806. package/src/testing/eval/cases/readNouns.ts +245 -9
  807. package/src/testing/fixtures/blockGraph.ts +104 -10
  808. package/src/testing/fixtures/graph/canonical.ts +182 -13
  809. package/src/testing/fixtures/graph/defaultPack.ts +1 -1
  810. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  811. package/src/testing/helpers/projectMcp.ts +32 -6
  812. package/src/testing/helpers/runCli.ts +35 -18
  813. package/src/testing/perf/budgets.test.ts +20 -9
  814. package/src/testing/perf/budgets.ts +58 -9
  815. package/src/testing/perf/codegen.test.ts +126 -0
  816. package/src/testing/perf/globalSetup.test.ts +286 -0
  817. package/src/testing/perf/globalSetup.ts +505 -23
  818. package/src/testing/perf/measure.test.ts +38 -0
  819. package/src/testing/perf/measure.ts +23 -4
  820. package/src/testing/setupXdgIsolation.ts +81 -21
  821. package/src/testing/tempRoot.globalSetup.ts +122 -0
  822. package/dist/pragma +0 -0
  823. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
  824. package/src/capabilities/create/templates.embedded.generated.ts +0 -28
  825. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
  826. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  827. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
  828. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
  829. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  830. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  831. package/src/capabilities/shared/bands.ts +0 -16
  832. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
@@ -150,10 +150,56 @@ export interface PackFilter {
150
150
  * string matched case-insensitively against the variable).
151
151
  */
152
152
  readonly values?: readonly string[];
153
+ /**
154
+ * How a provided value is compared to the row's cell.
155
+ *
156
+ * `"exact"` (the default) compares the whole cell. `"set"` reads the cell as
157
+ * a SPACE-SEPARATED set and matches when ANY member equals the provided
158
+ * value — the shape a `GROUP_CONCAT` produces, for a dimension where one row
159
+ * legitimately belongs to several values at once. The standing case is a
160
+ * hierarchy: a standard filed under `testing-unit` is, by the definition of
161
+ * the hierarchy, also a `testing` standard, and a filter that compared only
162
+ * the leaf answered `--category testing` with 1 of 8 — a silently wrong
163
+ * answer, exit 0.
164
+ */
165
+ readonly match?: "exact" | "set";
166
+ /**
167
+ * Where the dimension's VOCABULARY lives in the graph, for a filter with no
168
+ * declared {@link values}.
169
+ *
170
+ * A value-free filter rejects a value the data does not carry. The question is
171
+ * what "the data" means. The rows a list just returned are the wrong answer:
172
+ * they are a POPULATION, and a value can be real while no row carries it — a
173
+ * category the graph declares with zero standards filed under it, a
174
+ * `ds:ConceptType` no concept uses yet. Validating against rows turns those
175
+ * into `INVALID_INPUT`, when the honest answer is a calm empty list.
176
+ *
177
+ * So the vocabulary is read from the graph directly, from the same terms the
178
+ * surface that ENUMERATES it reads (`standard categories` reads `cs:Category`
179
+ * / `cs:slug`; so does the `category` filter's vocabulary query). The ruling
180
+ * this honours is "the graph is the vocabulary, don't hard-code the slugs" —
181
+ * rows were never the graph, just the part of it that answered.
182
+ *
183
+ * Without it a value-free filter falls back to the observed rows, which is the
184
+ * only evidence available; that is a NARROWER vocabulary than the truth, and a
185
+ * story whose dimension has an authoritative source should declare it.
186
+ */
187
+ readonly vocabulary?: PackFilterVocabulary;
153
188
  /** Help text (defaults to a generated description). */
154
189
  readonly description?: string;
155
190
  }
156
191
 
192
+ /** The authoritative value set for a value-free {@link PackFilter}. */
193
+ export interface PackFilterVocabulary {
194
+ /** SPARQL SELECT producing one row per admissible value. */
195
+ readonly query: string;
196
+ /**
197
+ * SELECT variable carrying the value (without `?`). Defaults to the filter's
198
+ * own {@link PackFilter.variable}.
199
+ */
200
+ readonly variable?: string;
201
+ }
202
+
157
203
  /**
158
204
  * Free-text search over list rows: a `--search` string keeping a row when ANY
159
205
  * named SELECT variable contains the term (case-insensitive substring). Applied
@@ -239,6 +285,49 @@ export interface PackCompletion {
239
285
  readonly minChars?: number;
240
286
  }
241
287
 
288
+ /**
289
+ * How much an entity's containing SCOPE is worth when a name reaches several
290
+ * entities at once — the ranking factor {@link PackLookup.scopeWeight} declares.
291
+ *
292
+ * DERIVED, never enumerated. The scope's own name is a path (`Global`,
293
+ * `Apps/Launchpad`), so its DEPTH is a fact the graph already states, and a
294
+ * scope nobody has heard of yet inherits its place the day it appears. An
295
+ * enumerated ranking would have to be edited for each new one, and the one
296
+ * nobody edited would silently rank first.
297
+ *
298
+ * The weight falls by {@link falloff} per level below the top, so the top level
299
+ * is worth 1 and each nesting step costs the same again; floored at 0, so a very
300
+ * deep scope can never turn negative and invert the type factor it multiplies.
301
+ *
302
+ * {@link asserted} is the retirement path for the DERIVATION, not for this
303
+ * declaration: an asserted value wins over the derived one
304
+ * (`COALESCE(?asserted, ?derived)`), so the day the ontology states the ranking
305
+ * itself, the depth heuristic stops mattering and `falloff` becomes inert.
306
+ *
307
+ * The declaration itself must stay. Every read of {@link asserted} is reached
308
+ * through this object, so deleting it does not fall back to the ontology's rank
309
+ * — it removes scope ranking from the query altogether and silently returns the
310
+ * lookup to `STR(?uri)` order, which is the defect this exists to fix. What
311
+ * retires is the derivation, and what remains is `via` plus `asserted`.
312
+ */
313
+ export interface PackScopeWeight {
314
+ /** The entity → scope edge (e.g. `ds:tier`). */
315
+ readonly via: string;
316
+ /**
317
+ * The scope property holding its path-shaped name (e.g. `ds:name`), whose
318
+ * `/`-separated depth derives the weight.
319
+ *
320
+ * It must be the NAME, not the IRI: the live tiers spell the same scope
321
+ * `ds:apps_launchpad` and `"Apps/Launchpad"`, and only the name carries the
322
+ * separator that makes the hierarchy legible.
323
+ */
324
+ readonly by: string;
325
+ /** Score cost per level below the top, 0–1 (e.g. 0.2 → 1, 0.8, 0.6, …). */
326
+ readonly falloff: number;
327
+ /** An asserted weight on the scope, which WINS over the derived one. */
328
+ readonly asserted?: string;
329
+ }
330
+
242
331
  /**
243
332
  * The lookup half of a pack. The query is generated from `by` and `type`/`types`
244
333
  * — user-supplied names are escaped by the generator, never interpolated by the
@@ -256,6 +345,29 @@ export interface PackLookup {
256
345
  readonly source?: "sparql" | "graphql";
257
346
  /** Property whose value names the entity — prefixed name or IRI. */
258
347
  readonly by: string;
348
+ /**
349
+ * What names an entity that carries no {@link by} value. Absent (the default)
350
+ * means NOTHING does: the `by` triple is required, and an entity without one
351
+ * is not addressable by name and never drawn by `sample`.
352
+ *
353
+ * `"iri"` opts the family into an IRI-DERIVED name — the local name after the
354
+ * last `#`/`/`, with dot-separated hierarchy segments published as slashes
355
+ * (`cs:react.component.props` → `react/component/props`).
356
+ *
357
+ * DECLARE IT ONLY WHEN THE STORY'S `list` PUBLISHES THE SAME DERIVED NAME.
358
+ * The option exists to keep the two halves of the two-step grammar over ONE
359
+ * population: `standard list` synthesizes a name for the ~87% of code
360
+ * standards carrying no `cs:name`, so `standard lookup` must answer to it.
361
+ * Turning it on where the list does NOT publish such a name is the mirror
362
+ * defect — `token list` requires `ds:tokenId`, so a `ds:Token` without one
363
+ * would become addressable and sampleable under a name the list never
364
+ * published.
365
+ *
366
+ * Requires a class constraint ({@link type}/{@link types}): the derived name
367
+ * is only as trustworthy as the class that vouches for the entity, and
368
+ * without one there is nothing to bound the scan with either.
369
+ */
370
+ readonly nameFallback?: "iri";
259
371
  /** Optional single class constraint — prefixed name or IRI. */
260
372
  readonly type?: string;
261
373
  /** CLI description for the lookup command (defaults to a generated one). */
@@ -267,6 +379,30 @@ export interface PackLookup {
267
379
  * VALUES constraint on the name resolve. Mutually exclusive with `type`.
268
380
  */
269
381
  readonly types?: readonly string[];
382
+ /**
383
+ * Relative importance per addressed type, prefixed type → 0–1 (unlisted types
384
+ * default to 1). Editorial judgement about which of a noun's classes matters
385
+ * most, declared as DATA rather than frozen into the kernel — it feeds the MCP
386
+ * listing's `annotations.priority`, breaks ties in URI-completion ranking, AND
387
+ * is one factor of the score a name resolve ORDERS BY, so a `ds:Subcomponent`
388
+ * at 0.6 sinks below every component at equal match.
389
+ *
390
+ * A separate map rather than an entry shape on `types` so `types` keeps its
391
+ * flat `readonly string[]` form and the addition is non-breaking. A key naming
392
+ * a type the lookup does not address is REJECTED, not ignored: a silent no-op
393
+ * is how a weight that never applied survives review.
394
+ */
395
+ readonly weights?: Readonly<Record<string, number>>;
396
+ /**
397
+ * The OTHER factor of that score: how much an entity's containing scope is
398
+ * worth, derived from how DEEP that scope sits in its own hierarchy.
399
+ *
400
+ * {@link weights} answers "which KIND of thing did they mean"; this answers
401
+ * "whose?". They multiply rather than tiebreak, because neither subsumes the
402
+ * other: a whole component in a narrow scope still beats a mere part of a
403
+ * block in the widest one.
404
+ */
405
+ readonly scopeWeight?: PackScopeWeight;
270
406
  /**
271
407
  * GraphQL type or interface the generated document's inline fragment targets
272
408
  * (`source: "graphql"` only). Defaults to the local name of `type`; required
@@ -8,7 +8,7 @@
8
8
  * conflict, reported with both sources.
9
9
  */
10
10
 
11
- import type { VerbSpec } from "../spec/types.js";
11
+ import type { VerbSpec } from "../spec/index.js";
12
12
 
13
13
  /** The `(noun, verb)` key for a verb path (`["standard","list"]` → `standard list`). */
14
14
  export function verbKey(path: readonly [string, string?]): string {
@@ -3,6 +3,7 @@ import { afterAll, describe, expect, it, vi } from "vitest";
3
3
  import { VERSION } from "../../../constants.js";
4
4
  import { fixtureModule } from "../../../testing/fixtures/fixtureCapability.js";
5
5
  import { projectCli } from "../../../testing/helpers/projectCli.js";
6
+ import type { GlobalFlags } from "../../runtime/index.js";
6
7
  import type { CapabilityModule, VerbSpec } from "../../spec/types.js";
7
8
  import { formatRootHelp } from "./rootHelp.js";
8
9
 
@@ -105,6 +106,121 @@ describe("buildProgram — default-true boolean negation (B9)", () => {
105
106
  });
106
107
  });
107
108
 
109
+ describe("buildProgram — one spelling per flag", () => {
110
+ it("registers no short option anywhere in the tree", () => {
111
+ const program = projectCli([fixtureModule]);
112
+ const walk = (cmd: import("commander").Command): void => {
113
+ expect(cmd.options.some((o) => o.short !== undefined)).toBe(false);
114
+ for (const child of cmd.commands) walk(child);
115
+ };
116
+ walk(program);
117
+ });
118
+
119
+ it("still answers --help while -v/-h reject as unknown options", async () => {
120
+ const spyErr = vi
121
+ .spyOn(process.stderr, "write")
122
+ .mockImplementation(() => true);
123
+ const spyOut = vi
124
+ .spyOn(process.stdout, "write")
125
+ .mockImplementation(() => true);
126
+ await expect(
127
+ projectCli([fixtureModule]).parseAsync(["widget", "--help"], {
128
+ from: "user",
129
+ }),
130
+ ).rejects.toMatchObject({ code: "commander.helpDisplayed" });
131
+ await expect(
132
+ projectCli([fixtureModule]).parseAsync(["widget", "list", "-h"], {
133
+ from: "user",
134
+ }),
135
+ ).rejects.toMatchObject({ code: "commander.unknownOption" });
136
+ await expect(
137
+ projectCli([fixtureModule]).parseAsync(["widget", "list", "-v"], {
138
+ from: "user",
139
+ }),
140
+ ).rejects.toMatchObject({ code: "commander.unknownOption" });
141
+ spyErr.mockRestore();
142
+ spyOut.mockRestore();
143
+ });
144
+ });
145
+
146
+ describe("buildProgram — repeatable filter flags", () => {
147
+ /** A verb with a repeatable enum filter and a repeatable string filter. */
148
+ const filterVerb: VerbSpec = {
149
+ path: ["thing", "list"],
150
+ summary: "thing list summary",
151
+ params: [
152
+ {
153
+ kind: "enum",
154
+ name: "category",
155
+ doc: "Filter by category.",
156
+ values: ["css", "git"],
157
+ repeatable: true,
158
+ },
159
+ { kind: "string", name: "tag", doc: "Filter by tag.", repeatable: true },
160
+ ],
161
+ output: {
162
+ formatters: {
163
+ plain: (d) => JSON.stringify(d),
164
+ llm: (d) => JSON.stringify(d),
165
+ json: (d) => JSON.stringify(d),
166
+ },
167
+ },
168
+ capability: { needsStore: false, mutates: false, mcp: { expose: true } },
169
+ run: async (params) => params,
170
+ };
171
+
172
+ /** Parse argv and capture the option bag the action receives. */
173
+ async function optsFor(argv: string[]): Promise<Record<string, unknown>> {
174
+ let seen: Record<string, unknown> = {};
175
+ const program = projectCli([
176
+ {
177
+ name: "thing",
178
+ verbs: [
179
+ {
180
+ ...filterVerb,
181
+ run: async (params) => {
182
+ seen = params;
183
+ return null;
184
+ },
185
+ },
186
+ ],
187
+ },
188
+ ]);
189
+ await program.parseAsync(["thing", "list", ...argv], { from: "user" });
190
+ return seen;
191
+ }
192
+
193
+ it("accumulates a repeated filter into the union, never last-wins", async () => {
194
+ const params = await optsFor([
195
+ "--category",
196
+ "css",
197
+ "--category",
198
+ "git",
199
+ "--tag",
200
+ "a",
201
+ "--tag",
202
+ "b",
203
+ ]);
204
+ expect(params.category).toEqual(["css", "git"]);
205
+ expect(params.tag).toEqual(["a", "b"]);
206
+ });
207
+
208
+ it("keeps a single occurrence a one-element array and validates enum values", async () => {
209
+ const params = await optsFor(["--category", "css"]);
210
+ expect(params.category).toEqual(["css"]);
211
+ const program = projectCli([{ name: "thing", verbs: [filterVerb] }]);
212
+ const spy = vi
213
+ .spyOn(process.stderr, "write")
214
+ .mockImplementation(() => true);
215
+ await expect(
216
+ program.parseAsync(["thing", "list", "--category", "bogus"], {
217
+ from: "user",
218
+ }),
219
+ ).rejects.toMatchObject({ code: "commander.invalidArgument" });
220
+ spy.mockRestore();
221
+ });
222
+ });
223
+
108
224
  describe("buildProgram — early exits", () => {
109
225
  it("throws commander.version for --version, writing the version", async () => {
110
226
  const program = projectCli([fixtureModule]);
@@ -371,12 +487,88 @@ describe("buildProgram — sub-verb-only noun invoked bare (U2)", () => {
371
487
  });
372
488
  });
373
489
 
490
+ /** The global flags of a human at a terminal: plain output, nothing inferred. */
491
+ const HUMAN_FLAGS: GlobalFlags = {
492
+ llm: false,
493
+ format: "plain",
494
+ verbose: false,
495
+ };
496
+
497
+ /** A run whose stdout is captured: `llm`, inferred or asked for. */
498
+ const CAPTURED_FLAGS: GlobalFlags = {
499
+ llm: true,
500
+ autoLlm: true,
501
+ format: "plain",
502
+ verbose: false,
503
+ };
504
+
505
+ /** The first line of the wordmark art — present iff the wordmark printed. */
506
+ const WORDMARK_LINE = "(___,";
507
+
508
+ const rootHelpFor = (flags: GlobalFlags): string =>
509
+ formatRootHelp(
510
+ "pragma",
511
+ "pragma test",
512
+ [
513
+ makeVerb(["info"]),
514
+ makeVerb(["config", "show"]),
515
+ makeVerb(["block", "list"]),
516
+ ],
517
+ "1.2.3",
518
+ "https://example.test/issues",
519
+ flags,
520
+ );
521
+
522
+ describe("formatRootHelp — the wordmark is gated on the AUDIENCE", () => {
523
+ // Asserted on the ART, never on styling: `golden.ts` strips ANSI and this
524
+ // suite pins `chalk.level = 0`, so a colour-only change would be invisible
525
+ // here — and chalk emits no escapes off a TTY anyway, so it would save an
526
+ // agent nothing. The lines have to go.
527
+ it("prints the art for a human reading plain output", () => {
528
+ expect(rootHelpFor(HUMAN_FLAGS)).toContain(WORDMARK_LINE);
529
+ });
530
+
531
+ it("drops the art — every line of it — when stdout is captured", () => {
532
+ const help = rootHelpFor(CAPTURED_FLAGS);
533
+ expect(help).not.toContain(WORDMARK_LINE);
534
+ // No leading blank line either: the header IS the first line.
535
+ expect(help.startsWith("pragma v1.2.3 — pragma test")).toBe(true);
536
+ // Only the art goes; the page itself is untouched.
537
+ expect(help).toContain("Usage: pragma <command> [subcommand] [flags]");
538
+ expect(help).toContain("Global flags");
539
+ });
540
+
541
+ it("drops the art for `--format json` too", () => {
542
+ expect(
543
+ rootHelpFor({ llm: false, format: "json", verbose: false }),
544
+ ).not.toContain(WORDMARK_LINE);
545
+ });
546
+
547
+ it("keeps the art for an EXPLICIT `--format plain` down a pipe", () => {
548
+ // Explicit beats inference: asking for the human shape gets the human page,
549
+ // captured or not. (`parseGlobalFlags` leaves `llm` false whenever
550
+ // `--format` was requested.)
551
+ expect(
552
+ rootHelpFor({
553
+ llm: false,
554
+ autoLlm: false,
555
+ format: "plain",
556
+ verbose: false,
557
+ }),
558
+ ).toContain(WORDMARK_LINE);
559
+ });
560
+
561
+ it("differs ONLY by the wordmark block", () => {
562
+ const human = rootHelpFor(HUMAN_FLAGS).split("\n");
563
+ const captured = rootHelpFor(CAPTURED_FLAGS).split("\n");
564
+ // 10 art lines + the blank that separates them from the header.
565
+ expect(human.length - captured.length).toBe(11);
566
+ expect(human.slice(11)).toEqual(captured);
567
+ });
568
+ });
569
+
374
570
  describe("formatRootHelp — grouping", () => {
375
- const help = formatRootHelp("pragma", "pragma test", [
376
- makeVerb(["info"]),
377
- makeVerb(["config", "show"]),
378
- makeVerb(["block", "list"]),
379
- ]);
571
+ const help = rootHelpFor(HUMAN_FLAGS);
380
572
 
381
573
  it("leads with the uncurated nouns, untitled, under the usage line", () => {
382
574
  // `block` is not in the kernel's curated table, so it leads the page with
@@ -389,11 +581,13 @@ describe("formatRootHelp — grouping", () => {
389
581
  expect(help.match(/pragma test/g)).toHaveLength(1);
390
582
  });
391
583
 
392
- it("lists the live nouns and always-available mcp", () => {
584
+ it("lists the live nouns, and only those", () => {
393
585
  expect(help).toContain("block");
394
586
  expect(help).toContain("config");
395
587
  expect(help).toContain("info");
396
- expect(help).toContain("mcp");
588
+ // `mcp` is curated for PLACEMENT, not conjured into existence: a registry
589
+ // without an mcp verb has no mcp row.
590
+ expect(help).not.toContain("mcp");
397
591
  });
398
592
 
399
593
  it("drops nouns that are not present", () => {
@@ -410,7 +604,20 @@ describe("formatRootHelp — grouping", () => {
410
604
 
411
605
  it("renders the unified root page (restyle golden)", () => {
412
606
  expect(help).toMatchInlineSnapshot(`
413
- "pragma — pragma test
607
+ " _
608
+ /' \`\\
609
+ /' )
610
+ /' (___,/'____ ____ ____ ,__________ ____
611
+ /' )' )--/' ) /' ) /' ) ) /' )
612
+ /' /' /' /' /' /' /' /' /' /' /'
613
+ (,/' /' (___,/(__(___,/(__/' /' /(__(___,/(__
614
+ /'
615
+ / /'
616
+ (___,/'
617
+
618
+ pragma v1.2.3 — pragma test
619
+
620
+ This is a preview version. Issues and suggestions: https://example.test/issues
414
621
 
415
622
  Usage: pragma <command> [subcommand] [flags]
416
623
 
@@ -420,13 +627,12 @@ describe("formatRootHelp — grouping", () => {
420
627
  config Read and write pragma configuration
421
628
  info Show version, config, and update status
422
629
 
423
- For AI agents
424
- mcp Start the MCP server over stdio
425
-
426
630
  Global flags
427
631
  --format <plain|llm|json> Select output format (llm = condensed Markdown for agents)
428
632
  --detail <level> Progressive-disclosure level (summary, standard, detailed)
429
- --verbose Diagnostic output on stderr
633
+ --no-headers Hide the table header row in plain output
634
+ --quiet Suppress success and progress output (errors still print)
635
+ --verbose Diagnostic output on stderr (sources update)
430
636
  --help Show help (works on any command)
431
637
  --version Show the CLI version
432
638
 
@@ -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,28 @@ 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(
302
+ programName,
303
+ description,
304
+ live,
305
+ version,
306
+ issuesUrl,
307
+ options.globalFlags,
308
+ ),
253
309
  );
254
310
 
255
311
  const groups = new Map<string, VerbSpec[]>();
@@ -264,6 +320,16 @@ export function buildProgram(
264
320
  const selfVerbs = bucket.filter((v) => v.path.length === 1);
265
321
  const subVerbs = bucket.filter((v) => v.path.length > 1);
266
322
 
323
+ // A module-owned mount replaces the generic per-verb attachment for its
324
+ // noun: create the parent once, hand it over, move on.
325
+ const mounted = options.mounts?.get(noun);
326
+ if (mounted) {
327
+ const parent = program.command(noun);
328
+ parent.enablePositionalOptions();
329
+ mounted.mount(parent, { globalFlags: options.globalFlags, programName });
330
+ continue;
331
+ }
332
+
267
333
  // Pure self-verb noun(s) — attach each leaf directly to the root, as before.
268
334
  if (subVerbs.length === 0) {
269
335
  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
+ }