@canonical/pragma-cli 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (892) hide show
  1. package/README.md +153 -30
  2. package/dist/.build-ok +0 -0
  3. package/dist/package.json +83 -0
  4. package/dist/pragma.conf.js +814 -0
  5. package/dist/pragma.conf.js.map +1 -0
  6. package/dist/src/bin.js +356 -0
  7. package/dist/src/bin.js.map +1 -0
  8. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  9. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  10. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  11. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  12. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  13. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  14. package/dist/src/capabilities/capabilities/hints.js +195 -0
  15. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  16. package/dist/src/capabilities/capabilities/index.js +11 -0
  17. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/types.js +11 -0
  19. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  20. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  21. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  22. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  23. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  24. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  25. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  26. package/dist/src/capabilities/colophon/index.js +5 -0
  27. package/dist/src/capabilities/colophon/index.js.map +1 -0
  28. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  29. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  30. package/dist/src/capabilities/colophon/types.js +10 -0
  31. package/dist/src/capabilities/colophon/types.js.map +1 -0
  32. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  33. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  34. package/dist/src/capabilities/config/field.render.js +22 -0
  35. package/dist/src/capabilities/config/field.render.js.map +1 -0
  36. package/dist/src/capabilities/config/fields.js +46 -0
  37. package/dist/src/capabilities/config/fields.js.map +1 -0
  38. package/dist/src/capabilities/config/get.verb.js +61 -0
  39. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  40. package/dist/src/capabilities/config/index.js +5 -0
  41. package/dist/src/capabilities/config/index.js.map +1 -0
  42. package/dist/src/capabilities/config/runField.js +59 -0
  43. package/dist/src/capabilities/config/runField.js.map +1 -0
  44. package/dist/src/capabilities/config/runGet.js +28 -0
  45. package/dist/src/capabilities/config/runGet.js.map +1 -0
  46. package/dist/src/capabilities/config/runSet.js +53 -0
  47. package/dist/src/capabilities/config/runSet.js.map +1 -0
  48. package/dist/src/capabilities/config/set.verb.js +66 -0
  49. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/show.render.js +84 -0
  51. package/dist/src/capabilities/config/show.render.js.map +1 -0
  52. package/dist/src/capabilities/config/show.verb.js +44 -0
  53. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  54. package/dist/src/capabilities/config/types.js +5 -0
  55. package/dist/src/capabilities/config/types.js.map +1 -0
  56. package/dist/src/capabilities/config/unset.verb.js +49 -0
  57. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  58. package/dist/src/capabilities/create/cliProjection.js +195 -0
  59. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  60. package/dist/src/capabilities/create/constants.js +47 -0
  61. package/dist/src/capabilities/create/constants.js.map +1 -0
  62. package/dist/src/capabilities/create/create.render.js +100 -0
  63. package/dist/src/capabilities/create/create.render.js.map +1 -0
  64. package/dist/src/capabilities/create/create.verb.js +438 -0
  65. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  66. package/dist/src/capabilities/create/createHelp.js +47 -0
  67. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  68. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  69. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  70. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  71. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  72. package/dist/src/capabilities/create/index.js +18 -0
  73. package/dist/src/capabilities/create/index.js.map +1 -0
  74. package/dist/src/capabilities/create/messages.js +16 -0
  75. package/dist/src/capabilities/create/messages.js.map +1 -0
  76. package/dist/src/capabilities/create/mount.js +293 -0
  77. package/dist/src/capabilities/create/mount.js.map +1 -0
  78. package/dist/src/capabilities/create/pathJail.js +65 -0
  79. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  80. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  81. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  82. package/dist/src/capabilities/create/types.js +2 -0
  83. package/dist/src/capabilities/create/types.js.map +1 -0
  84. package/dist/src/capabilities/distribution.js +40 -0
  85. package/dist/src/capabilities/distribution.js.map +1 -0
  86. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  87. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  88. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  89. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  90. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
  91. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  92. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  93. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  94. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  95. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  97. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  99. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
  101. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  102. package/dist/src/capabilities/doctor/doctor.render.js +185 -0
  103. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  104. package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
  105. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  106. package/dist/src/capabilities/doctor/index.js +5 -0
  107. package/dist/src/capabilities/doctor/index.js.map +1 -0
  108. package/dist/src/capabilities/doctor/runChecks.js +83 -0
  109. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  110. package/dist/src/capabilities/doctor/types.js +5 -0
  111. package/dist/src/capabilities/doctor/types.js.map +1 -0
  112. package/dist/src/capabilities/graph/index.js +19 -0
  113. package/dist/src/capabilities/graph/index.js.map +1 -0
  114. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  115. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  116. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  117. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  118. package/dist/src/capabilities/graph/query.render.js +73 -0
  119. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  120. package/dist/src/capabilities/graph/query.verb.js +49 -0
  121. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  122. package/dist/src/capabilities/graph/runQuery.js +41 -0
  123. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  124. package/dist/src/capabilities/index.js +56 -0
  125. package/dist/src/capabilities/index.js.map +1 -0
  126. package/dist/src/capabilities/info/collectInfo.js +66 -0
  127. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  128. package/dist/src/capabilities/info/index.js +5 -0
  129. package/dist/src/capabilities/info/index.js.map +1 -0
  130. package/dist/src/capabilities/info/info.render.js +53 -0
  131. package/dist/src/capabilities/info/info.render.js.map +1 -0
  132. package/dist/src/capabilities/info/info.verb.js +42 -0
  133. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  134. package/dist/src/capabilities/info/types.js +5 -0
  135. package/dist/src/capabilities/info/types.js.map +1 -0
  136. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  137. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  138. package/dist/src/capabilities/meta/index.js +13 -0
  139. package/dist/src/capabilities/meta/index.js.map +1 -0
  140. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  141. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  142. package/dist/src/capabilities/ontology/index.js +21 -0
  143. package/dist/src/capabilities/ontology/index.js.map +1 -0
  144. package/dist/src/capabilities/ontology/queries.js +123 -0
  145. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  146. package/dist/src/capabilities/ontology/render.js +66 -0
  147. package/dist/src/capabilities/ontology/render.js.map +1 -0
  148. package/dist/src/capabilities/ontology/verbs.js +181 -0
  149. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  150. package/dist/src/capabilities/prompt/index.js +16 -0
  151. package/dist/src/capabilities/prompt/index.js.map +1 -0
  152. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  153. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  154. package/dist/src/capabilities/prompt/types.js +10 -0
  155. package/dist/src/capabilities/prompt/types.js.map +1 -0
  156. package/dist/src/capabilities/prompt/verbs.js +93 -0
  157. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  158. package/dist/src/capabilities/resources/index.js +10 -0
  159. package/dist/src/capabilities/resources/index.js.map +1 -0
  160. package/dist/src/capabilities/resources/provider.js +423 -0
  161. package/dist/src/capabilities/resources/provider.js.map +1 -0
  162. package/dist/src/capabilities/setup/buildPlan.js +168 -0
  163. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  164. package/dist/src/capabilities/setup/index.js +5 -0
  165. package/dist/src/capabilities/setup/index.js.map +1 -0
  166. package/dist/src/capabilities/setup/mode.js +53 -0
  167. package/dist/src/capabilities/setup/mode.js.map +1 -0
  168. package/dist/src/capabilities/setup/operations/index.js +39 -0
  169. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  170. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  171. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  172. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  173. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  174. package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
  175. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  176. package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
  177. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  178. package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
  179. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
  181. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  182. package/dist/src/capabilities/setup/plan.js +128 -0
  183. package/dist/src/capabilities/setup/plan.js.map +1 -0
  184. package/dist/src/capabilities/setup/plan.render.js +193 -0
  185. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  186. package/dist/src/capabilities/setup/setup.render.js +54 -0
  187. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  188. package/dist/src/capabilities/setup/setup.verb.js +334 -0
  189. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  190. package/dist/src/capabilities/setup/shell.js +196 -0
  191. package/dist/src/capabilities/setup/shell.js.map +1 -0
  192. package/dist/src/capabilities/setup/targets.js +263 -0
  193. package/dist/src/capabilities/setup/targets.js.map +1 -0
  194. package/dist/src/capabilities/setup/types.js +5 -0
  195. package/dist/src/capabilities/setup/types.js.map +1 -0
  196. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  197. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  198. package/dist/src/capabilities/shared/bands.js +16 -0
  199. package/dist/src/capabilities/shared/bands.js.map +1 -0
  200. package/dist/src/capabilities/shared/index.js +26 -0
  201. package/dist/src/capabilities/shared/index.js.map +1 -0
  202. package/dist/src/capabilities/shared/packageManager.js +103 -0
  203. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  204. package/dist/src/capabilities/shared/registry.js +55 -0
  205. package/dist/src/capabilities/shared/registry.js.map +1 -0
  206. package/dist/src/capabilities/skill/discover.js +195 -0
  207. package/dist/src/capabilities/skill/discover.js.map +1 -0
  208. package/dist/src/capabilities/skill/index.js +10 -0
  209. package/dist/src/capabilities/skill/index.js.map +1 -0
  210. package/dist/src/capabilities/skill/render.js +49 -0
  211. package/dist/src/capabilities/skill/render.js.map +1 -0
  212. package/dist/src/capabilities/skill/verbs.js +83 -0
  213. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  214. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  215. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  216. package/dist/src/capabilities/sources/index.js +13 -0
  217. package/dist/src/capabilities/sources/index.js.map +1 -0
  218. package/dist/src/capabilities/sources/installSkills.js +167 -0
  219. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  220. package/dist/src/capabilities/sources/runUpdate.js +394 -0
  221. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  222. package/dist/src/capabilities/sources/status.render.js +64 -0
  223. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  224. package/dist/src/capabilities/sources/status.verb.js +40 -0
  225. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  226. package/dist/src/capabilities/sources/types.js +6 -0
  227. package/dist/src/capabilities/sources/types.js.map +1 -0
  228. package/dist/src/capabilities/sources/update.render.js +34 -0
  229. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  230. package/dist/src/capabilities/sources/update.verb.js +55 -0
  231. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  232. package/dist/src/capabilities/upgrade/index.js +5 -0
  233. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  234. package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
  235. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  236. package/dist/src/capabilities/upgrade/types.js +5 -0
  237. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  238. package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
  239. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  240. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  241. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  242. package/dist/src/capabilities/version/index.js +10 -0
  243. package/dist/src/capabilities/version/index.js.map +1 -0
  244. package/dist/src/capabilities/version/version.verb.js +36 -0
  245. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  246. package/dist/src/constants.js +82 -0
  247. package/dist/src/constants.js.map +1 -0
  248. package/dist/src/index.js +12 -0
  249. package/dist/src/index.js.map +1 -0
  250. package/dist/src/kernel/completion/complete.js +66 -0
  251. package/dist/src/kernel/completion/complete.js.map +1 -0
  252. package/dist/src/kernel/completion/emitScripts.js +92 -0
  253. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  254. package/dist/src/kernel/completion/entitySource.js +285 -0
  255. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  256. package/dist/src/kernel/completion/index.js +14 -0
  257. package/dist/src/kernel/completion/index.js.map +1 -0
  258. package/dist/src/kernel/completion/model.js +301 -0
  259. package/dist/src/kernel/completion/model.js.map +1 -0
  260. package/dist/src/kernel/completion/parse.js +253 -0
  261. package/dist/src/kernel/completion/parse.js.map +1 -0
  262. package/dist/src/kernel/completion/rank.js +101 -0
  263. package/dist/src/kernel/completion/rank.js.map +1 -0
  264. package/dist/src/kernel/completion/resolve.js +100 -0
  265. package/dist/src/kernel/completion/resolve.js.map +1 -0
  266. package/dist/src/kernel/completion/templates/bash.js +209 -0
  267. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  268. package/dist/src/kernel/completion/templates/fish.js +214 -0
  269. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  270. package/dist/src/kernel/completion/templates/index.js +23 -0
  271. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  272. package/dist/src/kernel/completion/templates/shared.js +98 -0
  273. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  274. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  275. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  276. package/dist/src/kernel/completion/types.js +13 -0
  277. package/dist/src/kernel/completion/types.js.map +1 -0
  278. package/dist/src/kernel/config/defaults.js +17 -0
  279. package/dist/src/kernel/config/defaults.js.map +1 -0
  280. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  281. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  282. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  283. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  284. package/dist/src/kernel/config/firstRun.js +34 -0
  285. package/dist/src/kernel/config/firstRun.js.map +1 -0
  286. package/dist/src/kernel/config/globalConfig.js +79 -0
  287. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  288. package/dist/src/kernel/config/index.js +16 -0
  289. package/dist/src/kernel/config/index.js.map +1 -0
  290. package/dist/src/kernel/config/paths.js +35 -0
  291. package/dist/src/kernel/config/paths.js.map +1 -0
  292. package/dist/src/kernel/config/readConfig.js +78 -0
  293. package/dist/src/kernel/config/readConfig.js.map +1 -0
  294. package/dist/src/kernel/config/schema.js +130 -0
  295. package/dist/src/kernel/config/schema.js.map +1 -0
  296. package/dist/src/kernel/config/types.js +19 -0
  297. package/dist/src/kernel/config/types.js.map +1 -0
  298. package/dist/src/kernel/config/writeConfigField.js +59 -0
  299. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  300. package/dist/src/kernel/copy.js +43 -0
  301. package/dist/src/kernel/copy.js.map +1 -0
  302. package/dist/src/kernel/error/PragmaError.js +149 -0
  303. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  304. package/dist/src/kernel/error/constants.js +40 -0
  305. package/dist/src/kernel/error/constants.js.map +1 -0
  306. package/dist/src/kernel/error/fromTaskError.js +96 -0
  307. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  308. package/dist/src/kernel/error/index.js +13 -0
  309. package/dist/src/kernel/error/index.js.map +1 -0
  310. package/dist/src/kernel/error/recovery.js +52 -0
  311. package/dist/src/kernel/error/recovery.js.map +1 -0
  312. package/dist/src/kernel/error/renderError.js +115 -0
  313. package/dist/src/kernel/error/renderError.js.map +1 -0
  314. package/dist/src/kernel/error/serialize.js +25 -0
  315. package/dist/src/kernel/error/serialize.js.map +1 -0
  316. package/dist/src/kernel/error/types.js +9 -0
  317. package/dist/src/kernel/error/types.js.map +1 -0
  318. package/dist/src/kernel/index.js +25 -0
  319. package/dist/src/kernel/index.js.map +1 -0
  320. package/dist/src/kernel/packs/collect.js +187 -0
  321. package/dist/src/kernel/packs/collect.js.map +1 -0
  322. package/dist/src/kernel/packs/compile.js +304 -0
  323. package/dist/src/kernel/packs/compile.js.map +1 -0
  324. package/dist/src/kernel/packs/disclosure.js +76 -0
  325. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  326. package/dist/src/kernel/packs/glob.js +38 -0
  327. package/dist/src/kernel/packs/glob.js.map +1 -0
  328. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  329. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  330. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  331. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  332. package/dist/src/kernel/packs/graphql/index.js +20 -0
  333. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  334. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  335. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  336. package/dist/src/kernel/packs/index.js +34 -0
  337. package/dist/src/kernel/packs/index.js.map +1 -0
  338. package/dist/src/kernel/packs/iri.js +110 -0
  339. package/dist/src/kernel/packs/iri.js.map +1 -0
  340. package/dist/src/kernel/packs/renderPack.js +129 -0
  341. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  342. package/dist/src/kernel/packs/resolveEntity.js +223 -0
  343. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  344. package/dist/src/kernel/packs/runBodies.js +87 -0
  345. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  346. package/dist/src/kernel/packs/sample.js +56 -0
  347. package/dist/src/kernel/packs/sample.js.map +1 -0
  348. package/dist/src/kernel/packs/schema.js +369 -0
  349. package/dist/src/kernel/packs/schema.js.map +1 -0
  350. package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
  351. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  352. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  353. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  354. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
  355. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  356. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  357. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  358. package/dist/src/kernel/packs/sparql/index.js +31 -0
  359. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  360. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  361. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  362. package/dist/src/kernel/packs/types.js +30 -0
  363. package/dist/src/kernel/packs/types.js.map +1 -0
  364. package/dist/src/kernel/packs/uniqueness.js +30 -0
  365. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  366. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  367. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  368. package/dist/src/kernel/project/cli/constants.js +27 -0
  369. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  370. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  371. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  372. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  373. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  374. package/dist/src/kernel/project/cli/globalFlags.js +216 -0
  375. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  376. package/dist/src/kernel/project/cli/helpFormat.js +59 -0
  377. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  378. package/dist/src/kernel/project/cli/index.js +14 -0
  379. package/dist/src/kernel/project/cli/index.js.map +1 -0
  380. package/dist/src/kernel/project/cli/rootHelp.js +197 -0
  381. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  382. package/dist/src/kernel/project/cli/suggest.js +75 -0
  383. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  384. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  385. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  386. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  387. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  388. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  389. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  390. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  391. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  392. package/dist/src/kernel/project/mcp/index.js +8 -0
  393. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  394. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  395. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  396. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  397. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  398. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  399. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  401. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  403. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
  405. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/serve.js +35 -0
  407. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  408. package/dist/src/kernel/render/compactUri.js +24 -0
  409. package/dist/src/kernel/render/compactUri.js.map +1 -0
  410. package/dist/src/kernel/render/contracts.js +10 -0
  411. package/dist/src/kernel/render/contracts.js.map +1 -0
  412. package/dist/src/kernel/render/disclosure.js +34 -0
  413. package/dist/src/kernel/render/disclosure.js.map +1 -0
  414. package/dist/src/kernel/render/envelope.js +30 -0
  415. package/dist/src/kernel/render/envelope.js.map +1 -0
  416. package/dist/src/kernel/render/formatters.js +27 -0
  417. package/dist/src/kernel/render/formatters.js.map +1 -0
  418. package/dist/src/kernel/render/index.js +15 -0
  419. package/dist/src/kernel/render/index.js.map +1 -0
  420. package/dist/src/kernel/render/prefixes.js +46 -0
  421. package/dist/src/kernel/render/prefixes.js.map +1 -0
  422. package/dist/src/kernel/render/renderers.js +468 -0
  423. package/dist/src/kernel/render/renderers.js.map +1 -0
  424. package/dist/src/kernel/render/style.js +85 -0
  425. package/dist/src/kernel/render/style.js.map +1 -0
  426. package/dist/src/kernel/render/turtle.js +194 -0
  427. package/dist/src/kernel/render/turtle.js.map +1 -0
  428. package/dist/src/kernel/render/writeStdout.js +43 -0
  429. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  430. package/dist/src/kernel/runtime/boot.js +49 -0
  431. package/dist/src/kernel/runtime/boot.js.map +1 -0
  432. package/dist/src/kernel/runtime/facade.js +39 -0
  433. package/dist/src/kernel/runtime/facade.js.map +1 -0
  434. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  435. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  436. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  437. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  438. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  439. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  440. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  441. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  442. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  443. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  444. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  445. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  446. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  447. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  449. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  451. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  453. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  455. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  457. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  459. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  460. package/dist/src/kernel/runtime/index.js +8 -0
  461. package/dist/src/kernel/runtime/index.js.map +1 -0
  462. package/dist/src/kernel/runtime/loadSession.js +34 -0
  463. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  464. package/dist/src/kernel/runtime/paths.js +78 -0
  465. package/dist/src/kernel/runtime/paths.js.map +1 -0
  466. package/dist/src/kernel/runtime/probe.js +37 -0
  467. package/dist/src/kernel/runtime/probe.js.map +1 -0
  468. package/dist/src/kernel/runtime/readEntity.js +363 -0
  469. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  470. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  471. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  472. package/dist/src/kernel/runtime/refs/index.js +29 -0
  473. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  474. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  475. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  476. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  477. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  478. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  479. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  480. package/dist/src/kernel/runtime/store.js +75 -0
  481. package/dist/src/kernel/runtime/store.js.map +1 -0
  482. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  483. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  484. package/dist/src/kernel/runtime/types.js +11 -0
  485. package/dist/src/kernel/runtime/types.js.map +1 -0
  486. package/dist/src/kernel/spec/asVerb.js +21 -0
  487. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  488. package/dist/src/kernel/spec/emitReference.js +578 -0
  489. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  490. package/dist/src/kernel/spec/emitSurface.js +202 -0
  491. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  492. package/dist/src/kernel/spec/index.js +11 -0
  493. package/dist/src/kernel/spec/index.js.map +1 -0
  494. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  495. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  496. package/dist/src/kernel/spec/types.js +14 -0
  497. package/dist/src/kernel/spec/types.js.map +1 -0
  498. package/dist/src/kernel/spec/validate.js +110 -0
  499. package/dist/src/kernel/spec/validate.js.map +1 -0
  500. package/dist/src/kernel/vocabulary.js +97 -0
  501. package/dist/src/kernel/vocabulary.js.map +1 -0
  502. package/dist/src/types.js +11 -0
  503. package/dist/src/types.js.map +1 -0
  504. package/package.json +25 -24
  505. package/pragma.conf.ts +853 -0
  506. package/src/bin.ts +276 -82
  507. package/src/capabilities/block.parity.test.ts +253 -0
  508. package/src/capabilities/capabilities/capabilities.render.ts +4 -3
  509. package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
  510. package/src/capabilities/capabilities/catalog.ts +20 -12
  511. package/src/capabilities/capabilities/hints.ts +43 -24
  512. package/src/capabilities/capabilities/index.ts +1 -1
  513. package/src/capabilities/colophon/collectColophon.ts +50 -24
  514. package/src/capabilities/colophon/colophon.render.ts +25 -1
  515. package/src/capabilities/colophon/colophon.test.ts +42 -21
  516. package/src/capabilities/colophon/colophon.verb.ts +9 -5
  517. package/src/capabilities/colophon/types.ts +16 -7
  518. package/src/capabilities/config/collectConfigShow.test.ts +58 -0
  519. package/src/capabilities/config/collectConfigShow.ts +43 -6
  520. package/src/capabilities/config/field.render.ts +4 -5
  521. package/src/capabilities/config/fields.ts +17 -37
  522. package/src/capabilities/config/get.verb.ts +70 -0
  523. package/src/capabilities/config/getUnset.test.ts +264 -0
  524. package/src/capabilities/config/index.ts +5 -1
  525. package/src/capabilities/config/runField.ts +40 -22
  526. package/src/capabilities/config/runGet.ts +34 -0
  527. package/src/capabilities/config/runSet.ts +35 -9
  528. package/src/capabilities/config/set.test.ts +48 -14
  529. package/src/capabilities/config/set.verb.ts +14 -9
  530. package/src/capabilities/config/show.render.test.ts +77 -5
  531. package/src/capabilities/config/show.render.ts +8 -13
  532. package/src/capabilities/config/show.verb.ts +13 -9
  533. package/src/capabilities/config/types.ts +26 -4
  534. package/src/capabilities/config/unset.verb.ts +58 -0
  535. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  536. package/src/capabilities/create/byteEquality.test.ts +95 -103
  537. package/src/capabilities/create/cliProjection.ts +227 -0
  538. package/src/capabilities/create/constants.ts +50 -0
  539. package/src/capabilities/create/create.mcp.test.ts +91 -7
  540. package/src/capabilities/create/create.render.ts +71 -7
  541. package/src/capabilities/create/create.test.ts +523 -162
  542. package/src/capabilities/create/create.verb.ts +361 -321
  543. package/src/capabilities/create/createGrammar.test.ts +865 -0
  544. package/src/capabilities/create/createHelp.ts +71 -0
  545. package/src/capabilities/create/createSurface.generated.ts +400 -0
  546. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  547. package/src/capabilities/create/cwdJail.test.ts +24 -5
  548. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  549. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  550. package/src/capabilities/create/index.ts +9 -14
  551. package/src/capabilities/create/messages.ts +18 -0
  552. package/src/capabilities/create/mount.ts +391 -0
  553. package/src/capabilities/create/pathJail.test.ts +90 -0
  554. package/src/capabilities/create/pathJail.ts +8 -5
  555. package/src/capabilities/create/pickGenerator.ts +40 -46
  556. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  557. package/src/capabilities/create/types.ts +29 -5
  558. package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
  559. package/src/capabilities/distribution.test.ts +122 -0
  560. package/src/capabilities/distribution.ts +54 -0
  561. package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
  562. package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
  563. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
  564. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
  565. package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
  566. package/src/capabilities/doctor/checks/index.ts +27 -0
  567. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  568. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  569. package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
  570. package/src/capabilities/doctor/doctor.render.test.ts +24 -13
  571. package/src/capabilities/doctor/doctor.render.ts +45 -20
  572. package/src/capabilities/doctor/doctor.test.ts +158 -40
  573. package/src/capabilities/doctor/doctor.verb.ts +9 -5
  574. package/src/capabilities/doctor/runChecks.ts +65 -66
  575. package/src/capabilities/doctor/types.ts +21 -5
  576. package/src/capabilities/emptyRecovery.test.ts +44 -22
  577. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  578. package/src/capabilities/graph/index.ts +1 -1
  579. package/src/capabilities/graph/inspect.render.ts +70 -22
  580. package/src/capabilities/graph/inspect.test.ts +260 -5
  581. package/src/capabilities/graph/inspect.verb.ts +18 -5
  582. package/src/capabilities/graph/query.render.ts +15 -3
  583. package/src/capabilities/graph/query.verb.ts +5 -4
  584. package/src/capabilities/graph/runQuery.ts +9 -7
  585. package/src/capabilities/index.ts +25 -19
  586. package/src/capabilities/info/collectInfo.ts +15 -10
  587. package/src/capabilities/info/info.render.ts +4 -3
  588. package/src/capabilities/info/info.verb.ts +4 -3
  589. package/src/capabilities/lazy.test.ts +125 -2
  590. package/src/capabilities/meta/complete.verb.ts +1 -1
  591. package/src/capabilities/meta/index.ts +1 -1
  592. package/src/capabilities/meta/mcp.verb.ts +10 -8
  593. package/src/capabilities/ontology/index.ts +15 -11
  594. package/src/capabilities/ontology/ontology.test.ts +6 -55
  595. package/src/capabilities/ontology/queries.ts +2 -2
  596. package/src/capabilities/ontology/render.ts +3 -4
  597. package/src/capabilities/ontology/verbs.ts +42 -83
  598. package/src/capabilities/prompt/index.ts +2 -2
  599. package/src/capabilities/prompt/prompt.render.ts +6 -2
  600. package/src/capabilities/prompt/prompt.test.ts +12 -6
  601. package/src/capabilities/prompt/types.ts +1 -1
  602. package/src/capabilities/prompt/verbs.ts +26 -14
  603. package/src/capabilities/reference.test.ts +63 -0
  604. package/src/capabilities/resources/provider.ts +367 -91
  605. package/src/capabilities/resources/resources.test.ts +411 -59
  606. package/src/capabilities/setup/buildPlan.ts +236 -0
  607. package/src/capabilities/setup/index.ts +7 -7
  608. package/src/capabilities/setup/mode.ts +74 -0
  609. package/src/capabilities/setup/operations/index.ts +74 -0
  610. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  611. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  612. package/src/capabilities/setup/operations/setupGenerator.ts +397 -320
  613. package/src/capabilities/setup/operations/setupLsp.ts +329 -68
  614. package/src/capabilities/setup/operations/setupMcp.ts +137 -97
  615. package/src/capabilities/setup/operations/setupSkills.ts +336 -108
  616. package/src/capabilities/setup/plan.render.ts +241 -0
  617. package/src/capabilities/setup/plan.ts +236 -0
  618. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  619. package/src/capabilities/setup/setup.render.test.ts +281 -73
  620. package/src/capabilities/setup/setup.render.ts +45 -77
  621. package/src/capabilities/setup/setup.test.ts +972 -209
  622. package/src/capabilities/setup/setup.verb.ts +233 -74
  623. package/src/capabilities/setup/shell.test.ts +86 -0
  624. package/src/capabilities/setup/shell.ts +166 -14
  625. package/src/capabilities/setup/targets.ts +367 -0
  626. package/src/capabilities/setup/types.ts +18 -57
  627. package/src/capabilities/shared/assertExecOk.ts +68 -10
  628. package/src/capabilities/shared/index.ts +32 -0
  629. package/src/capabilities/shared/packageManager.test.ts +55 -0
  630. package/src/capabilities/shared/packageManager.ts +62 -6
  631. package/src/capabilities/skill/discover.ts +47 -9
  632. package/src/capabilities/skill/index.ts +1 -1
  633. package/src/capabilities/skill/render.ts +14 -14
  634. package/src/capabilities/skill/skill.test.ts +7 -5
  635. package/src/capabilities/skill/verbs.ts +9 -10
  636. package/src/capabilities/sources/collectStatus.ts +61 -51
  637. package/src/capabilities/sources/index.ts +2 -2
  638. package/src/capabilities/sources/installSkills.ts +86 -9
  639. package/src/capabilities/sources/runUpdate.ts +164 -141
  640. package/src/capabilities/sources/sources.test.ts +265 -119
  641. package/src/capabilities/sources/status.render.test.ts +53 -24
  642. package/src/capabilities/sources/status.render.ts +25 -30
  643. package/src/capabilities/sources/status.verb.ts +16 -9
  644. package/src/capabilities/sources/types.ts +18 -25
  645. package/src/capabilities/sources/update.render.ts +10 -3
  646. package/src/capabilities/sources/update.verb.ts +13 -24
  647. package/src/capabilities/surface.test.ts +165 -25
  648. package/src/capabilities/tier.parity.test.ts +144 -0
  649. package/src/capabilities/upgrade/runUpgrade.ts +8 -8
  650. package/src/capabilities/upgrade/upgrade.render.ts +4 -5
  651. package/src/capabilities/upgrade/upgrade.test.ts +3 -3
  652. package/src/capabilities/upgrade/upgrade.verb.ts +8 -4
  653. package/src/capabilities/version/index.ts +12 -0
  654. package/src/capabilities/version/version.test.ts +66 -0
  655. package/src/capabilities/version/version.verb.ts +39 -0
  656. package/src/constants.test.ts +8 -6
  657. package/src/constants.ts +78 -22
  658. package/src/identity.test.ts +348 -0
  659. package/src/index.ts +2 -2
  660. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
  661. package/src/kernel/completion/complete.test.ts +12 -2
  662. package/src/kernel/completion/complete.ts +1 -1
  663. package/src/kernel/completion/emitScripts.test.ts +1 -1
  664. package/src/kernel/completion/emitScripts.ts +5 -3
  665. package/src/kernel/completion/entitySource.test.ts +185 -41
  666. package/src/kernel/completion/entitySource.ts +133 -110
  667. package/src/kernel/completion/model.test.ts +165 -13
  668. package/src/kernel/completion/model.ts +105 -14
  669. package/src/kernel/completion/parse.test.ts +4 -7
  670. package/src/kernel/completion/parse.ts +15 -0
  671. package/src/kernel/completion/resolve.test.ts +0 -1
  672. package/src/kernel/completion/safety.test.ts +104 -50
  673. package/src/kernel/completion/shellDrive.test.ts +611 -0
  674. package/src/kernel/completion/templates/bash.ts +7 -2
  675. package/src/kernel/completion/templates/fish.ts +28 -6
  676. package/src/kernel/completion/templates/index.ts +23 -0
  677. package/src/kernel/completion/types.ts +10 -3
  678. package/src/kernel/config/defaults.test.ts +108 -0
  679. package/src/kernel/config/defaults.ts +13 -23
  680. package/src/kernel/config/evaluateProjectConfig.ts +33 -11
  681. package/src/kernel/config/findProjectConfig.ts +4 -3
  682. package/src/kernel/config/firstRun.test.ts +44 -38
  683. package/src/kernel/config/firstRun.ts +24 -81
  684. package/src/kernel/config/globalConfig.ts +2 -2
  685. package/src/kernel/config/index.ts +5 -6
  686. package/src/kernel/config/paths.ts +17 -17
  687. package/src/kernel/config/readConfig.test.ts +246 -7
  688. package/src/kernel/config/readConfig.ts +8 -8
  689. package/src/kernel/config/schema.test.ts +50 -0
  690. package/src/kernel/config/schema.ts +100 -11
  691. package/src/kernel/config/types.ts +75 -19
  692. package/src/kernel/copy.test.ts +483 -0
  693. package/src/kernel/copy.ts +54 -0
  694. package/src/kernel/error/PragmaError.test.ts +6 -3
  695. package/src/kernel/error/PragmaError.ts +4 -2
  696. package/src/kernel/error/constants.ts +7 -4
  697. package/src/kernel/error/fromTaskError.ts +28 -6
  698. package/src/kernel/error/index.ts +1 -1
  699. package/src/kernel/error/recovery.test.ts +22 -45
  700. package/src/kernel/error/recovery.ts +36 -27
  701. package/src/kernel/error/renderError.ts +42 -1
  702. package/src/kernel/error/types.ts +25 -4
  703. package/src/kernel/index.ts +26 -0
  704. package/src/kernel/packs/collect.test.ts +195 -11
  705. package/src/kernel/packs/collect.ts +212 -61
  706. package/src/kernel/packs/compile.test.ts +293 -8
  707. package/src/kernel/packs/compile.ts +108 -15
  708. package/src/kernel/packs/disclosure.test.ts +5 -2
  709. package/src/kernel/packs/disclosure.ts +2 -2
  710. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  711. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
  712. package/src/kernel/packs/graphql/index.ts +20 -0
  713. package/src/kernel/packs/graphqlSource.test.ts +6 -3
  714. package/src/kernel/packs/index.ts +40 -0
  715. package/src/kernel/packs/iri.test.ts +73 -0
  716. package/src/kernel/packs/iri.ts +70 -20
  717. package/src/kernel/packs/renderPack.ts +28 -7
  718. package/src/kernel/packs/resolveEntity.test.ts +213 -0
  719. package/src/kernel/packs/resolveEntity.ts +132 -34
  720. package/src/kernel/packs/runBodies.ts +16 -16
  721. package/src/kernel/packs/sample.ts +1 -1
  722. package/src/kernel/packs/schema.ts +114 -11
  723. package/src/kernel/packs/sparql/applyFilters.ts +16 -17
  724. package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
  725. package/src/kernel/packs/sparql/index.ts +37 -0
  726. package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
  727. package/src/kernel/packs/sparql/runSelect.ts +75 -37
  728. package/src/kernel/packs/toolDescription.test.ts +52 -5
  729. package/src/kernel/packs/types.ts +52 -4
  730. package/src/kernel/packs/uniqueness.ts +5 -5
  731. package/src/kernel/project/cli/buildProgram.test.ts +157 -17
  732. package/src/kernel/project/cli/buildProgram.ts +77 -18
  733. package/src/kernel/project/cli/constants.ts +34 -0
  734. package/src/kernel/project/cli/dispatch.test.ts +227 -3
  735. package/src/kernel/project/cli/dispatch.ts +250 -48
  736. package/src/kernel/project/cli/exitCodes.ts +1 -1
  737. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  738. package/src/kernel/project/cli/globalFlags.ts +130 -30
  739. package/src/kernel/project/cli/helpFormat.ts +14 -1
  740. package/src/kernel/project/cli/rootHelp.ts +140 -111
  741. package/src/kernel/project/cli/suggest.test.ts +33 -1
  742. package/src/kernel/project/cli/suggest.ts +25 -1
  743. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  744. package/src/kernel/project/cli/verbHelp.ts +23 -7
  745. package/src/kernel/project/mcp/buildServer.ts +18 -10
  746. package/src/kernel/project/mcp/envelope.ts +2 -2
  747. package/src/kernel/project/mcp/instructions.ts +12 -7
  748. package/src/kernel/project/mcp/mcpError.ts +1 -1
  749. package/src/kernel/project/mcp/parity.test.ts +42 -1
  750. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  751. package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
  752. package/src/kernel/project/mcp/prompts/provider.ts +22 -8
  753. package/src/kernel/project/mcp/prompts/source.ts +69 -68
  754. package/src/kernel/project/mcp/registerVerb.ts +56 -11
  755. package/src/kernel/project/mcp/serve.ts +13 -5
  756. package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
  757. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  758. package/src/kernel/render/contracts.ts +21 -0
  759. package/src/kernel/render/disclosure.ts +4 -2
  760. package/src/kernel/render/envelope.ts +2 -3
  761. package/src/kernel/render/formatters.ts +1 -1
  762. package/src/kernel/render/prefixes.test.ts +36 -0
  763. package/src/kernel/render/prefixes.ts +40 -13
  764. package/src/kernel/render/renderers.test.ts +244 -7
  765. package/src/kernel/render/renderers.ts +222 -20
  766. package/src/kernel/render/style.test.ts +75 -24
  767. package/src/kernel/render/style.ts +31 -1
  768. package/src/kernel/render/turtle.ts +222 -0
  769. package/src/kernel/runtime/graphpack/build.ts +29 -3
  770. package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
  771. package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
  772. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
  773. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
  775. package/src/kernel/runtime/graphpack/embedded.ts +39 -13
  776. package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
  777. package/src/kernel/runtime/graphpack/hash.ts +3 -2
  778. package/src/kernel/runtime/graphpack/index.ts +1 -1
  779. package/src/kernel/runtime/graphpack/manifest.ts +114 -12
  780. package/src/kernel/runtime/graphpack/read.ts +5 -11
  781. package/src/kernel/runtime/graphpack/schemas.ts +74 -0
  782. package/src/kernel/runtime/graphpack/stories.ts +84 -0
  783. package/src/kernel/runtime/graphpack/types.ts +61 -48
  784. package/src/kernel/runtime/loadSession.ts +1 -1
  785. package/src/kernel/runtime/paths.ts +64 -15
  786. package/src/kernel/runtime/probe.test.ts +8 -4
  787. package/src/kernel/runtime/probe.ts +6 -6
  788. package/src/kernel/runtime/readEntity.ts +477 -32
  789. package/src/kernel/runtime/refs/gitOps.ts +1 -19
  790. package/src/kernel/runtime/refs/index.ts +39 -0
  791. package/src/kernel/runtime/refs/parseRef.ts +8 -8
  792. package/src/kernel/runtime/refs/resolve.ts +82 -66
  793. package/src/kernel/runtime/resolveSources.test.ts +63 -24
  794. package/src/kernel/runtime/resolveSources.ts +36 -25
  795. package/src/kernel/runtime/storeReadiness.ts +10 -10
  796. package/src/kernel/runtime/storeless.test.ts +1 -1
  797. package/src/kernel/runtime/types.ts +15 -1
  798. package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
  799. package/src/kernel/spec/emitReference.test.ts +3 -3
  800. package/src/kernel/spec/emitReference.ts +242 -34
  801. package/src/kernel/spec/emitSurface.ts +57 -11
  802. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  803. package/src/kernel/spec/surfaceConformance.ts +8 -0
  804. package/src/kernel/spec/types.ts +277 -13
  805. package/src/kernel/spec/validate.ts +2 -1
  806. package/src/kernel/vocabulary.test.ts +164 -0
  807. package/src/kernel/vocabulary.ts +146 -0
  808. package/src/testing/PARITY_GAPS.ts +8 -2
  809. package/src/testing/behavioral/README.md +3 -3
  810. package/src/testing/behavioral/completion.test.ts +19 -6
  811. package/src/testing/behavioral/docExamples.test.ts +14 -0
  812. package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
  813. package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
  814. package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
  815. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  816. package/src/testing/behavioral/harness.foundation.test.ts +14 -5
  817. package/src/testing/behavioral/journeys.cli.test.ts +117 -76
  818. package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
  819. package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
  820. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  821. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  822. package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +9 -6
  823. package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
  824. package/src/testing/behavioral/liveReadSurface.ts +4 -3
  825. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  826. package/src/testing/behavioral/mcpSurface.test.ts +10 -5
  827. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  828. package/src/testing/behavioral/staleCommands.test.ts +10 -0
  829. package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
  830. package/src/testing/eval/cases/assembly.ts +13 -6
  831. package/src/testing/eval/cases/effectful.ts +28 -15
  832. package/src/testing/eval/cases/readNouns.ts +22 -20
  833. package/src/testing/eval/cases/stable.ts +5 -1
  834. package/src/testing/eval/eval.test.ts +7 -1
  835. package/src/testing/fixtures/blockGraph.ts +79 -0
  836. package/src/testing/fixtures/fixtureCapability.ts +45 -1
  837. package/src/testing/fixtures/graph/canonical.ts +94 -5
  838. package/src/testing/fixtures/graph/defaultPack.ts +7 -6
  839. package/src/testing/fixtures/graph/owlExport.ts +7 -5
  840. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  841. package/src/testing/helpers/fixtureGraph.ts +33 -16
  842. package/src/testing/helpers/packRuntime.ts +2 -3
  843. package/src/testing/helpers/projectCli.ts +2 -1
  844. package/src/testing/helpers/projectMcp.ts +38 -6
  845. package/src/testing/helpers/runCli.ts +35 -18
  846. package/src/testing/perf/budgets.test.ts +24 -9
  847. package/src/testing/perf/budgets.ts +76 -12
  848. package/src/testing/perf/codegen.test.ts +126 -0
  849. package/src/testing/perf/globalSetup.test.ts +286 -0
  850. package/src/testing/perf/globalSetup.ts +611 -14
  851. package/src/testing/perf/measure.test.ts +38 -0
  852. package/src/testing/perf/measure.ts +23 -4
  853. package/src/testing/setupXdgIsolation.ts +81 -21
  854. package/src/testing/tempRoot.globalSetup.ts +122 -0
  855. package/src/types.ts +2 -2
  856. package/dist/pragma +0 -0
  857. package/src/capabilities/block/blockList.test.ts +0 -79
  858. package/src/capabilities/block/blockList.verb.ts +0 -163
  859. package/src/capabilities/block/index.ts +0 -25
  860. package/src/capabilities/block/pack.ts +0 -166
  861. package/src/capabilities/block/parity.test.ts +0 -187
  862. package/src/capabilities/block/tierChain.ts +0 -78
  863. package/src/capabilities/colophon/pragmaColophon.ts +0 -66
  864. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
  865. package/src/capabilities/create/templates.embedded.generated.ts +0 -53
  866. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
  867. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  868. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
  869. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
  870. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  871. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  872. package/src/capabilities/modifier/index.ts +0 -15
  873. package/src/capabilities/modifier/pack.ts +0 -64
  874. package/src/capabilities/standard/index.ts +0 -18
  875. package/src/capabilities/standard/pack.ts +0 -128
  876. package/src/capabilities/tier/index.ts +0 -19
  877. package/src/capabilities/tier/lookup.render.test.ts +0 -72
  878. package/src/capabilities/tier/lookup.render.ts +0 -59
  879. package/src/capabilities/tier/lookup.test.ts +0 -83
  880. package/src/capabilities/tier/lookup.verb.ts +0 -44
  881. package/src/capabilities/tier/pack.ts +0 -28
  882. package/src/capabilities/tier/runLookup.ts +0 -87
  883. package/src/capabilities/token/addConfig.render.ts +0 -27
  884. package/src/capabilities/token/addConfig.test.ts +0 -62
  885. package/src/capabilities/token/addConfig.verb.ts +0 -40
  886. package/src/capabilities/token/index.ts +0 -19
  887. package/src/capabilities/token/pack.ts +0 -58
  888. package/src/capabilities/token/runAddConfig.ts +0 -95
  889. package/src/kernel/completion/bashDrive.test.ts +0 -73
  890. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
  891. package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
  892. package/src/kernel/runtime/lock.ts +0 -90
@@ -1,227 +1,133 @@
1
1
  /**
2
- * The `create` verbs — `component` / `package` / `application` (path capped at
3
- * two segments; the three 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 runs a top-level `await loadTemplate`). 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
- import { PragmaError } from "../../kernel/error/PragmaError.js";
19
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
20
- import type { ParamSpec, VerbSpec } from "../../kernel/spec/types.js";
21
- import { createFormatters } from "./create.render.js";
22
- import { generatorToParams } from "./generatorToVerbSpec.js";
31
+ import { BIN_NAME } from "../../constants.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";
23
39
  import { assertInsideWorkspace } from "./pathJail.js";
24
40
  import type { CreateKind } from "./types.js";
25
41
 
26
42
  // =============================================================================
27
- // Static params (mirrors of the generators' prompts — see the module doc)
43
+ // Params, derived from the projected surface (createSurface.generated.ts)
28
44
  // =============================================================================
29
45
 
30
- /** `--framework` — the three 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
+ */
31
52
  const FRAMEWORK_PARAM: ParamSpec = {
32
53
  kind: "enum",
33
54
  name: "framework",
34
- doc: "Component framework.",
35
- values: ["react", "svelte", "lit"],
36
- default: "react",
37
- };
38
-
39
- /**
40
- * `componentPath` — positional, and deliberately WITHOUT a ParamSpec default so
41
- * the selected framework's own prompt default applies (react vs svelte/lit
42
- * differ); `required: false` keeps it optional despite having no default here.
43
- */
44
- const COMPONENT_PATH_PARAM: ParamSpec = {
45
- kind: "string",
46
- name: "componentPath",
47
- doc: "Component path (its final segment is the PascalCase component name).",
48
- required: false,
55
+ doc: "Component framework — the tree segment (`create component <framework>`).",
56
+ values: COMPONENT_FRAMEWORKS,
57
+ required: true,
49
58
  positional: true,
50
- complete: { kind: "files" },
51
59
  };
52
60
 
53
- const SHARED_COMPONENT_MIRROR: PromptDefinition[] = [
54
- {
55
- name: "withStyles",
56
- type: "confirm",
57
- message: "Include styles?",
58
- default: true,
59
- },
60
- {
61
- name: "withStories",
62
- type: "confirm",
63
- message: "Include Storybook stories?",
64
- default: true,
65
- },
66
- {
67
- name: "withSsrTests",
68
- type: "confirm",
69
- message: "Include SSR tests?",
70
- default: true,
71
- },
72
- ];
73
-
74
- const PACKAGE_MIRROR: PromptDefinition[] = [
75
- {
76
- name: "name",
77
- type: "text",
78
- message: "Package name:",
79
- default: "@canonical/my-package",
80
- },
81
- {
82
- name: "type",
83
- type: "select",
84
- message: "Package type:",
85
- choices: [
86
- { label: "tool-ts", value: "tool-ts" },
87
- { label: "library", value: "library" },
88
- { label: "css", value: "css" },
89
- ],
90
- default: "tool-ts",
91
- },
92
- {
93
- name: "description",
94
- type: "text",
95
- message: "Package description:",
96
- default: "",
97
- },
98
- {
99
- name: "withReact",
100
- type: "confirm",
101
- message: "Include React dependencies?",
102
- default: false,
103
- },
104
- {
105
- name: "withStorybook",
106
- type: "confirm",
107
- message: "Include Storybook setup?",
108
- default: false,
109
- },
110
- {
111
- name: "withCli",
112
- type: "confirm",
113
- message: "Include a CLI binary entry point?",
114
- default: false,
115
- },
116
- {
117
- name: "withPrTemplate",
118
- type: "confirm",
119
- message: "Include a PR template?",
120
- default: false,
121
- },
122
- // Opt-in (default false): the grammar has no `--no-` form, so a default-true
123
- // boolean could never be turned off. `--run-install` enables it.
124
- {
125
- name: "runInstall",
126
- type: "confirm",
127
- message: "Run the package manager install after creation?",
128
- default: false,
129
- },
130
- ];
131
-
132
- // The include-flag prompts carry the CLI grammar's `--with-X` names
133
- // (`withSsr`/`withRouter`/`withForms`/`withRelay`, AV-228 B8) rather than the
134
- // summon generator's bare prompt names (`ssr`/`router`/`forms`/`relay`). {@link
135
- // INCLUDE_FLAG_ALIASES} maps them back at the CLI↔generator boundary so the
136
- // generator prompt names — and their embedded templates + byte-equality
137
- // goldens — stay stable. `--run-install` (default false) is an action flag, not
138
- // an include, so it keeps its spelling.
139
- const APPLICATION_MIRROR: PromptDefinition[] = [
140
- {
141
- name: "appPath",
142
- type: "text",
143
- message: "Application directory:",
144
- default: "my-app",
145
- positional: true,
146
- },
147
- { name: "withSsr", type: "confirm", message: "Include SSR?", default: true },
148
- {
149
- name: "withRouter",
150
- type: "confirm",
151
- message: "Include router?",
152
- default: true,
153
- },
154
- {
155
- name: "withForms",
156
- type: "confirm",
157
- message: "Include form components?",
158
- default: true,
159
- },
160
- {
161
- name: "withRelay",
162
- type: "confirm",
163
- message: "Include a Relay (GraphQL) data layer?",
164
- default: false,
165
- },
166
- {
167
- name: "runInstall",
168
- type: "confirm",
169
- message: "Install dependencies now?",
170
- default: false,
171
- },
172
- ];
173
-
174
61
  /**
175
- * CLI include-flag names → summon generator prompt names, per create kind
176
- * (AV-228 B8). All four `create application` include-flags are exposed on the
177
- * unified `--with-X` convention, so their params arrive keyed `withSsr`/
178
- * `withRouter`/`withForms`/`withRelay`; the summon generator reads the bare
179
- * `ssr`/`router`/`forms`/`relay`. We normalize at the ONE CLI↔generator seam
180
- * ({@link toGeneratorAnswers}), keeping the generator prompt names (and their
181
- * templates/goldens) untouched. Component and package already use `--with-X`
182
- * 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.
183
68
  */
184
- export const INCLUDE_FLAG_ALIASES: Record<
185
- CreateKind,
186
- Readonly<Record<string, string>>
187
- > = {
188
- component: {},
189
- package: {},
190
- application: {
191
- withSsr: "ssr",
192
- withRouter: "router",
193
- withForms: "forms",
194
- withRelay: "relay",
195
- },
196
- };
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
+ }
197
109
 
198
- /**
199
- * Re-key a param bag's CLI include-flag aliases to the generator prompt names,
200
- * so the summon generator reads `ssr` where the CLI grammar exposes `--with-ssr`.
201
- *
202
- * @param kind - The create noun (selects the alias map).
203
- * @param params - The coerced CLI/MCP param bag.
204
- * @returns A new bag with aliased keys renamed to the generator prompt names.
205
- */
206
- export function toGeneratorAnswers(
207
- kind: CreateKind,
208
- params: Readonly<Record<string, unknown>>,
209
- ): Record<string, unknown> {
210
- const aliases = INCLUDE_FLAG_ALIASES[kind];
211
- const answers: Record<string, unknown> = {};
212
- for (const [key, value] of Object.entries(params)) {
213
- 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
+ );
214
117
  }
215
- return answers;
118
+ return surface;
216
119
  }
217
120
 
218
121
  const componentParams: ParamSpec[] = [
219
122
  FRAMEWORK_PARAM,
220
- COMPONENT_PATH_PARAM,
221
- ...generatorToParams(SHARED_COMPONENT_MIRROR),
123
+ ...unionComponentParams(),
222
124
  ];
223
- const packageParams: ParamSpec[] = generatorToParams(PACKAGE_MIRROR);
224
- 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
+ );
225
131
 
226
132
  /** The path param each noun jails (package writes into a name-derived subdir). */
227
133
  const PATH_PARAM: Record<CreateKind, string | undefined> = {
@@ -230,27 +136,20 @@ const PATH_PARAM: Record<CreateKind, string | undefined> = {
230
136
  application: "appPath",
231
137
  };
232
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
+
233
149
  // =============================================================================
234
150
  // The lazy run — the one-line summon↔pragma seam per invocation
235
151
  // =============================================================================
236
152
 
237
- /**
238
- * Build the `create` Task for one invocation: pick the generator, jail its
239
- * output path, pre-validate flag/arg answers, pick the prompt strategy against
240
- * the interaction context, wire `runtime.exec`, and return `execute`.
241
- *
242
- * @returns A `Promise<Task<GeneratorResult>>` (the union's third arm) the
243
- * dispatcher/MCP handler awaits into a Task before interpreting.
244
- */
245
- /**
246
- * The standalone `bun build --compile` binary resolves every bundled module
247
- * under the virtual `/$bunfs` filesystem — a marker absent from any source or
248
- * `bun`-run module URL. `create component` is fully embedded and runs from the
249
- * binary; `create package` / `create application` are NOT (application also
250
- * copies non-`.ejs` assets), so they are gated to a source run below.
251
- */
252
- const IS_COMPILED_BINARY = import.meta.url.includes("/$bunfs/");
253
-
254
153
  /**
255
154
  * True when a dynamic import failed because the module could not be RESOLVED.
256
155
  * summon-core + the generators are now bundled into the binary, so this should
@@ -276,54 +175,33 @@ export function isModuleNotFound(cause: unknown): boolean {
276
175
  }
277
176
 
278
177
  /**
279
- * Load the create runtime: inject the embedded template manifest, then import
280
- * the generator selector + summon-core (STATIC dynamic imports, so bun's
281
- * `--compile` bundler includes them — they stay behind this lazy boundary, so
282
- * the fast paths and `create --yes` still load neither summon-core nor React).
178
+ * Load the create runtime — the generator selector and summon-core.
283
179
  *
284
- * The manifest is injected BEFORE `pickGenerator` — importing the generator
285
- * packages runs a top-level `await loadTemplate`, and the component loader
286
- * consults the manifest when its disk read fails (the compiled binary). It is
287
- * imported from summon-component's `loadTemplate` submodule so this does not
288
- * evaluate the generator index first. In a source run the disk read wins and the
289
- * manifest is 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()`.
290
184
  *
291
- * `create package` / `create application` are not yet embedded for the compiled
292
- * binary (application also copies non-`.ejs` assets), so they are gated to a
293
- * source run here. A stale resolution failure is a defensive backstop
294
- * {@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.
295
188
  */
296
- async function loadCreateRuntime(kind: CreateKind) {
297
- if (IS_COMPILED_BINARY && kind !== "component") {
298
- throw new PragmaError({
299
- code: "UNSUPPORTED",
300
- message: `\`create ${kind}\` is not available in the compiled pragma binary yet — only \`create component\` is embedded. Run it from a source checkout, or use the \`summon\` CLI.`,
301
- recovery: {
302
- message: `Run \`create ${kind}\` from a source checkout, or use \`summon\`.`,
303
- },
304
- });
305
- }
189
+ async function loadCreateRuntime() {
306
190
  try {
307
- // Inject the embedded manifest before the generators evaluate.
308
- const [{ setEmbeddedTemplates }, { TEMPLATES }] = await Promise.all([
309
- import("@canonical/summon-component/embedded"),
310
- import("./templates.embedded.generated.js"),
311
- ]);
312
- setEmbeddedTemplates(TEMPLATES);
313
-
314
- const [pick, summon] = await Promise.all([
315
- import("./pickGenerator.js"),
191
+ const [summon, projection, pick] = await Promise.all([
316
192
  import("@canonical/summon-core"),
193
+ import("@canonical/summon-core/projection"),
194
+ import("./pickGenerator.js"),
317
195
  ]);
318
- return { pickGenerator: pick.pickGenerator, summon };
196
+ return { pickGenerator: pick.pickGenerator, summon, projection };
319
197
  } catch (cause) {
320
198
  if (isModuleNotFound(cause)) {
321
199
  throw new PragmaError({
322
200
  code: "UNSUPPORTED",
323
201
  message:
324
- "`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.",
325
203
  recovery: {
326
- message: "Run `create` from a source checkout, or use `summon`.",
204
+ message: `Reinstall ${BIN_NAME} to restore its generator dependencies.`,
327
205
  },
328
206
  });
329
207
  }
@@ -331,50 +209,151 @@ async function loadCreateRuntime(kind: CreateKind) {
331
209
  }
332
210
  }
333
211
 
334
- async function runCreate(
335
- kind: CreateKind,
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
+
222
+ /**
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.
229
+ *
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.
236
+ * @param rt - The pragma runtime.
237
+ * @returns A `Promise<Task<GeneratorResult>>` (the union's third arm) the
238
+ * dispatcher/MCP handler awaits into a Task before interpreting.
239
+ */
240
+ export async function runCreate(
241
+ commandPath: string,
336
242
  params: Record<string, unknown>,
337
243
  rt: PragmaRuntime,
338
244
  ): Promise<Task<GeneratorResult>> {
339
- // Lazy: importing these runs the generators' top-level template loads and
340
- // pulls summon-core — kept off every non-create path. Now STATIC dynamic
341
- // imports so `--compile` bundles them; the generators' `.ejs` are embedded and
342
- // injected here. `package`/`application` stay a source-run feature in the binary.
343
- const { pickGenerator, summon } = await loadCreateRuntime(kind);
245
+ // Lazy: importing these pulls summon-core (and with it React) — kept off every
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();
344
249
 
345
- // Normalize the CLI/MCP `--with-X` include-flags to the generator prompt names
346
- // (AV-228 B8) once, at this seam; every summon interaction below reads the
347
- // generator-facing `answers` bag so the generator prompt names stay stable.
348
- const answers = toGeneratorAnswers(kind, params);
250
+ const generator = pickGenerator(commandPath);
251
+ const kind = kindOf(commandPath);
349
252
 
350
- const generator = pickGenerator(kind, answers);
351
-
352
- // SEC-2: reject a path escaping the workspace BEFORE any effect runs.
353
- const pathParam = PATH_PARAM[kind];
354
- 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;
355
257
 
356
258
  // Reject a flag/arg-provided answer that fails its prompt's own constraint,
357
- // 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];
358
265
  const invalid = summon.validateAnswers(generator.prompts, answers);
359
266
  if (invalid !== null) {
360
- 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
+ });
361
287
  }
362
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.
363
296
  const { isTTY, transport, yes, signal, abort } = rt.interaction ?? {
364
297
  isTTY: false,
365
298
  transport: "cli" as const,
366
- yes: true,
299
+ yes: false,
367
300
  };
368
301
  const stamp = summon.createGeneratorStamp(generator);
369
302
 
370
- // TTY without --yes → the embedded Ink wizard (identical #819 flow). The
371
- // session both answers prompts and renders live effect progress, so its
372
- // callbacks ride runtime.exec alongside the shared stamping transform.
373
- 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") {
374
344
  // `onCancel` (H2): an in-Ink Ctrl-C during execution aborts the run so the
375
345
  // interpreter stops writing — raw mode swallows the SIGINT, so the wizard
376
346
  // drives the abort. Shared with setup by construction.
377
- const session = summon.inkPrompt(generator, { signal, onCancel: abort });
347
+ // `cwd` also reaches the wizard: its confirm-gate preview reads the same
348
+ // jail-checked write root the interpreter resolves effect paths against.
349
+ const session = summon.inkPrompt(generator, {
350
+ signal,
351
+ onCancel: abort,
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,
356
+ });
378
357
  // Thread the per-call write root: the interpreter resolves the generator's
379
358
  // relative output paths against `rt.cwd` — the SAME dir the SEC-2 jail
380
359
  // validated above — so the write can never escape the checked directory.
@@ -397,13 +376,12 @@ async function runCreate(
397
376
  });
398
377
  }
399
378
 
400
- // Non-interactive: MCP → params-or-error; CLI/--yes/CI → flags+defaults.
401
- const prompt =
402
- transport === "mcp"
403
- ? summon.mcpPrompt(answers)
404
- : summon.autoPrompt(answers);
405
- // Same per-call write root as the Ink branch: `rt.cwd` feeds both the SEC-2
406
- // 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);
407
385
  rt.exec = {
408
386
  cwd: rt.cwd,
409
387
  promptHandler: prompt,
@@ -422,7 +400,7 @@ async function runCreate(
422
400
  * `destructiveHint`, and MCP clients default an unset hint on a non-read-only
423
401
  * tool to `true` — advertising create as destructive, the opposite of intent.
424
402
  */
425
- const CREATE_CAPABILITY = {
403
+ export const CREATE_CAPABILITY = {
426
404
  needsStore: false,
427
405
  mutates: true,
428
406
  destructive: false,
@@ -433,10 +411,42 @@ const CREATE_CAPABILITY = {
433
411
  },
434
412
  };
435
413
 
414
+ /**
415
+ * The shared output spec: the outcome formatters plus the dry-run seam.
416
+ *
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.
422
+ *
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.
428
+ *
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.
433
+ */
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
+ };
442
+
436
443
  /**
437
444
  * Build a create verb. `run` presents `Promise<Task<R>>` through the `Task<R>`
438
445
  * arm by an honest cast at this one site (mirroring `sources update`): a literal
439
446
  * `Promise<Task<R>>` arm in the union would poison async read-verb inference.
447
+ *
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.
440
450
  */
441
451
  function createVerb(
442
452
  kind: CreateKind,
@@ -448,46 +458,76 @@ function createVerb(
448
458
  path: ["create", kind],
449
459
  summary,
450
460
  params,
451
- output: { formatters: createFormatters },
461
+ output: CREATE_OUTPUT,
452
462
  examples,
453
463
  capability: CREATE_CAPABILITY,
454
- run: (params_, rt) =>
455
- 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
+ },
456
483
  };
457
484
  }
458
485
 
459
- export const createComponentVerb = createVerb(
460
- "component",
461
- "Scaffold a React, Svelte, or Lit component.",
462
- componentParams,
463
- [
464
- {
465
- cmd: "pragma create component src/components/Button --framework react",
466
- note: "React component with tests, stories, and styles",
467
- },
468
- {
469
- cmd: "pragma create component src/lib/Card --framework svelte --dry-run",
470
- note: "preview the files without writing",
471
- },
472
- ],
473
- );
474
-
475
- export const createPackageVerb = createVerb(
476
- "package",
477
- "Scaffold a new npm package for the monorepo.",
478
- packageParams,
479
- [
480
- { cmd: "pragma create package --name @canonical/my-lib --type library" },
481
- { cmd: "pragma create package --name @canonical/my-tool --run-install" },
482
- ],
483
- );
484
-
485
- export const createApplicationVerb = createVerb(
486
- "application",
487
- "Scaffold a full React application with SSR and routing.",
488
- applicationParams,
489
- [
490
- { cmd: "pragma create application my-app" },
491
- { cmd: "pragma create application my-app --with-relay" },
492
- ],
493
- );
486
+ /**
487
+ * The `create` verbs, one per declared generator binding — so adding a binding
488
+ * to {@link CREATE_GENERATORS} without surfacing it is a type error rather than
489
+ * a silent no-op. Key order is authoring order, which `index.ts` preserves into
490
+ * the command tree, `--help` and the emitted surface.
491
+ */
492
+ export const createVerbs: Record<
493
+ CreateKind,
494
+ VerbSpec<Record<string, unknown>, GeneratorResult>
495
+ > = {
496
+ component: createVerb(
497
+ "component",
498
+ "Scaffold a React, Svelte, or Lit component.",
499
+ componentParams,
500
+ [
501
+ {
502
+ cmd: `${BIN_NAME} create component react src/components/Button`,
503
+ note: "React component with tests, stories, and styles",
504
+ },
505
+ {
506
+ cmd: `${BIN_NAME} create component svelte src/lib/Card --dry-run`,
507
+ note: "preview the files without writing",
508
+ },
509
+ ],
510
+ ),
511
+ package: createVerb(
512
+ "package",
513
+ "Scaffold a new npm package for the monorepo.",
514
+ packageParams,
515
+ [
516
+ {
517
+ cmd: `${BIN_NAME} create package --name @canonical/my-lib --type library`,
518
+ },
519
+ {
520
+ cmd: `${BIN_NAME} create package --name @canonical/my-tool --no-run-install`,
521
+ },
522
+ ],
523
+ ),
524
+ application: createVerb(
525
+ "application",
526
+ "Scaffold a full React application with SSR and routing.",
527
+ applicationParams,
528
+ [
529
+ { cmd: `${BIN_NAME} create application react my-app` },
530
+ { cmd: `${BIN_NAME} create application react my-app --relay` },
531
+ ],
532
+ ),
533
+ };