@canonical/pragma-cli 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (798) hide show
  1. package/README.md +153 -30
  2. package/dist/.build-ok +0 -0
  3. package/dist/package.json +83 -0
  4. package/dist/pragma.conf.js +814 -0
  5. package/dist/pragma.conf.js.map +1 -0
  6. package/dist/src/bin.js +356 -0
  7. package/dist/src/bin.js.map +1 -0
  8. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  9. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  10. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  11. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  12. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  13. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  14. package/dist/src/capabilities/capabilities/hints.js +195 -0
  15. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  16. package/dist/src/capabilities/capabilities/index.js +11 -0
  17. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/types.js +11 -0
  19. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  20. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  21. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  22. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  23. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  24. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  25. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  26. package/dist/src/capabilities/colophon/index.js +5 -0
  27. package/dist/src/capabilities/colophon/index.js.map +1 -0
  28. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  29. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  30. package/dist/src/capabilities/colophon/types.js +10 -0
  31. package/dist/src/capabilities/colophon/types.js.map +1 -0
  32. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  33. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  34. package/dist/src/capabilities/config/field.render.js +22 -0
  35. package/dist/src/capabilities/config/field.render.js.map +1 -0
  36. package/dist/src/capabilities/config/fields.js +46 -0
  37. package/dist/src/capabilities/config/fields.js.map +1 -0
  38. package/dist/src/capabilities/config/get.verb.js +61 -0
  39. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  40. package/dist/src/capabilities/config/index.js +5 -0
  41. package/dist/src/capabilities/config/index.js.map +1 -0
  42. package/dist/src/capabilities/config/runField.js +59 -0
  43. package/dist/src/capabilities/config/runField.js.map +1 -0
  44. package/dist/src/capabilities/config/runGet.js +28 -0
  45. package/dist/src/capabilities/config/runGet.js.map +1 -0
  46. package/dist/src/capabilities/config/runSet.js +53 -0
  47. package/dist/src/capabilities/config/runSet.js.map +1 -0
  48. package/dist/src/capabilities/config/set.verb.js +66 -0
  49. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/show.render.js +84 -0
  51. package/dist/src/capabilities/config/show.render.js.map +1 -0
  52. package/dist/src/capabilities/config/show.verb.js +44 -0
  53. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  54. package/dist/src/capabilities/config/types.js +5 -0
  55. package/dist/src/capabilities/config/types.js.map +1 -0
  56. package/dist/src/capabilities/config/unset.verb.js +49 -0
  57. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  58. package/dist/src/capabilities/create/cliProjection.js +195 -0
  59. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  60. package/dist/src/capabilities/create/constants.js +47 -0
  61. package/dist/src/capabilities/create/constants.js.map +1 -0
  62. package/dist/src/capabilities/create/create.render.js +100 -0
  63. package/dist/src/capabilities/create/create.render.js.map +1 -0
  64. package/dist/src/capabilities/create/create.verb.js +438 -0
  65. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  66. package/dist/src/capabilities/create/createHelp.js +47 -0
  67. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  68. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  69. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  70. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  71. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  72. package/dist/src/capabilities/create/index.js +18 -0
  73. package/dist/src/capabilities/create/index.js.map +1 -0
  74. package/dist/src/capabilities/create/messages.js +16 -0
  75. package/dist/src/capabilities/create/messages.js.map +1 -0
  76. package/dist/src/capabilities/create/mount.js +293 -0
  77. package/dist/src/capabilities/create/mount.js.map +1 -0
  78. package/dist/src/capabilities/create/pathJail.js +65 -0
  79. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  80. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  81. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  82. package/dist/src/capabilities/create/types.js +2 -0
  83. package/dist/src/capabilities/create/types.js.map +1 -0
  84. package/dist/src/capabilities/distribution.js +40 -0
  85. package/dist/src/capabilities/distribution.js.map +1 -0
  86. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  87. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  88. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  89. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  90. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
  91. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  92. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  93. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  94. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  95. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  97. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  99. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
  101. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  102. package/dist/src/capabilities/doctor/doctor.render.js +185 -0
  103. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  104. package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
  105. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  106. package/dist/src/capabilities/doctor/index.js +5 -0
  107. package/dist/src/capabilities/doctor/index.js.map +1 -0
  108. package/dist/src/capabilities/doctor/runChecks.js +83 -0
  109. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  110. package/dist/src/capabilities/doctor/types.js +5 -0
  111. package/dist/src/capabilities/doctor/types.js.map +1 -0
  112. package/dist/src/capabilities/graph/index.js +19 -0
  113. package/dist/src/capabilities/graph/index.js.map +1 -0
  114. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  115. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  116. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  117. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  118. package/dist/src/capabilities/graph/query.render.js +73 -0
  119. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  120. package/dist/src/capabilities/graph/query.verb.js +49 -0
  121. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  122. package/dist/src/capabilities/graph/runQuery.js +41 -0
  123. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  124. package/dist/src/capabilities/index.js +56 -0
  125. package/dist/src/capabilities/index.js.map +1 -0
  126. package/dist/src/capabilities/info/collectInfo.js +66 -0
  127. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  128. package/dist/src/capabilities/info/index.js +5 -0
  129. package/dist/src/capabilities/info/index.js.map +1 -0
  130. package/dist/src/capabilities/info/info.render.js +53 -0
  131. package/dist/src/capabilities/info/info.render.js.map +1 -0
  132. package/dist/src/capabilities/info/info.verb.js +42 -0
  133. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  134. package/dist/src/capabilities/info/types.js +5 -0
  135. package/dist/src/capabilities/info/types.js.map +1 -0
  136. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  137. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  138. package/dist/src/capabilities/meta/index.js +13 -0
  139. package/dist/src/capabilities/meta/index.js.map +1 -0
  140. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  141. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  142. package/dist/src/capabilities/ontology/index.js +21 -0
  143. package/dist/src/capabilities/ontology/index.js.map +1 -0
  144. package/dist/src/capabilities/ontology/queries.js +123 -0
  145. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  146. package/dist/src/capabilities/ontology/render.js +66 -0
  147. package/dist/src/capabilities/ontology/render.js.map +1 -0
  148. package/dist/src/capabilities/ontology/verbs.js +181 -0
  149. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  150. package/dist/src/capabilities/prompt/index.js +16 -0
  151. package/dist/src/capabilities/prompt/index.js.map +1 -0
  152. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  153. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  154. package/dist/src/capabilities/prompt/types.js +10 -0
  155. package/dist/src/capabilities/prompt/types.js.map +1 -0
  156. package/dist/src/capabilities/prompt/verbs.js +93 -0
  157. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  158. package/dist/src/capabilities/resources/index.js +10 -0
  159. package/dist/src/capabilities/resources/index.js.map +1 -0
  160. package/dist/src/capabilities/resources/provider.js +423 -0
  161. package/dist/src/capabilities/resources/provider.js.map +1 -0
  162. package/dist/src/capabilities/setup/buildPlan.js +168 -0
  163. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  164. package/dist/src/capabilities/setup/index.js +5 -0
  165. package/dist/src/capabilities/setup/index.js.map +1 -0
  166. package/dist/src/capabilities/setup/mode.js +53 -0
  167. package/dist/src/capabilities/setup/mode.js.map +1 -0
  168. package/dist/src/capabilities/setup/operations/index.js +39 -0
  169. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  170. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  171. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  172. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  173. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  174. package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
  175. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  176. package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
  177. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  178. package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
  179. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
  181. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  182. package/dist/src/capabilities/setup/plan.js +128 -0
  183. package/dist/src/capabilities/setup/plan.js.map +1 -0
  184. package/dist/src/capabilities/setup/plan.render.js +193 -0
  185. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  186. package/dist/src/capabilities/setup/setup.render.js +54 -0
  187. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  188. package/dist/src/capabilities/setup/setup.verb.js +334 -0
  189. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  190. package/dist/src/capabilities/setup/shell.js +196 -0
  191. package/dist/src/capabilities/setup/shell.js.map +1 -0
  192. package/dist/src/capabilities/setup/targets.js +263 -0
  193. package/dist/src/capabilities/setup/targets.js.map +1 -0
  194. package/dist/src/capabilities/setup/types.js +5 -0
  195. package/dist/src/capabilities/setup/types.js.map +1 -0
  196. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  197. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  198. package/dist/src/capabilities/shared/bands.js +16 -0
  199. package/dist/src/capabilities/shared/bands.js.map +1 -0
  200. package/dist/src/capabilities/shared/index.js +26 -0
  201. package/dist/src/capabilities/shared/index.js.map +1 -0
  202. package/dist/src/capabilities/shared/packageManager.js +103 -0
  203. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  204. package/dist/src/capabilities/shared/registry.js +55 -0
  205. package/dist/src/capabilities/shared/registry.js.map +1 -0
  206. package/dist/src/capabilities/skill/discover.js +195 -0
  207. package/dist/src/capabilities/skill/discover.js.map +1 -0
  208. package/dist/src/capabilities/skill/index.js +10 -0
  209. package/dist/src/capabilities/skill/index.js.map +1 -0
  210. package/dist/src/capabilities/skill/render.js +49 -0
  211. package/dist/src/capabilities/skill/render.js.map +1 -0
  212. package/dist/src/capabilities/skill/verbs.js +83 -0
  213. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  214. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  215. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  216. package/dist/src/capabilities/sources/index.js +13 -0
  217. package/dist/src/capabilities/sources/index.js.map +1 -0
  218. package/dist/src/capabilities/sources/installSkills.js +167 -0
  219. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  220. package/dist/src/capabilities/sources/runUpdate.js +394 -0
  221. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  222. package/dist/src/capabilities/sources/status.render.js +64 -0
  223. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  224. package/dist/src/capabilities/sources/status.verb.js +40 -0
  225. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  226. package/dist/src/capabilities/sources/types.js +6 -0
  227. package/dist/src/capabilities/sources/types.js.map +1 -0
  228. package/dist/src/capabilities/sources/update.render.js +34 -0
  229. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  230. package/dist/src/capabilities/sources/update.verb.js +55 -0
  231. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  232. package/dist/src/capabilities/upgrade/index.js +5 -0
  233. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  234. package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
  235. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  236. package/dist/src/capabilities/upgrade/types.js +5 -0
  237. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  238. package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
  239. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  240. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  241. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  242. package/dist/src/capabilities/version/index.js +10 -0
  243. package/dist/src/capabilities/version/index.js.map +1 -0
  244. package/dist/src/capabilities/version/version.verb.js +36 -0
  245. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  246. package/dist/src/constants.js +82 -0
  247. package/dist/src/constants.js.map +1 -0
  248. package/dist/src/index.js +12 -0
  249. package/dist/src/index.js.map +1 -0
  250. package/dist/src/kernel/completion/complete.js +66 -0
  251. package/dist/src/kernel/completion/complete.js.map +1 -0
  252. package/dist/src/kernel/completion/emitScripts.js +92 -0
  253. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  254. package/dist/src/kernel/completion/entitySource.js +285 -0
  255. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  256. package/dist/src/kernel/completion/index.js +14 -0
  257. package/dist/src/kernel/completion/index.js.map +1 -0
  258. package/dist/src/kernel/completion/model.js +301 -0
  259. package/dist/src/kernel/completion/model.js.map +1 -0
  260. package/dist/src/kernel/completion/parse.js +253 -0
  261. package/dist/src/kernel/completion/parse.js.map +1 -0
  262. package/dist/src/kernel/completion/rank.js +101 -0
  263. package/dist/src/kernel/completion/rank.js.map +1 -0
  264. package/dist/src/kernel/completion/resolve.js +100 -0
  265. package/dist/src/kernel/completion/resolve.js.map +1 -0
  266. package/dist/src/kernel/completion/templates/bash.js +209 -0
  267. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  268. package/dist/src/kernel/completion/templates/fish.js +214 -0
  269. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  270. package/dist/src/kernel/completion/templates/index.js +23 -0
  271. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  272. package/dist/src/kernel/completion/templates/shared.js +98 -0
  273. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  274. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  275. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  276. package/dist/src/kernel/completion/types.js +13 -0
  277. package/dist/src/kernel/completion/types.js.map +1 -0
  278. package/dist/src/kernel/config/defaults.js +17 -0
  279. package/dist/src/kernel/config/defaults.js.map +1 -0
  280. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  281. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  282. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  283. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  284. package/dist/src/kernel/config/firstRun.js +34 -0
  285. package/dist/src/kernel/config/firstRun.js.map +1 -0
  286. package/dist/src/kernel/config/globalConfig.js +79 -0
  287. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  288. package/dist/src/kernel/config/index.js +16 -0
  289. package/dist/src/kernel/config/index.js.map +1 -0
  290. package/dist/src/kernel/config/paths.js +35 -0
  291. package/dist/src/kernel/config/paths.js.map +1 -0
  292. package/dist/src/kernel/config/readConfig.js +78 -0
  293. package/dist/src/kernel/config/readConfig.js.map +1 -0
  294. package/dist/src/kernel/config/schema.js +130 -0
  295. package/dist/src/kernel/config/schema.js.map +1 -0
  296. package/dist/src/kernel/config/types.js +19 -0
  297. package/dist/src/kernel/config/types.js.map +1 -0
  298. package/dist/src/kernel/config/writeConfigField.js +59 -0
  299. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  300. package/dist/src/kernel/copy.js +43 -0
  301. package/dist/src/kernel/copy.js.map +1 -0
  302. package/dist/src/kernel/error/PragmaError.js +149 -0
  303. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  304. package/dist/src/kernel/error/constants.js +40 -0
  305. package/dist/src/kernel/error/constants.js.map +1 -0
  306. package/dist/src/kernel/error/fromTaskError.js +96 -0
  307. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  308. package/dist/src/kernel/error/index.js +13 -0
  309. package/dist/src/kernel/error/index.js.map +1 -0
  310. package/dist/src/kernel/error/recovery.js +52 -0
  311. package/dist/src/kernel/error/recovery.js.map +1 -0
  312. package/dist/src/kernel/error/renderError.js +115 -0
  313. package/dist/src/kernel/error/renderError.js.map +1 -0
  314. package/dist/src/kernel/error/serialize.js +25 -0
  315. package/dist/src/kernel/error/serialize.js.map +1 -0
  316. package/dist/src/kernel/error/types.js +9 -0
  317. package/dist/src/kernel/error/types.js.map +1 -0
  318. package/dist/src/kernel/index.js +25 -0
  319. package/dist/src/kernel/index.js.map +1 -0
  320. package/dist/src/kernel/packs/collect.js +187 -0
  321. package/dist/src/kernel/packs/collect.js.map +1 -0
  322. package/dist/src/kernel/packs/compile.js +304 -0
  323. package/dist/src/kernel/packs/compile.js.map +1 -0
  324. package/dist/src/kernel/packs/disclosure.js +76 -0
  325. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  326. package/dist/src/kernel/packs/glob.js +38 -0
  327. package/dist/src/kernel/packs/glob.js.map +1 -0
  328. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  329. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  330. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  331. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  332. package/dist/src/kernel/packs/graphql/index.js +20 -0
  333. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  334. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  335. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  336. package/dist/src/kernel/packs/index.js +34 -0
  337. package/dist/src/kernel/packs/index.js.map +1 -0
  338. package/dist/src/kernel/packs/iri.js +110 -0
  339. package/dist/src/kernel/packs/iri.js.map +1 -0
  340. package/dist/src/kernel/packs/renderPack.js +129 -0
  341. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  342. package/dist/src/kernel/packs/resolveEntity.js +223 -0
  343. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  344. package/dist/src/kernel/packs/runBodies.js +87 -0
  345. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  346. package/dist/src/kernel/packs/sample.js +56 -0
  347. package/dist/src/kernel/packs/sample.js.map +1 -0
  348. package/dist/src/kernel/packs/schema.js +369 -0
  349. package/dist/src/kernel/packs/schema.js.map +1 -0
  350. package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
  351. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  352. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  353. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  354. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
  355. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  356. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  357. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  358. package/dist/src/kernel/packs/sparql/index.js +31 -0
  359. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  360. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  361. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  362. package/dist/src/kernel/packs/types.js +30 -0
  363. package/dist/src/kernel/packs/types.js.map +1 -0
  364. package/dist/src/kernel/packs/uniqueness.js +30 -0
  365. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  366. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  367. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  368. package/dist/src/kernel/project/cli/constants.js +27 -0
  369. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  370. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  371. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  372. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  373. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  374. package/dist/src/kernel/project/cli/globalFlags.js +216 -0
  375. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  376. package/dist/src/kernel/project/cli/helpFormat.js +59 -0
  377. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  378. package/dist/src/kernel/project/cli/index.js +14 -0
  379. package/dist/src/kernel/project/cli/index.js.map +1 -0
  380. package/dist/src/kernel/project/cli/rootHelp.js +197 -0
  381. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  382. package/dist/src/kernel/project/cli/suggest.js +75 -0
  383. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  384. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  385. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  386. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  387. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  388. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  389. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  390. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  391. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  392. package/dist/src/kernel/project/mcp/index.js +8 -0
  393. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  394. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  395. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  396. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  397. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  398. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  399. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  401. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  403. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
  405. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/serve.js +35 -0
  407. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  408. package/dist/src/kernel/render/compactUri.js +24 -0
  409. package/dist/src/kernel/render/compactUri.js.map +1 -0
  410. package/dist/src/kernel/render/contracts.js +10 -0
  411. package/dist/src/kernel/render/contracts.js.map +1 -0
  412. package/dist/src/kernel/render/disclosure.js +34 -0
  413. package/dist/src/kernel/render/disclosure.js.map +1 -0
  414. package/dist/src/kernel/render/envelope.js +30 -0
  415. package/dist/src/kernel/render/envelope.js.map +1 -0
  416. package/dist/src/kernel/render/formatters.js +27 -0
  417. package/dist/src/kernel/render/formatters.js.map +1 -0
  418. package/dist/src/kernel/render/index.js +15 -0
  419. package/dist/src/kernel/render/index.js.map +1 -0
  420. package/dist/src/kernel/render/prefixes.js +46 -0
  421. package/dist/src/kernel/render/prefixes.js.map +1 -0
  422. package/dist/src/kernel/render/renderers.js +468 -0
  423. package/dist/src/kernel/render/renderers.js.map +1 -0
  424. package/dist/src/kernel/render/style.js +85 -0
  425. package/dist/src/kernel/render/style.js.map +1 -0
  426. package/dist/src/kernel/render/turtle.js +194 -0
  427. package/dist/src/kernel/render/turtle.js.map +1 -0
  428. package/dist/src/kernel/render/writeStdout.js +43 -0
  429. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  430. package/dist/src/kernel/runtime/boot.js +49 -0
  431. package/dist/src/kernel/runtime/boot.js.map +1 -0
  432. package/dist/src/kernel/runtime/facade.js +39 -0
  433. package/dist/src/kernel/runtime/facade.js.map +1 -0
  434. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  435. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  436. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  437. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  438. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  439. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  440. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  441. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  442. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  443. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  444. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  445. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  446. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  447. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  449. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  451. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  453. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  455. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  457. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  459. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  460. package/dist/src/kernel/runtime/index.js +8 -0
  461. package/dist/src/kernel/runtime/index.js.map +1 -0
  462. package/dist/src/kernel/runtime/loadSession.js +34 -0
  463. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  464. package/dist/src/kernel/runtime/paths.js +78 -0
  465. package/dist/src/kernel/runtime/paths.js.map +1 -0
  466. package/dist/src/kernel/runtime/probe.js +37 -0
  467. package/dist/src/kernel/runtime/probe.js.map +1 -0
  468. package/dist/src/kernel/runtime/readEntity.js +363 -0
  469. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  470. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  471. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  472. package/dist/src/kernel/runtime/refs/index.js +29 -0
  473. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  474. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  475. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  476. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  477. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  478. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  479. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  480. package/dist/src/kernel/runtime/store.js +75 -0
  481. package/dist/src/kernel/runtime/store.js.map +1 -0
  482. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  483. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  484. package/dist/src/kernel/runtime/types.js +11 -0
  485. package/dist/src/kernel/runtime/types.js.map +1 -0
  486. package/dist/src/kernel/spec/asVerb.js +21 -0
  487. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  488. package/dist/src/kernel/spec/emitReference.js +578 -0
  489. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  490. package/dist/src/kernel/spec/emitSurface.js +202 -0
  491. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  492. package/dist/src/kernel/spec/index.js +11 -0
  493. package/dist/src/kernel/spec/index.js.map +1 -0
  494. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  495. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  496. package/dist/src/kernel/spec/types.js +14 -0
  497. package/dist/src/kernel/spec/types.js.map +1 -0
  498. package/dist/src/kernel/spec/validate.js +110 -0
  499. package/dist/src/kernel/spec/validate.js.map +1 -0
  500. package/dist/src/kernel/vocabulary.js +97 -0
  501. package/dist/src/kernel/vocabulary.js.map +1 -0
  502. package/dist/src/types.js +11 -0
  503. package/dist/src/types.js.map +1 -0
  504. package/package.json +20 -22
  505. package/pragma.conf.ts +249 -60
  506. package/src/bin.ts +267 -82
  507. package/src/capabilities/block.parity.test.ts +6 -3
  508. package/src/capabilities/capabilities/capabilities.render.ts +1 -1
  509. package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
  510. package/src/capabilities/capabilities/catalog.ts +3 -3
  511. package/src/capabilities/capabilities/hints.ts +32 -7
  512. package/src/capabilities/capabilities/index.ts +1 -1
  513. package/src/capabilities/colophon/collectColophon.ts +35 -24
  514. package/src/capabilities/colophon/colophon.render.ts +25 -1
  515. package/src/capabilities/colophon/colophon.test.ts +42 -21
  516. package/src/capabilities/colophon/colophon.verb.ts +4 -4
  517. package/src/capabilities/config/collectConfigShow.test.ts +1 -0
  518. package/src/capabilities/config/collectConfigShow.ts +3 -3
  519. package/src/capabilities/config/field.render.ts +4 -5
  520. package/src/capabilities/config/fields.ts +17 -10
  521. package/src/capabilities/config/get.verb.ts +70 -0
  522. package/src/capabilities/config/getUnset.test.ts +264 -0
  523. package/src/capabilities/config/index.ts +5 -1
  524. package/src/capabilities/config/runField.ts +40 -22
  525. package/src/capabilities/config/runGet.ts +34 -0
  526. package/src/capabilities/config/runSet.ts +35 -9
  527. package/src/capabilities/config/set.test.ts +48 -14
  528. package/src/capabilities/config/set.verb.ts +8 -7
  529. package/src/capabilities/config/show.render.ts +1 -1
  530. package/src/capabilities/config/show.verb.ts +9 -6
  531. package/src/capabilities/config/types.ts +18 -4
  532. package/src/capabilities/config/unset.verb.ts +58 -0
  533. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  534. package/src/capabilities/create/byteEquality.test.ts +25 -11
  535. package/src/capabilities/create/cliProjection.ts +227 -0
  536. package/src/capabilities/create/constants.ts +36 -61
  537. package/src/capabilities/create/create.mcp.test.ts +89 -5
  538. package/src/capabilities/create/create.render.ts +71 -7
  539. package/src/capabilities/create/create.test.ts +433 -219
  540. package/src/capabilities/create/create.verb.ts +297 -328
  541. package/src/capabilities/create/createGrammar.test.ts +865 -0
  542. package/src/capabilities/create/createHelp.ts +71 -0
  543. package/src/capabilities/create/createSurface.generated.ts +400 -0
  544. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  545. package/src/capabilities/create/cwdJail.test.ts +24 -5
  546. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  547. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  548. package/src/capabilities/create/index.ts +7 -4
  549. package/src/capabilities/create/messages.ts +18 -0
  550. package/src/capabilities/create/mount.ts +391 -0
  551. package/src/capabilities/create/pathJail.test.ts +90 -0
  552. package/src/capabilities/create/pathJail.ts +8 -5
  553. package/src/capabilities/create/pickGenerator.ts +23 -35
  554. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  555. package/src/capabilities/create/types.ts +20 -0
  556. package/src/capabilities/distribution.test.ts +3 -1
  557. package/src/capabilities/distribution.ts +10 -15
  558. package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
  559. package/src/capabilities/doctor/checks/checkPackageRefs.ts +6 -4
  560. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
  561. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +72 -27
  562. package/src/capabilities/doctor/checks/checkShellCompletions.ts +59 -13
  563. package/src/capabilities/doctor/checks/index.ts +27 -0
  564. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  565. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  566. package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
  567. package/src/capabilities/doctor/doctor.render.test.ts +18 -7
  568. package/src/capabilities/doctor/doctor.render.ts +43 -19
  569. package/src/capabilities/doctor/doctor.test.ts +123 -34
  570. package/src/capabilities/doctor/doctor.verb.ts +3 -3
  571. package/src/capabilities/doctor/runChecks.ts +62 -63
  572. package/src/capabilities/doctor/types.ts +20 -4
  573. package/src/capabilities/emptyRecovery.test.ts +13 -8
  574. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  575. package/src/capabilities/graph/index.ts +1 -1
  576. package/src/capabilities/graph/inspect.render.ts +70 -22
  577. package/src/capabilities/graph/inspect.test.ts +260 -5
  578. package/src/capabilities/graph/inspect.verb.ts +18 -6
  579. package/src/capabilities/graph/query.render.ts +15 -3
  580. package/src/capabilities/graph/query.verb.ts +3 -3
  581. package/src/capabilities/graph/runQuery.ts +2 -3
  582. package/src/capabilities/index.ts +3 -1
  583. package/src/capabilities/info/collectInfo.ts +5 -4
  584. package/src/capabilities/info/info.render.ts +1 -1
  585. package/src/capabilities/info/info.verb.ts +1 -1
  586. package/src/capabilities/lazy.test.ts +32 -0
  587. package/src/capabilities/meta/complete.verb.ts +1 -1
  588. package/src/capabilities/meta/index.ts +1 -1
  589. package/src/capabilities/meta/mcp.verb.ts +10 -8
  590. package/src/capabilities/ontology/index.ts +15 -11
  591. package/src/capabilities/ontology/ontology.test.ts +6 -55
  592. package/src/capabilities/ontology/queries.ts +2 -2
  593. package/src/capabilities/ontology/render.ts +3 -4
  594. package/src/capabilities/ontology/verbs.ts +27 -68
  595. package/src/capabilities/prompt/index.ts +2 -2
  596. package/src/capabilities/prompt/prompt.render.ts +6 -2
  597. package/src/capabilities/prompt/types.ts +1 -1
  598. package/src/capabilities/prompt/verbs.ts +4 -5
  599. package/src/capabilities/reference.test.ts +63 -0
  600. package/src/capabilities/resources/provider.ts +342 -85
  601. package/src/capabilities/resources/resources.test.ts +355 -59
  602. package/src/capabilities/setup/buildPlan.ts +236 -0
  603. package/src/capabilities/setup/index.ts +7 -7
  604. package/src/capabilities/setup/mode.ts +74 -0
  605. package/src/capabilities/setup/operations/index.ts +74 -0
  606. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  607. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  608. package/src/capabilities/setup/operations/setupGenerator.ts +396 -326
  609. package/src/capabilities/setup/operations/setupLsp.ts +329 -68
  610. package/src/capabilities/setup/operations/setupMcp.ts +137 -97
  611. package/src/capabilities/setup/operations/setupSkills.ts +336 -108
  612. package/src/capabilities/setup/plan.render.ts +241 -0
  613. package/src/capabilities/setup/plan.ts +236 -0
  614. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  615. package/src/capabilities/setup/setup.render.test.ts +281 -73
  616. package/src/capabilities/setup/setup.render.ts +45 -77
  617. package/src/capabilities/setup/setup.test.ts +972 -209
  618. package/src/capabilities/setup/setup.verb.ts +223 -71
  619. package/src/capabilities/setup/shell.test.ts +86 -0
  620. package/src/capabilities/setup/shell.ts +137 -11
  621. package/src/capabilities/setup/targets.ts +367 -0
  622. package/src/capabilities/setup/types.ts +18 -57
  623. package/src/capabilities/shared/assertExecOk.ts +68 -10
  624. package/src/capabilities/shared/index.ts +32 -0
  625. package/src/capabilities/shared/packageManager.test.ts +55 -0
  626. package/src/capabilities/shared/packageManager.ts +62 -6
  627. package/src/capabilities/skill/discover.ts +37 -5
  628. package/src/capabilities/skill/index.ts +1 -1
  629. package/src/capabilities/skill/render.ts +10 -9
  630. package/src/capabilities/skill/skill.test.ts +7 -5
  631. package/src/capabilities/skill/verbs.ts +3 -4
  632. package/src/capabilities/sources/collectStatus.ts +7 -2
  633. package/src/capabilities/sources/index.ts +1 -1
  634. package/src/capabilities/sources/installSkills.ts +84 -7
  635. package/src/capabilities/sources/runUpdate.ts +53 -21
  636. package/src/capabilities/sources/sources.test.ts +154 -2
  637. package/src/capabilities/sources/status.render.ts +1 -1
  638. package/src/capabilities/sources/status.verb.ts +1 -1
  639. package/src/capabilities/sources/update.render.ts +1 -1
  640. package/src/capabilities/sources/update.verb.ts +1 -1
  641. package/src/capabilities/surface.test.ts +134 -17
  642. package/src/capabilities/upgrade/runUpgrade.ts +8 -8
  643. package/src/capabilities/upgrade/upgrade.render.ts +4 -5
  644. package/src/capabilities/upgrade/upgrade.test.ts +3 -3
  645. package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
  646. package/src/capabilities/version/index.ts +12 -0
  647. package/src/capabilities/version/version.test.ts +66 -0
  648. package/src/capabilities/version/version.verb.ts +39 -0
  649. package/src/constants.ts +31 -1
  650. package/src/identity.test.ts +40 -25
  651. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
  652. package/src/kernel/completion/complete.test.ts +12 -2
  653. package/src/kernel/completion/complete.ts +1 -1
  654. package/src/kernel/completion/emitScripts.ts +1 -1
  655. package/src/kernel/completion/entitySource.test.ts +1 -1
  656. package/src/kernel/completion/entitySource.ts +21 -8
  657. package/src/kernel/completion/model.test.ts +164 -12
  658. package/src/kernel/completion/model.ts +94 -14
  659. package/src/kernel/completion/parse.test.ts +4 -7
  660. package/src/kernel/completion/parse.ts +15 -0
  661. package/src/kernel/completion/resolve.test.ts +0 -1
  662. package/src/kernel/completion/safety.test.ts +34 -26
  663. package/src/kernel/completion/shellDrive.test.ts +28 -9
  664. package/src/kernel/completion/templates/bash.ts +7 -2
  665. package/src/kernel/completion/templates/index.ts +23 -0
  666. package/src/kernel/completion/types.ts +7 -0
  667. package/src/kernel/config/defaults.test.ts +25 -2
  668. package/src/kernel/config/defaults.ts +4 -3
  669. package/src/kernel/config/evaluateProjectConfig.ts +31 -8
  670. package/src/kernel/config/firstRun.test.ts +44 -38
  671. package/src/kernel/config/firstRun.ts +24 -88
  672. package/src/kernel/config/index.ts +1 -1
  673. package/src/kernel/config/readConfig.test.ts +6 -3
  674. package/src/kernel/config/readConfig.ts +1 -1
  675. package/src/kernel/config/schema.ts +3 -1
  676. package/src/kernel/config/types.ts +3 -1
  677. package/src/kernel/copy.test.ts +34 -4
  678. package/src/kernel/copy.ts +54 -0
  679. package/src/kernel/error/PragmaError.test.ts +5 -2
  680. package/src/kernel/error/PragmaError.ts +4 -2
  681. package/src/kernel/error/constants.ts +7 -5
  682. package/src/kernel/error/fromTaskError.ts +28 -6
  683. package/src/kernel/error/recovery.ts +14 -0
  684. package/src/kernel/error/renderError.ts +42 -1
  685. package/src/kernel/error/types.ts +21 -1
  686. package/src/kernel/index.ts +26 -0
  687. package/src/kernel/packs/collect.ts +12 -16
  688. package/src/kernel/packs/compile.test.ts +130 -1
  689. package/src/kernel/packs/compile.ts +93 -3
  690. package/src/kernel/packs/disclosure.ts +2 -2
  691. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  692. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
  693. package/src/kernel/packs/graphql/index.ts +20 -0
  694. package/src/kernel/packs/index.ts +40 -0
  695. package/src/kernel/packs/iri.test.ts +73 -0
  696. package/src/kernel/packs/iri.ts +66 -14
  697. package/src/kernel/packs/renderPack.ts +24 -5
  698. package/src/kernel/packs/resolveEntity.test.ts +213 -0
  699. package/src/kernel/packs/resolveEntity.ts +112 -18
  700. package/src/kernel/packs/runBodies.ts +2 -3
  701. package/src/kernel/packs/sample.ts +1 -1
  702. package/src/kernel/packs/schema.ts +18 -1
  703. package/src/kernel/packs/sparql/applyFilters.ts +16 -17
  704. package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
  705. package/src/kernel/packs/sparql/index.ts +37 -0
  706. package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
  707. package/src/kernel/packs/sparql/runSelect.ts +3 -4
  708. package/src/kernel/packs/toolDescription.test.ts +42 -3
  709. package/src/kernel/packs/types.ts +13 -0
  710. package/src/kernel/packs/uniqueness.ts +1 -1
  711. package/src/kernel/project/cli/buildProgram.test.ts +147 -12
  712. package/src/kernel/project/cli/buildProgram.ts +77 -18
  713. package/src/kernel/project/cli/constants.ts +34 -0
  714. package/src/kernel/project/cli/dispatch.test.ts +160 -3
  715. package/src/kernel/project/cli/dispatch.ts +222 -42
  716. package/src/kernel/project/cli/exitCodes.ts +1 -1
  717. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  718. package/src/kernel/project/cli/globalFlags.ts +130 -30
  719. package/src/kernel/project/cli/helpFormat.ts +13 -0
  720. package/src/kernel/project/cli/rootHelp.ts +41 -12
  721. package/src/kernel/project/cli/suggest.test.ts +33 -1
  722. package/src/kernel/project/cli/suggest.ts +25 -1
  723. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  724. package/src/kernel/project/cli/verbHelp.ts +23 -7
  725. package/src/kernel/project/mcp/buildServer.ts +7 -4
  726. package/src/kernel/project/mcp/envelope.ts +2 -2
  727. package/src/kernel/project/mcp/instructions.ts +2 -2
  728. package/src/kernel/project/mcp/mcpError.ts +1 -1
  729. package/src/kernel/project/mcp/parity.test.ts +5 -2
  730. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  731. package/src/kernel/project/mcp/prompts/source.ts +2 -2
  732. package/src/kernel/project/mcp/registerVerb.ts +35 -9
  733. package/src/kernel/project/mcp/serve.ts +2 -2
  734. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  735. package/src/kernel/render/contracts.ts +21 -0
  736. package/src/kernel/render/envelope.ts +2 -3
  737. package/src/kernel/render/formatters.ts +1 -1
  738. package/src/kernel/render/renderers.test.ts +243 -6
  739. package/src/kernel/render/renderers.ts +222 -20
  740. package/src/kernel/render/style.test.ts +75 -24
  741. package/src/kernel/render/style.ts +31 -1
  742. package/src/kernel/render/turtle.ts +222 -0
  743. package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
  744. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
  745. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
  746. package/src/kernel/runtime/graphpack/embedded.ts +3 -3
  747. package/src/kernel/runtime/graphpack/manifest.ts +1 -1
  748. package/src/kernel/runtime/graphpack/read.ts +1 -2
  749. package/src/kernel/runtime/loadSession.ts +1 -1
  750. package/src/kernel/runtime/probe.ts +6 -6
  751. package/src/kernel/runtime/readEntity.ts +472 -28
  752. package/src/kernel/runtime/refs/index.ts +39 -0
  753. package/src/kernel/runtime/refs/parseRef.ts +2 -2
  754. package/src/kernel/runtime/refs/resolve.ts +4 -4
  755. package/src/kernel/runtime/storeReadiness.ts +1 -2
  756. package/src/kernel/runtime/types.ts +15 -1
  757. package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
  758. package/src/kernel/spec/emitReference.ts +105 -30
  759. package/src/kernel/spec/emitSurface.ts +48 -6
  760. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  761. package/src/kernel/spec/types.ts +248 -4
  762. package/src/testing/behavioral/docExamples.test.ts +14 -0
  763. package/src/testing/behavioral/errorMatrix.mcp.test.ts +2 -2
  764. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  765. package/src/testing/behavioral/journeys.cli.test.ts +1 -1
  766. package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
  767. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  768. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  769. package/src/testing/behavioral/journeys.packageStories.test.ts +4 -4
  770. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  771. package/src/testing/behavioral/mcpSurface.test.ts +1 -1
  772. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  773. package/src/testing/eval/cases/effectful.ts +3 -2
  774. package/src/testing/fixtures/blockGraph.ts +79 -0
  775. package/src/testing/fixtures/graph/canonical.ts +88 -2
  776. package/src/testing/fixtures/graph/defaultPack.ts +1 -1
  777. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  778. package/src/testing/helpers/projectMcp.ts +32 -6
  779. package/src/testing/helpers/runCli.ts +35 -18
  780. package/src/testing/perf/budgets.test.ts +20 -9
  781. package/src/testing/perf/budgets.ts +58 -9
  782. package/src/testing/perf/codegen.test.ts +126 -0
  783. package/src/testing/perf/globalSetup.test.ts +286 -0
  784. package/src/testing/perf/globalSetup.ts +505 -23
  785. package/src/testing/perf/measure.test.ts +38 -0
  786. package/src/testing/perf/measure.ts +23 -4
  787. package/src/testing/setupXdgIsolation.ts +81 -21
  788. package/src/testing/tempRoot.globalSetup.ts +122 -0
  789. package/dist/pragma +0 -0
  790. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
  791. package/src/capabilities/create/templates.embedded.generated.ts +0 -28
  792. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
  793. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  794. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
  795. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
  796. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  797. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  798. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
@@ -1,27 +1,87 @@
1
1
  /**
2
- * Global test setup: isolate the XDG config, data, and state layers.
2
+ * Per-file test setup: give every test FILE its own directory inside the run's
3
+ * temp root, and isolate the XDG config, data, state, and cache layers in it.
3
4
  *
4
- * The layered config reader consults `$XDG_CONFIG_HOME/pragma/config.json`
5
- * on every read, global-first writes create it, and the project-config
6
- * evaluator caches compiled configs under `$XDG_STATE_HOME`. Point all three
7
- * at per-run temp directories so tests neither observe nor pollute the
8
- * developer's real global state. Individual tests that exercise XDG
9
- * behaviour override these values themselves.
5
+ * The layered config reader consults `$XDG_CONFIG_HOME/pragma/config.json` on
6
+ * every read, global-first writes create it, and the project-config evaluator
7
+ * caches compiled configs under `$XDG_STATE_HOME`. The store layer writes its
8
+ * content-addressed pack cache under `$XDG_CACHE_HOME`. Pointing all four at
9
+ * temp directories is what keeps tests from observing or polluting the
10
+ * developer's real global state. Individual tests that exercise XDG behaviour
11
+ * override these values themselves.
12
+ *
13
+ * WHY EVERY TEMP PATH IS REDIRECTED, NOT JUST THE FOUR. This module is
14
+ * registered as `setupFiles`, not `globalSetup`, so vitest executes it once per
15
+ * test FILE — over a hundred times in a full run, in a fresh process each time.
16
+ * Four bare module-scope `mkdtempSync` calls therefore left four directories
17
+ * behind per file with no hook that could ever remove them, and the tests,
18
+ * helpers and spawned binaries below them left thousands more, until a 12 GB
19
+ * tmpfs was exhausted. What that exhaustion looks like is why this docblock is
20
+ * long: a full disk does not read as a full disk. Every worker fails while
21
+ * IMPORTING its test file, so the suite reports a hundred-odd files failed
22
+ * against a handful of assertions run — the exact silhouette of a broken build
23
+ * — and each of those files still passes when run alone.
24
+ *
25
+ * So `TMPDIR`, `TMP`, and `TEMP` are pointed at this file's directory before
26
+ * any other temp directory exists, which puts every later `tmpdir()` consumer
27
+ * inside it: the four XDG directories here, the `mkdtempSync` calls in the test
28
+ * files and their helpers, and the subprocesses those tests spawn, which
29
+ * inherit this environment. 41 of the 82 files that call `mkdtempSync` have no
30
+ * `rmSync` anywhere in them; none of them needed editing.
31
+ *
32
+ * Allocate temp directories freely under `tmpdir()`; they are cleaned for you.
33
+ * Do not reintroduce a bare `mkdtempSync` rooted at the REAL system temp
34
+ * directory (`os.tmpdir()` read before this file runs, or an absolute `/tmp`) —
35
+ * it escapes the run root and leaks, which is how the tmpfs was exhausted the
36
+ * first time.
37
+ *
38
+ * CORRECTNESS LIVES IN THE RUN ROOT, NOT IN THIS FILE'S HOOK. The `afterAll`
39
+ * below is hygiene: it keeps a long run's peak disk usage flat instead of
40
+ * letting every finished file's footprint sit until the end. It is not what
41
+ * makes the run clean. A fully-skipped file runs no `afterAll` at all, and a
42
+ * worker torn down mid-file runs no hook either, so anything that depended on
43
+ * this hook would still leak on exactly the cases hardest to notice. What makes
44
+ * the run clean is `tempRoot.globalSetup.ts`'s teardown, which removes the run
45
+ * root wholesale after the last worker exits — every file's directory, skipped
46
+ * or not, hook or no hook.
10
47
  */
11
48
 
12
- import { mkdtempSync } from "node:fs";
13
- import { tmpdir } from "node:os";
49
+ import { mkdtempSync, rmSync } from "node:fs";
14
50
  import { join } from "node:path";
51
+ import { afterAll } from "vitest";
52
+ import { requireTempRoot } from "./tempRoot.globalSetup.js";
15
53
 
16
- process.env.XDG_CONFIG_HOME = mkdtempSync(join(tmpdir(), "pragma-test-xdg-"));
17
- process.env.XDG_DATA_HOME = mkdtempSync(
18
- join(tmpdir(), "pragma-test-xdg-data-"),
19
- );
20
- process.env.XDG_STATE_HOME = mkdtempSync(
21
- join(tmpdir(), "pragma-test-xdg-state-"),
22
- );
23
- // The store layer writes the content-addressed pack cache under
24
- // $XDG_CACHE_HOME — isolate it too so tests never touch the real cache.
25
- process.env.XDG_CACHE_HOME = mkdtempSync(
26
- join(tmpdir(), "pragma-test-xdg-cache-"),
27
- );
54
+ /**
55
+ * This test file's directory inside the run root.
56
+ *
57
+ * Allocated before the redirection below, so it lands in the run root rather
58
+ * than inside itself.
59
+ */
60
+ const fileTempDir = mkdtempSync(join(requireTempRoot(), "file-"));
61
+
62
+ // Every subsequent `tmpdir()` in this process, and in the processes it spawns,
63
+ // resolves here. Node reads these three names in this order.
64
+ process.env.TMPDIR = fileTempDir;
65
+ process.env.TMP = fileTempDir;
66
+ process.env.TEMP = fileTempDir;
67
+
68
+ process.env.XDG_CONFIG_HOME = mkdtempSync(join(fileTempDir, "xdg-config-"));
69
+ process.env.XDG_DATA_HOME = mkdtempSync(join(fileTempDir, "xdg-data-"));
70
+ process.env.XDG_STATE_HOME = mkdtempSync(join(fileTempDir, "xdg-state-"));
71
+ process.env.XDG_CACHE_HOME = mkdtempSync(join(fileTempDir, "xdg-cache-"));
72
+
73
+ /**
74
+ * Release this file's footprint early, tolerating every failure.
75
+ *
76
+ * A removal that fails (a subprocess still holding a descriptor, a mode a
77
+ * fixture made read-only) must never turn a green run red — the run root's
78
+ * teardown collects whatever is left regardless, so there is nothing useful to
79
+ * do here but continue.
80
+ */
81
+ afterAll(() => {
82
+ try {
83
+ rmSync(fileTempDir, { recursive: true, force: true });
84
+ } catch {
85
+ // Deliberately swallowed; the run teardown is the backstop. See above.
86
+ }
87
+ });
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Vitest global setup: one temp root for the whole RUN, allocated before any
3
+ * worker starts and removed when the last one finishes.
4
+ *
5
+ * WHY THE ROOT IS RUN-LEVEL AND NOT PER-FILE. Per-file allocation cannot meet
6
+ * either half of what this fix is for. A file whose every test is skipped runs
7
+ * no `afterAll`, and a worker torn down mid-file runs no hook at all, so a
8
+ * per-file scheme always leaves residue behind and has to reclaim it on some
9
+ * LATER run — which means a run is never actually clean, only eventually
10
+ * clean. And a per-file allocation fails per FILE: on a full disk every worker
11
+ * throws while importing its test file, which is the hundred-failures-no-
12
+ * assertions silhouette this whole change exists to abolish, reproduced by the
13
+ * cure.
14
+ *
15
+ * Run-level fixes both by construction. `setup` runs ONCE, in the main
16
+ * process, before a single worker exists: a disk that cannot fit one directory
17
+ * fails here, once, with a message that names the disk. `teardown` runs after
18
+ * the last worker exits, whatever happened inside it — skipped files, thrown
19
+ * files, torn-down workers — so one removal reclaims the run's whole
20
+ * footprint and the net is zero, not "zero after the next run sweeps".
21
+ *
22
+ * The path reaches the workers through the environment, which they inherit
23
+ * from this process. `setupXdgIsolation.ts` reads it, takes a per-file
24
+ * subdirectory inside it, and points `TMPDIR` there.
25
+ */
26
+
27
+ import { mkdirSync, mkdtempSync, rmSync } from "node:fs";
28
+ import { tmpdir } from "node:os";
29
+ import { join } from "node:path";
30
+
31
+ /**
32
+ * The variable carrying the run root to the workers.
33
+ *
34
+ * Read by `setupXdgIsolation.ts`, which runs in each worker. Not a public
35
+ * contract: both live only inside this package's test configuration.
36
+ */
37
+ export const TEMP_ROOT_ENV = "PRAGMA_TEST_TEMP_ROOT";
38
+
39
+ /**
40
+ * The one name every run root carries, so a human sweeping by hand — or the
41
+ * workaround in issue #1000 — can recognise this suite's residue.
42
+ *
43
+ * DELIBERATELY VENDOR-FREE. Redirecting `tmpdir()` puts this name inside every
44
+ * temp path the tests build, and some of them assert on the path text:
45
+ * `identity.test.ts` derives a skills root under `tmpdir()` and requires it to
46
+ * carry no distribution name, so a root called `pragma-…` fails a PROTECTED
47
+ * cell that has nothing to do with temp directories. Keep it clear of
48
+ * `pragma`, `canonical`, and `design-system`.
49
+ */
50
+ const ROOT_PREFIX = "vitest-tmproot-";
51
+
52
+ /** The run root, remembered between {@link setup} and {@link teardown}. */
53
+ let runRoot: string | undefined;
54
+
55
+ /**
56
+ * Allocate the run root, or fail the run with a diagnosis rather than a
57
+ * hundred import errors.
58
+ *
59
+ * @returns Nothing; the root is published on the environment.
60
+ * @note Impure — creates a directory and writes `process.env`.
61
+ */
62
+ export function setup(): void {
63
+ const systemTmp = tmpdir();
64
+ try {
65
+ runRoot = mkdtempSync(join(systemTmp, ROOT_PREFIX));
66
+ } catch (error) {
67
+ const reason = error instanceof Error ? error.message : String(error);
68
+ // The whole point of allocating here: ONE failure, named. A full disk
69
+ // presents as a mass import failure when it is discovered per worker, and
70
+ // that shape reads as a broken build rather than a full disk — which is
71
+ // how the leak this file fixes cost so much diagnosis time.
72
+ throw new Error(
73
+ `Could not create the test temp root under ${systemTmp}.\n` +
74
+ `This is a DISK problem, not a test failure: ${reason}\n\n` +
75
+ `Check free space with \`df -h ${systemTmp}\`, then reclaim this ` +
76
+ `suite's residue:\n` +
77
+ ` find ${systemTmp} -maxdepth 1 -type d -name '${ROOT_PREFIX}*' -exec rm -rf {} +`,
78
+ );
79
+ }
80
+ process.env[TEMP_ROOT_ENV] = runRoot;
81
+ }
82
+
83
+ /**
84
+ * Remove the run root and everything any worker put inside it.
85
+ *
86
+ * Tolerates failure: a removal that throws (a subprocess still holding a
87
+ * descriptor, a fixture that made a directory read-only) must never turn a
88
+ * green run red. One leaked root is one directory, and the message says which.
89
+ *
90
+ * @note Impure — removes a directory tree.
91
+ */
92
+ export function teardown(): void {
93
+ if (runRoot === undefined) return;
94
+ try {
95
+ rmSync(runRoot, { recursive: true, force: true });
96
+ } catch (error) {
97
+ const reason = error instanceof Error ? error.message : String(error);
98
+ console.warn(`Could not remove the test temp root ${runRoot}: ${reason}`);
99
+ }
100
+ }
101
+
102
+ /**
103
+ * The run root, for a worker that needs to allocate inside it.
104
+ *
105
+ * @returns The run root path.
106
+ * @throws If {@link setup} did not run — a configuration error, not a
107
+ * transient one, so it says how to fix the config rather than degrading to
108
+ * a per-file root that would silently reintroduce the leak.
109
+ * @note Impure — reads `process.env`.
110
+ */
111
+ export function requireTempRoot(): string {
112
+ const root = process.env[TEMP_ROOT_ENV];
113
+ if (root === undefined || root === "") {
114
+ throw new Error(
115
+ `${TEMP_ROOT_ENV} is unset, so the run-level temp root was never ` +
116
+ `allocated. Add "./src/testing/tempRoot.globalSetup.ts" to this ` +
117
+ `config's \`globalSetup\` array.`,
118
+ );
119
+ }
120
+ mkdirSync(root, { recursive: true });
121
+ return root;
122
+ }
package/dist/pragma DELETED
Binary file
@@ -1,189 +0,0 @@
1
- /**
2
- * PROTECTED — the compiled-binary `create` guard.
3
- *
4
- * Builds the real standalone `dist/pragma` (`bun build --compile`) and spawns
5
- * `pragma create component … --yes` for react, svelte AND lit, asserting each
6
- * tree is BYTE-IDENTICAL to a source run of the same generator (`bun src/bin.ts
7
- * …`, which reads the `.ejs` templates from disk).
8
- *
9
- * This is what proves PR7's two compiled-`create` fixes end-to-end:
10
- * 1. Summon is bundled — a computed-specifier import used to keep summon-core +
11
- * the generators OUT of the binary; static dynamic imports now include them.
12
- * 2. The templates are embedded AND resolved by DIRECTORY-QUALIFIED path. The
13
- * svelte + lit cases are load-bearing: `types.ts.ejs` / `index.ts.ejs` /
14
- * `styles.css.ejs` / `stories.ts.ejs` exist in react/, svelte/ AND lit/, so
15
- * the old basename-matching fallback could emit the WRONG framework's file
16
- * in the binary. A wrong file would differ from the source run → red here.
17
- *
18
- * On base (summon not bundled, templates not embedded) the binary's `create`
19
- * writes nothing (it errors), so `compiled.size > 0` already fails.
20
- */
21
-
22
- import { execFileSync, spawnSync } from "node:child_process";
23
- import { mkdtempSync, readdirSync, readFileSync } from "node:fs";
24
- import { tmpdir } from "node:os";
25
- import { dirname, join, resolve } from "node:path";
26
- import { fileURLToPath } from "node:url";
27
- import { describe, expect, it } from "vitest";
28
-
29
- const here = dirname(fileURLToPath(import.meta.url));
30
- const repoRoot = resolve(here, "../../../../../..");
31
- const cliNextDir = join(repoRoot, "packages/cli/pragma");
32
- const pragmaBin = join(cliNextDir, "src/bin.ts");
33
- const compiledBin = join(cliNextDir, "dist/pragma");
34
- const freshCwd = (): string => mkdtempSync(join(tmpdir(), "pragma-compiled-"));
35
-
36
- // The binary is provisioned by `testing/perf/globalSetup.ts`, which rebuilds it
37
- // whenever it is missing or older than `src/**`, `scripts/**`, `pragma.conf.ts`
38
- // or `package.json` — so these tests exercise the current bundle + embedded
39
- // manifest without a second `beforeAll` writing `dist/pragma` in place while
40
- // another worker's test is spawning it.
41
-
42
- /** Read a directory tree into a sorted map of relative path → contents. */
43
- function snapshot(dir: string): Map<string, string> {
44
- const out = new Map<string, string>();
45
- const walk = (d: string, base: string): void => {
46
- for (const entry of readdirSync(d, { withFileTypes: true }).sort((a, b) =>
47
- a.name.localeCompare(b.name),
48
- )) {
49
- const rel = base ? `${base}/${entry.name}` : entry.name;
50
- if (entry.isDirectory()) walk(join(d, entry.name), rel);
51
- else out.set(rel, readFileSync(join(d, entry.name), "utf-8"));
52
- }
53
- };
54
- walk(dir, "");
55
- return out;
56
- }
57
-
58
- /** Run a `create component` in its own cwd and snapshot what it wrote. */
59
- function createComponent(
60
- bin: string,
61
- args: readonly string[],
62
- framework: string,
63
- ): Map<string, string> {
64
- const dir = freshCwd();
65
- execFileSync(
66
- bin,
67
- [
68
- ...args,
69
- "create",
70
- "component",
71
- "src/components/Widget",
72
- "--framework",
73
- framework,
74
- "--yes",
75
- ],
76
- { cwd: dir, stdio: "pipe" },
77
- );
78
- return snapshot(dir);
79
- }
80
-
81
- describe("compiled pragma create component (PROTECTED)", () => {
82
- for (const framework of ["react", "svelte", "lit"] as const) {
83
- it(`${framework}: compiled binary ≡ source run, byte-for-byte`, () => {
84
- // (1) The real standalone binary — templates come from the embedded manifest.
85
- const compiled = createComponent(compiledBin, [], framework);
86
- // (2) A source run — templates come from disk. The reference output.
87
- const source = createComponent("bun", [pragmaBin], framework);
88
-
89
- // Wrote something (fails on base, where the binary's create errors out).
90
- expect(compiled.size).toBeGreaterThan(0);
91
- // Same file set …
92
- expect([...compiled.keys()].sort()).toEqual([...source.keys()].sort());
93
- // … and byte-identical contents (the collision fix: svelte/lit must NOT
94
- // carry react's template text).
95
- for (const [path, content] of compiled) {
96
- expect(source.get(path), `content of ${path}`).toBe(content);
97
- }
98
- }, 120_000);
99
- }
100
- });
101
-
102
- /**
103
- * PROTECTED — the compiled-binary `create` gate.
104
- *
105
- * `create component` runs from the binary (the describe above proves it byte for
106
- * byte) because summon-component routes every template read through
107
- * `loadTemplateSync` and passes `content:` into `template()`. `create package` /
108
- * `create application` do NOT: they call `template({ source })`, summon-core
109
- * falls through to `readFile(options.source)`, and the run dies with `ENOENT …
110
- * /$bunfs/templates/package.json.ejs` AFTER `mkdir` has already run — a
111
- * half-made package left on the user's disk. Measured against a real
112
- * `dist/pragma` with the gate lifted, for both nouns.
113
- *
114
- * A `--dry-run` does NOT test this: it exits 0 without reading a template and
115
- * merely PRINTS `Read file: /$bunfs/templates/package.json.ejs` as a planned
116
- * effect. That false positive is why the gate has to be pinned by a real run.
117
- *
118
- * The `readdirSync(dir)` assertion is the load-bearing one: it fails with the
119
- * real symptom if the gate is ever lifted without fixing the generators.
120
- */
121
- describe("compiled pragma create gate (PROTECTED)", () => {
122
- // A LITERAL noun list, deliberately not derived from `create`'s own
123
- // declaration: changing the gate's input must turn this red rather than
124
- // silently drop the case.
125
- for (const kind of ["package", "application"] as const) {
126
- it(`refuses \`create ${kind}\` and leaves the cwd untouched`, () => {
127
- const dir = freshCwd();
128
- const result = spawnSync(compiledBin, ["create", kind, "--yes"], {
129
- cwd: dir,
130
- stdio: "pipe",
131
- encoding: "utf-8",
132
- });
133
- const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
134
- // 1, not merely non-zero: UNSUPPORTED is a runtime refusal, which
135
- // `kernel/error/constants.ts` maps to the generic runtime exit.
136
- expect(result.status).toBe(1);
137
- expect(output).toContain("not available in the compiled pragma binary");
138
- // The clean refusal, not the crash it exists to prevent.
139
- expect(output).not.toMatch(/ENOENT/);
140
- expect(output).not.toMatch(/Internal error/);
141
- // And nothing half-made on disk: the generator's `mkdir` effects run
142
- // BEFORE its first template read, so a lifted gate leaves a stub tree.
143
- expect(readdirSync(dir)).toEqual([]);
144
- }, 30_000);
145
- }
146
- });
147
-
148
- /**
149
- * PROTECTED — the compiled-binary READ guard (U1-orig).
150
- *
151
- * A READ command (`block list`, `--help`) never calls a generator's
152
- * `generate()`, so — with the generators loading their templates LAZILY on first
153
- * `generate()` rather than at module-eval — it must never touch a `.ejs`
154
- * template that the standalone binary lacks. This is the exact gap the
155
- * create-only smoke above missed: the component generators used to load
156
- * templates via a top-level `await`, so a READ crashed with `Template not found`
157
- * on any bun version whose `--compile` code-splitting did not keep the generator
158
- * modules lazy. The lazy load makes a READ template-free regardless of bun.
159
- */
160
- describe("compiled pragma READ smoke (PROTECTED)", () => {
161
- // A cold store cleanly reports STORE_UNAVAILABLE (exit 3); `--help` never needs
162
- // a store (exit 0). Both fully exercise startup + dispatch — the phase where an
163
- // eager generator template load would have crashed — without a store or writes.
164
- const READS: ReadonlyArray<{
165
- args: readonly string[];
166
- okExit: readonly number[];
167
- }> = [
168
- { args: ["block", "list"], okExit: [0, 3] },
169
- { args: ["--help"], okExit: [0] },
170
- ];
171
-
172
- for (const { args, okExit } of READS) {
173
- it(`\`${args.join(" ")}\` runs without a Template-not-found crash`, () => {
174
- const result = spawnSync(compiledBin, [...args], {
175
- cwd: freshCwd(),
176
- stdio: "pipe",
177
- encoding: "utf-8",
178
- });
179
- const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
180
- // The exact crash the lazy-template fix closes: a READ never loads a
181
- // generator, so it never touches a `.ejs` the standalone binary lacks.
182
- expect(output).not.toMatch(/Template not found/);
183
- // Nor does it collapse to the internal-bug path (the crash's other tell).
184
- expect(output).not.toMatch(/Internal error/);
185
- // It reaches a clean dispatch outcome, not an uncaught startup crash.
186
- expect(okExit).toContain(result.status);
187
- }, 30_000);
188
- }
189
- });
@@ -1,28 +0,0 @@
1
- // AUTO-GENERATED by scripts/build.ts — do not edit by hand.
2
- // Regenerate: `bun run scripts/build.ts`. Inlines the .ejs templates of the
3
- // generators that read through this manifest (`create component`) as strings, so
4
- // `pragma create component` works from the standalone --compile binary (the .ejs
5
- // files are absent from the binary's virtual filesystem).
6
- /** Directory-qualified template path → file contents. */
7
- export const TEMPLATES: Record<string, string> = {
8
- "component/lit/component.ts.ejs": "import { html, LitElement } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n<% if (withStyles) { -%>\nimport styles from \"./styles.css\";\n<% } -%>\nimport type { <%= name %>Props } from \"./types.js\";\n\nconst componentCssClassName = \"ds <%= kebabName %>\";\n\n/**\n * <%= name %> web component.\n *\n * @implements ds:global.component.<%= kebabName %>\n */\n@customElement(\"ds-<%= kebabName %>\")\nexport default class <%= name %> extends LitElement implements <%= name %>Props {\n<% if (withStyles) { -%>\n static styles = styles;\n\n<% } -%>\n render() {\n return html`\n <div class=\"${componentCssClassName}\">\n <slot></slot>\n </div>\n `;\n }\n}\n",
9
- "component/lit/index.ts.ejs": "export { default as <%= name %> } from \"./<%= name %>.js\";\nexport type { <%= name %>Props } from \"./types.js\";\n",
10
- "component/lit/stories.ts.ejs": "import type { Meta, StoryObj } from \"@storybook/web-components-vite\";\nimport { html } from \"lit\";\n\nimport \"./<%= name %>.js\";\nimport type <%= name %> from \"./<%= name %>.js\";\n\nconst meta = {\n title: \"Web Components/<%= name %>\",\n tags: [\"autodocs\"],\n} satisfies Meta<<%= name %>>;\n\nexport default meta;\ntype Story = StoryObj<<%= name %>>;\n\nexport const Default: Story = {\n render: () => html`<ds-<%= kebabName %>>Hello, <%= name %>!</ds-<%= kebabName %>>`,\n};\n",
11
- "component/lit/styles.css.ejs": "/*\n * Lit Layout Primer\n * Delete this comment block when you're done implementing.\n *\n * Styles live in a shadow DOM, isolated from the page by default.\n *\n * Two layers:\n *\n * 1) :host — the outer shell, how this component presents to its parent layout.\n * display, width, height (always apply)\n * grid-column, grid-row, align-self, justify-self (parent must be grid/flex)\n *\n * 2) .ds.<%= kebabName %> — the inner shell, how this component arranges its shadow children.\n * display: grid/flex, gap, grid-template-columns, align-items, justify-content\n *\n * Subgrid pattern — use when the parent defines grid tracks you want to inherit:\n *\n * In the parent component:\n * .ds.parent { display: grid; grid-template-columns: repeat(4, 1fr); }\n *\n * In this component:\n * :host { display: grid; grid-column: span 2; }\n * .ds.<%= kebabName %> { display: grid; grid-template-columns: subgrid; }\n *\n * In this example, the parent establishes a 4-column grid.\n * This component claims 2 of those columns and inherits their widths via subgrid.\n *\n * Keep in mind:\n * - Custom elements are display: inline by default — always set display on :host.\n * - Flex/grid rules only affect direct children of the container, not deeper descendants.\n * - External CSS cannot pierce the shadow boundary — expose CSS custom properties for theming.\n */\n\n:host {\n /*\n * Host controls the outer layout role.\n * Declare component CSS variables here when needed.\n * Variables must be on :host to be accessible inside the shadow tree.\n *\n * Example:\n * --<%= kebabName %>-color-background: var(--color-background-default);\n * --<%= kebabName %>-color-text: var(--color-text-default);\n */\n display: inline-flex;\n}\n\n.ds.<%= kebabName %> {\n /* Inner layout and visual styles go here. */\n}\n",
12
- "component/lit/tests.ts.ejs": "import { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport \"./<%= name %>.js\";\nimport type <%= name %> from \"./<%= name %>.js\";\n\ndescribe(\"<%= name %> component\", () => {\n let elem: <%= name %>;\n\n beforeEach(() => {\n elem = document.createElement(\"ds-<%= kebabName %>\") as <%= name %>;\n document.body.appendChild(elem);\n });\n\n afterEach(() => {\n elem.remove();\n });\n\n it(\"should render component\", async () => {\n await customElements.whenDefined(\"ds-<%= kebabName %>\");\n\n const container = elem.shadowRoot?.querySelector(\".ds.<%= kebabName %>\");\n expect(container).toBeTruthy();\n });\n\n it(\"should have correct tag name\", () => {\n expect(elem.tagName.toLowerCase()).toBe(\"ds-<%= kebabName %>\");\n });\n});\n",
13
- "component/lit/types.ts.ejs": "/**\n * Props for the <%= name %> component.\n */\nexport interface <%= name %>Props {\n // Define props specific to <%= name %> here\n}\n",
14
- "component/react/component.tsx.ejs": "import type React from \"react\";\nimport type { <%= name %>Props } from \"./types.js\";\n<% if (withStyles) { -%>\nimport \"./styles.css\";\n<% } -%>\n\nconst componentCssClassName = \"ds <%= kebabName %>\";\n\n/**\n * <%= name %> component\n */\nconst <%= name %> = ({\n\tclassName,\n\tchildren,\n\t...props\n}: <%= name %>Props): React.ReactElement => {\n\treturn (\n\t\t<div\n\t\t\tclassName={[componentCssClassName, className].filter(Boolean).join(\" \")}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n};\n\nexport default <%= name %>;\n",
15
- "component/react/index.ts.ejs": "export { default as <%= name %> } from \"./<%= name %>.js\";\nexport type * from \"./types.js\";\n",
16
- "component/react/ssr.test.tsx.ejs": "import { describe, expect, it } from \"vitest\";\nimport { renderToString } from \"react-dom/server\";\nimport <%= name %> from \"./<%= name %>.js\";\n\ndescribe(\"<%= name %> SSR\", () => {\n\tit(\"renders without hydration errors\", () => {\n\t\tconst html = renderToString(<<%= name %>>Test content</<%= name %>>);\n\t\texpect(html).toContain(\"Test content\");\n\t\texpect(html).toContain(\"ds <%= kebabName %>\");\n\t});\n});\n",
17
- "component/react/stories.tsx.ejs": "import type { Meta, StoryObj } from \"@storybook/react-vite\";\nimport <%= name %> from \"./<%= name %>.js\";\n\nconst meta: Meta<typeof <%= name %>> = {\n\ttitle: \"Components/<%= name %>\",\n\tcomponent: <%= name %>,\n\ttags: [\"autodocs\"],\n};\n\nexport default meta;\ntype Story = StoryObj<typeof <%= name %>>;\n\nexport const Default: Story = {\n\targs: {\n\t\tchildren: \"Hello, <%= name %>!\",\n\t},\n};\n\nexport const WithCustomClass: Story = {\n\targs: {\n\t\tchildren: \"Custom styled\",\n\t\tclassName: \"custom-class\",\n\t},\n};\n",
18
- "component/react/test.tsx.ejs": "import { describe, expect, it } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport <%= name %> from \"./<%= name %>.js\";\n\ndescribe(\"<%= name %>\", () => {\n\tit(\"renders children\", () => {\n\t\trender(<<%= name %>>Test content</<%= name %>>);\n\t\texpect(screen.getByText(\"Test content\")).toBeInTheDocument();\n\t});\n\n\tit(\"applies custom className\", () => {\n\t\trender(<<%= name %> className=\"custom-class\">Content</<%= name %>>);\n\t\tconst element = screen.getByText(\"Content\");\n\t\texpect(element.className).toContain(\"ds <%= kebabName %>\");\n\t\texpect(element.className).toContain(\"custom-class\");\n\t});\n\n\tit(\"passes through additional props\", () => {\n\t\trender(<<%= name %> data-testid=\"test-component\">Content</<%= name %>>);\n\t\texpect(screen.getByTestId(\"test-component\")).toBeInTheDocument();\n\t});\n});\n",
19
- "component/react/types.ts.ejs": "import type { HTMLAttributes, ReactNode } from \"react\";\n\nexport interface <%= name %>Props extends HTMLAttributes<HTMLDivElement> {\n\t/** Content to render inside the component */\n\tchildren?: ReactNode;\n}\n",
20
- "component/shared/styles.css.ejs": ".ds.<%= kebabName %> {\n\t/* Component styles */\n}\n",
21
- "component/svelte/component.svelte.ejs": "<script lang=\"ts\">\n\timport type { <%= name %>Props } from \"./types.js\";\n<% if (withStyles) { -%>\n\timport \"./styles.css\";\n<% } -%>\n\n\tconst componentCssClassName = \"ds <%= kebabName %>\";\n\n\tlet {\n\t\tclass: className,\n\t\tchildren,\n\t\t...rest\n\t}: <%= name %>Props = $props();\n</script>\n\n<div\n\tclass={[componentCssClassName, className]}\n\t{...rest}\n>\n\t{@render children?.()}\n</div>\n",
22
- "component/svelte/index.ts.ejs": "export { default as <%= name %> } from \"./<%= name %>.svelte\";\nexport type { <%= name %>Props } from \"./types.js\";\n",
23
- "component/svelte/ssr.test.ts.ejs": "import { render } from \"@canonical/svelte-ssr-test\";\nimport type { RenderResult } from \"@canonical/svelte-ssr-test\";\nimport { createRawSnippet } from \"svelte\";\nimport type { ComponentProps } from \"svelte\";\nimport { describe, expect, it } from \"vitest\";\nimport Component from \"./<%= name %>.svelte\";\n\ndescribe(\"<%= name %> SSR\", () => {\n\tconst baseProps = {\n\t\tchildren: createRawSnippet(() => ({\n\t\t\trender: () => `<span><%= name %></span>`,\n\t\t})),\n\t} satisfies ComponentProps<typeof Component>;\n\n\tdescribe(\"basics\", () => {\n\t\tit(\"doesn't throw\", () => {\n\t\t\texpect(() => {\n\t\t\t\trender(Component, { props: { ...baseProps } });\n\t\t\t}).not.toThrow();\n\t\t});\n\n\t\tit(\"renders\", () => {\n\t\t\tconst page = render(Component, { props: { ...baseProps } });\n\t\t\texpect(componentLocator(page)).toBeInstanceOf(page.window.HTMLDivElement);\n\t\t});\n\t});\n\n\tdescribe(\"attributes\", () => {\n\t\tit.each([\n\t\t\t[\"id\", \"test-id\"],\n\t\t\t[\"aria-label\", \"test-aria-label\"],\n\t\t])(\"applies %s\", (attribute, expected) => {\n\t\t\tconst page = render(Component, {\n\t\t\t\tprops: { ...baseProps, [attribute]: expected },\n\t\t\t});\n\t\t\texpect(componentLocator(page).getAttribute(attribute)).toBe(expected);\n\t\t});\n\n\t\tit(\"applies classes\", () => {\n\t\t\tconst page = render(Component, {\n\t\t\t\tprops: { class: \"test-class\", ...baseProps },\n\t\t\t});\n\t\t\texpect(componentLocator(page).classList).toContain(\"test-class\");\n<% if (withStyles) { _%>\n\t\t\texpect(componentLocator(page).classList).toContain(\"ds\");\n\t\t\texpect(componentLocator(page).classList).toContain(\"<%= kebabName %>\");<% } %>\n\t\t});\n\n\t\tit(\"applies style\", () => {\n\t\t\tconst page = render(Component, {\n\t\t\t\tprops: { style: \"color: orange;\", ...baseProps },\n\t\t\t});\n\t\t\texpect(componentLocator(page).style.color).toBe(\"orange\");\n\t\t});\n\t});\n});\n\n// Note: Prefer role/semantics-oriented ways of selecting elements (e.g., by role, label, etc.) not only for component roots but for all elements to enhance accessibility and maintainability.\n// To select the component's root element, use one of the available [Queries](https://testing-library.com/docs/queries/about/#priority).\nfunction componentLocator(page: RenderResult): HTMLElement {\n\t// 1. SEMANTIC ROLES (PREFERRED) - These the most closely resemble how assistive technologies interact with your component\n\t// return page.getByRole(\"link\", { name: \"Learn more\" });\n\n\t// 2. LABELS - To test the association between labels and form controls\n\t// return page.getByLabelText(\"Email address\");\n\n\t// 3. PLACEHOLDER TEXT - Useful for input fields with placeholders\n\t// return page.getByPlaceholderText(\"Enter your email\");\n\n\t// 4. TEXT CONTENT - Good for testing the presence of unique texts and selecting non-interactive elements\n\t// return page.getByText(\"<%= name %>\");\n\n\t// 5. DISPLAY VALUE - For selecting form elements by their current value\n\t// return page.getByDisplayValue(\"test value\");\n\n\t// 6. ALT TEXT - For images and visual elements\n\t// return page.getByAltText(\"Company logo\");\n\n\t// 7. TITLE ATTRIBUTE - For elements with title tooltips\n\t// return page.getByTitle(\"Close dialog\");\n\n\t// 8. TEST IDS (LAST RESORT) - When semantic options aren't available\n\t// return page.getByTestId(\"<%= kebabName %>\");\n}\n",
24
- "component/svelte/stories.svelte.ejs": "<script lang=\"ts\" module>\n\timport { defineMeta } from \"@storybook/addon-svelte-csf\";\n\timport <%= name %> from \"./<%= name %>.svelte\";\n\n\tconst { Story } = defineMeta({\n\t\ttitle: \"Components/<%= name %>\",\n\t\tcomponent: <%= name %>,\n\t\ttags: [\"autodocs\"],\n\t});\n</script>\n\n<Story name=\"Default\">\n\tHello, <%= name %>!\n</Story>\n\n<Story\n name=\"WithCustomClass\"\n args={{\n class: \"custom-class\",\n id: \"custom-id\",\n style: \"background-color: tomato;\",\n }}\n>\n\tCustom styled\n</Story>\n",
25
- "component/svelte/stories.ts.ejs": "import type { Meta, StoryObj } from \"@storybook/svelte\";\nimport <%= name %> from \"./<%= name %>.svelte\";\n\nconst meta: Meta<typeof <%= name %>> = {\n\ttitle: \"Components/<%= name %>\",\n\tcomponent: <%= name %>,\n\ttags: [\"autodocs\"],\n};\n\nexport default meta;\ntype Story = StoryObj<typeof <%= name %>>;\n\nexport const Default: Story = {};\n\nexport const WithCustomClass: Story = {\n\targs: {\n\t\tclass: \"custom-class\",\n\t},\n};\n",
26
- "component/svelte/test.ts.ejs": "import type { Locator } from \"@vitest/browser/context\";\nimport { createRawSnippet } from \"svelte\";\nimport type { ComponentProps } from \"svelte\";\nimport { describe, expect, it } from \"vitest\";\nimport { render } from \"vitest-browser-svelte\";\nimport type { RenderResult } from \"vitest-browser-svelte\";\nimport Component from \"./<%= name %>.svelte\";\n\ndescribe(\"<%= name %> component\", () => {\n\tconst baseProps = {\n\t\tchildren: createRawSnippet(() => ({\n\t\t\trender: () => `<span><%= name %></span>`,\n\t\t})),\n\t} satisfies ComponentProps<typeof Component>;\n\n\tit(\"renders\", async () => {\n\t\tconst page = render(Component, { ...baseProps });\n\t\tawait expect.element(componentLocator(page)).toBeInTheDocument();\n\t\tawait expect.element(page.getByText(\"<%= name %>\")).toBeVisible();\n\t});\n\n\tdescribe(\"attributes\", () => {\n\t\tit.each([\n\t\t\t[\"id\", \"test-id\"],\n\t\t\t[\"aria-label\", \"test-aria-label\"],\n\t\t])(\"applies %s\", async (attribute, expected) => {\n\t\t\tconst page = render(Component, { ...baseProps, [attribute]: expected });\n\t\t\tawait expect\n\t\t\t\t.element(componentLocator(page))\n\t\t\t\t.toHaveAttribute(attribute, expected);\n\t\t});\n\n\t\tit(\"applies classes\", async () => {\n\t\t\tconst page = render(Component, { ...baseProps, class: \"test-class\" });\n\t\t\tawait expect.element(componentLocator(page)).toHaveClass(\"test-class\");\n<% if (withStyles) { _%>\n\t\t\tawait expect.element(componentLocator(page)).toHaveClass(\"ds\");\n\t\t\tawait expect\n\t\t\t\t.element(componentLocator(page))\n\t\t\t\t.toHaveClass(\"<%= kebabName %>\");<% } %>\n\t\t});\n\n\t\tit(\"applies style\", async () => {\n\t\t\tconst page = render(Component, {\n\t\t\t\t...baseProps,\n\t\t\t\tstyle: \"color: orange;\",\n\t\t\t});\n\t\t\tawait expect\n\t\t\t\t.element(componentLocator(page))\n\t\t\t\t.toHaveStyle({ color: \"orange\" });\n\t\t});\n\t});\n});\n\n// Note: Prefer role/semantics-oriented ways of selecting elements (e.g., by role, label, etc.) not only for component roots but for all elements to enhance accessibility and maintainability.\n// To select the component's root element, use one of the available [Locators](https://vitest.dev/guide/browser/locators.html).\nfunction componentLocator(page: RenderResult<typeof Component>): Locator {\n\t// 1. SEMANTIC ROLES (PREFERRED) - These the most closely resemble how assistive technologies interact with your component\n\t// return page.getByRole(\"link\", { name: \"Learn more\" });\n\n\t// 2. LABELS - To test the association between labels and form controls\n\t// return page.getByLabel(\"Email address\");\n\n\t// 3. PLACEHOLDER TEXT - Useful for input fields with placeholders\n\t// return page.getByPlaceholder(\"Enter your email\");\n\n\t// 4. TEXT CONTENT - Good for testing the presence of unique texts and selecting non-interactive elements\n\t// return page.getByText(\"<%= name %>\");\n\n\t// 5. ALT TEXT - For images and visual elements\n\t// return page.getByAltText(\"Company logo\");\n\n\t// 6. TITLE ATTRIBUTE - For elements with title tooltips\n\t// return page.getByTitle(\"Close dialog\");\n\n\t// 7. TEST IDS (LAST RESORT) - When semantic options aren't available\n\t// return page.getByTestId(\"<%= kebabName %>\");\n}\n",
27
- "component/svelte/types.ts.ejs": "import type { Snippet } from \"svelte\";\nimport type { SvelteHTMLElements } from \"svelte/elements\";\n\n/*\n\tFor components that render specific HTML elements with extended prop sets,\n\tmake sure to change `\"div\"` to the appropriate HTML element type.\n*/\ntype BaseProps = SvelteHTMLElements[\"div\"];\n\nexport interface <%= name %>Props extends BaseProps {\n\t/** Content to render inside the component */\n\tchildren?: Snippet;\n\t// Define additional props specific to <%= name %> here\n}\n\n/*\n\t...or consider using appropriate interfaces directly exported from `svelte/elements`.\n\n\tFor example:\n\t- `HTMLButtonAttributes` (provides `disabled`, `type`, etc.)\n\t- `HTMLAnchorAttributes` (provides `href`, `target`, etc.)\n\t- `HTMLInputAttributes` (provides `type`, `checked`, `value`, etc.)\n\t- `HTMLFormAttributes` (provides `action`, `method`, etc.)\n\n\t```typescript\n\timport type { HTMLButtonAttributes } from \"svelte/elements\";\n\n\texport interface MyButtonProps extends HTMLButtonAttributes {\n\t\t// Your custom props here\n\t}\n\t```\n\n\tSee Svelte documentation on typing wrapper components:\n\thttps://svelte.dev/docs/svelte/typescript#Typing-wrapper-components\n*/\n",
28
- };
@@ -1,42 +0,0 @@
1
- import { BIN_NAME } from "../../../constants.js";
2
- import { readConfig } from "../../../kernel/config/readConfig.js";
3
- import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
4
- import type { CheckResult } from "../types.js";
5
-
6
- /**
7
- * Check which config layer is active for the working directory.
8
- *
9
- * Passes when a project config is found up the tree, or — the CLI is
10
- * global-first — when only the global XDG config exists. Fails only when
11
- * neither layer is configured.
12
- *
13
- * @param rt - The per-invocation runtime (for `cwd`).
14
- * @returns A CheckResult indicating the active layer, or fail with a remedy.
15
- * @note Impure — reads the config layers from disk.
16
- */
17
- export async function checkConfigFile(rt: PragmaRuntime): Promise<CheckResult> {
18
- const layers = await readConfig(rt.cwd);
19
-
20
- if (layers.project.exists) {
21
- return {
22
- name: `${BIN_NAME} config`,
23
- status: "pass",
24
- detail: `project config active (${layers.project.path})`,
25
- };
26
- }
27
-
28
- if (layers.global.exists) {
29
- return {
30
- name: `${BIN_NAME} config`,
31
- status: "pass",
32
- detail: `no project config — global config active (${layers.global.path})`,
33
- };
34
- }
35
-
36
- return {
37
- name: `${BIN_NAME} config`,
38
- status: "fail",
39
- detail: "not found",
40
- remedy: `${BIN_NAME} config set tier <path>`,
41
- };
42
- }
@@ -1,114 +0,0 @@
1
- import { existsSync } from "node:fs";
2
- import { delimiter, isAbsolute, join } from "node:path";
3
- import type { DetectedHarness } from "@canonical/harnesses";
4
- import { detectHarnesses, readMcpConfig } from "@canonical/harnesses";
5
- import { runTask } from "@canonical/task/node";
6
- import type { CheckItem, CheckResult } from "../types.js";
7
- import { deriveBand } from "./deriveBand.js";
8
-
9
- const NAME = "MCP commands";
10
-
11
- /**
12
- * Extract the stdio command from an MCP server config entry, if any. HTTP/SSE
13
- * entries (`{ type: "http", url }`) have no command and are not checked.
14
- */
15
- function commandOf(entry: unknown): string | undefined {
16
- if (typeof entry !== "object" || entry === null) return undefined;
17
- const command = (entry as { command?: unknown }).command;
18
- return typeof command === "string" && command.length > 0
19
- ? command
20
- : undefined;
21
- }
22
-
23
- /**
24
- * Resolve a command the way a shell would: a path-bearing entry is checked as a
25
- * file (relative to the project root), a bare name is searched across `PATH`.
26
- */
27
- function commandResolves(command: string, cwd: string): boolean {
28
- if (command.includes("/") || command.includes("\\")) {
29
- return existsSync(isAbsolute(command) ? command : join(cwd, command));
30
- }
31
- return (process.env.PATH ?? "")
32
- .split(delimiter)
33
- .filter((dir) => dir.length > 0)
34
- .some((dir) => existsSync(join(dir, command)));
35
- }
36
-
37
- /**
38
- * Check that every command-based MCP server entry in detected harness configs
39
- * resolves to an executable. A dead entry makes every agent session try and
40
- * fail to boot it, so it is flagged with its config path.
41
- *
42
- * @param cwd - The project root to detect harnesses against.
43
- * @returns pass (all resolve), fail (listing broken entries), or skip (nothing
44
- * to check).
45
- * @note Impure — detects harnesses, reads configs, and probes PATH/the fs.
46
- */
47
- export async function checkMcpCommands(cwd: string): Promise<CheckResult> {
48
- let detected: DetectedHarness[];
49
- try {
50
- detected = await runTask(detectHarnesses(cwd));
51
- } catch {
52
- return { name: NAME, status: "skip", detail: "harness detection failed" };
53
- }
54
-
55
- const withConfig = detected.filter((d) => d.configExists);
56
- if (withConfig.length === 0) {
57
- return { name: NAME, status: "skip", detail: "no MCP configs found" };
58
- }
59
-
60
- // Band the finding by the harnesses whose configs were actually examined, so
61
- // a global-scope harness's broken command is reported under the global band.
62
- const band = deriveBand(withConfig);
63
- const broken: CheckItem[] = [];
64
- let checked = 0;
65
-
66
- for (const d of withConfig) {
67
- let servers: Record<string, unknown>;
68
- try {
69
- servers = await runTask(readMcpConfig(d.harness, cwd));
70
- } catch {
71
- continue; // The "MCP configured" check reports on unreadable configs.
72
- }
73
-
74
- for (const [serverName, entry] of Object.entries(servers)) {
75
- const command = commandOf(entry);
76
- if (!command) continue;
77
- checked += 1;
78
- if (!commandResolves(command, cwd)) {
79
- broken.push({
80
- label: `"${serverName}"`,
81
- status: "fail",
82
- detail: `"${command}" not found · ${d.configPath}`,
83
- });
84
- }
85
- }
86
- }
87
-
88
- if (checked === 0) {
89
- return {
90
- name: NAME,
91
- status: "skip",
92
- detail: "no command-based MCP servers configured",
93
- };
94
- }
95
-
96
- if (broken.length === 0) {
97
- return {
98
- name: NAME,
99
- status: "pass",
100
- detail: `${checked} command${checked === 1 ? "" : "s"} resolve on PATH`,
101
- band,
102
- };
103
- }
104
-
105
- return {
106
- name: NAME,
107
- status: "fail",
108
- detail: `${broken.length} of ${checked} unresolvable`,
109
- items: broken,
110
- remedy:
111
- "Install the missing command or remove the entry — every agent session tries and fails to boot it.",
112
- band,
113
- };
114
- }