@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,10 +1,10 @@
1
1
  /**
2
2
  * The `sources` capability barrel — `status` (storeless read) and `update`
3
- * (the resolve/build/lock Task).
3
+ * (the resolve/build/point Task).
4
4
  */
5
5
 
6
6
  import { asVerb } from "../../kernel/spec/asVerb.js";
7
- import type { CapabilityModule } from "../../kernel/spec/types.js";
7
+ import type { CapabilityModule } from "../../kernel/spec/index.js";
8
8
  import { statusVerb } from "./status.verb.js";
9
9
  import { updateVerb } from "./update.verb.js";
10
10
 
@@ -4,33 +4,57 @@
4
4
  * Design-system packages ship a top-level `skills/<name>/SKILL.md`, but skill
5
5
  * discovery only scans the project root and the installed-skills root — never a
6
6
  * resolved package's clone/dir. So `sources update` INSTALLS each package's
7
- * skills into the installed-skills root (`$XDG_DATA_HOME/pragma/skills`) as
7
+ * skills into the installed-skills root (`$XDG_DATA_HOME/<bin>/skills`) as
8
8
  * symlinks, exactly the root `discoverSkills` already reads. Precedence is
9
- * preserved (a project `.pragma/skills` entry still wins — it is discovered
9
+ * preserved (a project `.<bin>/skills` entry still wins — it is discovered
10
10
  * first), and the update Task stays reversible (each created link carries an
11
11
  * unlink undo).
12
12
  *
13
+ * Installing alone leaks, because planning walks the PACKAGES and so only ever
14
+ * visits a skill that still exists. When a package DROPS one (a `0.1.2` that
15
+ * shipped `component-specifier` upgrading to a `0.2.0` that does not), the link
16
+ * the previous update installed is never revisited and is left dangling at a
17
+ * target that no longer exists — which reads as a broken install rather than the
18
+ * intentional removal it is, and which `skill` commands can still list or try to
19
+ * open. So planning ALSO walks the installed root and prunes those, under a
20
+ * deliberately narrow rule: an entry is removed only when this run did not plan
21
+ * it AND it is a symlink whose target is gone. A real directory is a
22
+ * manually-installed skill and a still-resolving symlink is someone's own link;
23
+ * neither is this update's to delete.
24
+ *
13
25
  * Decisions run against REAL fs here so the update's `--dry-run` plan is
14
26
  * accurate; the composed Task performs only the symlink/delete effects.
15
27
  */
16
28
 
17
29
  import { existsSync, lstatSync, readdirSync, readlinkSync } from "node:fs";
18
30
  import { basename, join, resolve } from "node:path";
19
- import type { ResolvedPackage } from "../../kernel/runtime/refs/resolve.js";
31
+ import type { ResolvedPackage } from "../../kernel/runtime/refs/index.js";
20
32
  import { installedSkillsDir } from "../skill/discover.js";
21
33
 
22
34
  /** One planned skill symlink into the installed-skills root. */
23
35
  export interface SkillLinkAction {
24
- /** The package's skill folder — the symlink target. */
36
+ /**
37
+ * The symlink target: the package's skill folder for an install, or — on a
38
+ * `pruned` entry — the missing target the stale link still points at, kept so
39
+ * the prune's undo can put the link back exactly as it was.
40
+ */
25
41
  readonly target: string;
26
42
  /** `<installedSkillsDir>/<folderName>` — where the symlink is created. */
27
43
  readonly linkPath: string;
28
- /** created (absent), skipped (already correct / a real dir), or replaced. */
29
- readonly action: "created" | "skipped" | "replaced";
44
+ /**
45
+ * created (absent), skipped (already correct / a real dir), replaced, or
46
+ * pruned (an unplanned link whose target is gone — deleted, not re-created).
47
+ */
48
+ readonly action: "created" | "skipped" | "replaced" | "pruned";
30
49
  /** The skill folder name (the discovery key). */
31
50
  readonly folderName: string;
32
- /** The package the skill came from. */
33
- readonly packageName: string;
51
+ /**
52
+ * The package the skill came from. Absent on a `pruned` entry: a stale link
53
+ * records only a target path, and the package that installed it is precisely
54
+ * the one that no longer provides the skill — there is nothing honest left to
55
+ * attribute it to.
56
+ */
57
+ readonly packageName?: string;
34
58
  }
35
59
 
36
60
  /** What currently occupies a candidate link path. */
@@ -80,9 +104,58 @@ function packageSkillDirs(root: string): string[] {
80
104
  return out;
81
105
  }
82
106
 
107
+ /**
108
+ * Plan the removal of the links a package has since dropped.
109
+ *
110
+ * The install pass walks the packages, so it can only ever visit a skill that
111
+ * still exists; this pass walks the installed root, which is the ONLY place a
112
+ * dropped skill still shows up. An entry is pruned only when both hold: this run
113
+ * did not plan it, and it is a symlink whose target is gone. Both halves matter —
114
+ *
115
+ * - a real (non-symlink) entry is a manually-installed skill, which the install
116
+ * pass already refuses to clobber (`skipped`) and which this pass must refuse
117
+ * just as firmly: "unplanned" is exactly what a hand-placed skill looks like;
118
+ * - a symlink whose target still resolves is someone's own link into a checkout
119
+ * this command knows nothing about. Unplanned does not make it garbage, and an
120
+ * update that silently ate it would be a worse bug than the dangling link.
121
+ *
122
+ * A broken target, by contrast, cannot be anything but debris: nothing can read
123
+ * it, and re-creating it is a matter of re-running the update that installed it
124
+ * (which is also what this prune's undo does).
125
+ *
126
+ * @param dest - The installed-skills root.
127
+ * @param planned - Every folder name the install pass planned, whatever action.
128
+ * @returns One `pruned` action per stale link, for the plan and its preview.
129
+ * @note Impure — reads the installed root and stats each entry's target.
130
+ */
131
+ function planStaleLinkPrunes(
132
+ dest: string,
133
+ planned: ReadonlySet<string>,
134
+ ): SkillLinkAction[] {
135
+ let names: string[];
136
+ try {
137
+ names = readdirSync(dest);
138
+ } catch {
139
+ return []; // No installed root — nothing was ever installed to go stale.
140
+ }
141
+ const out: SkillLinkAction[] = [];
142
+ for (const folderName of names) {
143
+ if (planned.has(folderName)) continue;
144
+ const linkPath = resolve(dest, folderName);
145
+ const state = linkState(linkPath);
146
+ if (state.kind !== "symlink") continue;
147
+ // A relative target is stored relative to the link's OWN directory, which
148
+ // for an entry of the installed root is that root itself.
149
+ if (existsSync(resolve(dest, state.target))) continue;
150
+ out.push({ target: state.target, linkPath, action: "pruned", folderName });
151
+ }
152
+ return out;
153
+ }
154
+
83
155
  /**
84
156
  * Plan the symlink actions that install each resolved package's `skills/*` into
85
- * the installed-skills discovery root. First-seen wins on a folder-name clash
157
+ * the installed-skills discovery root, then the removals that retire the links
158
+ * a package has since dropped. First-seen wins on a folder-name clash
86
159
  * across packages. A real (non-symlink) entry at the link path is left untouched
87
160
  * (`skipped`) so a manually-installed skill is never clobbered.
88
161
  *
@@ -120,5 +193,9 @@ export function planSkillInstall(
120
193
  });
121
194
  }
122
195
  }
196
+ // `seen` is every folder name this run planned — the `skipped` ones included,
197
+ // so a name a package still provides is never a prune candidate even when the
198
+ // install pass decided to leave its entry alone.
199
+ actions.push(...planStaleLinkPrunes(dest, seen));
123
200
  return actions;
124
201
  }
@@ -5,18 +5,19 @@
5
5
  *
6
6
  * - Preview (CLI `--dry-run`, or MCP without `confirm`): NETWORK-FREE. It reads
7
7
  * only the config, then hands back a plan-only Task listing the refs it would
8
- * resolve+build and the lock it would write — no git fetch, no compile, no
8
+ * resolve+build and the pointer it would write — no git fetch, no compile, no
9
9
  * cache write. This is what a dry-run / agent "preview" must be: side-effect
10
10
  * free and offline-safe.
11
- * - Real execution: the heavy work — resolve every configured package (git
11
+ * - Real execution: the heavy work — resolve every configured pack (git
12
12
  * clone/fetch, file verify, npm resolve), then build the ONE combined
13
13
  * content-addressed pack — runs eagerly (it is not expressible as a task
14
14
  * effect: the effect set is fs + exec, and the in-process compile is not an
15
- * effect at all). The returned Task models the one project mutation, the
16
- * `pragma.lock.json` write, with an undo that restores (or removes) the prior
17
- * lock. Under `--frozen` each package re-resolves to the lock's pinned
18
- * revision and keeps its `resolvedAt`, so an unchanged update rewrites a
19
- * byte-identical lock.
15
+ * effect at all). The returned Task models the mutations: the active-pack
16
+ * pointer write (undo restores or removes the prior pointer) and the package
17
+ * skill symlinks.
18
+ *
19
+ * Pinning a revision is the ref's job, not a flag's: put a SHA in the source
20
+ * (`git+https://…#<sha>`) and every update resolves to exactly that commit.
20
21
  */
21
22
 
22
23
  import {
@@ -29,29 +30,25 @@ import {
29
30
  type Task,
30
31
  writeFile,
31
32
  } from "@canonical/task";
32
- import { RECOVERY_CLI_PREFIX, VERSION } from "../../constants.js";
33
- import type { PackageEntry } from "../../kernel/config/types.js";
34
- import { PragmaError } from "../../kernel/error/PragmaError.js";
35
- import { cliRecovery } from "../../kernel/error/recovery.js";
33
+ import { VERSION } from "../../constants.js";
34
+ import { cliRecovery, PragmaError } from "../../kernel/error/index.js";
35
+ // DIRECT LEAF IMPORT, not `graphpack/index.js`. The barrel re-exports
36
+ // `embedded.ts`, which statically imports the ~1.9 MB generated pack — and
37
+ // with per-file `tsc` output ESM evaluates that re-export when this module
38
+ // loads. `sources update` builds a USER pack; it must not pay the embedded
39
+ // pack's cost to do it.
36
40
  import { buildPack } from "../../kernel/runtime/graphpack/build.js";
37
- import {
38
- type PragmaLock,
39
- readLock,
40
- serializeLock,
41
- } from "../../kernel/runtime/lock.js";
42
- import { LOCK_BASENAME, lockPath } from "../../kernel/runtime/paths.js";
43
- import type { PackageRef } from "../../kernel/runtime/refs/parseRef.js";
44
- import {
45
- parsePackageEntry,
46
- redactUrl,
47
- } from "../../kernel/runtime/refs/parseRef.js";
41
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
42
+ import { activePackPath, readActivePack } from "../../kernel/runtime/paths.js";
43
+ import type { PackageRef } from "../../kernel/runtime/refs/index.js";
48
44
  import {
49
45
  detectPrefixClashes,
50
46
  harvestPrefixes,
47
+ parsePackDeclaration,
51
48
  type ResolvedPackage,
49
+ redactUrl,
52
50
  resolvePackage,
53
- } from "../../kernel/runtime/refs/resolve.js";
54
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
51
+ } from "../../kernel/runtime/refs/index.js";
55
52
  import { installedSkillsDir } from "../skill/discover.js";
56
53
  import { planSkillInstall } from "./installSkills.js";
57
54
  import type { SourcesUpdateData } from "./types.js";
@@ -67,17 +64,43 @@ const CORE_PREFIXES: Readonly<Record<string, string>> = {
67
64
  dcterms: "http://purl.org/dc/terms/",
68
65
  };
69
66
 
70
- const entryName = (entry: PackageEntry): string =>
71
- typeof entry === "string" ? entry : entry.name;
67
+ /**
68
+ * The prefix map a pack is built with: core < the packs' own `@prefix` < config.
69
+ *
70
+ * A resolved package's own declarations are harvested from its TTL (ke does not
71
+ * fold parsed-Turtle prefixes into `store.prefixes`) and merged beneath config
72
+ * so the index compacts pack URIs to `pfx:Local` — the FROZEN `{name,type}`
73
+ * token contract — while config still wins any clash. The merged map is
74
+ * persisted in the manifest, so boot reads the same names.
75
+ *
76
+ * Exported because the bundler (`scripts/bundle.ts`) compiles the embedded pack
77
+ * through this exact precedence. If the two pipelines computed prefixes
78
+ * separately, the embed could compact entities differently from what the SAME
79
+ * config produces on a user's machine — a silent divergence in entity names.
80
+ *
81
+ * @param inputs - The resolved packages' labelled RDF sources.
82
+ * @param configPrefixes - The config layer's `prefixes`, if any.
83
+ * @returns The merged prefix map to build with.
84
+ */
85
+ export function buildPackPrefixes(
86
+ inputs: readonly { readonly content: string }[],
87
+ configPrefixes: Readonly<Record<string, string>> | undefined,
88
+ ): Record<string, string> {
89
+ return {
90
+ ...CORE_PREFIXES,
91
+ ...harvestPrefixes(inputs),
92
+ ...(configPrefixes ?? {}),
93
+ };
94
+ }
72
95
 
73
96
  /**
74
97
  * Build the NETWORK-FREE preview plan for `sources update`.
75
98
  *
76
99
  * A plan-only Task: it reads the config to list the refs a real update would
77
- * resolve and build, then models the single project mutation (the lock write)
78
- * as effects the dry-run interpreter can describe WITHOUT running them. No git,
79
- * no compile, no cache write — so `--dry-run` and an MCP plan-first call are
80
- * offline-safe. Config refs are parsed (a cheap, offline validity check) but
100
+ * resolve and build, then models the project mutation (the active-pack pointer
101
+ * write) as effects the dry-run interpreter can describe WITHOUT running them.
102
+ * No git, no compile, no cache write — so `--dry-run` and an MCP plan-first call
103
+ * are offline-safe. Config refs are parsed (a cheap, offline validity check) but
81
104
  * never resolved.
82
105
  *
83
106
  * @param runtime - The per-invocation runtime.
@@ -87,57 +110,51 @@ async function buildUpdatePlan(
87
110
  runtime: PragmaRuntime,
88
111
  ): Promise<Task<SourcesUpdateData>> {
89
112
  const layers = await runtime.loadConfig();
90
- const entries = layers.config.packages ?? [];
91
- const refs = entries.map(parsePackageEntry);
92
- const path = lockPath(runtime.cwd);
113
+ const entries = layers.config.packs ?? [];
114
+ const refs = entries.map(parsePackDeclaration);
93
115
 
94
116
  const data: SourcesUpdateData = {
95
117
  contentHash: "",
96
118
  reused: false,
97
- lockPath: path,
98
- packs: refs.map((ref) => ({ name: ref.pkg, resolved: "", sourceCount: 0 })),
99
- };
100
- // A representative (never-written) lock, so the previewed write shows a
101
- // plausible shape/size. Placeholders make clear nothing was resolved.
102
- const previewLock: PragmaLock = {
103
- version: 1,
104
- contentHash: "(resolved on execute)",
105
119
  packs: refs.map((ref) => ({
106
120
  name: ref.pkg,
107
- source: ref.source,
108
- resolved: "(resolved on execute)",
109
- resolvedAt: "(resolved on execute)",
121
+ resolved: "",
122
+ sourceCount: 0,
123
+ storyCount: 0,
110
124
  })),
111
125
  };
112
- const previewContent = serializeLock(previewLock);
113
126
 
114
127
  return gen(function* () {
115
128
  yield* $(
116
129
  info(
117
130
  refs.length > 0
118
- ? `Resolve and build ${refs.length} package(s): ${refs.map((ref) => ref.source).join(", ")}`
119
- : "No packages configured — the embedded pack answers store reads",
131
+ ? `Resolve and build ${refs.length} pack(s): ${refs.map((ref) => ref.source).join(", ")}`
132
+ : "No packs configured — the embedded pack answers store reads",
120
133
  ),
121
134
  );
122
- // The one project mutation, previewed (dry-run never executes it).
123
- yield* $(writeFile(path, previewContent));
135
+ // The project mutation, previewed (dry-run never executes it). The content
136
+ // is a placeholder: the real hash only exists once the build has run.
137
+ yield* $(
138
+ writeFile(activePackPath(runtime.cwd), "(the pack hash, on execute)"),
139
+ );
124
140
  return data;
125
141
  });
126
142
  }
127
143
 
128
144
  /**
129
- * Resolve, build, and produce the lock-writing Task — or, for a preview, the
145
+ * Resolve, build, and produce the pointer-writing Task — or, for a preview, the
130
146
  * network-free plan.
131
147
  *
132
148
  * @param runtime - The per-invocation runtime.
133
- * @param frozen - When true, re-resolve to the lock's pinned revisions only.
134
- * @returns A Task that writes `pragma.lock.json` and returns the update result.
149
+ * @param skipInvalid - Drop sources that fail to parse (warning about each)
150
+ * rather than failing the whole update.
151
+ * @returns A Task that points the project at the built pack and returns the
152
+ * update result.
135
153
  * @note Impure — resolves packages (may hit git) and builds the pack eagerly,
136
154
  * UNLESS `runtime.mutation.preview` is set, in which case it stays offline.
137
155
  */
138
156
  export async function buildUpdateTask(
139
157
  runtime: PragmaRuntime,
140
- frozen: boolean,
141
158
  skipInvalid = false,
142
159
  ): Promise<Task<SourcesUpdateData>> {
143
160
  if (runtime.mutation?.preview) return buildUpdatePlan(runtime);
@@ -149,75 +166,80 @@ export async function buildUpdateTask(
149
166
  const verbose = runtime.globalFlags.verbose;
150
167
 
151
168
  const layers = await runtime.loadConfig();
152
- const entries = layers.config.packages ?? [];
153
- const existing = readLock(runtime.cwd);
154
- const priorContent = existing ? serializeLock(existing) : undefined;
169
+ const entries = layers.config.packs ?? [];
170
+ const priorHash = readActivePack(runtime.cwd);
155
171
 
156
- const resolved: ResolvedPackage[] = [];
172
+ const resolved: (ResolvedPackage & { readonly kind: PackageRef["kind"] })[] =
173
+ [];
157
174
  for (const entry of entries) {
158
- const ref = parsePackageEntry(entry);
175
+ const ref = parsePackDeclaration(entry);
159
176
  report?.(resolveProgress(ref));
160
- const pinned = existing?.packs.find((pack) => pack.name === ref.pkg);
161
- resolved.push(
162
- await resolvePackage(ref, {
163
- cwd: runtime.cwd,
164
- frozen,
165
- pinned: pinned?.resolved,
166
- }),
167
- );
177
+ resolved.push({
178
+ kind: ref.kind,
179
+ ...(await resolvePackage(ref, { cwd: runtime.cwd })),
180
+ });
168
181
  }
169
182
 
170
- // Prefix precedence: core < pack < config. A resolved package's own
171
- // `@prefix` declarations are harvested from its TTL and merged beneath config
172
- // so the index compacts pack URIs to `pfx:Local` (the FROZEN {name,type}
173
- // token contract); config still wins any clash. The merged map is persisted
174
- // in the manifest, so boot reads the same names.
175
183
  const inputs = resolved.flatMap((pkg) => pkg.sources);
184
+ // The packages' own `stories/*.json`, carried into the pack verbatim (see
185
+ // graphpack/types.STORIES_FILE). Raw text: nothing interprets them here.
186
+ const stories = resolved.flatMap((pkg) => pkg.stories);
176
187
 
177
- // Refuse to lock an empty store (A4). A package that ships no `.ttl` (or no
178
- // configured packages at all) would build a 0-triple pack whose empty
188
+ // Refuse to build an empty store (A4). A package that ships no `.ttl` (or no
189
+ // configured packs at all) would build a 0-triple pack whose empty
179
190
  // `data.nq` fails the completeness gate — so the "successful" update boots to
180
191
  // a PERMANENT `STORE_UNAVAILABLE` loop. Fail loudly here, leaving the embedded
181
- // fallback (or the prior lock) intact, instead of writing that broken lock.
192
+ // pack (or the prior build) answering reads, instead of pointing at that one.
182
193
  if (inputs.length === 0) {
183
194
  throw PragmaError.configError(
184
195
  entries.length === 0
185
- ? "No packages are configured, so there are no sources to build a store from. The embedded sample pack answers reads until you add a package."
186
- : `The ${entries.length} configured package(s) resolved 0 RDF sources (no definitions/**.ttl or data/**.ttl). Refusing to write a lock for an empty store.`,
196
+ ? "No packs are configured, so there are no sources to build a store from. The embedded pack answers reads until you add a pack."
197
+ : `The ${entries.length} configured pack(s) resolved 0 RDF sources (no definitions/**.ttl or data/**.ttl). Refusing to build an empty store.`,
187
198
  {
188
199
  recovery: cliRecovery(
189
- `${RECOVERY_CLI_PREFIX}sources update --verbose`,
190
- "Add a package that ships `.ttl` under definitions/ or data/, then re-run.",
200
+ "sources update --verbose",
201
+ "Add a pack that ships `.ttl` under definitions/ or data/, then re-run.",
191
202
  ),
192
203
  },
193
204
  );
194
205
  }
195
206
 
196
- const prefixes = {
197
- ...CORE_PREFIXES,
198
- ...harvestPrefixes(inputs),
199
- ...(layers.config.prefixes ?? {}),
200
- };
207
+ const prefixes = buildPackPrefixes(inputs, layers.config.prefixes);
201
208
 
202
209
  // Warn on conflicting `@prefix` declarations across packages (A5): last-wins
203
210
  // is silent otherwise, compacting the losing package's URIs to the wrong
204
211
  // prefix. Display-only, so a warning (not a hard failure) is the right call.
205
212
  for (const clash of detectPrefixClashes(inputs)) {
206
213
  report?.(
207
- `Prefix "${clash.label}:" is declared with conflicting IRIs across packages (${clash.iris.join(" vs ")}); last wins, so some entities may compact to the wrong prefix.`,
214
+ `Prefix "${clash.label}:" is declared with conflicting IRIs across packs (${clash.iris.join(" vs ")}); last wins, so some entities may compact to the wrong prefix.`,
208
215
  );
209
216
  }
210
217
 
211
218
  report?.(`Building store from ${inputs.length} source(s)`);
212
219
  if (verbose) for (const input of inputs) report?.(` parse ${input.path}`);
220
+ if (stories.length > 0)
221
+ report?.(`Carrying ${stories.length} pack read story file(s)`);
213
222
 
214
223
  // Build the pack. On a parse/build failure, classify it as a NAMED data error
215
- // (U6) — not INTERNAL_ERROR's "please report this issue" — identifying the
224
+ // (U6) — not INTERNAL_ERROR's "report this issue" — identifying the
216
225
  // offending package source, since ke's parser error carries only line/column.
217
226
  // With `--skip-invalid`, drop the unparseable sources (warning LOUDLY about
218
227
  // each — never a silent partial graph) and build from the rest instead of
219
228
  // failing the whole update.
220
- const sourceRef = entries.map(entryName).join(",") || "embedded";
229
+ // `<name>@<kind>:<resolved>` — the SAME provenance label the bundler writes
230
+ // for the embed, so the manifest field means one thing whoever built the pack,
231
+ // and `sources status` / `doctor` can still answer "which revision is my store
232
+ // built from?" now that no lock records it. A `file:` pack resolves to a local
233
+ // PATH rather than a revision, so it contributes its name alone: a machine
234
+ // path is not provenance, and `sources status` already lists the ref.
235
+ const sourceRef =
236
+ resolved
237
+ .map((pkg) =>
238
+ pkg.kind === "file"
239
+ ? pkg.name
240
+ : `${pkg.name}@${pkg.kind}:${pkg.resolved}`,
241
+ )
242
+ .join(", ") || "embedded";
221
243
  let built: Awaited<ReturnType<typeof buildPack>>;
222
244
  try {
223
245
  built = await buildPack(inputs, {
@@ -225,6 +247,7 @@ export async function buildUpdateTask(
225
247
  version: VERSION,
226
248
  sourceRef,
227
249
  prefixes,
250
+ stories,
228
251
  });
229
252
  } catch (error) {
230
253
  if (!skipInvalid) throw await classifySourceBuildError(error, inputs);
@@ -241,10 +264,10 @@ export async function buildUpdateTask(
241
264
  );
242
265
  if (usableInputs.length === 0)
243
266
  throw PragmaError.configError(
244
- `All ${inputs.length} configured source(s) failed to parse — nothing to build.`,
267
+ `None of the ${inputs.length} configured source(s) can be parsed — nothing to build.`,
245
268
  {
246
269
  recovery: cliRecovery(
247
- `${RECOVERY_CLI_PREFIX}sources update --verbose`,
270
+ "sources update --verbose",
248
271
  "Fix the reported sources, then re-run.",
249
272
  ),
250
273
  },
@@ -256,11 +279,8 @@ export async function buildUpdateTask(
256
279
  sourceRef,
257
280
  // Re-harvest prefixes from only the sources that survived, so a dropped
258
281
  // file's declarations don't skew compaction.
259
- prefixes: {
260
- ...CORE_PREFIXES,
261
- ...harvestPrefixes(usableInputs),
262
- ...(layers.config.prefixes ?? {}),
263
- },
282
+ prefixes: buildPackPrefixes(usableInputs, layers.config.prefixes),
283
+ stories,
264
284
  });
265
285
  } catch (rebuildError) {
266
286
  throw await classifySourceBuildError(rebuildError, usableInputs);
@@ -270,78 +290,62 @@ export async function buildUpdateTask(
270
290
  `${built.reused ? "Reused" : "Built"} store ${built.contentHash.slice(0, 12)}`,
271
291
  );
272
292
 
273
- // Refuse to lock a 0-triple build (A4): non-empty sources can still parse to
274
- // no triples (e.g. comment-only TTL, or a file of only `@prefix` lines). A
275
- // locked empty pack boots to the same `STORE_UNAVAILABLE` loop, so treat it
276
- // as a data error rather than a silent "success". (A manifest predating the
277
- // triple count is left alone — `undefined` never trips this.)
293
+ // Refuse a 0-triple build (A4): non-empty sources can still parse to no
294
+ // triples (e.g. comment-only TTL, or a file of only `@prefix` lines). Pointing
295
+ // the project at an empty pack boots to the same `STORE_UNAVAILABLE` loop, so
296
+ // treat it as a data error rather than a silent "success". (A manifest
297
+ // predating the triple count is left alone — `undefined` never trips this.)
278
298
  if (built.manifest.tripleCount === 0) {
279
299
  throw PragmaError.configError(
280
- `The configured sources parsed to 0 RDF triples, so the store would be empty. Refusing to write a lock for an empty store.`,
300
+ `The configured sources parsed to 0 RDF triples, so the store would be empty. Refusing to build an empty store.`,
281
301
  {
282
302
  recovery: cliRecovery(
283
- `${RECOVERY_CLI_PREFIX}sources update --verbose`,
284
- "Check that the package sources actually contain RDF triples, then re-run.",
303
+ "sources update --verbose",
304
+ "Check that the pack sources actually contain RDF triples, then re-run.",
285
305
  ),
286
306
  },
287
307
  );
288
308
  }
289
309
 
290
- const now = new Date().toISOString();
291
- const lock: PragmaLock = {
292
- version: 1,
293
- contentHash: built.contentHash,
294
- packs: resolved.map((pkg) => {
295
- const prev = existing?.packs.find((entry) => entry.name === pkg.name);
296
- // Preserve the prior `resolvedAt` when nothing actually changed — under
297
- // --frozen (re-pinned to the same revision) AND on a plain re-run that
298
- // resolves the IDENTICAL revision from the same source. Otherwise every
299
- // `sources update` stamped a fresh timestamp and rewrote the lock, dirtying
300
- // the git tree on a no-op run (L1). A moved revision still restamps.
301
- const reproducible =
302
- prev !== undefined &&
303
- (frozen ||
304
- (prev.resolved === pkg.resolved && prev.source === pkg.source));
305
- return {
306
- name: pkg.name,
307
- source: pkg.source,
308
- resolved: pkg.resolved,
309
- resolvedAt: reproducible && prev ? prev.resolvedAt : now,
310
- };
311
- }),
312
- };
313
- const newContent = serializeLock(lock);
314
- const path = lockPath(runtime.cwd);
315
-
310
+ const path = activePackPath(runtime.cwd);
316
311
  const data: SourcesUpdateData = {
317
312
  contentHash: built.contentHash,
318
313
  reused: built.reused,
319
- lockPath: path,
320
314
  packs: resolved.map((pkg) => ({
321
315
  name: pkg.name,
322
316
  resolved: pkg.resolved,
323
317
  sourceCount: pkg.sources.length,
318
+ storyCount: pkg.stories.length,
324
319
  })),
325
320
  };
326
321
 
327
322
  const undo =
328
- priorContent !== undefined
329
- ? writeFile(path, priorContent)
330
- : deleteFile(path);
323
+ priorHash !== undefined ? writeFile(path, priorHash) : deleteFile(path);
331
324
 
332
325
  // Install package-provided skills (U10): symlink each resolved package's
333
326
  // `skills/*` into the installed-skills root, so `skill list` / `setup skills`
334
- // see them after an update. Kept in this Task (reversible: created links carry
335
- // an unlink undo) so `sources update --undo` also removes them.
336
- const skillLinks = planSkillInstall(resolved).filter(
337
- (link) => link.action !== "skipped",
327
+ // see them after an update — and RETIRE the links of skills those packages
328
+ // have since dropped, which the same plan reports as `pruned`. Kept in this
329
+ // Task (reversible: a created link carries an unlink undo, a pruned one a
330
+ // re-link undo) so `sources update --undo` restores the root as it was.
331
+ //
332
+ // The two are split, not counted together: a prune is a deletion, so folding
333
+ // it into "Installing N skill(s)" would report a removal as an install.
334
+ const skillPlan = planSkillInstall(resolved);
335
+ const skillLinks = skillPlan.filter(
336
+ (link) => link.action === "created" || link.action === "replaced",
338
337
  );
338
+ const staleLinks = skillPlan.filter((link) => link.action === "pruned");
339
339
  if (skillLinks.length > 0)
340
340
  report?.(`Installing ${skillLinks.length} skill(s)`);
341
+ if (staleLinks.length > 0)
342
+ report?.(
343
+ `Removing ${staleLinks.length} skill link(s) no longer provided by any package`,
344
+ );
341
345
 
342
- report?.(`Writing ${LOCK_BASENAME}`);
346
+ report?.(`Pointing ${runtime.cwd} at pack ${built.contentHash.slice(0, 12)}`);
343
347
  return gen(function* () {
344
- yield* $(writeFile(path, newContent, { undo }));
348
+ yield* $(writeFile(path, built.contentHash, { undo }));
345
349
  if (skillLinks.length > 0) {
346
350
  yield* $(mkdir(installedSkillsDir(), true));
347
351
  for (const link of skillLinks) {
@@ -353,6 +357,25 @@ export async function buildUpdateTask(
353
357
  );
354
358
  }
355
359
  }
360
+ // No `mkdir` guard here: a stale link can only have been enumerated FROM
361
+ // the installed root, so the root necessarily exists.
362
+ //
363
+ // The undo re-creates the link exactly as found — dangling target and all —
364
+ // because undo's job is to restore the prior state, not to improve on it. It
365
+ // clears the path first because the undo interpreter MOCKS forward effects
366
+ // when collecting: the delete above may never have run, and `fs.symlink`
367
+ // refuses a path that already exists. Same delete-then-link shape the
368
+ // `replaced` branch above uses, for the same reason.
369
+ for (const stale of staleLinks) {
370
+ yield* $(
371
+ deleteFile(stale.linkPath, {
372
+ undo: gen(function* () {
373
+ yield* $(deleteFile(stale.linkPath));
374
+ yield* $(symlink(stale.target, stale.linkPath));
375
+ }),
376
+ }),
377
+ );
378
+ }
356
379
  return data;
357
380
  });
358
381
  }
@@ -394,12 +417,12 @@ export async function classifySourceBuildError(
394
417
  const culprit = await isolateBadSource(inputs);
395
418
  const detail = culprit?.message ?? parserMessage;
396
419
  const where = culprit
397
- ? `Package source "${culprit.path}" could not be parsed`
398
- : "The configured package sources could not be built into a store";
420
+ ? `Pack source "${culprit.path}" cannot be parsed`
421
+ : "The configured packs cannot be built into a store";
399
422
  return PragmaError.configError(`${where}: ${detail}`, {
400
423
  recovery: cliRecovery(
401
- `${RECOVERY_CLI_PREFIX}sources update --verbose`,
402
- "Re-run with --verbose to see each file as it parses. If a package ships malformed RDF, report it to that package's maintainer.",
424
+ "sources update --verbose",
425
+ "Re-run with --verbose to see each file as it parses. If a pack ships malformed RDF, report it to that pack's maintainer.",
403
426
  ),
404
427
  });
405
428
  }