@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
@@ -1,230 +1,133 @@
1
1
  /**
2
- * The `create` verbs — `component` / `package` / `application` (path capped at
3
- * two segments; the declared component frameworks collapse to one verb + a
4
- * `--framework` enum). Each is a mutating, interactive, storeless verb.
2
+ * The `create` verbs — `component` / `package` / `application`, the THREE
3
+ * binding-level VerbSpecs (the MCP/covenant/reference grammar). Their params
4
+ * DERIVE mechanically from the generators' own prompts, projected at build
5
+ * time into `createSurface.generated.ts` — no hand mirrors, no flag aliases:
6
+ * the prompt names ARE the param/MCP-arg names, the FLAG tokens are
7
+ * `buildOptionInfo`'s registered forms (a default-true confirm registers
8
+ * ONLY `--no-<kebab>` — the covenant and the doc gate speak that vocabulary
9
+ * through the mount's registered-syntax seam, L-CIS-2), and `component`'s
10
+ * params are the FRAMEWORK UNION of its three declared leaves plus a
11
+ * required, positional `framework` enum derived from the tree segments
12
+ * (L-CIS). The CLI mounts the
13
+ * generator TREE itself (`create component react [component-path]` — see
14
+ * `mount.ts`); these specs are what MCP tools and the emitted surface read.
5
15
  *
6
- * LAZY DISPATCH (R9 + lazy-React): the params are STATIC — built by the
7
- * generator→grammar adapter over static prompt MIRRORS, never the live
8
- * generators (importing a generator pulls summon-core, and with it React). The
9
- * `run` body lazily `import()`s `pickGenerator` + summon-core, so `buildProgram`
10
- * / `--help` / `__complete` / reads never load summon-core or the generators —
11
- * and `create --yes` never loads React (the Ink UI is dynamic-only, and only the
12
- * TTY branch even asks for it). A parity test loads the real generators and
13
- * asserts the mirrors still match.
16
+ * LAZY DISPATCH (R9 + lazy-React): NOTHING of summon-core is imported
17
+ * statically — not even the UI-free projection subpath: this module sits on
18
+ * the capabilities barrel, so `--help` and `__complete` pay its import cost
19
+ * on every spawn, and the projection helpers it needs (`decideInteraction`,
20
+ * `refusalMessage`, `toKebabCase`, …) are only ever called inside `run`.
21
+ * `run` lazily `import()`s `pickGenerator` + summon-core + the projection, so
22
+ * `buildProgram` / `--help` / `__complete` / reads never load summon-core or
23
+ * the generators — and `create --yes` never loads React. The lazy-graph
24
+ * guard in `lazy.test.ts` pins the boundary.
14
25
  */
15
26
 
16
- import type { GeneratorResult, PromptDefinition } from "@canonical/summon-core";
27
+ import { isAbsolute } from "node:path";
28
+ import type { GeneratorResult } from "@canonical/summon-core";
29
+ import type { ProjectedPrompt } from "@canonical/summon-core/projection";
17
30
  import type { Task } from "@canonical/task";
18
31
  import { BIN_NAME } from "../../constants.js";
19
- import { PragmaError } from "../../kernel/error/PragmaError.js";
20
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
21
- import type { ParamSpec, VerbSpec } from "../../kernel/spec/types.js";
22
- import { CREATE_GENERATORS } from "./constants.js";
23
- import { createFormatters } from "./create.render.js";
24
- import { generatorToParams } from "./generatorToVerbSpec.js";
32
+ import { PragmaError } from "../../kernel/error/index.js";
33
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
34
+ import type { ParamSpec, VerbSpec } from "../../kernel/spec/index.js";
35
+ import { COMPONENT_FRAMEWORKS, CREATE_GENERATORS } from "./constants.js";
36
+ import { createFormatters, formatCreatePlan } from "./create.render.js";
37
+ import { CREATE_SURFACE } from "./createSurface.generated.js";
38
+ import { generatorToParams, promptToParam } from "./generatorToVerbSpec.js";
25
39
  import { assertInsideWorkspace } from "./pathJail.js";
26
40
  import type { CreateKind } from "./types.js";
27
41
 
28
42
  // =============================================================================
29
- // Static params (mirrors of the generators' prompts — see the module doc)
43
+ // Params, derived from the projected surface (createSurface.generated.ts)
30
44
  // =============================================================================
31
45
 
32
- /** `--framework` — the declared component generators collapsed to one enum. */
46
+ /**
47
+ * `framework` — the component tree segments as a REQUIRED positional enum
48
+ * (`create component <framework>`), values derived from the declared paths.
49
+ * Deliberately NO default: summon has no default framework, and neither does
50
+ * the projection of it.
51
+ */
33
52
  const FRAMEWORK_PARAM: ParamSpec = {
34
53
  kind: "enum",
35
54
  name: "framework",
36
- doc: "Component framework.",
37
- values: CREATE_GENERATORS.component.frameworks,
38
- // The FIRST declared framework, so the default is always inside the enum.
39
- default: CREATE_GENERATORS.component.frameworks[0],
40
- };
41
-
42
- /**
43
- * `componentPath` — positional, and deliberately WITHOUT a ParamSpec default so
44
- * the selected framework's own prompt default applies (react vs svelte/lit
45
- * differ); `required: false` keeps it optional despite having no default here.
46
- */
47
- const COMPONENT_PATH_PARAM: ParamSpec = {
48
- kind: "string",
49
- name: "componentPath",
50
- doc: "Component path (its final segment is the PascalCase component name).",
51
- required: false,
55
+ doc: "Component framework — the tree segment (`create component <framework>`).",
56
+ values: COMPONENT_FRAMEWORKS,
57
+ required: true,
52
58
  positional: true,
53
- complete: { kind: "files" },
54
59
  };
55
60
 
56
- const SHARED_COMPONENT_MIRROR: PromptDefinition[] = [
57
- {
58
- name: "withStyles",
59
- type: "confirm",
60
- message: "Include styles?",
61
- default: true,
62
- },
63
- {
64
- name: "withStories",
65
- type: "confirm",
66
- message: "Include Storybook stories?",
67
- default: true,
68
- },
69
- {
70
- name: "withSsrTests",
71
- type: "confirm",
72
- message: "Include SSR tests?",
73
- default: true,
74
- },
75
- ];
76
-
77
- const PACKAGE_MIRROR: PromptDefinition[] = [
78
- {
79
- name: "name",
80
- type: "text",
81
- message: "Package name:",
82
- default: "@canonical/my-package",
83
- },
84
- {
85
- name: "type",
86
- type: "select",
87
- message: "Package type:",
88
- choices: [
89
- { label: "tool-ts", value: "tool-ts" },
90
- { label: "library", value: "library" },
91
- { label: "css", value: "css" },
92
- ],
93
- default: "tool-ts",
94
- },
95
- {
96
- name: "description",
97
- type: "text",
98
- message: "Package description:",
99
- default: "",
100
- },
101
- {
102
- name: "withReact",
103
- type: "confirm",
104
- message: "Include React dependencies?",
105
- default: false,
106
- },
107
- {
108
- name: "withStorybook",
109
- type: "confirm",
110
- message: "Include Storybook setup?",
111
- default: false,
112
- },
113
- {
114
- name: "withCli",
115
- type: "confirm",
116
- message: "Include a CLI binary entry point?",
117
- default: false,
118
- },
119
- {
120
- name: "withPrTemplate",
121
- type: "confirm",
122
- message: "Include a PR template?",
123
- default: false,
124
- },
125
- // Opt-in (default false): the grammar has no `--no-` form, so a default-true
126
- // boolean could never be turned off. `--run-install` enables it.
127
- {
128
- name: "runInstall",
129
- type: "confirm",
130
- message: "Run the package manager install after creation?",
131
- default: false,
132
- },
133
- ];
134
-
135
- // The include-flag prompts carry the CLI grammar's `--with-X` names
136
- // (`withSsr`/`withRouter`/`withForms`/`withRelay`, AV-228 B8) rather than the
137
- // summon generator's bare prompt names (`ssr`/`router`/`forms`/`relay`). {@link
138
- // INCLUDE_FLAG_ALIASES} maps them back at the CLI↔generator boundary so the
139
- // generator prompt names — and their embedded templates + byte-equality
140
- // goldens — stay stable. `--run-install` (default false) is an action flag, not
141
- // an include, so it keeps its spelling.
142
- const APPLICATION_MIRROR: PromptDefinition[] = [
143
- {
144
- name: "appPath",
145
- type: "text",
146
- message: "Application directory:",
147
- default: "my-app",
148
- positional: true,
149
- },
150
- { name: "withSsr", type: "confirm", message: "Include SSR?", default: true },
151
- {
152
- name: "withRouter",
153
- type: "confirm",
154
- message: "Include router?",
155
- default: true,
156
- },
157
- {
158
- name: "withForms",
159
- type: "confirm",
160
- message: "Include form components?",
161
- default: true,
162
- },
163
- {
164
- name: "withRelay",
165
- type: "confirm",
166
- message: "Include a Relay (GraphQL) data layer?",
167
- default: false,
168
- },
169
- {
170
- name: "runInstall",
171
- type: "confirm",
172
- message: "Install dependencies now?",
173
- default: false,
174
- },
175
- ];
176
-
177
61
  /**
178
- * CLI include-flag names → summon generator prompt names, per create kind
179
- * (AV-228 B8). All four `create application` include-flags are exposed on the
180
- * unified `--with-X` convention, so their params arrive keyed `withSsr`/
181
- * `withRouter`/`withForms`/`withRelay`; the summon generator reads the bare
182
- * `ssr`/`router`/`forms`/`relay`. We normalize at the ONE CLI↔generator seam
183
- * ({@link toGeneratorAnswers}), keeping the generator prompt names (and their
184
- * templates/goldens) untouched. Component and package already use `--with-X`
185
- * names that match their prompts, so their maps are empty.
62
+ * The FRAMEWORK UNION of the component leaves' prompts (A4): first-seen order
63
+ * over the declared framework order; a prompt identical across all declaring
64
+ * frameworks keeps its default; a prompt whose default DIFFERS across
65
+ * frameworks omits it (`required: false` — the selected framework's own
66
+ * prompt default applies at run time); a prompt not present on every
67
+ * framework gets its doc suffixed with the declaring frameworks.
186
68
  */
187
- export const INCLUDE_FLAG_ALIASES: Record<
188
- CreateKind,
189
- Readonly<Record<string, string>>
190
- > = {
191
- component: {},
192
- package: {},
193
- application: {
194
- withSsr: "ssr",
195
- withRouter: "router",
196
- withForms: "forms",
197
- withRelay: "relay",
198
- },
199
- };
69
+ function unionComponentParams(): ParamSpec[] {
70
+ const paths = CREATE_GENERATORS.component.paths;
71
+ const byName = new Map<
72
+ string,
73
+ { prompt: ProjectedPrompt; frameworks: string[]; defaults: unknown[] }
74
+ >();
75
+ const order: string[] = [];
76
+ for (const commandPath of paths) {
77
+ const framework = commandPath.split("/")[1] as string;
78
+ for (const prompt of surfaceFor(commandPath).prompts) {
79
+ let entry = byName.get(prompt.name);
80
+ if (!entry) {
81
+ entry = { prompt, frameworks: [], defaults: [] };
82
+ byName.set(prompt.name, entry);
83
+ order.push(prompt.name);
84
+ }
85
+ entry.frameworks.push(framework);
86
+ entry.defaults.push(prompt.default);
87
+ }
88
+ }
89
+ return order.map((name) => {
90
+ const entry = byName.get(name) as NonNullable<
91
+ ReturnType<typeof byName.get>
92
+ >;
93
+ const universal = entry.frameworks.length === paths.length;
94
+ const agreed = entry.defaults.every((value) =>
95
+ Object.is(value, entry.defaults[0]),
96
+ );
97
+ const param = promptToParam(
98
+ agreed ? entry.prompt : { ...entry.prompt, default: undefined },
99
+ );
100
+ return {
101
+ ...param,
102
+ ...(universal
103
+ ? {}
104
+ : { doc: `${param.doc} (frameworks: ${entry.frameworks.join(", ")})` }),
105
+ ...(agreed ? {} : { required: false }),
106
+ } as ParamSpec;
107
+ });
108
+ }
200
109
 
201
- /**
202
- * Re-key a param bag's CLI include-flag aliases to the generator prompt names,
203
- * so the summon generator reads `ssr` where the CLI grammar exposes `--with-ssr`.
204
- *
205
- * @param kind - The create noun (selects the alias map).
206
- * @param params - The coerced CLI/MCP param bag.
207
- * @returns A new bag with aliased keys renamed to the generator prompt names.
208
- */
209
- export function toGeneratorAnswers(
210
- kind: CreateKind,
211
- params: Readonly<Record<string, unknown>>,
212
- ): Record<string, unknown> {
213
- const aliases = INCLUDE_FLAG_ALIASES[kind];
214
- const answers: Record<string, unknown> = {};
215
- for (const [key, value] of Object.entries(params)) {
216
- answers[aliases[key] ?? key] = value;
110
+ /** The projected surface for a declared path (fails loud on a stale build). */
111
+ function surfaceFor(commandPath: string) {
112
+ const surface = CREATE_SURFACE[commandPath];
113
+ if (!surface) {
114
+ throw new Error(
115
+ `createSurface.generated.ts carries no entry for declared path "${commandPath}" — rerun the build`,
116
+ );
217
117
  }
218
- return answers;
118
+ return surface;
219
119
  }
220
120
 
221
121
  const componentParams: ParamSpec[] = [
222
122
  FRAMEWORK_PARAM,
223
- COMPONENT_PATH_PARAM,
224
- ...generatorToParams(SHARED_COMPONENT_MIRROR),
123
+ ...unionComponentParams(),
225
124
  ];
226
- const packageParams: ParamSpec[] = generatorToParams(PACKAGE_MIRROR);
227
- const applicationParams: ParamSpec[] = generatorToParams(APPLICATION_MIRROR);
125
+ const packageParams: ParamSpec[] = generatorToParams(
126
+ surfaceFor("package").prompts,
127
+ );
128
+ const applicationParams: ParamSpec[] = generatorToParams(
129
+ surfaceFor("application/react").prompts,
130
+ );
228
131
 
229
132
  /** The path param each noun jails (package writes into a name-derived subdir). */
230
133
  const PATH_PARAM: Record<CreateKind, string | undefined> = {
@@ -233,23 +136,20 @@ const PATH_PARAM: Record<CreateKind, string | undefined> = {
233
136
  application: "appPath",
234
137
  };
235
138
 
139
+ /**
140
+ * The two value classes the shared prompt validators reject as workspace
141
+ * ESCAPES — absolute, and any `..` segment: exactly the jail's own
142
+ * non-symlink classes, which the round-9 reorder moved onto the validator
143
+ * tier. Used to keep the jail-tier `recovery` hint on those rejections.
144
+ */
145
+ const isEscapeValue = (value: unknown): boolean =>
146
+ typeof value === "string" &&
147
+ (isAbsolute(value) || value.split(/[/\\]/).includes(".."));
148
+
236
149
  // =============================================================================
237
150
  // The lazy run — the one-line summon↔pragma seam per invocation
238
151
  // =============================================================================
239
152
 
240
- /**
241
- * The standalone `bun build --compile` binary resolves every bundled module
242
- * under the virtual `/$bunfs` filesystem — a marker absent from any source or
243
- * `bun`-run module URL. Only a generator that routes its template reads through
244
- * the embedded manifest can run there
245
- * (`CREATE_GENERATORS[kind].readsEmbeddedTemplates`);
246
- * the others call `template({ source })`, which falls through to
247
- * `readFile(source)` and dies with `ENOENT … /$bunfs/…` after `mkdir` has
248
- * already run, leaving partially-created files behind.
249
- * `compiledCreate.subprocess.test.ts` pins the refusal AND the empty cwd.
250
- */
251
- const IS_COMPILED_BINARY = import.meta.url.includes("/$bunfs/");
252
-
253
153
  /**
254
154
  * True when a dynamic import failed because the module could not be RESOLVED.
255
155
  * summon-core + the generators are now bundled into the binary, so this should
@@ -275,53 +175,33 @@ export function isModuleNotFound(cause: unknown): boolean {
275
175
  }
276
176
 
277
177
  /**
278
- * Load the create runtime: inject the embedded template manifest, then import
279
- * the generator selector + summon-core (STATIC dynamic imports, so bun's
280
- * `--compile` bundler includes them — they stay behind this lazy boundary, so
281
- * the fast paths and `create --yes` still load neither summon-core nor React).
178
+ * Load the create runtime — the generator selector and summon-core.
282
179
  *
283
- * The manifest is injected BEFORE `pickGenerator` — the component loader
284
- * consults it when its disk read fails (the compiled binary), and the generators
285
- * load their templates on first `generate()`. It is imported from
286
- * summon-component's `loadTemplate` submodule so this does not evaluate the
287
- * generator index first. In a source run the disk read wins and the manifest is
288
- * inert.
180
+ * Lazy, and the specifiers stay STATIC so they remain analysable: importing
181
+ * these pulls summon-core and with it React, which must stay off `--help`,
182
+ * completion and every read. The generators load their own templates from their
183
+ * own packages on first `generate()`.
289
184
  *
290
- * A binding whose generator does not read through that manifest is gated to a
291
- * source run here ({@link IS_COMPILED_BINARY}). A stale resolution failure is a
292
- * defensive backstop {@link isModuleNotFound} turns into the same clean gate.
185
+ * A resolution failure means a broken or pruned install, and
186
+ * {@link isModuleNotFound} turns it into a clean refusal rather than an
187
+ * internal-bug report.
293
188
  */
294
- async function loadCreateRuntime(kind: CreateKind) {
295
- if (IS_COMPILED_BINARY && !CREATE_GENERATORS[kind].readsEmbeddedTemplates) {
296
- throw new PragmaError({
297
- code: "UNSUPPORTED",
298
- message: `\`create ${kind}\` is not available in the compiled ${BIN_NAME} binary — ${SOURCE_ONLY_REASON}. Run it from a source checkout, or use the \`summon\` CLI.`,
299
- recovery: {
300
- message: `Run \`create ${kind}\` from a source checkout, or use \`summon\`.`,
301
- },
302
- });
303
- }
189
+ async function loadCreateRuntime() {
304
190
  try {
305
- // Inject the embedded manifest before the generators evaluate.
306
- const [{ setEmbeddedTemplates }, { TEMPLATES }] = await Promise.all([
307
- import("@canonical/summon-component/embedded"),
308
- import("./templates.embedded.generated.js"),
309
- ]);
310
- setEmbeddedTemplates(TEMPLATES);
311
-
312
- const [pick, summon] = await Promise.all([
313
- import("./pickGenerator.js"),
191
+ const [summon, projection, pick] = await Promise.all([
314
192
  import("@canonical/summon-core"),
193
+ import("@canonical/summon-core/projection"),
194
+ import("./pickGenerator.js"),
315
195
  ]);
316
- return { pickGenerator: pick.pickGenerator, summon };
196
+ return { pickGenerator: pick.pickGenerator, summon, projection };
317
197
  } catch (cause) {
318
198
  if (isModuleNotFound(cause)) {
319
199
  throw new PragmaError({
320
200
  code: "UNSUPPORTED",
321
201
  message:
322
- "`create` could not load its generator runtime. Run it from a source checkout, or use the `summon` CLI.",
202
+ "`create` cannot load its generator runtime — the `@canonical/summon-*` packages it depends on are missing from this install.",
323
203
  recovery: {
324
- message: "Run `create` from a source checkout, or use `summon`.",
204
+ message: `Reinstall ${BIN_NAME} to restore its generator dependencies.`,
325
205
  },
326
206
  });
327
207
  }
@@ -329,57 +209,138 @@ async function loadCreateRuntime(kind: CreateKind) {
329
209
  }
330
210
  }
331
211
 
212
+ /** The create noun that declares a command path. */
213
+ function kindOf(commandPath: string): CreateKind {
214
+ for (const [kind, binding] of Object.entries(CREATE_GENERATORS)) {
215
+ if ((binding.paths as readonly string[]).includes(commandPath)) {
216
+ return kind as CreateKind;
217
+ }
218
+ }
219
+ throw PragmaError.internalError(`undeclared command path ${commandPath}`);
220
+ }
221
+
332
222
  /**
333
- * Build the `create` Task for one invocation: pick the generator, jail its
334
- * output path, pre-validate flag/arg answers, pick the prompt strategy against
335
- * the interaction context, wire `runtime.exec`, and return `execute`.
223
+ * Build the `create` Task for one invocation of a declared COMMAND PATH: pick
224
+ * the generator, pre-validate the provided answers (the shared validator
225
+ * tier), jail its output path (the host backstop, after validation),
226
+ * decide the interaction mode (the ONE shared decision — same function, same
227
+ * inputs as the summon bin), and return `execute` wired to the strategy the
228
+ * mode names.
336
229
  *
337
- * @param kind - The create noun.
338
- * @param params - The coerced params for this invocation.
230
+ * `params` are the EXPLICIT answers only (CLI flags/positional; MCP args
231
+ * carry schema defaults, which is that transport's contract). MCP keeps its
232
+ * plan-first/confirm path untouched — `decideInteraction` is CLI-only.
233
+ *
234
+ * @param commandPath - The declared command path (`component/react`, …).
235
+ * @param params - The provided answers for this invocation.
339
236
  * @param rt - The pragma runtime.
340
237
  * @returns A `Promise<Task<GeneratorResult>>` (the union's third arm) the
341
238
  * dispatcher/MCP handler awaits into a Task before interpreting.
342
239
  */
343
- async function runCreate(
344
- kind: CreateKind,
240
+ export async function runCreate(
241
+ commandPath: string,
345
242
  params: Record<string, unknown>,
346
243
  rt: PragmaRuntime,
347
244
  ): Promise<Task<GeneratorResult>> {
348
245
  // Lazy: importing these pulls summon-core (and with it React) — kept off every
349
- // non-create path. Now STATIC dynamic imports so `--compile` bundles them; the
350
- // embedded `.ejs` manifest is injected here. A binding that does not read
351
- // through it stays a source-run feature in the binary.
352
- const { pickGenerator, summon } = await loadCreateRuntime(kind);
246
+ // non-create path. The specifiers stay static so they remain analysable; the
247
+ // embedded `.ejs` manifest is injected here as the disk read's fallback.
248
+ const { pickGenerator, summon, projection } = await loadCreateRuntime();
353
249
 
354
- // Normalize the CLI/MCP `--with-X` include-flags to the generator prompt names
355
- // (AV-228 B8) once, at this seam; every summon interaction below reads the
356
- // generator-facing `answers` bag so the generator prompt names stay stable.
357
- const answers = toGeneratorAnswers(kind, params);
250
+ const generator = pickGenerator(commandPath);
251
+ const kind = kindOf(commandPath);
358
252
 
359
- const generator = pickGenerator(kind, answers);
360
-
361
- // SEC-2: reject a path escaping the workspace BEFORE any effect runs.
362
- const pathParam = PATH_PARAM[kind];
363
- if (pathParam) assertInsideWorkspace(pathParam, answers[pathParam], rt.cwd);
253
+ // The tree segment is not an answer: drop a stray `framework` key so the
254
+ // generators (whose prompts never include it) see only their own answers.
255
+ const answers: Record<string, unknown> = { ...params };
256
+ delete answers.framework;
364
257
 
365
258
  // Reject a flag/arg-provided answer that fails its prompt's own constraint,
366
- // with a clean INVALID_INPUT (execute re-validates as a backstop).
259
+ // with a clean INVALID_INPUT (execute re-validates as a backstop). Runs
260
+ // BEFORE the jail: the path prompts' own validators reject absolute/`..`
261
+ // escapes, so an escaping output path fails the SHARED validator line in
262
+ // both hosts (the cross-CLI matrix) and the jail below stays the backstop
263
+ // its docblock claims.
264
+ const pathParam = PATH_PARAM[kind];
367
265
  const invalid = summon.validateAnswers(generator.prompts, answers);
368
266
  if (invalid !== null) {
369
- throw new PragmaError({ code: "INVALID_INPUT", message: invalid });
267
+ // A rejection of the JAILED path param's escape classes (absolute /
268
+ // `..` — the two the round-9 reorder moved off the jail) attaches ONE
269
+ // workspace hint to BOTH classes — the jail's `..`-branch message —
270
+ // deliberately NOT reproducing the jail's per-branch hints (its
271
+ // absolute branch says "Use a path relative to the current
272
+ // directory."; those stay the jail's own, pinned in pathJail.test.ts).
273
+ // The message stays the validator's — the shared cross-host line. A
274
+ // non-escape rejection of the same param (e.g. casing) never carried
275
+ // recovery and still does not.
276
+ const escaped =
277
+ pathParam !== undefined &&
278
+ invalid.startsWith(`Invalid --${projection.toKebabCase(pathParam)} `) &&
279
+ isEscapeValue(answers[pathParam]);
280
+ throw new PragmaError({
281
+ code: "INVALID_INPUT",
282
+ message: invalid,
283
+ ...(escaped
284
+ ? { recovery: { message: "The path must stay inside the workspace." } }
285
+ : {}),
286
+ });
370
287
  }
371
288
 
289
+ // SEC-2: reject a path escaping the workspace BEFORE any effect runs — the
290
+ // host-level backstop behind the validators, and the only tier that catches
291
+ // a symlink RESOLVING outside the workspace.
292
+ if (pathParam) assertInsideWorkspace(pathParam, answers[pathParam], rt.cwd);
293
+
294
+ // An ABSENT interaction context defaults to `yes: false` — nothing may
295
+ // silently auto-apply just because a caller forgot to say how it is driven.
372
296
  const { isTTY, transport, yes, signal, abort } = rt.interaction ?? {
373
297
  isTTY: false,
374
298
  transport: "cli" as const,
375
- yes: true,
299
+ yes: false,
376
300
  };
377
301
  const stamp = summon.createGeneratorStamp(generator);
378
302
 
379
- // TTY without --yes → the embedded Ink wizard (identical #819 flow). The
380
- // session both answers prompts and renders live effect progress, so its
381
- // callbacks ride runtime.exec alongside the shared stamping transform.
382
- if (isTTY && !yes) {
303
+ // MCP: params-or-error, plan-first/confirm — untouched by the decision
304
+ // table (an MCP call is never a terminal session).
305
+ if (transport === "mcp") {
306
+ const prompt = summon.mcpPrompt(answers);
307
+ rt.exec = {
308
+ cwd: rt.cwd,
309
+ promptHandler: prompt,
310
+ onEffectStart: summon.createStampOnEffectStart(stamp),
311
+ onLog: (_level, message) => process.stderr.write(`${message}\n`),
312
+ signal,
313
+ };
314
+ return summon.execute(generator, { prompt, params: answers, signal });
315
+ }
316
+
317
+ // The ONE interaction decision (R2) — the same function, over the same five
318
+ // inputs, as the summon bin. The mount refuses before ever loading this
319
+ // runtime; re-deriving here keeps direct kernel callers honest too.
320
+ const { mode } = projection.decideInteraction({
321
+ dryRun: rt.mutation?.preview === true,
322
+ undo: rt.mutation?.undo === true,
323
+ yes: yes === true,
324
+ isTTY: isTTY === true,
325
+ explicitComplete: projection.explicitAnswersComplete(
326
+ generator.prompts,
327
+ answers,
328
+ ),
329
+ });
330
+
331
+ if (mode === "refuse") {
332
+ throw new PragmaError({
333
+ code: "INVALID_INPUT",
334
+ message: projection.refusalMessage(
335
+ projection.missingExplicitFlags(generator.prompts, answers),
336
+ ),
337
+ });
338
+ }
339
+
340
+ // Wizard: ask exactly the pending prompts — the provided answers are
341
+ // explicit and pre-seeded; `collectAnswers` skips them and evaluates each
342
+ // conditional against the answers as they land (wizard-script parity).
343
+ if (mode === "wizard") {
383
344
  // `onCancel` (H2): an in-Ink Ctrl-C during execution aborts the run so the
384
345
  // interpreter stops writing — raw mode swallows the SIGINT, so the wizard
385
346
  // drives the abort. Shared with setup by construction.
@@ -389,6 +350,9 @@ async function runCreate(
389
350
  signal,
390
351
  onCancel: abort,
391
352
  cwd: rt.cwd,
353
+ // Flag-provided answers reach the wizard too: without the seed the
354
+ // confirm gate previews with them missing (undefined paths, wrong plan).
355
+ initialAnswers: answers,
392
356
  });
393
357
  // Thread the per-call write root: the interpreter resolves the generator's
394
358
  // relative output paths against `rt.cwd` — the SAME dir the SEC-2 jail
@@ -412,13 +376,12 @@ async function runCreate(
412
376
  });
413
377
  }
414
378
 
415
- // Non-interactive: MCP → params-or-error; CLI/--yes/CI → flags+defaults.
416
- const prompt =
417
- transport === "mcp"
418
- ? summon.mcpPrompt(answers)
419
- : summon.autoPrompt(answers);
420
- // Same per-call write root as the Ink branch: `rt.cwd` feeds both the SEC-2
421
- // jail and the interpreter's effect-path base, atomically.
379
+ // run / batch-dry-run / batch-undo: flags + defaults, never a wizard —
380
+ // `autoPrompt` resolves each unprovided prompt to its default or fails
381
+ // loudly on a missing required answer. Same per-call write root as the
382
+ // wizard branch: `rt.cwd` feeds both the SEC-2 jail and the interpreter's
383
+ // effect-path base, atomically.
384
+ const prompt = summon.autoPrompt(answers);
422
385
  rt.exec = {
423
386
  cwd: rt.cwd,
424
387
  promptHandler: prompt,
@@ -437,7 +400,7 @@ async function runCreate(
437
400
  * `destructiveHint`, and MCP clients default an unset hint on a non-read-only
438
401
  * tool to `true` — advertising create as destructive, the opposite of intent.
439
402
  */
440
- const CREATE_CAPABILITY = {
403
+ export const CREATE_CAPABILITY = {
441
404
  needsStore: false,
442
405
  mutates: true,
443
406
  destructive: false,
@@ -449,50 +412,41 @@ const CREATE_CAPABILITY = {
449
412
  };
450
413
 
451
414
  /**
452
- * Why a binding is source-run only — the ONE authoring of it, shared by the
453
- * documentation below and by {@link loadCreateRuntime}'s `UNSUPPORTED` refusal,
454
- * so what the reference promises and what the binary does cannot disagree.
455
- */
456
- const SOURCE_ONLY_REASON =
457
- "its generator reads templates from disk, which the binary does not carry";
458
-
459
- /**
460
- * The published caveat for a binding the compiled binary cannot run. DERIVED
461
- * from `CREATE_GENERATORS[kind].readsEmbeddedTemplates` — flipping that bit
462
- * moves the caveat, `docs/reference/*.md`, and `create.test.ts`'s binding
463
- * assertion together.
415
+ * The shared output spec: the outcome formatters plus the dry-run seam.
464
416
  *
465
- * It LEADS WITH THE PURPOSE, because `tools.md` and the MCP tool description
466
- * both render `doc ?? summary` — so a caveat alone REPLACED the only sentence
467
- * saying what the tool makes, and an agent enumerating tools could not learn
468
- * that `create_package` scaffolds a package. The tool works from a source
469
- * checkout; describing nothing but its refusal made a live tool
470
- * undiscoverable. The repeated sentence in `commands.md`'s section is the
471
- * cheaper of the two costs.
417
+ * ONE constant because there are TWO specs per leaf — the binding-level verbs
418
+ * below (what MCP and the emitted surface read) and the per-leaf spec the
419
+ * mount synthesizes for `create component react …` (what a user actually
420
+ * runs). They describe the same generation, so a preview that reached only one
421
+ * of them would be a preview the CLI never showed.
472
422
  *
473
- * It names no CLI flag (`mcp/toolDescriptions.test.ts` forbids one, and an
474
- * agent has no flags): the plan-only refusal is stated in the terms BOTH
475
- * surfaces share.
423
+ * `formatPlan` renders through summon's own effect formatter instead of the
424
+ * kernel's raw dump, so the two bins describe the identical tree they write
425
+ * identically. `planData` stays unset — the effects the preview records ARE
426
+ * the plan — which is what leaves the `--format json` dry-run body exactly as
427
+ * it was.
476
428
  *
477
- * @param kind - The create binding.
478
- * @param summary - The verb's own one-liner, which the `doc` replaces on MCP.
479
- * @returns The `doc` for a source-run-only binding, or `undefined`.
429
+ * It resolves a PROMISE because {@link formatCreatePlan} loads that formatter
430
+ * behind a dynamic `import()`: this constant is reachable from the
431
+ * capabilities barrel, and the whole point of the lazy-dispatch boundary above
432
+ * is that nothing on that graph pays for summon-core on a `--help` spawn.
480
433
  */
481
- function buildAvailabilityDoc(
482
- kind: CreateKind,
483
- summary: string,
484
- ): string | undefined {
485
- if (CREATE_GENERATORS[kind].readsEmbeddedTemplates) return undefined;
486
- return `${summary} From the compiled ${BIN_NAME} binary, \`create ${kind}\` refuses with \`UNSUPPORTED\` and writes nothing. Asking it only to PLAN refuses too — the gate runs while the plan is built — so a successful plan is never evidence it would run. The cause is that ${SOURCE_ONLY_REASON}. Run it from a source checkout, or use the \`summon\` CLI.`;
487
- }
434
+ export const CREATE_OUTPUT: VerbSpec<
435
+ Record<string, unknown>,
436
+ GeneratorResult
437
+ >["output"] = {
438
+ formatters: createFormatters,
439
+ formatPlan: (_planData, effects, verbose) =>
440
+ formatCreatePlan(effects, verbose),
441
+ };
488
442
 
489
443
  /**
490
444
  * Build a create verb. `run` presents `Promise<Task<R>>` through the `Task<R>`
491
445
  * arm by an honest cast at this one site (mirroring `sources update`): a literal
492
446
  * `Promise<Task<R>>` arm in the union would poison async read-verb inference.
493
447
  *
494
- * A binding the compiled binary cannot run says so in its `summary` (which is
495
- * what `--help` and the noun listing show) and explains itself in its `doc`.
448
+ * The binding-level `run` maps its kind (+ `framework` for component) onto
449
+ * the declared command path — the MCP transport's view of the tree.
496
450
  */
497
451
  function createVerb(
498
452
  kind: CreateKind,
@@ -500,17 +454,32 @@ function createVerb(
500
454
  params: ParamSpec[],
501
455
  examples: VerbSpec["examples"],
502
456
  ): VerbSpec<Record<string, unknown>, GeneratorResult> {
503
- const doc = buildAvailabilityDoc(kind, summary);
504
457
  return {
505
458
  path: ["create", kind],
506
- summary: doc ? `${summary} Source-run only.` : summary,
507
- ...(doc ? { doc } : {}),
459
+ summary,
508
460
  params,
509
- output: { formatters: createFormatters },
461
+ output: CREATE_OUTPUT,
510
462
  examples,
511
463
  capability: CREATE_CAPABILITY,
512
- run: (params_, rt) =>
513
- runCreate(kind, params_, rt) as unknown as Task<GeneratorResult>,
464
+ run: (params_, rt) => {
465
+ let commandPath: string;
466
+ if (kind === "component") {
467
+ const framework = String(params_.framework ?? "");
468
+ if (!COMPONENT_FRAMEWORKS.includes(framework)) {
469
+ throw PragmaError.invalidInput("framework", framework, {
470
+ validOptions: [...COMPONENT_FRAMEWORKS],
471
+ });
472
+ }
473
+ commandPath = `component/${framework}`;
474
+ } else {
475
+ commandPath = CREATE_GENERATORS[kind].paths[0];
476
+ }
477
+ return runCreate(
478
+ commandPath,
479
+ params_,
480
+ rt,
481
+ ) as unknown as Task<GeneratorResult>;
482
+ },
514
483
  };
515
484
  }
516
485
 
@@ -530,11 +499,11 @@ export const createVerbs: Record<
530
499
  componentParams,
531
500
  [
532
501
  {
533
- cmd: `${BIN_NAME} create component src/components/Button --framework react`,
502
+ cmd: `${BIN_NAME} create component react src/components/Button`,
534
503
  note: "React component with tests, stories, and styles",
535
504
  },
536
505
  {
537
- cmd: `${BIN_NAME} create component src/lib/Card --framework svelte --dry-run`,
506
+ cmd: `${BIN_NAME} create component svelte src/lib/Card --dry-run`,
538
507
  note: "preview the files without writing",
539
508
  },
540
509
  ],
@@ -548,7 +517,7 @@ export const createVerbs: Record<
548
517
  cmd: `${BIN_NAME} create package --name @canonical/my-lib --type library`,
549
518
  },
550
519
  {
551
- cmd: `${BIN_NAME} create package --name @canonical/my-tool --run-install`,
520
+ cmd: `${BIN_NAME} create package --name @canonical/my-tool --no-run-install`,
552
521
  },
553
522
  ],
554
523
  ),
@@ -557,8 +526,8 @@ export const createVerbs: Record<
557
526
  "Scaffold a full React application with SSR and routing.",
558
527
  applicationParams,
559
528
  [
560
- { cmd: `${BIN_NAME} create application my-app` },
561
- { cmd: `${BIN_NAME} create application my-app --with-relay` },
529
+ { cmd: `${BIN_NAME} create application react my-app` },
530
+ { cmd: `${BIN_NAME} create application react my-app --relay` },
562
531
  ],
563
532
  ),
564
533
  };