@canonical/pragma-cli 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (892) hide show
  1. package/README.md +153 -30
  2. package/dist/.build-ok +0 -0
  3. package/dist/package.json +83 -0
  4. package/dist/pragma.conf.js +814 -0
  5. package/dist/pragma.conf.js.map +1 -0
  6. package/dist/src/bin.js +356 -0
  7. package/dist/src/bin.js.map +1 -0
  8. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  9. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  10. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  11. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  12. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  13. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  14. package/dist/src/capabilities/capabilities/hints.js +195 -0
  15. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  16. package/dist/src/capabilities/capabilities/index.js +11 -0
  17. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/types.js +11 -0
  19. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  20. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  21. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  22. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  23. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  24. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  25. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  26. package/dist/src/capabilities/colophon/index.js +5 -0
  27. package/dist/src/capabilities/colophon/index.js.map +1 -0
  28. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  29. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  30. package/dist/src/capabilities/colophon/types.js +10 -0
  31. package/dist/src/capabilities/colophon/types.js.map +1 -0
  32. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  33. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  34. package/dist/src/capabilities/config/field.render.js +22 -0
  35. package/dist/src/capabilities/config/field.render.js.map +1 -0
  36. package/dist/src/capabilities/config/fields.js +46 -0
  37. package/dist/src/capabilities/config/fields.js.map +1 -0
  38. package/dist/src/capabilities/config/get.verb.js +61 -0
  39. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  40. package/dist/src/capabilities/config/index.js +5 -0
  41. package/dist/src/capabilities/config/index.js.map +1 -0
  42. package/dist/src/capabilities/config/runField.js +59 -0
  43. package/dist/src/capabilities/config/runField.js.map +1 -0
  44. package/dist/src/capabilities/config/runGet.js +28 -0
  45. package/dist/src/capabilities/config/runGet.js.map +1 -0
  46. package/dist/src/capabilities/config/runSet.js +53 -0
  47. package/dist/src/capabilities/config/runSet.js.map +1 -0
  48. package/dist/src/capabilities/config/set.verb.js +66 -0
  49. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/show.render.js +84 -0
  51. package/dist/src/capabilities/config/show.render.js.map +1 -0
  52. package/dist/src/capabilities/config/show.verb.js +44 -0
  53. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  54. package/dist/src/capabilities/config/types.js +5 -0
  55. package/dist/src/capabilities/config/types.js.map +1 -0
  56. package/dist/src/capabilities/config/unset.verb.js +49 -0
  57. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  58. package/dist/src/capabilities/create/cliProjection.js +195 -0
  59. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  60. package/dist/src/capabilities/create/constants.js +47 -0
  61. package/dist/src/capabilities/create/constants.js.map +1 -0
  62. package/dist/src/capabilities/create/create.render.js +100 -0
  63. package/dist/src/capabilities/create/create.render.js.map +1 -0
  64. package/dist/src/capabilities/create/create.verb.js +438 -0
  65. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  66. package/dist/src/capabilities/create/createHelp.js +47 -0
  67. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  68. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  69. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  70. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  71. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  72. package/dist/src/capabilities/create/index.js +18 -0
  73. package/dist/src/capabilities/create/index.js.map +1 -0
  74. package/dist/src/capabilities/create/messages.js +16 -0
  75. package/dist/src/capabilities/create/messages.js.map +1 -0
  76. package/dist/src/capabilities/create/mount.js +293 -0
  77. package/dist/src/capabilities/create/mount.js.map +1 -0
  78. package/dist/src/capabilities/create/pathJail.js +65 -0
  79. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  80. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  81. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  82. package/dist/src/capabilities/create/types.js +2 -0
  83. package/dist/src/capabilities/create/types.js.map +1 -0
  84. package/dist/src/capabilities/distribution.js +40 -0
  85. package/dist/src/capabilities/distribution.js.map +1 -0
  86. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  87. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  88. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  89. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  90. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
  91. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  92. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  93. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  94. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  95. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  97. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  99. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
  101. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  102. package/dist/src/capabilities/doctor/doctor.render.js +185 -0
  103. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  104. package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
  105. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  106. package/dist/src/capabilities/doctor/index.js +5 -0
  107. package/dist/src/capabilities/doctor/index.js.map +1 -0
  108. package/dist/src/capabilities/doctor/runChecks.js +83 -0
  109. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  110. package/dist/src/capabilities/doctor/types.js +5 -0
  111. package/dist/src/capabilities/doctor/types.js.map +1 -0
  112. package/dist/src/capabilities/graph/index.js +19 -0
  113. package/dist/src/capabilities/graph/index.js.map +1 -0
  114. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  115. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  116. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  117. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  118. package/dist/src/capabilities/graph/query.render.js +73 -0
  119. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  120. package/dist/src/capabilities/graph/query.verb.js +49 -0
  121. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  122. package/dist/src/capabilities/graph/runQuery.js +41 -0
  123. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  124. package/dist/src/capabilities/index.js +56 -0
  125. package/dist/src/capabilities/index.js.map +1 -0
  126. package/dist/src/capabilities/info/collectInfo.js +66 -0
  127. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  128. package/dist/src/capabilities/info/index.js +5 -0
  129. package/dist/src/capabilities/info/index.js.map +1 -0
  130. package/dist/src/capabilities/info/info.render.js +53 -0
  131. package/dist/src/capabilities/info/info.render.js.map +1 -0
  132. package/dist/src/capabilities/info/info.verb.js +42 -0
  133. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  134. package/dist/src/capabilities/info/types.js +5 -0
  135. package/dist/src/capabilities/info/types.js.map +1 -0
  136. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  137. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  138. package/dist/src/capabilities/meta/index.js +13 -0
  139. package/dist/src/capabilities/meta/index.js.map +1 -0
  140. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  141. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  142. package/dist/src/capabilities/ontology/index.js +21 -0
  143. package/dist/src/capabilities/ontology/index.js.map +1 -0
  144. package/dist/src/capabilities/ontology/queries.js +123 -0
  145. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  146. package/dist/src/capabilities/ontology/render.js +66 -0
  147. package/dist/src/capabilities/ontology/render.js.map +1 -0
  148. package/dist/src/capabilities/ontology/verbs.js +181 -0
  149. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  150. package/dist/src/capabilities/prompt/index.js +16 -0
  151. package/dist/src/capabilities/prompt/index.js.map +1 -0
  152. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  153. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  154. package/dist/src/capabilities/prompt/types.js +10 -0
  155. package/dist/src/capabilities/prompt/types.js.map +1 -0
  156. package/dist/src/capabilities/prompt/verbs.js +93 -0
  157. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  158. package/dist/src/capabilities/resources/index.js +10 -0
  159. package/dist/src/capabilities/resources/index.js.map +1 -0
  160. package/dist/src/capabilities/resources/provider.js +423 -0
  161. package/dist/src/capabilities/resources/provider.js.map +1 -0
  162. package/dist/src/capabilities/setup/buildPlan.js +168 -0
  163. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  164. package/dist/src/capabilities/setup/index.js +5 -0
  165. package/dist/src/capabilities/setup/index.js.map +1 -0
  166. package/dist/src/capabilities/setup/mode.js +53 -0
  167. package/dist/src/capabilities/setup/mode.js.map +1 -0
  168. package/dist/src/capabilities/setup/operations/index.js +39 -0
  169. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  170. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  171. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  172. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  173. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  174. package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
  175. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  176. package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
  177. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  178. package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
  179. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
  181. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  182. package/dist/src/capabilities/setup/plan.js +128 -0
  183. package/dist/src/capabilities/setup/plan.js.map +1 -0
  184. package/dist/src/capabilities/setup/plan.render.js +193 -0
  185. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  186. package/dist/src/capabilities/setup/setup.render.js +54 -0
  187. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  188. package/dist/src/capabilities/setup/setup.verb.js +334 -0
  189. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  190. package/dist/src/capabilities/setup/shell.js +196 -0
  191. package/dist/src/capabilities/setup/shell.js.map +1 -0
  192. package/dist/src/capabilities/setup/targets.js +263 -0
  193. package/dist/src/capabilities/setup/targets.js.map +1 -0
  194. package/dist/src/capabilities/setup/types.js +5 -0
  195. package/dist/src/capabilities/setup/types.js.map +1 -0
  196. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  197. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  198. package/dist/src/capabilities/shared/bands.js +16 -0
  199. package/dist/src/capabilities/shared/bands.js.map +1 -0
  200. package/dist/src/capabilities/shared/index.js +26 -0
  201. package/dist/src/capabilities/shared/index.js.map +1 -0
  202. package/dist/src/capabilities/shared/packageManager.js +103 -0
  203. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  204. package/dist/src/capabilities/shared/registry.js +55 -0
  205. package/dist/src/capabilities/shared/registry.js.map +1 -0
  206. package/dist/src/capabilities/skill/discover.js +195 -0
  207. package/dist/src/capabilities/skill/discover.js.map +1 -0
  208. package/dist/src/capabilities/skill/index.js +10 -0
  209. package/dist/src/capabilities/skill/index.js.map +1 -0
  210. package/dist/src/capabilities/skill/render.js +49 -0
  211. package/dist/src/capabilities/skill/render.js.map +1 -0
  212. package/dist/src/capabilities/skill/verbs.js +83 -0
  213. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  214. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  215. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  216. package/dist/src/capabilities/sources/index.js +13 -0
  217. package/dist/src/capabilities/sources/index.js.map +1 -0
  218. package/dist/src/capabilities/sources/installSkills.js +167 -0
  219. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  220. package/dist/src/capabilities/sources/runUpdate.js +394 -0
  221. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  222. package/dist/src/capabilities/sources/status.render.js +64 -0
  223. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  224. package/dist/src/capabilities/sources/status.verb.js +40 -0
  225. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  226. package/dist/src/capabilities/sources/types.js +6 -0
  227. package/dist/src/capabilities/sources/types.js.map +1 -0
  228. package/dist/src/capabilities/sources/update.render.js +34 -0
  229. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  230. package/dist/src/capabilities/sources/update.verb.js +55 -0
  231. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  232. package/dist/src/capabilities/upgrade/index.js +5 -0
  233. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  234. package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
  235. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  236. package/dist/src/capabilities/upgrade/types.js +5 -0
  237. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  238. package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
  239. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  240. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  241. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  242. package/dist/src/capabilities/version/index.js +10 -0
  243. package/dist/src/capabilities/version/index.js.map +1 -0
  244. package/dist/src/capabilities/version/version.verb.js +36 -0
  245. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  246. package/dist/src/constants.js +82 -0
  247. package/dist/src/constants.js.map +1 -0
  248. package/dist/src/index.js +12 -0
  249. package/dist/src/index.js.map +1 -0
  250. package/dist/src/kernel/completion/complete.js +66 -0
  251. package/dist/src/kernel/completion/complete.js.map +1 -0
  252. package/dist/src/kernel/completion/emitScripts.js +92 -0
  253. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  254. package/dist/src/kernel/completion/entitySource.js +285 -0
  255. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  256. package/dist/src/kernel/completion/index.js +14 -0
  257. package/dist/src/kernel/completion/index.js.map +1 -0
  258. package/dist/src/kernel/completion/model.js +301 -0
  259. package/dist/src/kernel/completion/model.js.map +1 -0
  260. package/dist/src/kernel/completion/parse.js +253 -0
  261. package/dist/src/kernel/completion/parse.js.map +1 -0
  262. package/dist/src/kernel/completion/rank.js +101 -0
  263. package/dist/src/kernel/completion/rank.js.map +1 -0
  264. package/dist/src/kernel/completion/resolve.js +100 -0
  265. package/dist/src/kernel/completion/resolve.js.map +1 -0
  266. package/dist/src/kernel/completion/templates/bash.js +209 -0
  267. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  268. package/dist/src/kernel/completion/templates/fish.js +214 -0
  269. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  270. package/dist/src/kernel/completion/templates/index.js +23 -0
  271. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  272. package/dist/src/kernel/completion/templates/shared.js +98 -0
  273. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  274. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  275. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  276. package/dist/src/kernel/completion/types.js +13 -0
  277. package/dist/src/kernel/completion/types.js.map +1 -0
  278. package/dist/src/kernel/config/defaults.js +17 -0
  279. package/dist/src/kernel/config/defaults.js.map +1 -0
  280. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  281. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  282. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  283. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  284. package/dist/src/kernel/config/firstRun.js +34 -0
  285. package/dist/src/kernel/config/firstRun.js.map +1 -0
  286. package/dist/src/kernel/config/globalConfig.js +79 -0
  287. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  288. package/dist/src/kernel/config/index.js +16 -0
  289. package/dist/src/kernel/config/index.js.map +1 -0
  290. package/dist/src/kernel/config/paths.js +35 -0
  291. package/dist/src/kernel/config/paths.js.map +1 -0
  292. package/dist/src/kernel/config/readConfig.js +78 -0
  293. package/dist/src/kernel/config/readConfig.js.map +1 -0
  294. package/dist/src/kernel/config/schema.js +130 -0
  295. package/dist/src/kernel/config/schema.js.map +1 -0
  296. package/dist/src/kernel/config/types.js +19 -0
  297. package/dist/src/kernel/config/types.js.map +1 -0
  298. package/dist/src/kernel/config/writeConfigField.js +59 -0
  299. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  300. package/dist/src/kernel/copy.js +43 -0
  301. package/dist/src/kernel/copy.js.map +1 -0
  302. package/dist/src/kernel/error/PragmaError.js +149 -0
  303. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  304. package/dist/src/kernel/error/constants.js +40 -0
  305. package/dist/src/kernel/error/constants.js.map +1 -0
  306. package/dist/src/kernel/error/fromTaskError.js +96 -0
  307. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  308. package/dist/src/kernel/error/index.js +13 -0
  309. package/dist/src/kernel/error/index.js.map +1 -0
  310. package/dist/src/kernel/error/recovery.js +52 -0
  311. package/dist/src/kernel/error/recovery.js.map +1 -0
  312. package/dist/src/kernel/error/renderError.js +115 -0
  313. package/dist/src/kernel/error/renderError.js.map +1 -0
  314. package/dist/src/kernel/error/serialize.js +25 -0
  315. package/dist/src/kernel/error/serialize.js.map +1 -0
  316. package/dist/src/kernel/error/types.js +9 -0
  317. package/dist/src/kernel/error/types.js.map +1 -0
  318. package/dist/src/kernel/index.js +25 -0
  319. package/dist/src/kernel/index.js.map +1 -0
  320. package/dist/src/kernel/packs/collect.js +187 -0
  321. package/dist/src/kernel/packs/collect.js.map +1 -0
  322. package/dist/src/kernel/packs/compile.js +304 -0
  323. package/dist/src/kernel/packs/compile.js.map +1 -0
  324. package/dist/src/kernel/packs/disclosure.js +76 -0
  325. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  326. package/dist/src/kernel/packs/glob.js +38 -0
  327. package/dist/src/kernel/packs/glob.js.map +1 -0
  328. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  329. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  330. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  331. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  332. package/dist/src/kernel/packs/graphql/index.js +20 -0
  333. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  334. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  335. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  336. package/dist/src/kernel/packs/index.js +34 -0
  337. package/dist/src/kernel/packs/index.js.map +1 -0
  338. package/dist/src/kernel/packs/iri.js +110 -0
  339. package/dist/src/kernel/packs/iri.js.map +1 -0
  340. package/dist/src/kernel/packs/renderPack.js +129 -0
  341. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  342. package/dist/src/kernel/packs/resolveEntity.js +223 -0
  343. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  344. package/dist/src/kernel/packs/runBodies.js +87 -0
  345. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  346. package/dist/src/kernel/packs/sample.js +56 -0
  347. package/dist/src/kernel/packs/sample.js.map +1 -0
  348. package/dist/src/kernel/packs/schema.js +369 -0
  349. package/dist/src/kernel/packs/schema.js.map +1 -0
  350. package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
  351. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  352. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  353. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  354. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
  355. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  356. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  357. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  358. package/dist/src/kernel/packs/sparql/index.js +31 -0
  359. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  360. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  361. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  362. package/dist/src/kernel/packs/types.js +30 -0
  363. package/dist/src/kernel/packs/types.js.map +1 -0
  364. package/dist/src/kernel/packs/uniqueness.js +30 -0
  365. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  366. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  367. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  368. package/dist/src/kernel/project/cli/constants.js +27 -0
  369. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  370. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  371. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  372. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  373. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  374. package/dist/src/kernel/project/cli/globalFlags.js +216 -0
  375. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  376. package/dist/src/kernel/project/cli/helpFormat.js +59 -0
  377. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  378. package/dist/src/kernel/project/cli/index.js +14 -0
  379. package/dist/src/kernel/project/cli/index.js.map +1 -0
  380. package/dist/src/kernel/project/cli/rootHelp.js +197 -0
  381. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  382. package/dist/src/kernel/project/cli/suggest.js +75 -0
  383. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  384. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  385. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  386. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  387. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  388. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  389. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  390. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  391. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  392. package/dist/src/kernel/project/mcp/index.js +8 -0
  393. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  394. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  395. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  396. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  397. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  398. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  399. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  401. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  403. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
  405. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/serve.js +35 -0
  407. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  408. package/dist/src/kernel/render/compactUri.js +24 -0
  409. package/dist/src/kernel/render/compactUri.js.map +1 -0
  410. package/dist/src/kernel/render/contracts.js +10 -0
  411. package/dist/src/kernel/render/contracts.js.map +1 -0
  412. package/dist/src/kernel/render/disclosure.js +34 -0
  413. package/dist/src/kernel/render/disclosure.js.map +1 -0
  414. package/dist/src/kernel/render/envelope.js +30 -0
  415. package/dist/src/kernel/render/envelope.js.map +1 -0
  416. package/dist/src/kernel/render/formatters.js +27 -0
  417. package/dist/src/kernel/render/formatters.js.map +1 -0
  418. package/dist/src/kernel/render/index.js +15 -0
  419. package/dist/src/kernel/render/index.js.map +1 -0
  420. package/dist/src/kernel/render/prefixes.js +46 -0
  421. package/dist/src/kernel/render/prefixes.js.map +1 -0
  422. package/dist/src/kernel/render/renderers.js +468 -0
  423. package/dist/src/kernel/render/renderers.js.map +1 -0
  424. package/dist/src/kernel/render/style.js +85 -0
  425. package/dist/src/kernel/render/style.js.map +1 -0
  426. package/dist/src/kernel/render/turtle.js +194 -0
  427. package/dist/src/kernel/render/turtle.js.map +1 -0
  428. package/dist/src/kernel/render/writeStdout.js +43 -0
  429. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  430. package/dist/src/kernel/runtime/boot.js +49 -0
  431. package/dist/src/kernel/runtime/boot.js.map +1 -0
  432. package/dist/src/kernel/runtime/facade.js +39 -0
  433. package/dist/src/kernel/runtime/facade.js.map +1 -0
  434. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  435. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  436. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  437. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  438. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  439. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  440. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  441. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  442. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  443. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  444. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  445. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  446. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  447. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  449. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  451. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  453. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  455. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  457. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  459. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  460. package/dist/src/kernel/runtime/index.js +8 -0
  461. package/dist/src/kernel/runtime/index.js.map +1 -0
  462. package/dist/src/kernel/runtime/loadSession.js +34 -0
  463. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  464. package/dist/src/kernel/runtime/paths.js +78 -0
  465. package/dist/src/kernel/runtime/paths.js.map +1 -0
  466. package/dist/src/kernel/runtime/probe.js +37 -0
  467. package/dist/src/kernel/runtime/probe.js.map +1 -0
  468. package/dist/src/kernel/runtime/readEntity.js +363 -0
  469. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  470. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  471. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  472. package/dist/src/kernel/runtime/refs/index.js +29 -0
  473. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  474. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  475. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  476. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  477. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  478. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  479. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  480. package/dist/src/kernel/runtime/store.js +75 -0
  481. package/dist/src/kernel/runtime/store.js.map +1 -0
  482. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  483. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  484. package/dist/src/kernel/runtime/types.js +11 -0
  485. package/dist/src/kernel/runtime/types.js.map +1 -0
  486. package/dist/src/kernel/spec/asVerb.js +21 -0
  487. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  488. package/dist/src/kernel/spec/emitReference.js +578 -0
  489. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  490. package/dist/src/kernel/spec/emitSurface.js +202 -0
  491. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  492. package/dist/src/kernel/spec/index.js +11 -0
  493. package/dist/src/kernel/spec/index.js.map +1 -0
  494. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  495. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  496. package/dist/src/kernel/spec/types.js +14 -0
  497. package/dist/src/kernel/spec/types.js.map +1 -0
  498. package/dist/src/kernel/spec/validate.js +110 -0
  499. package/dist/src/kernel/spec/validate.js.map +1 -0
  500. package/dist/src/kernel/vocabulary.js +97 -0
  501. package/dist/src/kernel/vocabulary.js.map +1 -0
  502. package/dist/src/types.js +11 -0
  503. package/dist/src/types.js.map +1 -0
  504. package/package.json +25 -24
  505. package/pragma.conf.ts +853 -0
  506. package/src/bin.ts +276 -82
  507. package/src/capabilities/block.parity.test.ts +253 -0
  508. package/src/capabilities/capabilities/capabilities.render.ts +4 -3
  509. package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
  510. package/src/capabilities/capabilities/catalog.ts +20 -12
  511. package/src/capabilities/capabilities/hints.ts +43 -24
  512. package/src/capabilities/capabilities/index.ts +1 -1
  513. package/src/capabilities/colophon/collectColophon.ts +50 -24
  514. package/src/capabilities/colophon/colophon.render.ts +25 -1
  515. package/src/capabilities/colophon/colophon.test.ts +42 -21
  516. package/src/capabilities/colophon/colophon.verb.ts +9 -5
  517. package/src/capabilities/colophon/types.ts +16 -7
  518. package/src/capabilities/config/collectConfigShow.test.ts +58 -0
  519. package/src/capabilities/config/collectConfigShow.ts +43 -6
  520. package/src/capabilities/config/field.render.ts +4 -5
  521. package/src/capabilities/config/fields.ts +17 -37
  522. package/src/capabilities/config/get.verb.ts +70 -0
  523. package/src/capabilities/config/getUnset.test.ts +264 -0
  524. package/src/capabilities/config/index.ts +5 -1
  525. package/src/capabilities/config/runField.ts +40 -22
  526. package/src/capabilities/config/runGet.ts +34 -0
  527. package/src/capabilities/config/runSet.ts +35 -9
  528. package/src/capabilities/config/set.test.ts +48 -14
  529. package/src/capabilities/config/set.verb.ts +14 -9
  530. package/src/capabilities/config/show.render.test.ts +77 -5
  531. package/src/capabilities/config/show.render.ts +8 -13
  532. package/src/capabilities/config/show.verb.ts +13 -9
  533. package/src/capabilities/config/types.ts +26 -4
  534. package/src/capabilities/config/unset.verb.ts +58 -0
  535. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  536. package/src/capabilities/create/byteEquality.test.ts +95 -103
  537. package/src/capabilities/create/cliProjection.ts +227 -0
  538. package/src/capabilities/create/constants.ts +50 -0
  539. package/src/capabilities/create/create.mcp.test.ts +91 -7
  540. package/src/capabilities/create/create.render.ts +71 -7
  541. package/src/capabilities/create/create.test.ts +523 -162
  542. package/src/capabilities/create/create.verb.ts +361 -321
  543. package/src/capabilities/create/createGrammar.test.ts +865 -0
  544. package/src/capabilities/create/createHelp.ts +71 -0
  545. package/src/capabilities/create/createSurface.generated.ts +400 -0
  546. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  547. package/src/capabilities/create/cwdJail.test.ts +24 -5
  548. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  549. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  550. package/src/capabilities/create/index.ts +9 -14
  551. package/src/capabilities/create/messages.ts +18 -0
  552. package/src/capabilities/create/mount.ts +391 -0
  553. package/src/capabilities/create/pathJail.test.ts +90 -0
  554. package/src/capabilities/create/pathJail.ts +8 -5
  555. package/src/capabilities/create/pickGenerator.ts +40 -46
  556. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  557. package/src/capabilities/create/types.ts +29 -5
  558. package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
  559. package/src/capabilities/distribution.test.ts +122 -0
  560. package/src/capabilities/distribution.ts +54 -0
  561. package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
  562. package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
  563. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
  564. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
  565. package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
  566. package/src/capabilities/doctor/checks/index.ts +27 -0
  567. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  568. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  569. package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
  570. package/src/capabilities/doctor/doctor.render.test.ts +24 -13
  571. package/src/capabilities/doctor/doctor.render.ts +45 -20
  572. package/src/capabilities/doctor/doctor.test.ts +158 -40
  573. package/src/capabilities/doctor/doctor.verb.ts +9 -5
  574. package/src/capabilities/doctor/runChecks.ts +65 -66
  575. package/src/capabilities/doctor/types.ts +21 -5
  576. package/src/capabilities/emptyRecovery.test.ts +44 -22
  577. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  578. package/src/capabilities/graph/index.ts +1 -1
  579. package/src/capabilities/graph/inspect.render.ts +70 -22
  580. package/src/capabilities/graph/inspect.test.ts +260 -5
  581. package/src/capabilities/graph/inspect.verb.ts +18 -5
  582. package/src/capabilities/graph/query.render.ts +15 -3
  583. package/src/capabilities/graph/query.verb.ts +5 -4
  584. package/src/capabilities/graph/runQuery.ts +9 -7
  585. package/src/capabilities/index.ts +25 -19
  586. package/src/capabilities/info/collectInfo.ts +15 -10
  587. package/src/capabilities/info/info.render.ts +4 -3
  588. package/src/capabilities/info/info.verb.ts +4 -3
  589. package/src/capabilities/lazy.test.ts +125 -2
  590. package/src/capabilities/meta/complete.verb.ts +1 -1
  591. package/src/capabilities/meta/index.ts +1 -1
  592. package/src/capabilities/meta/mcp.verb.ts +10 -8
  593. package/src/capabilities/ontology/index.ts +15 -11
  594. package/src/capabilities/ontology/ontology.test.ts +6 -55
  595. package/src/capabilities/ontology/queries.ts +2 -2
  596. package/src/capabilities/ontology/render.ts +3 -4
  597. package/src/capabilities/ontology/verbs.ts +42 -83
  598. package/src/capabilities/prompt/index.ts +2 -2
  599. package/src/capabilities/prompt/prompt.render.ts +6 -2
  600. package/src/capabilities/prompt/prompt.test.ts +12 -6
  601. package/src/capabilities/prompt/types.ts +1 -1
  602. package/src/capabilities/prompt/verbs.ts +26 -14
  603. package/src/capabilities/reference.test.ts +63 -0
  604. package/src/capabilities/resources/provider.ts +367 -91
  605. package/src/capabilities/resources/resources.test.ts +411 -59
  606. package/src/capabilities/setup/buildPlan.ts +236 -0
  607. package/src/capabilities/setup/index.ts +7 -7
  608. package/src/capabilities/setup/mode.ts +74 -0
  609. package/src/capabilities/setup/operations/index.ts +74 -0
  610. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  611. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  612. package/src/capabilities/setup/operations/setupGenerator.ts +397 -320
  613. package/src/capabilities/setup/operations/setupLsp.ts +329 -68
  614. package/src/capabilities/setup/operations/setupMcp.ts +137 -97
  615. package/src/capabilities/setup/operations/setupSkills.ts +336 -108
  616. package/src/capabilities/setup/plan.render.ts +241 -0
  617. package/src/capabilities/setup/plan.ts +236 -0
  618. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  619. package/src/capabilities/setup/setup.render.test.ts +281 -73
  620. package/src/capabilities/setup/setup.render.ts +45 -77
  621. package/src/capabilities/setup/setup.test.ts +972 -209
  622. package/src/capabilities/setup/setup.verb.ts +233 -74
  623. package/src/capabilities/setup/shell.test.ts +86 -0
  624. package/src/capabilities/setup/shell.ts +166 -14
  625. package/src/capabilities/setup/targets.ts +367 -0
  626. package/src/capabilities/setup/types.ts +18 -57
  627. package/src/capabilities/shared/assertExecOk.ts +68 -10
  628. package/src/capabilities/shared/index.ts +32 -0
  629. package/src/capabilities/shared/packageManager.test.ts +55 -0
  630. package/src/capabilities/shared/packageManager.ts +62 -6
  631. package/src/capabilities/skill/discover.ts +47 -9
  632. package/src/capabilities/skill/index.ts +1 -1
  633. package/src/capabilities/skill/render.ts +14 -14
  634. package/src/capabilities/skill/skill.test.ts +7 -5
  635. package/src/capabilities/skill/verbs.ts +9 -10
  636. package/src/capabilities/sources/collectStatus.ts +61 -51
  637. package/src/capabilities/sources/index.ts +2 -2
  638. package/src/capabilities/sources/installSkills.ts +86 -9
  639. package/src/capabilities/sources/runUpdate.ts +164 -141
  640. package/src/capabilities/sources/sources.test.ts +265 -119
  641. package/src/capabilities/sources/status.render.test.ts +53 -24
  642. package/src/capabilities/sources/status.render.ts +25 -30
  643. package/src/capabilities/sources/status.verb.ts +16 -9
  644. package/src/capabilities/sources/types.ts +18 -25
  645. package/src/capabilities/sources/update.render.ts +10 -3
  646. package/src/capabilities/sources/update.verb.ts +13 -24
  647. package/src/capabilities/surface.test.ts +165 -25
  648. package/src/capabilities/tier.parity.test.ts +144 -0
  649. package/src/capabilities/upgrade/runUpgrade.ts +8 -8
  650. package/src/capabilities/upgrade/upgrade.render.ts +4 -5
  651. package/src/capabilities/upgrade/upgrade.test.ts +3 -3
  652. package/src/capabilities/upgrade/upgrade.verb.ts +8 -4
  653. package/src/capabilities/version/index.ts +12 -0
  654. package/src/capabilities/version/version.test.ts +66 -0
  655. package/src/capabilities/version/version.verb.ts +39 -0
  656. package/src/constants.test.ts +8 -6
  657. package/src/constants.ts +78 -22
  658. package/src/identity.test.ts +348 -0
  659. package/src/index.ts +2 -2
  660. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
  661. package/src/kernel/completion/complete.test.ts +12 -2
  662. package/src/kernel/completion/complete.ts +1 -1
  663. package/src/kernel/completion/emitScripts.test.ts +1 -1
  664. package/src/kernel/completion/emitScripts.ts +5 -3
  665. package/src/kernel/completion/entitySource.test.ts +185 -41
  666. package/src/kernel/completion/entitySource.ts +133 -110
  667. package/src/kernel/completion/model.test.ts +165 -13
  668. package/src/kernel/completion/model.ts +105 -14
  669. package/src/kernel/completion/parse.test.ts +4 -7
  670. package/src/kernel/completion/parse.ts +15 -0
  671. package/src/kernel/completion/resolve.test.ts +0 -1
  672. package/src/kernel/completion/safety.test.ts +104 -50
  673. package/src/kernel/completion/shellDrive.test.ts +611 -0
  674. package/src/kernel/completion/templates/bash.ts +7 -2
  675. package/src/kernel/completion/templates/fish.ts +28 -6
  676. package/src/kernel/completion/templates/index.ts +23 -0
  677. package/src/kernel/completion/types.ts +10 -3
  678. package/src/kernel/config/defaults.test.ts +108 -0
  679. package/src/kernel/config/defaults.ts +13 -23
  680. package/src/kernel/config/evaluateProjectConfig.ts +33 -11
  681. package/src/kernel/config/findProjectConfig.ts +4 -3
  682. package/src/kernel/config/firstRun.test.ts +44 -38
  683. package/src/kernel/config/firstRun.ts +24 -81
  684. package/src/kernel/config/globalConfig.ts +2 -2
  685. package/src/kernel/config/index.ts +5 -6
  686. package/src/kernel/config/paths.ts +17 -17
  687. package/src/kernel/config/readConfig.test.ts +246 -7
  688. package/src/kernel/config/readConfig.ts +8 -8
  689. package/src/kernel/config/schema.test.ts +50 -0
  690. package/src/kernel/config/schema.ts +100 -11
  691. package/src/kernel/config/types.ts +75 -19
  692. package/src/kernel/copy.test.ts +483 -0
  693. package/src/kernel/copy.ts +54 -0
  694. package/src/kernel/error/PragmaError.test.ts +6 -3
  695. package/src/kernel/error/PragmaError.ts +4 -2
  696. package/src/kernel/error/constants.ts +7 -4
  697. package/src/kernel/error/fromTaskError.ts +28 -6
  698. package/src/kernel/error/index.ts +1 -1
  699. package/src/kernel/error/recovery.test.ts +22 -45
  700. package/src/kernel/error/recovery.ts +36 -27
  701. package/src/kernel/error/renderError.ts +42 -1
  702. package/src/kernel/error/types.ts +25 -4
  703. package/src/kernel/index.ts +26 -0
  704. package/src/kernel/packs/collect.test.ts +195 -11
  705. package/src/kernel/packs/collect.ts +212 -61
  706. package/src/kernel/packs/compile.test.ts +293 -8
  707. package/src/kernel/packs/compile.ts +108 -15
  708. package/src/kernel/packs/disclosure.test.ts +5 -2
  709. package/src/kernel/packs/disclosure.ts +2 -2
  710. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  711. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
  712. package/src/kernel/packs/graphql/index.ts +20 -0
  713. package/src/kernel/packs/graphqlSource.test.ts +6 -3
  714. package/src/kernel/packs/index.ts +40 -0
  715. package/src/kernel/packs/iri.test.ts +73 -0
  716. package/src/kernel/packs/iri.ts +70 -20
  717. package/src/kernel/packs/renderPack.ts +28 -7
  718. package/src/kernel/packs/resolveEntity.test.ts +213 -0
  719. package/src/kernel/packs/resolveEntity.ts +132 -34
  720. package/src/kernel/packs/runBodies.ts +16 -16
  721. package/src/kernel/packs/sample.ts +1 -1
  722. package/src/kernel/packs/schema.ts +114 -11
  723. package/src/kernel/packs/sparql/applyFilters.ts +16 -17
  724. package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
  725. package/src/kernel/packs/sparql/index.ts +37 -0
  726. package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
  727. package/src/kernel/packs/sparql/runSelect.ts +75 -37
  728. package/src/kernel/packs/toolDescription.test.ts +52 -5
  729. package/src/kernel/packs/types.ts +52 -4
  730. package/src/kernel/packs/uniqueness.ts +5 -5
  731. package/src/kernel/project/cli/buildProgram.test.ts +157 -17
  732. package/src/kernel/project/cli/buildProgram.ts +77 -18
  733. package/src/kernel/project/cli/constants.ts +34 -0
  734. package/src/kernel/project/cli/dispatch.test.ts +227 -3
  735. package/src/kernel/project/cli/dispatch.ts +250 -48
  736. package/src/kernel/project/cli/exitCodes.ts +1 -1
  737. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  738. package/src/kernel/project/cli/globalFlags.ts +130 -30
  739. package/src/kernel/project/cli/helpFormat.ts +14 -1
  740. package/src/kernel/project/cli/rootHelp.ts +140 -111
  741. package/src/kernel/project/cli/suggest.test.ts +33 -1
  742. package/src/kernel/project/cli/suggest.ts +25 -1
  743. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  744. package/src/kernel/project/cli/verbHelp.ts +23 -7
  745. package/src/kernel/project/mcp/buildServer.ts +18 -10
  746. package/src/kernel/project/mcp/envelope.ts +2 -2
  747. package/src/kernel/project/mcp/instructions.ts +12 -7
  748. package/src/kernel/project/mcp/mcpError.ts +1 -1
  749. package/src/kernel/project/mcp/parity.test.ts +42 -1
  750. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  751. package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
  752. package/src/kernel/project/mcp/prompts/provider.ts +22 -8
  753. package/src/kernel/project/mcp/prompts/source.ts +69 -68
  754. package/src/kernel/project/mcp/registerVerb.ts +56 -11
  755. package/src/kernel/project/mcp/serve.ts +13 -5
  756. package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
  757. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  758. package/src/kernel/render/contracts.ts +21 -0
  759. package/src/kernel/render/disclosure.ts +4 -2
  760. package/src/kernel/render/envelope.ts +2 -3
  761. package/src/kernel/render/formatters.ts +1 -1
  762. package/src/kernel/render/prefixes.test.ts +36 -0
  763. package/src/kernel/render/prefixes.ts +40 -13
  764. package/src/kernel/render/renderers.test.ts +244 -7
  765. package/src/kernel/render/renderers.ts +222 -20
  766. package/src/kernel/render/style.test.ts +75 -24
  767. package/src/kernel/render/style.ts +31 -1
  768. package/src/kernel/render/turtle.ts +222 -0
  769. package/src/kernel/runtime/graphpack/build.ts +29 -3
  770. package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
  771. package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
  772. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
  773. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
  775. package/src/kernel/runtime/graphpack/embedded.ts +39 -13
  776. package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
  777. package/src/kernel/runtime/graphpack/hash.ts +3 -2
  778. package/src/kernel/runtime/graphpack/index.ts +1 -1
  779. package/src/kernel/runtime/graphpack/manifest.ts +114 -12
  780. package/src/kernel/runtime/graphpack/read.ts +5 -11
  781. package/src/kernel/runtime/graphpack/schemas.ts +74 -0
  782. package/src/kernel/runtime/graphpack/stories.ts +84 -0
  783. package/src/kernel/runtime/graphpack/types.ts +61 -48
  784. package/src/kernel/runtime/loadSession.ts +1 -1
  785. package/src/kernel/runtime/paths.ts +64 -15
  786. package/src/kernel/runtime/probe.test.ts +8 -4
  787. package/src/kernel/runtime/probe.ts +6 -6
  788. package/src/kernel/runtime/readEntity.ts +477 -32
  789. package/src/kernel/runtime/refs/gitOps.ts +1 -19
  790. package/src/kernel/runtime/refs/index.ts +39 -0
  791. package/src/kernel/runtime/refs/parseRef.ts +8 -8
  792. package/src/kernel/runtime/refs/resolve.ts +82 -66
  793. package/src/kernel/runtime/resolveSources.test.ts +63 -24
  794. package/src/kernel/runtime/resolveSources.ts +36 -25
  795. package/src/kernel/runtime/storeReadiness.ts +10 -10
  796. package/src/kernel/runtime/storeless.test.ts +1 -1
  797. package/src/kernel/runtime/types.ts +15 -1
  798. package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
  799. package/src/kernel/spec/emitReference.test.ts +3 -3
  800. package/src/kernel/spec/emitReference.ts +242 -34
  801. package/src/kernel/spec/emitSurface.ts +57 -11
  802. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  803. package/src/kernel/spec/surfaceConformance.ts +8 -0
  804. package/src/kernel/spec/types.ts +277 -13
  805. package/src/kernel/spec/validate.ts +2 -1
  806. package/src/kernel/vocabulary.test.ts +164 -0
  807. package/src/kernel/vocabulary.ts +146 -0
  808. package/src/testing/PARITY_GAPS.ts +8 -2
  809. package/src/testing/behavioral/README.md +3 -3
  810. package/src/testing/behavioral/completion.test.ts +19 -6
  811. package/src/testing/behavioral/docExamples.test.ts +14 -0
  812. package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
  813. package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
  814. package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
  815. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  816. package/src/testing/behavioral/harness.foundation.test.ts +14 -5
  817. package/src/testing/behavioral/journeys.cli.test.ts +117 -76
  818. package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
  819. package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
  820. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  821. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  822. package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +9 -6
  823. package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
  824. package/src/testing/behavioral/liveReadSurface.ts +4 -3
  825. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  826. package/src/testing/behavioral/mcpSurface.test.ts +10 -5
  827. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  828. package/src/testing/behavioral/staleCommands.test.ts +10 -0
  829. package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
  830. package/src/testing/eval/cases/assembly.ts +13 -6
  831. package/src/testing/eval/cases/effectful.ts +28 -15
  832. package/src/testing/eval/cases/readNouns.ts +22 -20
  833. package/src/testing/eval/cases/stable.ts +5 -1
  834. package/src/testing/eval/eval.test.ts +7 -1
  835. package/src/testing/fixtures/blockGraph.ts +79 -0
  836. package/src/testing/fixtures/fixtureCapability.ts +45 -1
  837. package/src/testing/fixtures/graph/canonical.ts +94 -5
  838. package/src/testing/fixtures/graph/defaultPack.ts +7 -6
  839. package/src/testing/fixtures/graph/owlExport.ts +7 -5
  840. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  841. package/src/testing/helpers/fixtureGraph.ts +33 -16
  842. package/src/testing/helpers/packRuntime.ts +2 -3
  843. package/src/testing/helpers/projectCli.ts +2 -1
  844. package/src/testing/helpers/projectMcp.ts +38 -6
  845. package/src/testing/helpers/runCli.ts +35 -18
  846. package/src/testing/perf/budgets.test.ts +24 -9
  847. package/src/testing/perf/budgets.ts +76 -12
  848. package/src/testing/perf/codegen.test.ts +126 -0
  849. package/src/testing/perf/globalSetup.test.ts +286 -0
  850. package/src/testing/perf/globalSetup.ts +611 -14
  851. package/src/testing/perf/measure.test.ts +38 -0
  852. package/src/testing/perf/measure.ts +23 -4
  853. package/src/testing/setupXdgIsolation.ts +81 -21
  854. package/src/testing/tempRoot.globalSetup.ts +122 -0
  855. package/src/types.ts +2 -2
  856. package/dist/pragma +0 -0
  857. package/src/capabilities/block/blockList.test.ts +0 -79
  858. package/src/capabilities/block/blockList.verb.ts +0 -163
  859. package/src/capabilities/block/index.ts +0 -25
  860. package/src/capabilities/block/pack.ts +0 -166
  861. package/src/capabilities/block/parity.test.ts +0 -187
  862. package/src/capabilities/block/tierChain.ts +0 -78
  863. package/src/capabilities/colophon/pragmaColophon.ts +0 -66
  864. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
  865. package/src/capabilities/create/templates.embedded.generated.ts +0 -53
  866. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
  867. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  868. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
  869. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
  870. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  871. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  872. package/src/capabilities/modifier/index.ts +0 -15
  873. package/src/capabilities/modifier/pack.ts +0 -64
  874. package/src/capabilities/standard/index.ts +0 -18
  875. package/src/capabilities/standard/pack.ts +0 -128
  876. package/src/capabilities/tier/index.ts +0 -19
  877. package/src/capabilities/tier/lookup.render.test.ts +0 -72
  878. package/src/capabilities/tier/lookup.render.ts +0 -59
  879. package/src/capabilities/tier/lookup.test.ts +0 -83
  880. package/src/capabilities/tier/lookup.verb.ts +0 -44
  881. package/src/capabilities/tier/pack.ts +0 -28
  882. package/src/capabilities/tier/runLookup.ts +0 -87
  883. package/src/capabilities/token/addConfig.render.ts +0 -27
  884. package/src/capabilities/token/addConfig.test.ts +0 -62
  885. package/src/capabilities/token/addConfig.verb.ts +0 -40
  886. package/src/capabilities/token/index.ts +0 -19
  887. package/src/capabilities/token/pack.ts +0 -58
  888. package/src/capabilities/token/runAddConfig.ts +0 -95
  889. package/src/kernel/completion/bashDrive.test.ts +0 -73
  890. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
  891. package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
  892. package/src/kernel/runtime/lock.ts +0 -90
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Test helper: boot a store-backed {@link PragmaRuntime} at a REAL `cwd` whose
3
- * `pragma.lock.json` points at a built fixture pack.
3
+ * active-pack pointer names a built fixture pack.
4
4
  *
5
5
  * This is distinct from (and complements) `packRuntime.ts#buildFixtureRuntime`:
6
6
  * that helper hands back an in-process runtime wired to a custom `LazyStore`,
@@ -8,14 +8,18 @@
8
8
  * generalizes the `runtimeFor` + `buildUpdateTask` pattern proven in
9
9
  * `capabilities/sources/sources.test.ts`: it writes an actual
10
10
  * `pragma.config.ts` + package directory, runs the REAL `sources update` Task
11
- * (resolve → build → lock), and returns a `cwd`. Because the lock is a real
12
- * file, EVERY independent runtime construction that resolves config from that
11
+ * (resolve → build → point), and returns a `cwd`. Because the pointer is a
12
+ * real file, EVERY independent runtime construction that resolves config from that
13
13
  * `cwd` — `bootRuntime(flags, cwd)` (CLI dispatch), `projectMcp(modules, cwd)`
14
14
  * (MCP), and `runCli(args, { cwd })` (spawn) — boots the SAME cached pack. That
15
15
  * is the property PR4's cross-surface parity tests need and PR3's single-surface
16
16
  * parity tests did not: proof that CLI-json and MCP-json agree over a graph
17
17
  * built the same way `sources update` builds one for a real project.
18
18
  *
19
+ * A fixture package may also ship `stories/*.json` (the `stories` option), which
20
+ * `sources update` carries into the built pack — that is the package tier a
21
+ * third-party noun arrives through.
22
+ *
19
23
  * Hermetic: the pack cache lives under the isolated `$XDG_CACHE_HOME`
20
24
  * `setupXdgIsolation` installs; `dispose()` removes the temp directories (the
21
25
  * shared content-addressed pack cache itself is left for reuse/cleanup by the
@@ -30,7 +34,7 @@ import { buildUpdateTask } from "../../capabilities/sources/runUpdate.js";
30
34
  import { VERSION } from "../../constants.js";
31
35
  import type {
32
36
  ConfigLayers,
33
- PackageEntry,
37
+ PackDeclaration,
34
38
  PragmaConfig,
35
39
  } from "../../kernel/config/types.js";
36
40
  import { bootRuntime } from "../../kernel/runtime/boot.js";
@@ -52,34 +56,39 @@ export interface FixtureGraphOptions {
52
56
  readonly ttl: string;
53
57
  /**
54
58
  * Config fields to bake into the written `pragma.config.ts`, e.g.
55
- * `{ tier: "apps/lxd", channel: "prerelease" }`. `packages` is always set by
59
+ * `{ tier: "apps/lxd", channel: "prerelease" }`. `packs` is always set by
56
60
  * this helper (to the fixture package) — do not override it here.
57
61
  */
58
- readonly config?: Omit<Partial<PragmaConfig>, "packages">;
62
+ readonly config?: Omit<Partial<PragmaConfig>, "packs">;
63
+ /**
64
+ * `stories/*.json` the fixture PACKAGE ships, as raw text keyed by file name
65
+ * — deliberately raw, so a test can ship malformed or schema-invalid content
66
+ * and assert that it is dropped rather than fatal.
67
+ */
68
+ readonly stories?: Readonly<Record<string, string>>;
59
69
  }
60
70
 
61
71
  /** A booted fixture runtime plus its `cwd` (usable by any surface) and disposal. */
62
72
  export interface FixtureGraph {
63
73
  /** A REAL `bootRuntime` at {@link cwd} — the same one CLI dispatch uses. */
64
74
  readonly runtime: PragmaRuntime;
65
- /** The project directory whose `pragma.lock.json`/`pragma.config.ts` were written. */
75
+ /** The project directory whose `pragma.config.ts` + active-pack pointer were written. */
66
76
  readonly cwd: string;
67
77
  /** Remove the temp directories and dispose the store session, if booted. */
68
78
  dispose(): Promise<void>;
69
79
  }
70
80
 
71
81
  /** A synthetic runtime with an IN-MEMORY config — used only to drive the build Task. */
72
- function builderRuntime(cwd: string, packages: PackageEntry[]): PragmaRuntime {
82
+ function builderRuntime(cwd: string, packs: PackDeclaration[]): PragmaRuntime {
73
83
  const layers: ConfigLayers = {
74
- config: { channel: "normal", packages },
84
+ config: { channel: "normal", packs },
75
85
  origins: {
76
86
  tier: "default",
77
87
  channel: "default",
78
88
  detail: "default",
79
- packages: "project",
89
+ packs: "project",
80
90
  stories: "default",
81
91
  prefixes: "default",
82
- prompts: "default",
83
92
  },
84
93
  global: { path: "/nonexistent", exists: false },
85
94
  project: { exists: false },
@@ -102,8 +111,9 @@ function configField(key: string, value: unknown): string {
102
111
  }
103
112
 
104
113
  /**
105
- * Build a store-backed runtime whose `cwd` carries a real lock file — the ONE
106
- * shared store-backed fixture path for cross-surface (CLI/MCP/spawn) tests.
114
+ * Build a store-backed runtime whose `cwd` is pointed at a real built pack —
115
+ * the ONE shared store-backed fixture path for cross-surface (CLI/MCP/spawn)
116
+ * tests.
107
117
  *
108
118
  * @param options - The fixture graph TTL and any config overrides.
109
119
  * @returns The runtime, its cwd, and a disposer.
@@ -116,11 +126,18 @@ export async function bootFixtureRuntime(
116
126
  const pkgDir = mkdtempSync(join(tmpdir(), "pragma-fixture-pkg-"));
117
127
  mkdirSync(join(pkgDir, "definitions"), { recursive: true });
118
128
  writeFileSync(join(pkgDir, "definitions", "fixture.ttl"), options.ttl);
129
+ const stories = Object.entries(options.stories ?? {});
130
+ if (stories.length > 0) {
131
+ mkdirSync(join(pkgDir, "stories"), { recursive: true });
132
+ for (const [file, content] of stories) {
133
+ writeFileSync(join(pkgDir, "stories", file), content);
134
+ }
135
+ }
119
136
 
120
- const packages: PackageEntry[] = [
137
+ const packs: PackDeclaration[] = [
121
138
  { name: "fixture", source: `file://${pkgDir}` },
122
139
  ];
123
- const fields = [configField("packages", packages)];
140
+ const fields = [configField("packs", packs)];
124
141
  for (const [key, value] of Object.entries(options.config ?? {})) {
125
142
  fields.push(configField(key, value));
126
143
  }
@@ -129,7 +146,7 @@ export async function bootFixtureRuntime(
129
146
  `export default {\n${fields.join("\n")}\n};\n`,
130
147
  );
131
148
 
132
- await runTask(await buildUpdateTask(builderRuntime(cwd, packages), false));
149
+ await runTask(await buildUpdateTask(builderRuntime(cwd, packs)));
133
150
 
134
151
  const runtime = bootRuntime(FIXTURE_FLAGS, cwd);
135
152
 
@@ -36,7 +36,7 @@ export interface FixtureRuntimeOptions {
36
36
  /** Explicit `--detail` level for this invocation. */
37
37
  readonly detail?: DetailLevel;
38
38
  /** Config `detail` value and its origin (drives {@link resolvePackDetail}). */
39
- readonly configDetail?: string;
39
+ readonly configDetail?: DetailLevel;
40
40
  /** Origin of the config `detail` (default `"default"`). */
41
41
  readonly detailOrigin?: ConfigOrigin;
42
42
  }
@@ -93,10 +93,9 @@ export async function buildFixtureRuntime(
93
93
  tier: "default",
94
94
  channel: "default",
95
95
  detail: options.detailOrigin ?? "default",
96
- packages: "default",
96
+ packs: "default",
97
97
  stories: "default",
98
98
  prefixes: "default",
99
- prompts: "default",
100
99
  },
101
100
  global: { path: "", exists: false },
102
101
  project: { exists: false },
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import type { Command } from "commander";
10
+ import { BIN_NAME } from "../../constants.js";
10
11
  import { buildProgram } from "../../kernel/project/cli/buildProgram.js";
11
12
  import type { GlobalFlags } from "../../kernel/runtime/types.js";
12
13
  import type { CapabilityModule, VerbSpec } from "../../kernel/spec/types.js";
@@ -31,5 +32,5 @@ export function projectCli(
31
32
  globalFlags: GlobalFlags = TEST_FLAGS,
32
33
  ): Command {
33
34
  const verbs: VerbSpec[] = modules.flatMap((module) => [...module.verbs]);
34
- return buildProgram(verbs, { globalFlags, programName: "pragma" });
35
+ return buildProgram(verbs, { globalFlags, programName: BIN_NAME });
35
36
  }
@@ -10,6 +10,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
10
10
  import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
11
11
  import type {
12
12
  CallToolResult,
13
+ Resource,
13
14
  ServerCapabilities,
14
15
  } from "@modelcontextprotocol/sdk/types.js";
15
16
  import { buildServer } from "../../kernel/project/mcp/buildServer.js";
@@ -34,14 +35,33 @@ export interface McpHarness {
34
35
  ): Promise<Record<string, unknown>>;
35
36
  /** List the registered tools. */
36
37
  listTools(): Promise<ToolInfo[]>;
37
- /** List the resources exposed by the `{+uri}` template's list callback. */
38
- listResources(): Promise<{ uri: string; name: string }[]>;
38
+ /**
39
+ * List the resources exposed by the `{+uri}` template's list callback.
40
+ *
41
+ * The WHOLE wire entry (title, annotations, `_meta`, …), not a projection of
42
+ * it: the listing's cost and its navigability are both properties of what
43
+ * actually crosses the wire, and a helper that trimmed the entry would hide
44
+ * exactly the fields under test.
45
+ */
46
+ listResources(): Promise<Resource[]>;
39
47
  /** Read one resource by URI; returns the first content's parsed/raw text. */
40
48
  readResource(uri: string): Promise<{ mimeType?: string; text: string }>;
41
- /** Complete a resource-template variable against a partial value. */
42
- completeResource(partial: string): Promise<string[]>;
49
+ /**
50
+ * Complete a resource-template variable against a partial value.
51
+ *
52
+ * Returns the full completion result — `total` and `hasMore` are derived by
53
+ * the SDK from the callback's array, so they are the only witness that a
54
+ * truncated result admits to being truncated.
55
+ */
56
+ completeResource(partial: string): Promise<{
57
+ values: string[];
58
+ total?: number;
59
+ hasMore?: boolean;
60
+ }>;
43
61
  /** The server capabilities negotiated at initialize (tools/resources/prompts). */
44
62
  serverCapabilities(): ServerCapabilities | undefined;
63
+ /** The `serverInfo` the server introduced itself with at initialize. */
64
+ serverInfo(): { name: string; version: string } | undefined;
45
65
  /** The server `instructions` string sent at initialize. */
46
66
  instructions(): string | undefined;
47
67
  /** List the native MCP prompts (`prompts/list`). */
@@ -98,7 +118,7 @@ export async function projectMcp(
98
118
  },
99
119
  async listResources() {
100
120
  const { resources } = await client.listResources();
101
- return resources.map((r) => ({ uri: r.uri, name: r.name }));
121
+ return resources;
102
122
  },
103
123
  async readResource(uri) {
104
124
  const result = await client.readResource({ uri });
@@ -115,11 +135,23 @@ export async function projectMcp(
115
135
  ref: { type: "ref/resource", uri: "pragma:{+uri}" },
116
136
  argument: { name: "uri", value: partial },
117
137
  });
118
- return result.completion.values;
138
+ return {
139
+ values: result.completion.values,
140
+ ...(result.completion.total === undefined
141
+ ? {}
142
+ : { total: result.completion.total }),
143
+ ...(result.completion.hasMore === undefined
144
+ ? {}
145
+ : { hasMore: result.completion.hasMore }),
146
+ };
119
147
  },
120
148
  serverCapabilities() {
121
149
  return client.getServerCapabilities();
122
150
  },
151
+ serverInfo() {
152
+ const info = client.getServerVersion();
153
+ return info ? { name: info.name, version: info.version } : undefined;
154
+ },
123
155
  instructions() {
124
156
  return client.getInstructions();
125
157
  },
@@ -1,10 +1,10 @@
1
1
  /**
2
- * Test helper: spawn-and-CAPTURE the real `pragma` binary.
2
+ * Test helper: spawn-and-CAPTURE the real `pragma` entry point.
3
3
  *
4
4
  * {@link measureCommand} (the perf helper) discards stdout/stderr — it only
5
5
  * times spawns. This is the complementary helper for tests that need to READ
6
6
  * what the process printed: the true end-to-end boundary (argv parsing,
7
- * first-run, the compiled/`bun` entry point, real process exit codes).
7
+ * first-run, the shipped entry point, real process exit codes).
8
8
  *
9
9
  * Kept THIN — most behavioral coverage should run in-process via
10
10
  * `executeVerb`/`projectCli`/`projectMcp`; reserve `runCli` for tests where the
@@ -18,9 +18,12 @@ import { tmpdir } from "node:os";
18
18
  import { join } from "node:path";
19
19
  import { fileURLToPath } from "node:url";
20
20
 
21
- /** The compiled binary the perf `globalSetup` guarantees exists before tests run. */
22
- const COMPILED_BINARY = fileURLToPath(
23
- new URL("../../../dist/pragma", import.meta.url),
21
+ /**
22
+ * The shipped entry the perf `globalSetup` guarantees exists before tests run —
23
+ * the `bin` the published package points at, run the way a consumer runs it.
24
+ */
25
+ const SHIPPED_ENTRY = fileURLToPath(
26
+ new URL("../../../dist/src/bin.js", import.meta.url),
24
27
  );
25
28
 
26
29
  /** The `bin.ts` entry point, for fast source-mode spawns (no rebuild). */
@@ -37,11 +40,12 @@ export interface RunCliOptions {
37
40
  */
38
41
  readonly env?: Record<string, string | undefined>;
39
42
  /**
40
- * `"compiled"` (default) spawns `dist/pragma` — the true release boundary.
41
- * `"source"` spawns `bun src/bin.ts` — faster, no rebuild required, for
42
- * journeys that do not test the compiled-binary boundary itself.
43
+ * `"shipped"` (default) spawns `node dist/src/bin.js` — the true release
44
+ * boundary, exactly what a consumer's `pragma` runs. `"source"` spawns
45
+ * `bun src/bin.ts` — faster, no rebuild required, for journeys that do not
46
+ * test the shipped-entry boundary itself.
43
47
  */
44
- readonly mode?: "compiled" | "source";
48
+ readonly mode?: "shipped" | "source";
45
49
  /** Spawn timeout in milliseconds (default 20000). */
46
50
  readonly timeoutMs?: number;
47
51
  }
@@ -76,7 +80,7 @@ function seededXdgConfigHome(): string {
76
80
  /**
77
81
  * Spawn the real `pragma` CLI and capture its output.
78
82
  *
79
- * @param args - Argv passed to the binary (no `pragma`/`bun` prefix).
83
+ * @param args - Argv passed to the CLI (no `pragma`/runtime prefix).
80
84
  * @param options - cwd, env overrides, mode, and timeout.
81
85
  * @returns The captured stdout/stderr/exitCode/signal.
82
86
  * @note Impure — spawns a child process.
@@ -85,17 +89,30 @@ export function runCli(
85
89
  args: readonly string[],
86
90
  options: RunCliOptions = {},
87
91
  ): RunCliResult {
88
- const mode = options.mode ?? "compiled";
89
- const command = mode === "compiled" ? COMPILED_BINARY : "bun";
90
- const spawnArgs = mode === "compiled" ? [...args] : [SOURCE_ENTRY, ...args];
92
+ const mode = options.mode ?? "shipped";
93
+ // Both modes spawn a RUNTIME with an entry argument now — the built entry is
94
+ // emitted JavaScript, not a self-executing binary, so `node` names it.
95
+ const command = mode === "shipped" ? process.execPath : "bun";
96
+ const entry = mode === "shipped" ? SHIPPED_ENTRY : SOURCE_ENTRY;
97
+ const spawnArgs = [entry, ...args];
98
+
99
+ // Colour OFF by default: these tests assert on bytes, and nx exports
100
+ // FORCE_COLOR to its test tasks, so a spawned CLI colours its help even
101
+ // through a pipe — green locally, red in CI, for a difference no assertion
102
+ // meant to make. NO_COLOR is the one convention the style seam obeys
103
+ // unconditionally. FORCE_COLOR is DELETED rather than overridden: Bun warns
104
+ // on stderr when it sees both, and stderr is part of what is asserted.
105
+ // `options.env` still wins, so a test that wants colour asks for it.
106
+ const env: NodeJS.ProcessEnv = {
107
+ ...process.env,
108
+ NO_COLOR: "1",
109
+ XDG_CONFIG_HOME: seededXdgConfigHome(),
110
+ };
111
+ delete env.FORCE_COLOR;
91
112
 
92
113
  const result = spawnSync(command, spawnArgs, {
93
114
  cwd: options.cwd,
94
- env: {
95
- ...process.env,
96
- XDG_CONFIG_HOME: seededXdgConfigHome(),
97
- ...options.env,
98
- },
115
+ env: { ...env, ...options.env },
99
116
  encoding: "utf-8",
100
117
  timeout: options.timeoutMs ?? 20_000,
101
118
  });
@@ -15,8 +15,19 @@ import {
15
15
  } from "./budgets.js";
16
16
  import { measureCommand, percentile, trimmedMean } from "./measure.js";
17
17
 
18
- /** The compiled binary the perf globalSetup guarantees exists. */
19
- const BINARY = fileURLToPath(new URL("../../../dist/pragma", import.meta.url));
18
+ /**
19
+ * The shipped entry the perf globalSetup guarantees exists, spawned through
20
+ * `node` — which is what a consumer's `pragma` does, so node's own startup is
21
+ * inside every sample rather than excluded from it. The budgets below are
22
+ * ceilings on what a user waits, not on what a bundler produced.
23
+ */
24
+ const NODE = process.execPath;
25
+ const ENTRY = fileURLToPath(
26
+ new URL("../../../dist/src/bin.js", import.meta.url),
27
+ );
28
+
29
+ /** Argv for one CLI invocation through the shipped entry. */
30
+ const cli = (...args: string[]): string[] => [ENTRY, ...args];
20
31
 
21
32
  /** Fresh XDG dirs so spawned runs never touch real state (and first-run is isolated). */
22
33
  const perfEnv = {
@@ -25,7 +36,7 @@ const perfEnv = {
25
36
  };
26
37
 
27
38
  /**
28
- * Protected budget suite. Spawns the standalone `dist/pragma`, discards
39
+ * Protected budget suite. Spawns the shipped entry through `node`, discards
29
40
  * warmups, and asserts median + p95 against the ceilings in budgets.ts. Given
30
41
  * spawn-time variance, each spawn case retries.
31
42
  */
@@ -45,7 +56,7 @@ describe("perf budgets (PROTECTED)", () => {
45
56
  });
46
57
 
47
58
  it("pragma --help stays under budget", { retry: 2 }, () => {
48
- const result = measureCommand(BINARY, ["--help"], {
59
+ const result = measureCommand(NODE, cli("--help"), {
49
60
  runs: 15,
50
61
  warmups: 3,
51
62
  env: perfEnv,
@@ -55,7 +66,7 @@ describe("perf budgets (PROTECTED)", () => {
55
66
  });
56
67
 
57
68
  it("pragma __complete stays under budget", { retry: 3 }, () => {
58
- const result = measureCommand(BINARY, ["__complete", "config"], {
69
+ const result = measureCommand(NODE, cli("__complete", "config"), {
59
70
  runs: 30,
60
71
  warmups: 5,
61
72
  env: perfEnv,
@@ -77,8 +88,8 @@ describe("perf budgets (PROTECTED)", () => {
77
88
  // dir → an empty walk, but it exercises the discoverSkills path per spawn;
78
89
  // enforce the same robust statistic as the noun case.
79
90
  const result = measureCommand(
80
- BINARY,
81
- ["__complete", "skill", "lookup", "do"],
91
+ NODE,
92
+ cli("__complete", "skill", "lookup", "do"),
82
93
  {
83
94
  runs: 30,
84
95
  warmups: 5,
@@ -94,9 +105,13 @@ describe("perf budgets (PROTECTED)", () => {
94
105
 
95
106
  it("warm store-backed verb stays under budget", { retry: 2 }, () => {
96
107
  // __store-probe boots the embedded pack from its n-quads cache and queries
97
- // it — the full store-backed verb cost in the compiled binary. The first
108
+ // it — the full store-backed verb cost through the shipped entry. The first
98
109
  // spawn materializes the pack; warmups absorb it, then it is a cache hit.
99
- const result = measureCommand(BINARY, ["__store-probe"], {
110
+ // Note that with 9 kept samples a nearest-rank p95 IS the maximum (see
111
+ // BUDGETS.md's p95-stabilization section) — deliberately kept, because the
112
+ // honest statistic here is the one that catches real cost, and the ceiling
113
+ // is sized with a 1.25× margin over a projected p95 to absorb it.
114
+ const result = measureCommand(NODE, cli("__store-probe"), {
100
115
  runs: 12,
101
116
  warmups: 3,
102
117
  env: {
@@ -1,30 +1,94 @@
1
1
  /**
2
- * Performance budgets for the compiled `pragma` binary.
2
+ * Performance budgets for the shipped `pragma` entry.
3
3
  *
4
4
  * The ceilings the protected budget tests assert against. The surface
5
5
  * covenant's designed target for `--help`/`__complete` is 50 ms; the day-1 perf
6
- * spike (commit 6) found that unrealistic on the build hardware (cold Bun
7
- * process start alone is ~45 ms here), so — per the plan — each ceiling is set
8
- * to roughly 2× the measured median rather than silently weakening the target.
9
- * Measured numbers and environment are recorded in BUDGETS.md.
6
+ * spike (commit 6) found that unrealistic on the build hardware (cold process
7
+ * start alone is ~45 ms here), so — per the plan — those ceilings are set to
8
+ * roughly 2× the measured median rather than silently weakening the target.
9
+ *
10
+ * A CEILING IS RELATIVE TO THE ARTIFACT IT WAS MEASURED ON. These were derived
11
+ * against a `bun build --compile` executable. The distribution now ships
12
+ * JavaScript that `node` executes, which costs roughly 2× on the fast paths, so
13
+ * a ceiling set at 2× the binary's median lands at the emit's median — where it
14
+ * cannot separate a regression from a slow runner. `__complete` proved that
15
+ * exactly: three CI attempts at 100.15, 100.20 and 100.37 ms against a 100 ms
16
+ * ceiling. Re-derived below on the same rule, against the artifact that now
17
+ * ships; the designed 50 ms target is recorded as unmet rather than quietly
18
+ * moved. {@link BUDGET_WARM_STORE_MS} is derived differently (from a projected
19
+ * p95, and it lands TIGHTER than 2× its median); its arithmetic is written out
20
+ * in full in BUDGETS.md, as are the measurements and environment for all of
21
+ * them.
10
22
  */
11
23
 
12
- /** `pragma --help` ceiling (ms). Designed 50; measured median ~61 → 2×. */
24
+ /**
25
+ * `pragma --help` ceiling (ms). Designed 50; the rule is 2× the measured median.
26
+ *
27
+ * Down from the provisional 220, which covered the create surface's eager
28
+ * registration imports on the capabilities barrel. Those are gone — the
29
+ * registered flag spellings are baked into `createSurface.generated.ts` at
30
+ * build time, the mount's adapter loads behind `CliProjection.prepare()`, and
31
+ * the bare-help path no longer loads Commander at all — and the lazy-graph
32
+ * guard in `lazy.test.ts` pins all three so the cost cannot creep back
33
+ * silently.
34
+ *
35
+ * MEASURED, paired: the pre-refactor tree and this one were each built and
36
+ * spawned alternately, 40 kept samples per cell, so drift on a shared box hits
37
+ * both arms. Median 74.6 → 64.7 ms; net of each arm's own `--version` control,
38
+ * the work this path does went 49.3 → 35.3 ms (−28%). 2 × 64.7 = 129.5, so
39
+ * 130 is the rule's own number rather than a number the rule tolerates. It is
40
+ * also where this path sat before the regression. BUDGETS.md carries the full
41
+ * table, the reference-box projection, and why this is the floor.
42
+ */
13
43
  export const BUDGET_HELP_MS = 130;
14
44
 
15
- /** `pragma __complete …` ceiling (ms). Designed 50; measured median ~46 → 2×. */
16
- export const BUDGET_COMPLETE_MS = 100;
45
+ /**
46
+ * `pragma __complete …` ceiling (ms). Designed 50 — **not met, and recorded as
47
+ * such**: the shipped entry cannot reach it, because node's own start is most
48
+ * of that number before pragma runs a line.
49
+ *
50
+ * Down from the provisional 220 for the same reason as {@link BUDGET_HELP_MS}:
51
+ * the eager create-surface imports both fast paths paid for are deferred, and
52
+ * completion additionally sheds Commander — nothing on the `__complete`
53
+ * closure imports it any more.
54
+ *
55
+ * MEASURED in the same paired run: median 79.1 → 69.2 ms for the noun case and
56
+ * 74.2 → 69.3 ms for the name-source case; net of the control, 53.7 → 39.7 ms
57
+ * and 48.9 → 39.8 ms.
58
+ *
59
+ * 2× the slower median is 138.5, BELOW this 150 — and it stays 150 anyway,
60
+ * because a ceiling is relative to the box as well as the artifact. This box's
61
+ * cold start is 25–30 ms against the reference box's 45.5; projecting the
62
+ * measured work onto the reference box gives a ~85 ms median, whose 2× is
63
+ * ~170. CI has already run this path at a ~100 ms trimmed mean. Cutting to 140
64
+ * on a local median would be deriving a ceiling on hardware the suite does not
65
+ * run on. Completion is typed interactively, so this stays the budget most
66
+ * worth defending — see BUDGETS.md for the arithmetic.
67
+ */
68
+ export const BUDGET_COMPLETE_MS = 150;
17
69
 
18
70
  /** Warm project-config (`pragma.config.ts`) load ceiling (ms). Cache hit is sub-ms. */
19
71
  export const BUDGET_PROJECT_CONFIG_MS = 10;
20
72
 
21
73
  /**
22
74
  * Warm store-backed verb ceiling (ms) — a store boot from the cached n-quads
23
- * dump plus a query, in the compiled binary. The designed 300 ms holds: the
24
- * measured median (`__store-probe`) is ~150 ms here, so 300 is already ~2× the
25
- * measured median and needs no relaxation (see BUDGETS.md).
75
+ * dump plus a query, through the shipped entry.
76
+ *
77
+ * Re-derived when the embed became the distribution's real 8 479-triple graph
78
+ * instead of a 23-triple sample. Netted against a `--version` control from the
79
+ * SAME binary in the SAME run (this box's process start swings 60–287 ms with
80
+ * page-cache state alone), the real pack's store work is 2.83× the sample's —
81
+ * the median of five repetitions across two protocols. Projected onto the
82
+ * reference box, whose own toy store work is 147 − 45.5 = 101.5 ms: 45.5 +
83
+ * 101.5 × 2.83 ≈ 333 ms median, and 333 × (176/147) ≈ 398 ms p95 using the
84
+ * reference box's own dispersion for this command. `ceil(398 × 1.25 / 50) × 50`
85
+ * = 500 — which is 1.6× the projected median, i.e. tighter than the
86
+ * 2×-of-median rule the ceilings above use. Every input, every step, and the
87
+ * raw measurements are in BUDGETS.md; the designed `<300ms` target stays in the
88
+ * surface covenant, exactly as the 50 ms `help` target survived its 130 ms
89
+ * ceiling.
26
90
  */
27
- export const BUDGET_WARM_STORE_MS = 300;
91
+ export const BUDGET_WARM_STORE_MS = 500;
28
92
 
29
93
  /**
30
94
  * Warm in-process MCP tool-call ceiling (ms) — PR7 graduates this from seeded to
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Unit pins for the committed-codegen CHECK seam (`scripts/codegen.ts`) —
3
+ * the mechanism behind two loop MAJORs: a gate's build must COMPARE the
4
+ * committed generated module and fail on staleness instead of silently
5
+ * repairing it before the PROTECTED drift guard (create.test.ts's
6
+ * projection-fidelity cell) reads it. The generator cell drives the EXPORTED
7
+ * generator with an injected `out` in a tmpdir — no spawn, no build, no repo
8
+ * write. The wiring cells pin the two halves the
9
+ * seam is made of and the fact that they MEET: the flag's VALUE (the
10
+ * exported GATE_BUILD_ENV) and its READER (the exported
11
+ * checkModeFromEnv). They do NOT pin the two CALL SITES — the gate
12
+ * spawn's `...GATE_BUILD_ENV` spread (perf/globalSetup.ts) and
13
+ * build.ts's `checkModeFromEnv(process.env)` read — which stay pinned by
14
+ * CONSTRUCTION: scripts/build.ts is executed by no test at all, and
15
+ * dropping the spread leaves every cell here green. A refactor that
16
+ * severs either call site still reverts gate builds to write mode
17
+ * silently; only a VALUE or READER change reddens.
18
+ */
19
+
20
+ import {
21
+ copyFileSync,
22
+ mkdtempSync,
23
+ readFileSync,
24
+ rmSync,
25
+ writeFileSync,
26
+ } from "node:fs";
27
+ import { tmpdir } from "node:os";
28
+ import { join } from "node:path";
29
+ import { fileURLToPath } from "node:url";
30
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
31
+ import {
32
+ checkModeFromEnv,
33
+ generateCreateSurface,
34
+ } from "../../../scripts/codegen.js";
35
+ import { GATE_BUILD_ENV } from "./globalSetup.js";
36
+
37
+ const SURFACE_COMMITTED = fileURLToPath(
38
+ new URL(
39
+ "../../capabilities/create/createSurface.generated.ts",
40
+ import.meta.url,
41
+ ),
42
+ );
43
+ describe("the committed-codegen CHECK seam (scripts/codegen.ts)", () => {
44
+ let surfaceOut: string;
45
+ let dir: string;
46
+
47
+ beforeEach(() => {
48
+ dir = mkdtempSync(join(tmpdir(), "codegen-check-"));
49
+ surfaceOut = join(dir, "createSurface.generated.ts");
50
+ copyFileSync(SURFACE_COMMITTED, surfaceOut);
51
+ });
52
+
53
+ afterEach(() => {
54
+ rmSync(dir, { recursive: true, force: true });
55
+ vi.restoreAllMocks();
56
+ });
57
+
58
+ it("check mode over the committed bytes: green, nothing written, ZERO notices — the healthy-tree gate", () => {
59
+ // Seeded with the bytes git holds, check mode must compute NO change (this
60
+ // is also the healthy gate build's determinism: a fresh render equals the
61
+ // committed bytes), must never write — and must log NOTHING. The
62
+ // zero-notices half is what separates "byte-identical" from "tolerated".
63
+ const before = readFileSync(surfaceOut, "utf-8");
64
+ const log = vi.spyOn(console, "log").mockImplementation(() => {});
65
+ const surface = generateCreateSurface({ check: true, out: surfaceOut });
66
+ expect(surface.changed).toBe(false);
67
+ expect(surface.surfaced).toBeGreaterThan(0);
68
+ expect(log).not.toHaveBeenCalled();
69
+ expect(readFileSync(surfaceOut, "utf-8")).toBe(before);
70
+ });
71
+
72
+ it("check mode over STALE bytes: throws naming the module — and never repairs it", () => {
73
+ // The other arm of the seam — the one the gate exists for. Seed bytes
74
+ // that differ from a fresh render; check mode must FAIL loudly (naming
75
+ // the committed module and the repair) and must leave the seeded bytes
76
+ // untouched: a check that silently rewrote them would green the stale
77
+ // tree before the PROTECTED drift guard reads it.
78
+ const stale = "// stale committed projection\n";
79
+ writeFileSync(surfaceOut, stale);
80
+ expect(() =>
81
+ generateCreateSurface({ check: true, out: surfaceOut }),
82
+ ).toThrowError(/createSurface\.generated\.ts is STALE[\s\S]*bun run build/);
83
+ expect(readFileSync(surfaceOut, "utf-8")).toBe(stale);
84
+ });
85
+
86
+ it("write mode over STALE bytes repairs them to the committed render", () => {
87
+ // The developer path `bun run build` takes: the same seeded staleness,
88
+ // check off — the module is rewritten to exactly the bytes a fresh
89
+ // render produces (the committed generation this suite copied in).
90
+ const committed = readFileSync(SURFACE_COMMITTED, "utf-8");
91
+ writeFileSync(surfaceOut, "// stale committed projection\n");
92
+ const result = generateCreateSurface({ check: false, out: surfaceOut });
93
+ expect(result.changed).toBe(true);
94
+ expect(readFileSync(surfaceOut, "utf-8")).toBe(committed);
95
+ });
96
+ });
97
+
98
+ describe("the CHECK seam's wiring (GATE_BUILD_ENV → checkModeFromEnv)", () => {
99
+ it("checkModeFromEnv: exactly the documented flag value flips a build into the gate's check", () => {
100
+ // The READ side of the seam, pinned: build.ts consumes this one-liner
101
+ // over its process.env, so a build enters check mode exactly when the
102
+ // flag is the string "1" — an ordinary developer env (no flag) and a
103
+ // flag EXPLICITLY set to any other value both stay in write mode,
104
+ // where `bun run build` repairs the committed artifacts. The
105
+ // third case is what makes "exactly" true: a predicate that merely
106
+ // tested for the key's presence, or accepted "0" as well, would pass
107
+ // the first two.
108
+ expect(checkModeFromEnv({ PRAGMA_BUILD_SKIP_DOCS: "1" })).toBe(true);
109
+ expect(checkModeFromEnv({})).toBe(false);
110
+ expect(checkModeFromEnv({ PRAGMA_BUILD_SKIP_DOCS: "0" })).toBe(false);
111
+ });
112
+
113
+ it("GATE_BUILD_ENV carries the check-mode flag — the gate spawn's env enters check mode", () => {
114
+ // The SET side of the seam, pinned against the read side: the exported
115
+ // constant IS the object the gate spawn spreads into its child env
116
+ // (perf/globalSetup.ts), and feeding it to checkModeFromEnv proves the
117
+ // VALUE and the READER meet — changing the flag's value, or renaming
118
+ // the key on either side, reddens here. What this cell does NOT see is
119
+ // the spawn's `...GATE_BUILD_ENV` spread itself: dropping that leaves
120
+ // every cell in this file green while gate builds silently revert to
121
+ // write mode (repairing the stale committed tree every drift guard
122
+ // exists to catch), so the call site stays pinned by construction.
123
+ expect(GATE_BUILD_ENV.PRAGMA_BUILD_SKIP_DOCS).toBe("1");
124
+ expect(checkModeFromEnv(GATE_BUILD_ENV)).toBe(true);
125
+ });
126
+ });