@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,9 +1,12 @@
1
1
  import { execFileSync } from "node:child_process";
2
2
  import {
3
3
  existsSync,
4
+ lstatSync,
4
5
  mkdirSync,
5
6
  mkdtempSync,
7
+ readdirSync,
6
8
  readFileSync,
9
+ readlinkSync,
7
10
  rmSync,
8
11
  symlinkSync,
9
12
  writeFileSync,
@@ -14,13 +17,20 @@ import { join } from "node:path";
14
17
  import { runTask } from "@canonical/task/node";
15
18
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
16
19
  import { VERSION } from "../../constants.js";
17
- import type { ConfigLayers, PackageEntry } from "../../kernel/config/types.js";
20
+ import type {
21
+ ConfigLayers,
22
+ PackDeclaration,
23
+ } from "../../kernel/config/types.js";
18
24
  import { PragmaError } from "../../kernel/error/PragmaError.js";
19
25
  import { executeVerb } from "../../kernel/project/cli/dispatch.js";
20
26
  import { bootRuntime } from "../../kernel/runtime/boot.js";
21
27
  import { createQueryFacade } from "../../kernel/runtime/facade.js";
22
- import { readLock } from "../../kernel/runtime/lock.js";
23
- import { lockPath, packDir } from "../../kernel/runtime/paths.js";
28
+ import { readManifest } from "../../kernel/runtime/graphpack/manifest.js";
29
+ import {
30
+ activePackPath,
31
+ packDir,
32
+ readActivePack,
33
+ } from "../../kernel/runtime/paths.js";
24
34
  import {
25
35
  detectPrefixClashes,
26
36
  resolvePackageJson,
@@ -58,18 +68,17 @@ const tmp = (prefix: string): string => {
58
68
  return dir;
59
69
  };
60
70
 
61
- /** A runtime whose config is the given package list (no config files needed). */
62
- function runtimeFor(cwd: string, packages: PackageEntry[]): PragmaRuntime {
71
+ /** A runtime whose config is the given pack list (no config files needed). */
72
+ function runtimeFor(cwd: string, packs: PackDeclaration[]): PragmaRuntime {
63
73
  const layers: ConfigLayers = {
64
- config: { channel: "normal", packages },
74
+ config: { channel: "normal", packs },
65
75
  origins: {
66
76
  tier: "default",
67
77
  channel: "default",
68
78
  detail: "default",
69
- packages: "project",
79
+ packs: "project",
70
80
  stories: "default",
71
81
  prefixes: "default",
72
- prompts: "default",
73
82
  },
74
83
  global: { path: "/nonexistent", exists: false },
75
84
  project: { exists: false },
@@ -101,30 +110,24 @@ function filePackage(): string {
101
110
  return pkg;
102
111
  }
103
112
 
104
- describe("sources lock round-trip (PROTECTED)", () => {
105
- it("file source: builds, locks, and --frozen rewrites a byte-identical lock", async () => {
113
+ describe("sources update round-trip (PROTECTED)", () => {
114
+ it("file source: builds and points the project at the built pack", async () => {
106
115
  const pkg = filePackage();
107
116
  const cwd = tmp("pragma-proj-");
108
117
  const runtime = runtimeFor(cwd, [
109
118
  { name: "pkg-a", source: `file://${pkg}` },
110
119
  ]);
111
120
 
112
- const result = await runTask(await buildUpdateTask(runtime, false));
121
+ const result = await runTask(await buildUpdateTask(runtime));
113
122
  expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
114
-
115
- const lock = readLock(cwd);
116
- expect(lock?.packs).toHaveLength(1);
117
- expect(lock?.packs[0]?.name).toBe("pkg-a");
118
- expect(lock?.packs[0]?.resolved).toBe(pkg);
119
- expect(lock?.contentHash).toBe(result.contentHash);
120
-
121
- const firstBytes = readFileSync(lockPath(cwd), "utf-8");
122
- // A --frozen re-run reproduces the locked state byte-for-byte.
123
- await runTask(await buildUpdateTask(runtime, true));
124
- expect(readFileSync(lockPath(cwd), "utf-8")).toBe(firstBytes);
123
+ expect(result.packs).toEqual([
124
+ { name: "pkg-a", resolved: pkg, sourceCount: 1, storyCount: 0 },
125
+ ]);
126
+ // The pointer the next boot reads names exactly the pack just built.
127
+ expect(readActivePack(cwd)).toBe(result.contentHash);
125
128
  });
126
129
 
127
- it("git source: resolves and locks a commit SHA, --frozen pins it", async () => {
130
+ it("git source: resolves the ref to a commit SHA", async () => {
128
131
  const repo = tmp("pragma-repo-");
129
132
  const git = (args: string[]) =>
130
133
  execFileSync("git", args, {
@@ -149,34 +152,39 @@ describe("sources lock round-trip (PROTECTED)", () => {
149
152
  { name: "pkg-git", source: `git+file://${repo}#main` },
150
153
  ]);
151
154
 
152
- await runTask(await buildUpdateTask(runtime, false));
153
- const lock = readLock(cwd);
154
- expect(lock?.packs[0]?.resolved).toMatch(/^[0-9a-f]{40}$/);
155
-
156
- const firstBytes = readFileSync(lockPath(cwd), "utf-8");
157
- await runTask(await buildUpdateTask(runtime, true));
158
- expect(readFileSync(lockPath(cwd), "utf-8")).toBe(firstBytes);
155
+ const result = await runTask(await buildUpdateTask(runtime));
156
+ const sha = result.packs.at(0)?.resolved;
157
+ expect(sha).toMatch(/^[0-9a-f]{40}$/);
158
+ expect(readActivePack(cwd)).toBe(result.contentHash);
159
+ // The revision reaches the manifest's provenance label, which is the only
160
+ // place `sources status` and `doctor` can read it from now that no lock
161
+ // records it. Same `<name>@<kind>:<resolved>` shape the bundler writes.
162
+ expect(readManifest(packDir(result.contentHash))?.sourceRef).toBe(
163
+ `pkg-git@git:${sha}`,
164
+ );
159
165
  });
160
166
 
161
- it("a non-frozen re-run over an unchanged source rewrites a byte-identical lock (L1)", async () => {
162
- // On base, every non-frozen update stamped a fresh `resolvedAt`, so a no-op
163
- // re-run dirtied the tree. When the revision is unchanged the timestamp is
164
- // preserved, so the lock is byte-identical.
167
+ it("a re-run over an unchanged source leaves the pointer byte-identical (L1)", async () => {
168
+ // On base the lock file carried a `resolvedAt` timestamp, so a no-op re-run
169
+ // rewrote it and dirtied the tree. The pointer holds only the content hash,
170
+ // which is a pure function of the sources — so this is now true by
171
+ // construction. The guard stays because it is the property users cared
172
+ // about: repeating an update changes nothing when nothing changed.
165
173
  const pkg = filePackage();
166
174
  const cwd = tmp("pragma-proj-");
167
175
  const runtime = runtimeFor(cwd, [
168
176
  { name: "pkg-a", source: `file://${pkg}` },
169
177
  ]);
170
- await runTask(await buildUpdateTask(runtime, false));
171
- const firstBytes = readFileSync(lockPath(cwd), "utf-8");
172
- await runTask(await buildUpdateTask(runtime, false));
173
- expect(readFileSync(lockPath(cwd), "utf-8")).toBe(firstBytes);
178
+ await runTask(await buildUpdateTask(runtime));
179
+ const firstBytes = readFileSync(activePackPath(cwd), "utf-8");
180
+ await runTask(await buildUpdateTask(runtime));
181
+ expect(readFileSync(activePackPath(cwd), "utf-8")).toBe(firstBytes);
174
182
  });
175
183
 
176
184
  it("follows a symlinked .ttl into the build (L6)", async () => {
177
185
  // pnpm / workspace trees symlink their sources; Dirent.isFile is false for a
178
186
  // symlink, so on base the only `.ttl` was skipped → 0 sources → the empty
179
- // build. Following the link ingests it and the build+lock succeed.
187
+ // build. Following the link ingests it and the build succeeds.
180
188
  const pkg = tmp("pragma-symlink-pkg-");
181
189
  mkdirSync(join(pkg, "definitions"), { recursive: true });
182
190
  const realTtl = join(pkg, "real.ttl");
@@ -187,15 +195,15 @@ describe("sources lock round-trip (PROTECTED)", () => {
187
195
  { name: "pkg-a", source: `file://${pkg}` },
188
196
  ]);
189
197
 
190
- const result = await runTask(await buildUpdateTask(runtime, false));
198
+ const result = await runTask(await buildUpdateTask(runtime));
191
199
  expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
192
- expect(readLock(cwd)?.packs).toHaveLength(1);
200
+ expect(readActivePack(cwd)).toBe(result.contentHash);
193
201
  });
194
202
 
195
203
  it("does not recurse into a symlinked directory cycle (L6 safety)", async () => {
196
204
  // The L6 fix follows symlinked FILES but must NOT recurse into a symlinked
197
205
  // DIRECTORY: a link to an ancestor dir is a cycle that, if walked, recurses
198
- // without bound → a stack-overflow RangeError (an INTERNAL "please report").
206
+ // without bound → a stack-overflow RangeError (an INTERNAL "report").
199
207
  // The real `.ttl` is still ingested and the build completes.
200
208
  const pkg = tmp("pragma-symlink-cycle-");
201
209
  mkdirSync(join(pkg, "definitions"), { recursive: true });
@@ -207,21 +215,20 @@ describe("sources lock round-trip (PROTECTED)", () => {
207
215
  { name: "pkg-a", source: `file://${pkg}` },
208
216
  ]);
209
217
 
210
- const result = await runTask(await buildUpdateTask(runtime, false));
218
+ const result = await runTask(await buildUpdateTask(runtime));
211
219
  expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
212
- expect(readLock(cwd)?.packs).toHaveLength(1);
220
+ expect(readActivePack(cwd)).toBe(result.contentHash);
213
221
  });
214
222
 
215
- it("undo restores the prior lock (no prior → removed)", async () => {
223
+ it("undo removes the pointer when the project had none before", async () => {
216
224
  const pkg = filePackage();
217
225
  const cwd = tmp("pragma-proj-");
218
226
  const runtime = runtimeFor(cwd, [
219
227
  { name: "pkg-a", source: `file://${pkg}` },
220
228
  ]);
221
229
  const { runUndo } = await import("@canonical/task/node");
222
- await runUndo(await buildUpdateTask(runtime, false));
223
- // Prior lock was absent, so undo removes the file.
224
- expect(readLock(cwd)).toBeUndefined();
230
+ await runUndo(await buildUpdateTask(runtime));
231
+ expect(readActivePack(cwd)).toBeUndefined();
225
232
  });
226
233
  });
227
234
 
@@ -237,7 +244,7 @@ describe("sources update — package-declared prefixes (M1)", () => {
237
244
  { name: "pkg-a", source: `file://${pkg}` },
238
245
  ]);
239
246
 
240
- const result = await runTask(await buildUpdateTask(runtime, false));
247
+ const result = await runTask(await buildUpdateTask(runtime));
241
248
  const index = JSON.parse(
242
249
  readFileSync(join(packDir(result.contentHash), "index.json"), "utf-8"),
243
250
  ) as {
@@ -267,30 +274,30 @@ describe("sources update — refuses an empty store (A4)", () => {
267
274
  return pkg;
268
275
  }
269
276
 
270
- it("a package with no .ttl is refused, and no lock is written", async () => {
277
+ it("a package with no .ttl is refused, and no pointer is written", async () => {
271
278
  // On base this builds a 0-triple pack whose empty data.nq fails the
272
279
  // completeness gate — so the "successful" update boots to a PERMANENT
273
- // STORE_UNAVAILABLE loop. The fix refuses before writing the lock.
280
+ // STORE_UNAVAILABLE loop. The fix refuses before writing the pointer.
274
281
  const pkg = emptyPackage();
275
282
  const cwd = tmp("pragma-proj-");
276
283
  const runtime = runtimeFor(cwd, [
277
284
  { name: "pkg-a", source: `file://${pkg}` },
278
285
  ]);
279
286
 
280
- await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
287
+ await expect(buildUpdateTask(runtime)).rejects.toMatchObject({
281
288
  code: "CONFIG_ERROR",
282
289
  });
283
- // No lock → the embedded fallback / prior state survives, no boot loop.
284
- expect(readLock(cwd)).toBeUndefined();
290
+ // No pointer → the embedded fallback / prior state survives, no boot loop.
291
+ expect(readActivePack(cwd)).toBeUndefined();
285
292
  });
286
293
 
287
- it("no configured packages is refused rather than locking an empty pack", async () => {
294
+ it("no configured packs is refused rather than pointing at an empty pack", async () => {
288
295
  const cwd = tmp("pragma-proj-");
289
296
  const runtime = runtimeFor(cwd, []);
290
- await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
297
+ await expect(buildUpdateTask(runtime)).rejects.toMatchObject({
291
298
  code: "CONFIG_ERROR",
292
299
  });
293
- expect(readLock(cwd)).toBeUndefined();
300
+ expect(readActivePack(cwd)).toBeUndefined();
294
301
  });
295
302
 
296
303
  it("a comment-only .ttl (0 triples) is refused too", async () => {
@@ -305,10 +312,10 @@ describe("sources update — refuses an empty store (A4)", () => {
305
312
  const runtime = runtimeFor(cwd, [
306
313
  { name: "pkg-a", source: `file://${pkg}` },
307
314
  ]);
308
- await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
315
+ await expect(buildUpdateTask(runtime)).rejects.toMatchObject({
309
316
  code: "CONFIG_ERROR",
310
317
  });
311
- expect(readLock(cwd)).toBeUndefined();
318
+ expect(readActivePack(cwd)).toBeUndefined();
312
319
  });
313
320
  });
314
321
 
@@ -358,7 +365,7 @@ describe("sources update — conflicting @prefix detection (A5)", () => {
358
365
  report: (message: string) => reports.push(message),
359
366
  };
360
367
 
361
- await runTask(await buildUpdateTask(runtime, false));
368
+ await runTask(await buildUpdateTask(runtime));
362
369
  expect(
363
370
  reports.some(
364
371
  (r) => r.includes('Prefix "ex:"') && r.includes("conflicting"),
@@ -385,11 +392,12 @@ describe("sources update — network-free preview (M2)", () => {
385
392
 
386
393
  // A successful plan — the unreachable clone was never attempted.
387
394
  expect(outcome.exitCode).toBe(0);
388
- expect(outcome.stdout).toContain("Resolve and build 1 package(s)");
395
+ expect(outcome.stdout).toContain("Resolve and build 1 pack(s)");
389
396
  expect(outcome.stdout).toContain(UNREACHABLE);
390
- // The one project mutation is previewed, not performed.
391
- expect(outcome.stdout).toContain("pragma.lock.json");
392
- expect(readLock(cwd)).toBeUndefined();
397
+ // The project mutation is previewed, not performed: the plan names the
398
+ // exact pointer file a real run would write, and no pointer landed.
399
+ expect(outcome.stdout).toContain(activePackPath(cwd));
400
+ expect(readActivePack(cwd)).toBeUndefined();
393
401
  // The store was never even asked for.
394
402
  expect(runtime.store.booted).toBe(false);
395
403
  });
@@ -398,7 +406,7 @@ describe("sources update — network-free preview (M2)", () => {
398
406
  const cwd = tmp("pragma-proj-");
399
407
  writeFileSync(
400
408
  join(cwd, "pragma.config.ts"),
401
- `export default { packages: [{ name: "pkg-remote", source: "${UNREACHABLE}" }] };\n`,
409
+ `export default { packs: [{ name: "pkg-remote", source: "${UNREACHABLE}" }] };\n`,
402
410
  );
403
411
 
404
412
  const mcp = await projectMcp([sourcesModule], cwd);
@@ -412,25 +420,8 @@ describe("sources update — network-free preview (M2)", () => {
412
420
  });
413
421
  const plan = (envelope.data as { plan: string[] }).plan;
414
422
  expect(plan.some((line) => line.includes(UNREACHABLE))).toBe(true);
415
- // Plan-first withheld the write — no lock landed.
416
- expect(readLock(cwd)).toBeUndefined();
417
- });
418
- });
419
-
420
- describe("sources update — reproducible-or-fail (m5)", () => {
421
- it("--frozen refuses a package that has no lock entry", async () => {
422
- const pkg = filePackage();
423
- const cwd = tmp("pragma-proj-");
424
- const runtime = runtimeFor(cwd, [
425
- { name: "pkg-a", source: `file://${pkg}` },
426
- ]);
427
-
428
- // No prior lock → nothing to reproduce → refuse rather than silently
429
- // advance. The throw is raised during setup, before any Task is returned.
430
- await expect(buildUpdateTask(runtime, true)).rejects.toMatchObject({
431
- code: "CONFIG_ERROR",
432
- });
433
- expect(readLock(cwd)).toBeUndefined();
423
+ // Plan-first withheld the write — no pointer landed.
424
+ expect(readActivePack(cwd)).toBeUndefined();
434
425
  });
435
426
  });
436
427
 
@@ -498,7 +489,7 @@ describe("sources update — data-failure classification (U6)", () => {
498
489
 
499
490
  let caught: unknown;
500
491
  try {
501
- await buildUpdateTask(runtime, false);
492
+ await buildUpdateTask(runtime);
502
493
  } catch (error) {
503
494
  caught = error;
504
495
  }
@@ -511,13 +502,13 @@ describe("sources update — data-failure classification (U6)", () => {
511
502
  expect(err.message).toContain("bad-pkg/definitions/broken.ttl");
512
503
  // … carries the parser's own detail …
513
504
  expect(err.message.toLowerCase()).toContain("parser error");
514
- // … and is NOT the internal-bug "please report this issue" path.
505
+ // … and is NOT the internal-bug "report this issue" path.
515
506
  expect(err.message).not.toContain("Internal error");
516
507
  expect(err.recovery?.message ?? "").not.toContain("report this issue");
517
508
  // The recovery points the user at a runnable, useful next step.
518
509
  expect(err.recovery?.cli).toBe("pragma sources update --verbose");
519
- // Nothing was locked on failure.
520
- expect(readLock(cwd)).toBeUndefined();
510
+ // Nothing was pointed at on failure.
511
+ expect(readActivePack(cwd)).toBeUndefined();
521
512
  });
522
513
 
523
514
  it("classifies a git clone failure, naming the package (not INTERNAL)", async () => {
@@ -534,7 +525,7 @@ describe("sources update — data-failure classification (U6)", () => {
534
525
 
535
526
  let caught: unknown;
536
527
  try {
537
- await buildUpdateTask(runtime, false);
528
+ await buildUpdateTask(runtime);
538
529
  } catch (error) {
539
530
  caught = error;
540
531
  }
@@ -543,7 +534,7 @@ describe("sources update — data-failure classification (U6)", () => {
543
534
  expect(err.code).toBe("CONFIG_ERROR");
544
535
  expect(err.message).toContain("pkg-remote");
545
536
  expect(err.message).not.toContain("Internal error");
546
- expect(readLock(cwd)).toBeUndefined();
537
+ expect(readActivePack(cwd)).toBeUndefined();
547
538
  });
548
539
 
549
540
  it("names the SPECIFIC bad file among several good ones", async () => {
@@ -557,12 +548,12 @@ describe("sources update — data-failure classification (U6)", () => {
557
548
  const cwd = tmp("pragma-proj-");
558
549
  const runtime = runtimeFor(cwd, [{ name: "mix", source: `file://${pkg}` }]);
559
550
 
560
- await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
551
+ await expect(buildUpdateTask(runtime)).rejects.toMatchObject({
561
552
  code: "CONFIG_ERROR",
562
553
  });
563
554
  let caught: unknown;
564
555
  try {
565
- await buildUpdateTask(runtime, false);
556
+ await buildUpdateTask(runtime);
566
557
  } catch (error) {
567
558
  caught = error;
568
559
  }
@@ -594,9 +585,9 @@ describe("sources update — hidden files and --skip-invalid", () => {
594
585
  { name: "pkg-a", source: `file://${pkg}` },
595
586
  ]);
596
587
 
597
- const result = await runTask(await buildUpdateTask(runtime, false));
588
+ const result = await runTask(await buildUpdateTask(runtime));
598
589
  expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
599
- expect(readLock(cwd)?.packs).toHaveLength(1);
590
+ expect(readActivePack(cwd)).toMatch(/^[0-9a-f]{64}$/);
600
591
  });
601
592
 
602
593
  it("without --skip-invalid, one malformed source fails the whole update", async () => {
@@ -605,10 +596,10 @@ describe("sources update — hidden files and --skip-invalid", () => {
605
596
  const runtime = runtimeFor(cwd, [
606
597
  { name: "pkg-a", source: `file://${pkg}` },
607
598
  ]);
608
- await expect(buildUpdateTask(runtime, false, false)).rejects.toMatchObject({
599
+ await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
609
600
  code: "CONFIG_ERROR",
610
601
  });
611
- expect(readLock(cwd)).toBeUndefined();
602
+ expect(readActivePack(cwd)).toBeUndefined();
612
603
  });
613
604
 
614
605
  it("with --skip-invalid, drops the bad source, warns loudly, and builds from the rest", async () => {
@@ -620,10 +611,10 @@ describe("sources update — hidden files and --skip-invalid", () => {
620
611
  report: (message: string) => reports.push(message),
621
612
  };
622
613
 
623
- const result = await runTask(await buildUpdateTask(runtime, false, true));
614
+ const result = await runTask(await buildUpdateTask(runtime, true));
624
615
  // Built from the good widget.ttl, not aborted.
625
616
  expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
626
- expect(readLock(cwd)?.packs).toHaveLength(1);
617
+ expect(readActivePack(cwd)).toMatch(/^[0-9a-f]{64}$/);
627
618
  // Loud per-source warning names the dropped file …
628
619
  expect(
629
620
  reports.some(
@@ -643,10 +634,10 @@ describe("sources update — hidden files and --skip-invalid", () => {
643
634
  ...runtimeFor(cwd, [{ name: "pkg-a", source: `file://${pkg}` }]),
644
635
  report: () => {},
645
636
  };
646
- await expect(buildUpdateTask(runtime, false, true)).rejects.toMatchObject({
637
+ await expect(buildUpdateTask(runtime, true)).rejects.toMatchObject({
647
638
  code: "CONFIG_ERROR",
648
639
  });
649
- expect(readLock(cwd)).toBeUndefined();
640
+ expect(readActivePack(cwd)).toBeUndefined();
650
641
  });
651
642
  });
652
643
 
@@ -740,7 +731,7 @@ describe("sources update — installs package skills (U10)", () => {
740
731
  { name: "pkg-a", source: `file://${pkg}` },
741
732
  ]);
742
733
 
743
- await runTask(await buildUpdateTask(runtime, false));
734
+ await runTask(await buildUpdateTask(runtime));
744
735
 
745
736
  // Installed as a symlink into $XDG_DATA_HOME/pragma/skills …
746
737
  const linked = join(dataHome, "pragma", "skills", "foo");
@@ -762,7 +753,7 @@ describe("sources update — installs package skills (U10)", () => {
762
753
  const runtime = runtimeFor(cwd, [
763
754
  { name: "pkg-a", source: `file://${pkg}` },
764
755
  ]);
765
- await runTask(await buildUpdateTask(runtime, false));
756
+ await runTask(await buildUpdateTask(runtime));
766
757
 
767
758
  const shared = discoverSkills(cwd).filter((s) => s.name === "shared");
768
759
  expect(shared).toHaveLength(1);
@@ -776,35 +767,191 @@ describe("sources update — installs package skills (U10)", () => {
776
767
  { name: "pkg-a", source: `file://${pkg}` },
777
768
  ]);
778
769
  const { runUndo } = await import("@canonical/task/node");
779
- await runUndo(await buildUpdateTask(runtime, false));
770
+ await runUndo(await buildUpdateTask(runtime));
780
771
 
781
772
  expect(existsSync(join(dataHome, "pragma", "skills", "bar"))).toBe(false);
782
773
  });
774
+
775
+ /** The installed-skills root, created so a prior install can be seeded into it. */
776
+ function installedRoot(): string {
777
+ const root = join(dataHome, "pragma", "skills");
778
+ mkdirSync(root, { recursive: true });
779
+ return root;
780
+ }
781
+
782
+ /** A symlink at `<installedRoot>/<name>` whose target does not exist. */
783
+ function danglingLink(root: string, name: string): string {
784
+ const target = join(tmp("pragma-uninstalled-"), "skills", name);
785
+ symlinkSync(target, join(root, name));
786
+ return target;
787
+ }
788
+
789
+ // The `@canonical/design-system` 0.2.0 regression: 0.1.2 shipped
790
+ // `component-specifier`, 0.2.0 deleted it in favour of `specify-component`,
791
+ // and every machine that had updated against 0.1.2 kept a symlink into a
792
+ // package directory that no longer exists.
793
+ it("prunes a link whose package dropped the skill", async () => {
794
+ const pkg = skillPackage("specify-component"); // the 0.2.0 shape
795
+ const root = installedRoot();
796
+ danglingLink(root, "component-specifier"); // what 0.1.2 left behind
797
+
798
+ const cwd = tmp("pragma-proj-");
799
+ const runtime = runtimeFor(cwd, [
800
+ { name: "design-system", source: `file://${pkg}` },
801
+ ]);
802
+ await runTask(await buildUpdateTask(runtime));
803
+
804
+ expect(readdirSync(root)).toEqual(["specify-component"]);
805
+ expect(discoverSkills(cwd).map((s) => s.name)).not.toContain(
806
+ "component-specifier",
807
+ );
808
+ });
809
+
810
+ it("spares a manually-installed skill and a foreign link that still resolves", async () => {
811
+ const pkg = skillPackage("specify-component");
812
+ const root = installedRoot();
813
+ danglingLink(root, "component-specifier");
814
+
815
+ // A hand-installed skill: a REAL directory, belonging to no package. The
816
+ // install pass already refuses to clobber these; so must the prune pass.
817
+ const manual = join(root, "hand-written");
818
+ mkdirSync(manual, { recursive: true });
819
+ writeFileSync(
820
+ join(manual, "SKILL.md"),
821
+ "---\nname: hand-written\ndescription: Mine.\n---\n",
822
+ );
823
+ // Someone's own link into a checkout this update knows nothing about, and
824
+ // which still resolves. Deliberately RELATIVE: a relative target is stored
825
+ // relative to the LINK's directory, so resolving it against anything else
826
+ // (the cwd, say) would read as broken and eat a perfectly live link.
827
+ const foreign = join(dataHome, "elsewhere", "my-own");
828
+ mkdirSync(foreign, { recursive: true });
829
+ writeFileSync(
830
+ join(foreign, "SKILL.md"),
831
+ "---\nname: my-own\ndescription: Theirs.\n---\n",
832
+ );
833
+ symlinkSync(join("..", "..", "elsewhere", "my-own"), join(root, "my-own"));
834
+
835
+ const cwd = tmp("pragma-proj-");
836
+ const runtime = runtimeFor(cwd, [
837
+ { name: "design-system", source: `file://${pkg}` },
838
+ ]);
839
+ await runTask(await buildUpdateTask(runtime));
840
+
841
+ // Only the dangling link went.
842
+ expect(readdirSync(root).sort()).toEqual([
843
+ "hand-written",
844
+ "my-own",
845
+ "specify-component",
846
+ ]);
847
+ expect(lstatSync(manual).isDirectory()).toBe(true);
848
+ expect(existsSync(join(manual, "SKILL.md"))).toBe(true);
849
+ expect(lstatSync(join(root, "my-own")).isSymbolicLink()).toBe(true);
850
+ expect(existsSync(join(root, "my-own"))).toBe(true); // still resolves
851
+ const found = discoverSkills(cwd).map((s) => s.name);
852
+ expect(found).toEqual(
853
+ expect.arrayContaining(["hand-written", "my-own", "specify-component"]),
854
+ );
855
+ });
856
+
857
+ it("re-points, rather than prunes, a dangling link the package still provides", async () => {
858
+ const pkg = skillPackage("foo");
859
+ const root = installedRoot();
860
+ danglingLink(root, "foo"); // e.g. the package moved to a new cache dir
861
+
862
+ const cwd = tmp("pragma-proj-");
863
+ const runtime = runtimeFor(cwd, [
864
+ { name: "pkg-a", source: `file://${pkg}` },
865
+ ]);
866
+ await runTask(await buildUpdateTask(runtime));
867
+
868
+ // `replaced`, never `pruned`: the prune pass skips every name this run
869
+ // planned, or it would delete the link the install pass just created.
870
+ expect(readlinkSync(join(root, "foo"))).toBe(join(pkg, "skills", "foo"));
871
+ expect(discoverSkills(cwd).map((s) => s.name)).toContain("foo");
872
+ });
873
+
874
+ it("is reversible — undo restores a pruned link, dangling target and all", async () => {
875
+ const pkg = skillPackage("specify-component");
876
+ const root = installedRoot();
877
+ const staleTarget = danglingLink(root, "component-specifier");
878
+ const link = join(root, "component-specifier");
879
+
880
+ const cwd = tmp("pragma-proj-");
881
+ const runtime = runtimeFor(cwd, [
882
+ { name: "design-system", source: `file://${pkg}` },
883
+ ]);
884
+ // The plan is made while the stale link is still there; `runUndo` MOCKS the
885
+ // forward effects, so stand in for the delete it would have performed.
886
+ const task = await buildUpdateTask(runtime);
887
+ rmSync(link);
888
+
889
+ const { runUndo } = await import("@canonical/task/node");
890
+ await runUndo(task);
891
+
892
+ expect(lstatSync(link).isSymbolicLink()).toBe(true);
893
+ expect(readlinkSync(link)).toBe(staleTarget); // the target it always had
894
+ });
895
+
896
+ it("undoes a prune whose forward delete never ran, rather than failing EEXIST", async () => {
897
+ const pkg = skillPackage("specify-component");
898
+ const root = installedRoot();
899
+ const staleTarget = danglingLink(root, "component-specifier");
900
+
901
+ const cwd = tmp("pragma-proj-");
902
+ const runtime = runtimeFor(cwd, [
903
+ { name: "design-system", source: `file://${pkg}` },
904
+ ]);
905
+ // No `rmSync` this time: the link is still in place when the undo re-links,
906
+ // and `fs.symlink` refuses an existing path — so the undo must clear it.
907
+ const { runUndo } = await import("@canonical/task/node");
908
+ await expect(runUndo(await buildUpdateTask(runtime))).resolves.toBeTruthy();
909
+
910
+ expect(readlinkSync(join(root, "component-specifier"))).toBe(staleTarget);
911
+ });
912
+
913
+ it("plans no prunes when nothing was ever installed", async () => {
914
+ const pkg = skillPackage("foo"); // $XDG_DATA_HOME/pragma/skills absent
915
+ const cwd = tmp("pragma-proj-");
916
+ const runtime = runtimeFor(cwd, [
917
+ { name: "pkg-a", source: `file://${pkg}` },
918
+ ]);
919
+ await runTask(await buildUpdateTask(runtime));
920
+
921
+ expect(readdirSync(join(dataHome, "pragma", "skills"))).toEqual(["foo"]);
922
+ });
783
923
  });
784
924
 
785
925
  describe("sources status — entityCount from the manifest (A10)", () => {
786
- it("reports the count without re-parsing index.json", async () => {
787
- const pkg = filePackage(); // ex:Widget class + ex:one individual
926
+ it("reports the count from the manifest even when index.json is unreadable", async () => {
927
+ // A pack of its OWN (unique TTL ⇒ unique content hash), so corrupting its
928
+ // cached index cannot reach any other test's pack in the shared cache.
929
+ const pkg = tmp("pragma-a10-pkg-");
930
+ mkdirSync(join(pkg, "definitions"), { recursive: true });
931
+ writeFileSync(
932
+ join(pkg, "definitions", "widget.ttl"),
933
+ `${TTL}ex:a10only a ex:Widget ; rdfs:label "A10" .\n`,
934
+ );
788
935
  const cwd = tmp("pragma-proj-");
789
936
  const runtime = runtimeFor(cwd, [
790
- { name: "pkg-a", source: `file://${pkg}` },
937
+ { name: "pkg-a10", source: `file://${pkg}` },
791
938
  ]);
792
- const result = await runTask(await buildUpdateTask(runtime, false));
939
+ const result = await runTask(await buildUpdateTask(runtime));
793
940
 
794
- // Delete index.json: any path that PARSED it to count would now fail —
795
- // proving the figure is read from the manifest's persisted entityCount.
796
- rmSync(join(packDir(result.contentHash), "index.json"), { force: true });
941
+ // Corrupt index.json but keep it non-empty, so the pack still reads as
942
+ // complete: any path that PARSED it to count would now yield null.
943
+ writeFileSync(join(packDir(result.contentHash), "index.json"), "not json");
797
944
 
798
945
  const status = await collectStatus(bootRuntime(flagsJson, cwd));
799
- // One abox individual (ex:one); the ex:Widget class is tbox, not counted.
800
- expect(status.entityCount).toBe(1);
946
+ // Two abox individuals (ex:one, ex:a10only); ex:Widget is tbox, not counted.
947
+ expect(status.entityCount).toBe(2);
801
948
  });
802
949
  });
803
950
 
804
951
  describe("sources status CLI-json == MCP tool (PROTECTED)", () => {
805
- it("a cold store's status is byte-equal on both surfaces", async () => {
806
- // Both surfaces boot from the SAME cwd + isolated config (default packages,
807
- // no lock), so the storeless status must be identical.
952
+ it("a fresh install's status is byte-equal on both surfaces", async () => {
953
+ // Both surfaces boot from the SAME cwd + isolated config (default packs,
954
+ // nothing built), so the storeless status must be identical.
808
955
  const cwd = tmp("pragma-proj-");
809
956
  const cli = await executeVerb(
810
957
  statusVerb,
@@ -820,9 +967,8 @@ describe("sources status CLI-json == MCP tool (PROTECTED)", () => {
820
967
 
821
968
  expect(cliEnvelope).toEqual(mcpEnvelope);
822
969
  expect(cliEnvelope.ok).toBe(true);
823
- expect((cliEnvelope.data as { lockPresent: boolean }).lockPresent).toBe(
824
- false,
825
- );
826
- expect((cliEnvelope.data as { cached: boolean }).cached).toBe(false);
970
+ // Nothing built here, and the packs are the distribution's own — so the
971
+ // embedded snapshot is what answers reads, and status says exactly that.
972
+ expect((cliEnvelope.data as { store: string }).store).toBe("embedded");
827
973
  });
828
974
  });