@canonical/pragma-cli 0.34.0 → 0.36.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 (832) hide show
  1. package/README.md +153 -30
  2. package/bundled-skills/add-standard/SKILL.md +338 -0
  3. package/bundled-skills/adoption-a1-styles/SKILL.md +269 -0
  4. package/bundled-skills/adoption-a2-components/SKILL.md +291 -0
  5. package/bundled-skills/adoption-a3-forms/SKILL.md +260 -0
  6. package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +406 -0
  7. package/bundled-skills/anatomy-author/SKILL.md +1226 -0
  8. package/bundled-skills/design-auditor/SKILL.md +455 -0
  9. package/bundled-skills/implement-component/SKILL.md +333 -0
  10. package/bundled-skills/specify-component/SKILL.md +331 -0
  11. package/bundled-skills/specify-pattern/SKILL.md +292 -0
  12. package/dist/.build-ok +0 -0
  13. package/dist/package.json +84 -0
  14. package/dist/pragma.conf.js +1016 -0
  15. package/dist/pragma.conf.js.map +1 -0
  16. package/dist/src/bin.js +356 -0
  17. package/dist/src/bin.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  19. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  20. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  21. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  22. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  23. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  24. package/dist/src/capabilities/capabilities/hints.js +195 -0
  25. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  26. package/dist/src/capabilities/capabilities/index.js +11 -0
  27. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  28. package/dist/src/capabilities/capabilities/types.js +11 -0
  29. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  30. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  31. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  32. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  33. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  34. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  35. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  36. package/dist/src/capabilities/colophon/index.js +5 -0
  37. package/dist/src/capabilities/colophon/index.js.map +1 -0
  38. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  39. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  40. package/dist/src/capabilities/colophon/types.js +10 -0
  41. package/dist/src/capabilities/colophon/types.js.map +1 -0
  42. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  43. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  44. package/dist/src/capabilities/config/field.render.js +22 -0
  45. package/dist/src/capabilities/config/field.render.js.map +1 -0
  46. package/dist/src/capabilities/config/fields.js +46 -0
  47. package/dist/src/capabilities/config/fields.js.map +1 -0
  48. package/dist/src/capabilities/config/get.verb.js +61 -0
  49. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/index.js +5 -0
  51. package/dist/src/capabilities/config/index.js.map +1 -0
  52. package/dist/src/capabilities/config/runField.js +59 -0
  53. package/dist/src/capabilities/config/runField.js.map +1 -0
  54. package/dist/src/capabilities/config/runGet.js +28 -0
  55. package/dist/src/capabilities/config/runGet.js.map +1 -0
  56. package/dist/src/capabilities/config/runSet.js +53 -0
  57. package/dist/src/capabilities/config/runSet.js.map +1 -0
  58. package/dist/src/capabilities/config/set.verb.js +66 -0
  59. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  60. package/dist/src/capabilities/config/show.render.js +84 -0
  61. package/dist/src/capabilities/config/show.render.js.map +1 -0
  62. package/dist/src/capabilities/config/show.verb.js +44 -0
  63. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  64. package/dist/src/capabilities/config/types.js +5 -0
  65. package/dist/src/capabilities/config/types.js.map +1 -0
  66. package/dist/src/capabilities/config/unset.verb.js +49 -0
  67. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  68. package/dist/src/capabilities/create/cliProjection.js +195 -0
  69. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  70. package/dist/src/capabilities/create/constants.js +47 -0
  71. package/dist/src/capabilities/create/constants.js.map +1 -0
  72. package/dist/src/capabilities/create/create.render.js +100 -0
  73. package/dist/src/capabilities/create/create.render.js.map +1 -0
  74. package/dist/src/capabilities/create/create.verb.js +438 -0
  75. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  76. package/dist/src/capabilities/create/createHelp.js +47 -0
  77. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  78. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  79. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  80. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  81. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  82. package/dist/src/capabilities/create/index.js +18 -0
  83. package/dist/src/capabilities/create/index.js.map +1 -0
  84. package/dist/src/capabilities/create/messages.js +16 -0
  85. package/dist/src/capabilities/create/messages.js.map +1 -0
  86. package/dist/src/capabilities/create/mount.js +294 -0
  87. package/dist/src/capabilities/create/mount.js.map +1 -0
  88. package/dist/src/capabilities/create/pathJail.js +65 -0
  89. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  90. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  91. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  92. package/dist/src/capabilities/create/types.js +2 -0
  93. package/dist/src/capabilities/create/types.js.map +1 -0
  94. package/dist/src/capabilities/distribution.js +40 -0
  95. package/dist/src/capabilities/distribution.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  97. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  99. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +148 -0
  101. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  102. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  103. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  104. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  105. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  106. package/dist/src/capabilities/doctor/checks/harnessInventory.js +195 -0
  107. package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -0
  108. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  109. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  110. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  111. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  112. package/dist/src/capabilities/doctor/checks/targetHealth.js +349 -0
  113. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  114. package/dist/src/capabilities/doctor/doctor.render.js +164 -0
  115. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  116. package/dist/src/capabilities/doctor/doctor.verb.js +49 -0
  117. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  118. package/dist/src/capabilities/doctor/index.js +5 -0
  119. package/dist/src/capabilities/doctor/index.js.map +1 -0
  120. package/dist/src/capabilities/doctor/runChecks.js +86 -0
  121. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  122. package/dist/src/capabilities/doctor/types.js +5 -0
  123. package/dist/src/capabilities/doctor/types.js.map +1 -0
  124. package/dist/src/capabilities/graph/index.js +19 -0
  125. package/dist/src/capabilities/graph/index.js.map +1 -0
  126. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  127. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  128. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  129. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  130. package/dist/src/capabilities/graph/query.render.js +73 -0
  131. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  132. package/dist/src/capabilities/graph/query.verb.js +49 -0
  133. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  134. package/dist/src/capabilities/graph/runQuery.js +41 -0
  135. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  136. package/dist/src/capabilities/index.js +56 -0
  137. package/dist/src/capabilities/index.js.map +1 -0
  138. package/dist/src/capabilities/info/collectInfo.js +72 -0
  139. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  140. package/dist/src/capabilities/info/index.js +5 -0
  141. package/dist/src/capabilities/info/index.js.map +1 -0
  142. package/dist/src/capabilities/info/info.render.js +57 -0
  143. package/dist/src/capabilities/info/info.render.js.map +1 -0
  144. package/dist/src/capabilities/info/info.verb.js +42 -0
  145. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  146. package/dist/src/capabilities/info/types.js +5 -0
  147. package/dist/src/capabilities/info/types.js.map +1 -0
  148. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  149. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  150. package/dist/src/capabilities/meta/index.js +13 -0
  151. package/dist/src/capabilities/meta/index.js.map +1 -0
  152. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  153. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  154. package/dist/src/capabilities/ontology/index.js +21 -0
  155. package/dist/src/capabilities/ontology/index.js.map +1 -0
  156. package/dist/src/capabilities/ontology/queries.js +123 -0
  157. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  158. package/dist/src/capabilities/ontology/render.js +66 -0
  159. package/dist/src/capabilities/ontology/render.js.map +1 -0
  160. package/dist/src/capabilities/ontology/verbs.js +181 -0
  161. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  162. package/dist/src/capabilities/prompt/index.js +16 -0
  163. package/dist/src/capabilities/prompt/index.js.map +1 -0
  164. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  165. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  166. package/dist/src/capabilities/prompt/types.js +10 -0
  167. package/dist/src/capabilities/prompt/types.js.map +1 -0
  168. package/dist/src/capabilities/prompt/verbs.js +93 -0
  169. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  170. package/dist/src/capabilities/resources/index.js +10 -0
  171. package/dist/src/capabilities/resources/index.js.map +1 -0
  172. package/dist/src/capabilities/resources/provider.js +423 -0
  173. package/dist/src/capabilities/resources/provider.js.map +1 -0
  174. package/dist/src/capabilities/setup/buildPlan.js +172 -0
  175. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  176. package/dist/src/capabilities/setup/index.js +5 -0
  177. package/dist/src/capabilities/setup/index.js.map +1 -0
  178. package/dist/src/capabilities/setup/mode.js +53 -0
  179. package/dist/src/capabilities/setup/mode.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/index.js +39 -0
  181. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  182. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  183. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  184. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  185. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  186. package/dist/src/capabilities/setup/operations/setupGenerator.js +390 -0
  187. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  188. package/dist/src/capabilities/setup/operations/setupLsp.js +329 -0
  189. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  190. package/dist/src/capabilities/setup/operations/setupMcp.js +253 -0
  191. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  192. package/dist/src/capabilities/setup/operations/setupSkills.js +594 -0
  193. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  194. package/dist/src/capabilities/setup/plan.js +128 -0
  195. package/dist/src/capabilities/setup/plan.js.map +1 -0
  196. package/dist/src/capabilities/setup/plan.render.js +271 -0
  197. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  198. package/dist/src/capabilities/setup/setup.render.js +54 -0
  199. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  200. package/dist/src/capabilities/setup/setup.verb.js +387 -0
  201. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  202. package/dist/src/capabilities/setup/shell.js +196 -0
  203. package/dist/src/capabilities/setup/shell.js.map +1 -0
  204. package/dist/src/capabilities/setup/targets.js +328 -0
  205. package/dist/src/capabilities/setup/targets.js.map +1 -0
  206. package/dist/src/capabilities/setup/types.js +5 -0
  207. package/dist/src/capabilities/setup/types.js.map +1 -0
  208. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  209. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  210. package/dist/src/capabilities/shared/index.js +27 -0
  211. package/dist/src/capabilities/shared/index.js.map +1 -0
  212. package/dist/src/capabilities/shared/packageManager.js +349 -0
  213. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  214. package/dist/src/capabilities/shared/registry.js +55 -0
  215. package/dist/src/capabilities/shared/registry.js.map +1 -0
  216. package/dist/src/capabilities/skill/discover.js +281 -0
  217. package/dist/src/capabilities/skill/discover.js.map +1 -0
  218. package/dist/src/capabilities/skill/index.js +10 -0
  219. package/dist/src/capabilities/skill/index.js.map +1 -0
  220. package/dist/src/capabilities/skill/render.js +49 -0
  221. package/dist/src/capabilities/skill/render.js.map +1 -0
  222. package/dist/src/capabilities/skill/verbs.js +83 -0
  223. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  224. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  225. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  226. package/dist/src/capabilities/sources/index.js +13 -0
  227. package/dist/src/capabilities/sources/index.js.map +1 -0
  228. package/dist/src/capabilities/sources/installSkills.js +309 -0
  229. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  230. package/dist/src/capabilities/sources/runUpdate.js +460 -0
  231. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  232. package/dist/src/capabilities/sources/status.render.js +64 -0
  233. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  234. package/dist/src/capabilities/sources/status.verb.js +40 -0
  235. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  236. package/dist/src/capabilities/sources/types.js +6 -0
  237. package/dist/src/capabilities/sources/types.js.map +1 -0
  238. package/dist/src/capabilities/sources/update.render.js +34 -0
  239. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  240. package/dist/src/capabilities/sources/update.verb.js +55 -0
  241. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  242. package/dist/src/capabilities/upgrade/index.js +5 -0
  243. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  244. package/dist/src/capabilities/upgrade/runUpgrade.js +135 -0
  245. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  246. package/dist/src/capabilities/upgrade/types.js +5 -0
  247. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  248. package/dist/src/capabilities/upgrade/upgrade.render.js +52 -0
  249. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  250. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  251. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  252. package/dist/src/capabilities/version/index.js +10 -0
  253. package/dist/src/capabilities/version/index.js.map +1 -0
  254. package/dist/src/capabilities/version/version.verb.js +36 -0
  255. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  256. package/dist/src/constants.js +87 -0
  257. package/dist/src/constants.js.map +1 -0
  258. package/dist/src/index.js +12 -0
  259. package/dist/src/index.js.map +1 -0
  260. package/dist/src/kernel/completion/complete.js +66 -0
  261. package/dist/src/kernel/completion/complete.js.map +1 -0
  262. package/dist/src/kernel/completion/emitScripts.js +92 -0
  263. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  264. package/dist/src/kernel/completion/entitySource.js +285 -0
  265. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  266. package/dist/src/kernel/completion/index.js +14 -0
  267. package/dist/src/kernel/completion/index.js.map +1 -0
  268. package/dist/src/kernel/completion/model.js +301 -0
  269. package/dist/src/kernel/completion/model.js.map +1 -0
  270. package/dist/src/kernel/completion/parse.js +253 -0
  271. package/dist/src/kernel/completion/parse.js.map +1 -0
  272. package/dist/src/kernel/completion/rank.js +101 -0
  273. package/dist/src/kernel/completion/rank.js.map +1 -0
  274. package/dist/src/kernel/completion/resolve.js +100 -0
  275. package/dist/src/kernel/completion/resolve.js.map +1 -0
  276. package/dist/src/kernel/completion/templates/bash.js +209 -0
  277. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  278. package/dist/src/kernel/completion/templates/fish.js +214 -0
  279. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  280. package/dist/src/kernel/completion/templates/index.js +23 -0
  281. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  282. package/dist/src/kernel/completion/templates/shared.js +98 -0
  283. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  284. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  285. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  286. package/dist/src/kernel/completion/types.js +13 -0
  287. package/dist/src/kernel/completion/types.js.map +1 -0
  288. package/dist/src/kernel/config/defaults.js +17 -0
  289. package/dist/src/kernel/config/defaults.js.map +1 -0
  290. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  291. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  292. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  293. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  294. package/dist/src/kernel/config/firstRun.js +34 -0
  295. package/dist/src/kernel/config/firstRun.js.map +1 -0
  296. package/dist/src/kernel/config/globalConfig.js +79 -0
  297. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  298. package/dist/src/kernel/config/index.js +16 -0
  299. package/dist/src/kernel/config/index.js.map +1 -0
  300. package/dist/src/kernel/config/paths.js +35 -0
  301. package/dist/src/kernel/config/paths.js.map +1 -0
  302. package/dist/src/kernel/config/readConfig.js +78 -0
  303. package/dist/src/kernel/config/readConfig.js.map +1 -0
  304. package/dist/src/kernel/config/schema.js +130 -0
  305. package/dist/src/kernel/config/schema.js.map +1 -0
  306. package/dist/src/kernel/config/types.js +19 -0
  307. package/dist/src/kernel/config/types.js.map +1 -0
  308. package/dist/src/kernel/config/writeConfigField.js +59 -0
  309. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  310. package/dist/src/kernel/copy.js +43 -0
  311. package/dist/src/kernel/copy.js.map +1 -0
  312. package/dist/src/kernel/error/PragmaError.js +149 -0
  313. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  314. package/dist/src/kernel/error/constants.js +40 -0
  315. package/dist/src/kernel/error/constants.js.map +1 -0
  316. package/dist/src/kernel/error/fromTaskError.js +96 -0
  317. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  318. package/dist/src/kernel/error/index.js +13 -0
  319. package/dist/src/kernel/error/index.js.map +1 -0
  320. package/dist/src/kernel/error/recovery.js +52 -0
  321. package/dist/src/kernel/error/recovery.js.map +1 -0
  322. package/dist/src/kernel/error/renderError.js +115 -0
  323. package/dist/src/kernel/error/renderError.js.map +1 -0
  324. package/dist/src/kernel/error/serialize.js +25 -0
  325. package/dist/src/kernel/error/serialize.js.map +1 -0
  326. package/dist/src/kernel/error/types.js +9 -0
  327. package/dist/src/kernel/error/types.js.map +1 -0
  328. package/dist/src/kernel/index.js +34 -0
  329. package/dist/src/kernel/index.js.map +1 -0
  330. package/dist/src/kernel/interactivity.js +68 -0
  331. package/dist/src/kernel/interactivity.js.map +1 -0
  332. package/dist/src/kernel/packs/collect.js +187 -0
  333. package/dist/src/kernel/packs/collect.js.map +1 -0
  334. package/dist/src/kernel/packs/compile.js +304 -0
  335. package/dist/src/kernel/packs/compile.js.map +1 -0
  336. package/dist/src/kernel/packs/disclosure.js +76 -0
  337. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  338. package/dist/src/kernel/packs/glob.js +38 -0
  339. package/dist/src/kernel/packs/glob.js.map +1 -0
  340. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  341. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  342. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  343. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  344. package/dist/src/kernel/packs/graphql/index.js +20 -0
  345. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  346. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  347. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  348. package/dist/src/kernel/packs/index.js +34 -0
  349. package/dist/src/kernel/packs/index.js.map +1 -0
  350. package/dist/src/kernel/packs/iri.js +110 -0
  351. package/dist/src/kernel/packs/iri.js.map +1 -0
  352. package/dist/src/kernel/packs/renderPack.js +129 -0
  353. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  354. package/dist/src/kernel/packs/resolveEntity.js +274 -0
  355. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  356. package/dist/src/kernel/packs/runBodies.js +140 -0
  357. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  358. package/dist/src/kernel/packs/sample.js +56 -0
  359. package/dist/src/kernel/packs/sample.js.map +1 -0
  360. package/dist/src/kernel/packs/schema.js +421 -0
  361. package/dist/src/kernel/packs/schema.js.map +1 -0
  362. package/dist/src/kernel/packs/sparql/applyFilters.js +167 -0
  363. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  364. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  365. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  366. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +480 -0
  367. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  368. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  369. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  370. package/dist/src/kernel/packs/sparql/index.js +31 -0
  371. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  372. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  373. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  374. package/dist/src/kernel/packs/types.js +30 -0
  375. package/dist/src/kernel/packs/types.js.map +1 -0
  376. package/dist/src/kernel/packs/uniqueness.js +30 -0
  377. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  378. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  379. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  380. package/dist/src/kernel/project/cli/constants.js +27 -0
  381. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  382. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  383. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  384. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  385. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  386. package/dist/src/kernel/project/cli/globalFlags.js +219 -0
  387. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  388. package/dist/src/kernel/project/cli/helpFormat.js +58 -0
  389. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  390. package/dist/src/kernel/project/cli/index.js +14 -0
  391. package/dist/src/kernel/project/cli/index.js.map +1 -0
  392. package/dist/src/kernel/project/cli/rootHelp.js +227 -0
  393. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  394. package/dist/src/kernel/project/cli/suggest.js +75 -0
  395. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  396. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  397. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  398. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  399. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  401. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  403. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/index.js +8 -0
  405. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  407. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  408. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  409. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  410. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  411. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  412. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  413. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  414. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  415. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  416. package/dist/src/kernel/project/mcp/registerVerb.js +315 -0
  417. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  418. package/dist/src/kernel/project/mcp/serve.js +35 -0
  419. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  420. package/dist/src/kernel/render/compactUri.js +24 -0
  421. package/dist/src/kernel/render/compactUri.js.map +1 -0
  422. package/dist/src/kernel/render/contracts.js +10 -0
  423. package/dist/src/kernel/render/contracts.js.map +1 -0
  424. package/dist/src/kernel/render/disclosure.js +34 -0
  425. package/dist/src/kernel/render/disclosure.js.map +1 -0
  426. package/dist/src/kernel/render/envelope.js +30 -0
  427. package/dist/src/kernel/render/envelope.js.map +1 -0
  428. package/dist/src/kernel/render/formatters.js +27 -0
  429. package/dist/src/kernel/render/formatters.js.map +1 -0
  430. package/dist/src/kernel/render/index.js +15 -0
  431. package/dist/src/kernel/render/index.js.map +1 -0
  432. package/dist/src/kernel/render/prefixes.js +46 -0
  433. package/dist/src/kernel/render/prefixes.js.map +1 -0
  434. package/dist/src/kernel/render/renderers.js +468 -0
  435. package/dist/src/kernel/render/renderers.js.map +1 -0
  436. package/dist/src/kernel/render/style.js +105 -0
  437. package/dist/src/kernel/render/style.js.map +1 -0
  438. package/dist/src/kernel/render/turtle.js +194 -0
  439. package/dist/src/kernel/render/turtle.js.map +1 -0
  440. package/dist/src/kernel/render/vocabulary.js +174 -0
  441. package/dist/src/kernel/render/vocabulary.js.map +1 -0
  442. package/dist/src/kernel/render/writeStdout.js +43 -0
  443. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  444. package/dist/src/kernel/runtime/boot.js +49 -0
  445. package/dist/src/kernel/runtime/boot.js.map +1 -0
  446. package/dist/src/kernel/runtime/facade.js +39 -0
  447. package/dist/src/kernel/runtime/facade.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  449. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  451. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  453. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  455. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  457. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  459. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  460. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  461. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  462. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  463. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  464. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  465. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  466. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  467. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  468. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  469. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  470. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  471. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  472. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  473. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  474. package/dist/src/kernel/runtime/index.js +8 -0
  475. package/dist/src/kernel/runtime/index.js.map +1 -0
  476. package/dist/src/kernel/runtime/loadSession.js +34 -0
  477. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  478. package/dist/src/kernel/runtime/paths.js +78 -0
  479. package/dist/src/kernel/runtime/paths.js.map +1 -0
  480. package/dist/src/kernel/runtime/probe.js +37 -0
  481. package/dist/src/kernel/runtime/probe.js.map +1 -0
  482. package/dist/src/kernel/runtime/readEntity.js +363 -0
  483. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  484. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  485. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  486. package/dist/src/kernel/runtime/refs/index.js +29 -0
  487. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  488. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  489. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  490. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  491. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  492. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  493. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  494. package/dist/src/kernel/runtime/store.js +75 -0
  495. package/dist/src/kernel/runtime/store.js.map +1 -0
  496. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  497. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  498. package/dist/src/kernel/runtime/types.js +11 -0
  499. package/dist/src/kernel/runtime/types.js.map +1 -0
  500. package/dist/src/kernel/spec/asVerb.js +21 -0
  501. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  502. package/dist/src/kernel/spec/emitReference.js +578 -0
  503. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  504. package/dist/src/kernel/spec/emitSurface.js +202 -0
  505. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  506. package/dist/src/kernel/spec/index.js +11 -0
  507. package/dist/src/kernel/spec/index.js.map +1 -0
  508. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  509. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  510. package/dist/src/kernel/spec/types.js +14 -0
  511. package/dist/src/kernel/spec/types.js.map +1 -0
  512. package/dist/src/kernel/spec/validate.js +110 -0
  513. package/dist/src/kernel/spec/validate.js.map +1 -0
  514. package/dist/src/kernel/vocabulary.js +97 -0
  515. package/dist/src/kernel/vocabulary.js.map +1 -0
  516. package/dist/src/types.js +11 -0
  517. package/dist/src/types.js.map +1 -0
  518. package/package.json +22 -23
  519. package/pragma.conf.ts +486 -90
  520. package/src/bin.ts +274 -82
  521. package/src/capabilities/block.parity.test.ts +29 -12
  522. package/src/capabilities/block.shipped.exec.test.ts +282 -0
  523. package/src/capabilities/block.tierRank.exec.test.ts +300 -0
  524. package/src/capabilities/capabilities/capabilities.render.ts +1 -1
  525. package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
  526. package/src/capabilities/capabilities/catalog.ts +3 -3
  527. package/src/capabilities/capabilities/hints.ts +32 -7
  528. package/src/capabilities/capabilities/index.ts +1 -1
  529. package/src/capabilities/colophon/collectColophon.ts +35 -24
  530. package/src/capabilities/colophon/colophon.render.ts +24 -1
  531. package/src/capabilities/colophon/colophon.test.ts +42 -21
  532. package/src/capabilities/colophon/colophon.verb.ts +4 -4
  533. package/src/capabilities/config/collectConfigShow.test.ts +1 -0
  534. package/src/capabilities/config/collectConfigShow.ts +3 -3
  535. package/src/capabilities/config/field.render.ts +4 -5
  536. package/src/capabilities/config/fields.ts +17 -10
  537. package/src/capabilities/config/get.verb.ts +70 -0
  538. package/src/capabilities/config/getUnset.test.ts +264 -0
  539. package/src/capabilities/config/index.ts +5 -1
  540. package/src/capabilities/config/runField.ts +40 -22
  541. package/src/capabilities/config/runGet.ts +34 -0
  542. package/src/capabilities/config/runSet.ts +35 -9
  543. package/src/capabilities/config/set.test.ts +48 -14
  544. package/src/capabilities/config/set.verb.ts +8 -7
  545. package/src/capabilities/config/show.render.ts +1 -1
  546. package/src/capabilities/config/show.verb.ts +9 -6
  547. package/src/capabilities/config/types.ts +18 -4
  548. package/src/capabilities/config/unset.verb.ts +58 -0
  549. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  550. package/src/capabilities/create/byteEquality.test.ts +25 -11
  551. package/src/capabilities/create/cliProjection.ts +227 -0
  552. package/src/capabilities/create/constants.ts +36 -61
  553. package/src/capabilities/create/create.mcp.test.ts +89 -5
  554. package/src/capabilities/create/create.render.ts +71 -7
  555. package/src/capabilities/create/create.test.ts +433 -219
  556. package/src/capabilities/create/create.verb.ts +297 -328
  557. package/src/capabilities/create/createGrammar.test.ts +865 -0
  558. package/src/capabilities/create/createHelp.ts +71 -0
  559. package/src/capabilities/create/createSurface.generated.ts +400 -0
  560. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  561. package/src/capabilities/create/cwdJail.test.ts +24 -5
  562. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  563. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  564. package/src/capabilities/create/index.ts +7 -4
  565. package/src/capabilities/create/messages.ts +18 -0
  566. package/src/capabilities/create/mount.ts +391 -0
  567. package/src/capabilities/create/pathJail.test.ts +90 -0
  568. package/src/capabilities/create/pathJail.ts +8 -5
  569. package/src/capabilities/create/pickGenerator.ts +23 -35
  570. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  571. package/src/capabilities/create/types.ts +20 -0
  572. package/src/capabilities/distribution.parity.test.ts +4 -0
  573. package/src/capabilities/distribution.test.ts +3 -1
  574. package/src/capabilities/distribution.ts +10 -15
  575. package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
  576. package/src/capabilities/doctor/checks/checkPackageRefs.ts +75 -8
  577. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
  578. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +76 -29
  579. package/src/capabilities/doctor/checks/checkShellCompletions.ts +63 -17
  580. package/src/capabilities/doctor/checks/harnessInventory.test.ts +219 -0
  581. package/src/capabilities/doctor/checks/harnessInventory.ts +298 -0
  582. package/src/capabilities/doctor/checks/index.ts +27 -0
  583. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  584. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  585. package/src/capabilities/doctor/checks/targetHealth.ts +444 -0
  586. package/src/capabilities/doctor/doctor.render.test.ts +125 -38
  587. package/src/capabilities/doctor/doctor.render.ts +74 -74
  588. package/src/capabilities/doctor/doctor.test.ts +338 -37
  589. package/src/capabilities/doctor/doctor.verb.ts +8 -3
  590. package/src/capabilities/doctor/runChecks.ts +65 -63
  591. package/src/capabilities/doctor/types.ts +22 -15
  592. package/src/capabilities/emptyRecovery.test.ts +21 -8
  593. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  594. package/src/capabilities/graph/index.ts +1 -1
  595. package/src/capabilities/graph/inspect.render.ts +70 -22
  596. package/src/capabilities/graph/inspect.test.ts +260 -5
  597. package/src/capabilities/graph/inspect.verb.ts +18 -6
  598. package/src/capabilities/graph/query.render.ts +15 -3
  599. package/src/capabilities/graph/query.verb.ts +3 -3
  600. package/src/capabilities/graph/runQuery.ts +2 -3
  601. package/src/capabilities/index.ts +3 -1
  602. package/src/capabilities/info/collectInfo.ts +13 -5
  603. package/src/capabilities/info/info.render.ts +7 -3
  604. package/src/capabilities/info/info.test.ts +37 -1
  605. package/src/capabilities/info/info.verb.ts +1 -1
  606. package/src/capabilities/info/types.ts +10 -2
  607. package/src/capabilities/lazy.test.ts +32 -0
  608. package/src/capabilities/meta/complete.verb.ts +1 -1
  609. package/src/capabilities/meta/index.ts +1 -1
  610. package/src/capabilities/meta/mcp.verb.ts +10 -8
  611. package/src/capabilities/ontology/index.ts +15 -11
  612. package/src/capabilities/ontology/ontology.test.ts +6 -55
  613. package/src/capabilities/ontology/queries.ts +2 -2
  614. package/src/capabilities/ontology/render.ts +3 -4
  615. package/src/capabilities/ontology/verbs.ts +27 -68
  616. package/src/capabilities/prompt/index.ts +2 -2
  617. package/src/capabilities/prompt/prompt.render.ts +6 -2
  618. package/src/capabilities/prompt/types.ts +1 -1
  619. package/src/capabilities/prompt/verbs.ts +4 -5
  620. package/src/capabilities/reference.test.ts +63 -0
  621. package/src/capabilities/renderVocabularySync.test.ts +82 -0
  622. package/src/capabilities/resources/provider.ts +342 -85
  623. package/src/capabilities/resources/resources.test.ts +355 -59
  624. package/src/capabilities/scopeTypeSync.test.ts +29 -15
  625. package/src/capabilities/setup/buildPlan.ts +240 -0
  626. package/src/capabilities/setup/index.ts +7 -7
  627. package/src/capabilities/setup/mode.ts +74 -0
  628. package/src/capabilities/setup/operations/index.ts +79 -0
  629. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  630. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  631. package/src/capabilities/setup/operations/setupGenerator.ts +478 -334
  632. package/src/capabilities/setup/operations/setupLsp.ts +420 -67
  633. package/src/capabilities/setup/operations/setupMcp.ts +238 -127
  634. package/src/capabilities/setup/operations/setupSkills.ts +667 -105
  635. package/src/capabilities/setup/plan.render.ts +336 -0
  636. package/src/capabilities/setup/plan.ts +241 -0
  637. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  638. package/src/capabilities/setup/setup.render.test.ts +297 -75
  639. package/src/capabilities/setup/setup.render.ts +45 -77
  640. package/src/capabilities/setup/setup.test.ts +1819 -225
  641. package/src/capabilities/setup/setup.verb.ts +288 -78
  642. package/src/capabilities/setup/shell.test.ts +86 -0
  643. package/src/capabilities/setup/shell.ts +137 -11
  644. package/src/capabilities/setup/targets.ts +435 -0
  645. package/src/capabilities/setup/types.ts +23 -70
  646. package/src/capabilities/shared/assertExecOk.ts +68 -10
  647. package/src/capabilities/shared/index.ts +43 -0
  648. package/src/capabilities/shared/packageManager.test.ts +470 -0
  649. package/src/capabilities/shared/packageManager.ts +425 -34
  650. package/src/capabilities/skill/bundledSkills.test.ts +347 -0
  651. package/src/capabilities/skill/discover.ts +131 -10
  652. package/src/capabilities/skill/index.ts +1 -1
  653. package/src/capabilities/skill/render.ts +10 -9
  654. package/src/capabilities/skill/skill.test.ts +22 -7
  655. package/src/capabilities/skill/verbs.ts +3 -4
  656. package/src/capabilities/sources/collectStatus.ts +7 -2
  657. package/src/capabilities/sources/index.ts +1 -1
  658. package/src/capabilities/sources/installSkills.ts +265 -10
  659. package/src/capabilities/sources/runUpdate.ts +131 -23
  660. package/src/capabilities/sources/sources.test.ts +382 -2
  661. package/src/capabilities/sources/status.render.ts +1 -1
  662. package/src/capabilities/sources/status.verb.ts +1 -1
  663. package/src/capabilities/sources/update.render.ts +1 -1
  664. package/src/capabilities/sources/update.verb.ts +4 -4
  665. package/src/capabilities/surface.test.ts +136 -19
  666. package/src/capabilities/upgrade/runUpgrade.ts +53 -14
  667. package/src/capabilities/upgrade/types.ts +10 -2
  668. package/src/capabilities/upgrade/upgrade.render.ts +13 -7
  669. package/src/capabilities/upgrade/upgrade.test.ts +75 -3
  670. package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
  671. package/src/capabilities/version/index.ts +12 -0
  672. package/src/capabilities/version/version.test.ts +66 -0
  673. package/src/capabilities/version/version.verb.ts +39 -0
  674. package/src/constants.ts +36 -1
  675. package/src/identity.test.ts +57 -29
  676. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
  677. package/src/kernel/completion/complete.test.ts +12 -2
  678. package/src/kernel/completion/complete.ts +1 -1
  679. package/src/kernel/completion/emitScripts.ts +1 -1
  680. package/src/kernel/completion/entitySource.test.ts +16 -3
  681. package/src/kernel/completion/entitySource.ts +21 -8
  682. package/src/kernel/completion/model.test.ts +164 -12
  683. package/src/kernel/completion/model.ts +94 -14
  684. package/src/kernel/completion/parse.test.ts +4 -7
  685. package/src/kernel/completion/parse.ts +15 -0
  686. package/src/kernel/completion/resolve.test.ts +0 -1
  687. package/src/kernel/completion/safety.test.ts +50 -35
  688. package/src/kernel/completion/shellDrive.test.ts +28 -9
  689. package/src/kernel/completion/templates/bash.ts +7 -2
  690. package/src/kernel/completion/templates/index.ts +23 -0
  691. package/src/kernel/completion/types.ts +7 -0
  692. package/src/kernel/config/defaults.test.ts +27 -3
  693. package/src/kernel/config/defaults.ts +4 -3
  694. package/src/kernel/config/evaluateProjectConfig.ts +31 -8
  695. package/src/kernel/config/firstRun.test.ts +44 -38
  696. package/src/kernel/config/firstRun.ts +24 -88
  697. package/src/kernel/config/index.ts +1 -1
  698. package/src/kernel/config/readConfig.test.ts +6 -3
  699. package/src/kernel/config/readConfig.ts +1 -1
  700. package/src/kernel/config/schema.ts +3 -1
  701. package/src/kernel/config/types.ts +3 -1
  702. package/src/kernel/copy.test.ts +34 -4
  703. package/src/kernel/copy.ts +54 -0
  704. package/src/kernel/error/PragmaError.test.ts +5 -2
  705. package/src/kernel/error/PragmaError.ts +4 -2
  706. package/src/kernel/error/constants.ts +7 -5
  707. package/src/kernel/error/fromTaskError.ts +28 -6
  708. package/src/kernel/error/recovery.ts +14 -0
  709. package/src/kernel/error/renderError.ts +42 -1
  710. package/src/kernel/error/types.ts +21 -1
  711. package/src/kernel/index.ts +35 -0
  712. package/src/kernel/interactivity.test.ts +76 -0
  713. package/src/kernel/interactivity.ts +69 -0
  714. package/src/kernel/packs/collect.ts +12 -16
  715. package/src/kernel/packs/compile.test.ts +222 -1
  716. package/src/kernel/packs/compile.ts +93 -3
  717. package/src/kernel/packs/disclosure.ts +2 -2
  718. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  719. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
  720. package/src/kernel/packs/graphql/index.ts +20 -0
  721. package/src/kernel/packs/index.ts +40 -0
  722. package/src/kernel/packs/iri.test.ts +73 -0
  723. package/src/kernel/packs/iri.ts +66 -14
  724. package/src/kernel/packs/renderPack.ts +25 -6
  725. package/src/kernel/packs/resolveEntity.test.ts +274 -0
  726. package/src/kernel/packs/resolveEntity.ts +200 -42
  727. package/src/kernel/packs/runBodies.ts +86 -22
  728. package/src/kernel/packs/sample.ts +1 -1
  729. package/src/kernel/packs/schema.ts +78 -5
  730. package/src/kernel/packs/sparql/applyFilters.ts +136 -16
  731. package/src/kernel/packs/sparql/buildLookupQuery.test.ts +290 -0
  732. package/src/kernel/packs/sparql/buildLookupQuery.ts +367 -17
  733. package/src/kernel/packs/sparql/index.ts +37 -0
  734. package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
  735. package/src/kernel/packs/sparql/runSelect.ts +3 -4
  736. package/src/kernel/packs/toolDescription.test.ts +77 -4
  737. package/src/kernel/packs/types.ts +136 -0
  738. package/src/kernel/packs/uniqueness.ts +1 -1
  739. package/src/kernel/project/cli/buildProgram.test.ts +218 -12
  740. package/src/kernel/project/cli/buildProgram.ts +84 -18
  741. package/src/kernel/project/cli/constants.ts +34 -0
  742. package/src/kernel/project/cli/dispatch.test.ts +160 -2
  743. package/src/kernel/project/cli/dispatch.ts +226 -45
  744. package/src/kernel/project/cli/exitCodes.ts +1 -1
  745. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  746. package/src/kernel/project/cli/globalFlags.ts +134 -31
  747. package/src/kernel/project/cli/helpFormat.ts +14 -2
  748. package/src/kernel/project/cli/rootHelp.ts +74 -12
  749. package/src/kernel/project/cli/suggest.test.ts +33 -1
  750. package/src/kernel/project/cli/suggest.ts +25 -1
  751. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  752. package/src/kernel/project/cli/verbHelp.ts +23 -7
  753. package/src/kernel/project/mcp/buildServer.ts +7 -4
  754. package/src/kernel/project/mcp/envelope.ts +2 -2
  755. package/src/kernel/project/mcp/instructions.ts +2 -2
  756. package/src/kernel/project/mcp/mcpError.ts +1 -1
  757. package/src/kernel/project/mcp/parity.test.ts +5 -2
  758. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  759. package/src/kernel/project/mcp/prompts/source.ts +2 -2
  760. package/src/kernel/project/mcp/registerVerb.ts +55 -10
  761. package/src/kernel/project/mcp/serve.ts +2 -2
  762. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  763. package/src/kernel/render/contracts.ts +21 -0
  764. package/src/kernel/render/envelope.ts +2 -3
  765. package/src/kernel/render/formatters.ts +1 -1
  766. package/src/kernel/render/renderers.test.ts +243 -6
  767. package/src/kernel/render/renderers.ts +222 -20
  768. package/src/kernel/render/style.test.ts +75 -24
  769. package/src/kernel/render/style.ts +59 -6
  770. package/src/kernel/render/turtle.ts +222 -0
  771. package/src/kernel/render/vocabulary.ts +276 -0
  772. package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
  773. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
  775. package/src/kernel/runtime/graphpack/embedded.ts +3 -3
  776. package/src/kernel/runtime/graphpack/manifest.ts +1 -1
  777. package/src/kernel/runtime/graphpack/read.ts +1 -2
  778. package/src/kernel/runtime/loadSession.ts +1 -1
  779. package/src/kernel/runtime/probe.ts +6 -6
  780. package/src/kernel/runtime/readEntity.ts +472 -28
  781. package/src/kernel/runtime/refs/index.ts +39 -0
  782. package/src/kernel/runtime/refs/parseRef.ts +2 -2
  783. package/src/kernel/runtime/refs/resolve.ts +4 -4
  784. package/src/kernel/runtime/storeReadiness.ts +1 -2
  785. package/src/kernel/runtime/types.ts +15 -1
  786. package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
  787. package/src/kernel/spec/emitReference.ts +105 -30
  788. package/src/kernel/spec/emitSurface.ts +48 -6
  789. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  790. package/src/kernel/spec/types.ts +277 -4
  791. package/src/testing/PARITY_GAPS.ts +9 -3
  792. package/src/testing/behavioral/docExamples.test.ts +16 -0
  793. package/src/testing/behavioral/errorMatrix.mcp.test.ts +112 -9
  794. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  795. package/src/testing/behavioral/journeys.cli.test.ts +1 -1
  796. package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
  797. package/src/testing/behavioral/journeys.firstInstall.test.ts +7 -2
  798. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  799. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  800. package/src/testing/behavioral/journeys.packageStories.test.ts +10 -7
  801. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  802. package/src/testing/behavioral/mcpSurface.test.ts +1 -1
  803. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  804. package/src/testing/eval/__snapshots__/eval.test.ts.snap +26 -1
  805. package/src/testing/eval/cases/effectful.ts +3 -2
  806. package/src/testing/eval/cases/readNouns.ts +245 -9
  807. package/src/testing/fixtures/blockGraph.ts +104 -10
  808. package/src/testing/fixtures/graph/canonical.ts +182 -13
  809. package/src/testing/fixtures/graph/defaultPack.ts +1 -1
  810. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  811. package/src/testing/helpers/projectMcp.ts +32 -6
  812. package/src/testing/helpers/runCli.ts +35 -18
  813. package/src/testing/perf/budgets.test.ts +20 -9
  814. package/src/testing/perf/budgets.ts +58 -9
  815. package/src/testing/perf/codegen.test.ts +126 -0
  816. package/src/testing/perf/globalSetup.test.ts +286 -0
  817. package/src/testing/perf/globalSetup.ts +505 -23
  818. package/src/testing/perf/measure.test.ts +38 -0
  819. package/src/testing/perf/measure.ts +23 -4
  820. package/src/testing/setupXdgIsolation.ts +81 -21
  821. package/src/testing/tempRoot.globalSetup.ts +122 -0
  822. package/dist/pragma +0 -0
  823. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
  824. package/src/capabilities/create/templates.embedded.generated.ts +0 -28
  825. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
  826. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  827. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
  828. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
  829. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  830. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  831. package/src/capabilities/shared/bands.ts +0 -16
  832. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
@@ -4,7 +4,7 @@
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
 
@@ -10,27 +10,62 @@
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
- import { existsSync, lstatSync, readdirSync, readlinkSync } from "node:fs";
29
+ import {
30
+ existsSync,
31
+ lstatSync,
32
+ readdirSync,
33
+ readlinkSync,
34
+ statSync,
35
+ } from "node:fs";
18
36
  import { basename, join, resolve } from "node:path";
19
- import type { ResolvedPackage } from "../../kernel/runtime/refs/resolve.js";
37
+ import type { ResolvedPackage } from "../../kernel/runtime/refs/index.js";
38
+ // The ownership test, imported rather than reimplemented: `setup skills` and
39
+ // this module must not be able to disagree about which links belong to pragma.
40
+ // `setupSkills.ts` reaches `@canonical/harnesses` only through a DYNAMIC
41
+ // import, so this edge adds no static one (`capabilities/lazy.test.ts`).
42
+ import { withinAnyRoot } from "../setup/operations/setupSkills.js";
20
43
  import { installedSkillsDir } from "../skill/discover.js";
21
44
 
22
45
  /** One planned skill symlink into the installed-skills root. */
23
46
  export interface SkillLinkAction {
24
- /** The package's skill folder — the symlink target. */
47
+ /**
48
+ * The symlink target: the package's skill folder for an install, or — on a
49
+ * `pruned` entry — the missing target the stale link still points at, kept so
50
+ * the prune's undo can put the link back exactly as it was.
51
+ */
25
52
  readonly target: string;
26
53
  /** `<installedSkillsDir>/<folderName>` — where the symlink is created. */
27
54
  readonly linkPath: string;
28
- /** created (absent), skipped (already correct / a real dir), or replaced. */
29
- readonly action: "created" | "skipped" | "replaced";
55
+ /**
56
+ * created (absent), skipped (already correct / a real dir), replaced, or
57
+ * pruned (an unplanned link whose target is gone — deleted, not re-created).
58
+ */
59
+ readonly action: "created" | "skipped" | "replaced" | "pruned";
30
60
  /** The skill folder name (the discovery key). */
31
61
  readonly folderName: string;
32
- /** The package the skill came from. */
33
- readonly packageName: string;
62
+ /**
63
+ * The package the skill came from. Absent on a `pruned` entry: a stale link
64
+ * records only a target path, and the package that installed it is precisely
65
+ * the one that no longer provides the skill — there is nothing honest left to
66
+ * attribute it to.
67
+ */
68
+ readonly packageName?: string;
34
69
  }
35
70
 
36
71
  /** What currently occupies a candidate link path. */
@@ -70,7 +105,11 @@ function packageSkillDirs(root: string): string[] {
70
105
  for (const name of names) {
71
106
  const dir = join(skillsDir, name);
72
107
  try {
73
- if (lstatSync(dir).isDirectory() && existsSync(join(dir, "SKILL.md"))) {
108
+ // `stat`, not `lstat`: a package that ships `skills/<name>` as a SYMLINK
109
+ // — the ordinary pnpm / monorepo / `file:` layout — contributed nothing
110
+ // at all, silently, because `lstat` reports the link and not the
111
+ // directory behind it. Discovery uses `stat`; so does this now.
112
+ if (statSync(dir).isDirectory() && existsSync(join(dir, "SKILL.md"))) {
74
113
  out.push(dir);
75
114
  }
76
115
  } catch {
@@ -80,9 +119,58 @@ function packageSkillDirs(root: string): string[] {
80
119
  return out;
81
120
  }
82
121
 
122
+ /**
123
+ * Plan the removal of the links a package has since dropped.
124
+ *
125
+ * The install pass walks the packages, so it can only ever visit a skill that
126
+ * still exists; this pass walks the installed root, which is the ONLY place a
127
+ * dropped skill still shows up. An entry is pruned only when both hold: this run
128
+ * did not plan it, and it is a symlink whose target is gone. Both halves matter —
129
+ *
130
+ * - a real (non-symlink) entry is a manually-installed skill, which the install
131
+ * pass already refuses to clobber (`skipped`) and which this pass must refuse
132
+ * just as firmly: "unplanned" is exactly what a hand-placed skill looks like;
133
+ * - a symlink whose target still resolves is someone's own link into a checkout
134
+ * this command knows nothing about. Unplanned does not make it garbage, and an
135
+ * update that silently ate it would be a worse bug than the dangling link.
136
+ *
137
+ * A broken target, by contrast, cannot be anything but debris: nothing can read
138
+ * it, and re-creating it is a matter of re-running the update that installed it
139
+ * (which is also what this prune's undo does).
140
+ *
141
+ * @param dest - The installed-skills root.
142
+ * @param planned - Every folder name the install pass planned, whatever action.
143
+ * @returns One `pruned` action per stale link, for the plan and its preview.
144
+ * @note Impure — reads the installed root and stats each entry's target.
145
+ */
146
+ function planStaleLinkPrunes(
147
+ dest: string,
148
+ planned: ReadonlySet<string>,
149
+ ): SkillLinkAction[] {
150
+ let names: string[];
151
+ try {
152
+ names = readdirSync(dest);
153
+ } catch {
154
+ return []; // No installed root — nothing was ever installed to go stale.
155
+ }
156
+ const out: SkillLinkAction[] = [];
157
+ for (const folderName of names) {
158
+ if (planned.has(folderName)) continue;
159
+ const linkPath = resolve(dest, folderName);
160
+ const state = linkState(linkPath);
161
+ if (state.kind !== "symlink") continue;
162
+ // A relative target is stored relative to the link's OWN directory, which
163
+ // for an entry of the installed root is that root itself.
164
+ if (existsSync(resolve(dest, state.target))) continue;
165
+ out.push({ target: state.target, linkPath, action: "pruned", folderName });
166
+ }
167
+ return out;
168
+ }
169
+
83
170
  /**
84
171
  * 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
172
+ * the installed-skills discovery root, then the removals that retire the links
173
+ * a package has since dropped. First-seen wins on a folder-name clash
86
174
  * across packages. A real (non-symlink) entry at the link path is left untouched
87
175
  * (`skipped`) so a manually-installed skill is never clobbered.
88
176
  *
@@ -103,10 +191,17 @@ export function planSkillInstall(
103
191
  seen.add(folderName);
104
192
  const linkPath = resolve(dest, folderName);
105
193
  const state = linkState(linkPath);
194
+ // Already correct means the link RESOLVES to the skill dir, not that its
195
+ // raw `readlink` string equals an absolute path. A relative link was
196
+ // therefore never "already correct": it was torn down and rebuilt on
197
+ // every single update, and the sibling planner reported it as drift.
198
+ const resolvesToSkill =
199
+ state.kind === "symlink" &&
200
+ resolve(dest, state.target) === resolve(skillDir);
106
201
  const action: SkillLinkAction["action"] =
107
202
  state.kind === "absent"
108
203
  ? "created"
109
- : state.kind === "symlink" && state.target === skillDir
204
+ : resolvesToSkill
110
205
  ? "skipped"
111
206
  : state.kind === "symlink"
112
207
  ? "replaced"
@@ -120,5 +215,165 @@ export function planSkillInstall(
120
215
  });
121
216
  }
122
217
  }
218
+ // `seen` is every folder name this run planned — the `skipped` ones included,
219
+ // so a name a package still provides is never a prune candidate even when the
220
+ // install pass decided to leave its entry alone.
221
+ actions.push(...planStaleLinkPrunes(dest, seen));
123
222
  return actions;
124
223
  }
224
+
225
+ /**
226
+ * One planned link action in a HARNESS skills directory (layer 2).
227
+ *
228
+ * Layer 1 (`<installedSkillsDir>/<name>` → the package's folder) is what
229
+ * {@link planSkillInstall} owns. This is the layer above it: the links inside
230
+ * `~/.claude/skills` and `~/.agents/skills` that point AT layer 1 — a link to a
231
+ * link — and that `setup skills` owns.
232
+ */
233
+ export interface HarnessLinkAction {
234
+ readonly target: string;
235
+ readonly linkPath: string;
236
+ readonly action: "created" | "replaced" | "pruned";
237
+ readonly folderName: string;
238
+ /** The harness directory's display name, for the progress line. */
239
+ readonly dirName: string;
240
+ /**
241
+ * The target the link ALREADY holds, recorded only for a `replaced` action so
242
+ * its undo can put that link back. Without it the undo could only delete what
243
+ * the forward run created, which restores an ABSENT path — a state that never
244
+ * existed — instead of the link the run overwrote.
245
+ *
246
+ * Stored as `readlink` returned it, not resolved: a relative link is relative
247
+ * to its own directory, which for a candidate of `dir` is `dir` itself, so
248
+ * re-linking the raw value reproduces the link exactly as found.
249
+ */
250
+ readonly previousTarget?: string;
251
+ }
252
+
253
+ /**
254
+ * Plan the CONVERGE-ONLY refresh of the global scope's harness skill links.
255
+ *
256
+ * The reported bug lives here. `sources update` installed and pruned layer 1
257
+ * and stopped, so a new pack skill reached no harness directory until the user
258
+ * separately ran `setup skills`, and a dropped one left its layer-2 link
259
+ * dangling with nothing that would ever clear it. This closes the loop, under
260
+ * two rules that are the entire safety argument:
261
+ *
262
+ * 1. CONVERGE-ONLY. `dirs` are directories that already exist — this function
263
+ * never creates one, and the caller composes no `mkdir`. A `sources update`
264
+ * that materialised `~/.claude/skills` would be litter, and would silently
265
+ * opt the user into linking they never asked for.
266
+ * 2. OWNERSHIP, by the SAME test `setup skills` uses. A path is this command's
267
+ * to touch only when it holds a symlink resolving INSIDE one of the global
268
+ * scope's roots (`withinAnyRoot`, a pure path-SEGMENT test that reads nothing
269
+ * — so it still answers correctly after the layer-1 target is gone, which is
270
+ * exactly the stale case). A real directory is a hand-installed skill; a
271
+ * symlink pointing anywhere else is the user's own; a `<root>-backup/foo`
272
+ * sibling is not "inside" despite sharing a string prefix. None is removed.
273
+ *
274
+ * THE SET, NOT JUST THE INSTALLED ROOT, and that is what keeps precedence
275
+ * true one layer up. A harness link left pointing at the BUNDLED snapshot
276
+ * for a skill this update has just installed for real is owned, so it is
277
+ * `replaced` onto the installed copy. Tested against the installed root
278
+ * alone it read as "someone else's link" and was skipped — and the user who
279
+ * deliberately ran `sources update` would have kept running the shipped copy.
280
+ *
281
+ * The plan is derived from the layer-1 plan rather than from a filesystem
282
+ * re-read, because at planning time the layer-1 writes have not happened yet:
283
+ * `surviving` is the post-update truth, and reading the disk would see the
284
+ * pre-update state. That is also why a surviving name always targets
285
+ * `roots[0]`: layer 1 is about to hold it, whether or not it does now.
286
+ *
287
+ * A RETIRED NAME IS NOT AUTOMATICALLY DEBRIS any more. The fallback roots
288
+ * (today: the bundled snapshot) are NOT written by this update, so their
289
+ * contents ARE readable at plan time — and a skill the packages dropped that
290
+ * the shipped snapshot still carries is still discoverable, still listed by
291
+ * `skill list`, and so still belongs in the harness directory. Such a link is
292
+ * RETARGETED onto the surviving root rather than pruned; only a name no root
293
+ * provides at all is deleted.
294
+ *
295
+ * @param dirs - The EXISTING global link directories.
296
+ * @param roots - The global scope's source roots in PRECEDENCE order.
297
+ * `roots[0]` is the installed root (layer 1) every surviving name targets;
298
+ * the rest are fallbacks a retired name may still resolve in. The whole set
299
+ * is the ownership set.
300
+ * @param surviving - Folder names layer 1 will hold after this update.
301
+ * @param retired - Folder names layer 1 is pruning in this update.
302
+ * @returns The layer-2 actions, for the plan and its effects.
303
+ * @note Impure — lstats each candidate link path, and stats the fallback roots
304
+ * for each retired name.
305
+ */
306
+ export function planHarnessSkillLinks(
307
+ dirs: readonly { dir: string; name: string }[],
308
+ roots: readonly string[],
309
+ surviving: readonly string[],
310
+ retired: readonly string[],
311
+ ): HarnessLinkAction[] {
312
+ const dest = resolve(roots[0] as string);
313
+ /** The first FALLBACK root that still holds `folderName`, if any. */
314
+ const fallback = (folderName: string): string | undefined =>
315
+ roots
316
+ .slice(1)
317
+ .map((root) => resolve(root, folderName))
318
+ .find((candidate) => existsSync(candidate));
319
+ const out: HarnessLinkAction[] = [];
320
+ for (const { dir, name } of dirs) {
321
+ for (const folderName of surviving) {
322
+ const linkPath = resolve(dir, folderName);
323
+ const target = resolve(dest, folderName);
324
+ const state = linkState(linkPath);
325
+ if (state.kind === "other") continue; // A hand-placed entry — never ours.
326
+ if (state.kind === "absent") {
327
+ out.push({
328
+ target,
329
+ linkPath,
330
+ action: "created",
331
+ folderName,
332
+ dirName: name,
333
+ });
334
+ continue;
335
+ }
336
+ if (resolve(dir, state.target) === target) continue; // Already correct.
337
+ // A symlink pointing outside every scope root is the user's own link into
338
+ // their own checkout. Unplanned does not make it ours to replace.
339
+ if (!withinAnyRoot(roots, linkPath, state.target)) continue;
340
+ out.push({
341
+ target,
342
+ linkPath,
343
+ action: "replaced",
344
+ folderName,
345
+ dirName: name,
346
+ previousTarget: state.target,
347
+ });
348
+ }
349
+ for (const folderName of retired) {
350
+ const linkPath = resolve(dir, folderName);
351
+ const state = linkState(linkPath);
352
+ if (state.kind !== "symlink") continue;
353
+ if (!withinAnyRoot(roots, linkPath, state.target)) continue;
354
+ const surviving = fallback(folderName);
355
+ if (surviving !== undefined) {
356
+ // Dropped upstream, still shipped: retarget rather than delete. Already
357
+ // correct is nothing to do.
358
+ if (resolve(dir, state.target) === surviving) continue;
359
+ out.push({
360
+ target: surviving,
361
+ linkPath,
362
+ action: "replaced",
363
+ folderName,
364
+ dirName: name,
365
+ previousTarget: state.target,
366
+ });
367
+ continue;
368
+ }
369
+ out.push({
370
+ target: resolve(dir, state.target),
371
+ linkPath,
372
+ action: "pruned",
373
+ folderName,
374
+ dirName: name,
375
+ });
376
+ }
377
+ }
378
+ return out;
379
+ }
@@ -31,24 +31,30 @@ import {
31
31
  writeFile,
32
32
  } from "@canonical/task";
33
33
  import { VERSION } from "../../constants.js";
34
- import { PragmaError } from "../../kernel/error/PragmaError.js";
35
- import { cliRecovery } from "../../kernel/error/recovery.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";
41
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
37
42
  import { activePackPath, readActivePack } from "../../kernel/runtime/paths.js";
38
- import type { PackageRef } from "../../kernel/runtime/refs/parseRef.js";
39
- import {
40
- parsePackDeclaration,
41
- redactUrl,
42
- } from "../../kernel/runtime/refs/parseRef.js";
43
+ import type { PackageRef } from "../../kernel/runtime/refs/index.js";
43
44
  import {
44
45
  detectPrefixClashes,
45
46
  harvestPrefixes,
47
+ parsePackDeclaration,
46
48
  type ResolvedPackage,
49
+ redactUrl,
47
50
  resolvePackage,
48
- } from "../../kernel/runtime/refs/resolve.js";
49
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
50
- import { installedSkillsDir } from "../skill/discover.js";
51
- import { planSkillInstall } from "./installSkills.js";
51
+ } from "../../kernel/runtime/refs/index.js";
52
+ // The global scope's EXISTING link directories, from the module that owns the
53
+ // scope covenant — so `sources update` cannot drift away from what
54
+ // `setup skills --global` links, or widen the scope on its own.
55
+ import { existingGlobalSkillDirs } from "../setup/operations/setupSkills.js";
56
+ import { globalSkillRoots, installedSkillsDir } from "../skill/discover.js";
57
+ import { planHarnessSkillLinks, planSkillInstall } from "./installSkills.js";
52
58
  import type { SourcesUpdateData } from "./types.js";
53
59
 
54
60
  /** Generic-core prefixes; config `prefixes` merge over them (config wins). */
@@ -209,17 +215,17 @@ export async function buildUpdateTask(
209
215
  // prefix. Display-only, so a warning (not a hard failure) is the right call.
210
216
  for (const clash of detectPrefixClashes(inputs)) {
211
217
  report?.(
212
- `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.`,
218
+ `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.`,
213
219
  );
214
220
  }
215
221
 
216
222
  report?.(`Building store from ${inputs.length} source(s)`);
217
223
  if (verbose) for (const input of inputs) report?.(` parse ${input.path}`);
218
224
  if (stories.length > 0)
219
- report?.(`Carrying ${stories.length} package read story file(s)`);
225
+ report?.(`Carrying ${stories.length} pack read story file(s)`);
220
226
 
221
227
  // Build the pack. On a parse/build failure, classify it as a NAMED data error
222
- // (U6) — not INTERNAL_ERROR's "please report this issue" — identifying the
228
+ // (U6) — not INTERNAL_ERROR's "report this issue" — identifying the
223
229
  // offending package source, since ke's parser error carries only line/column.
224
230
  // With `--skip-invalid`, drop the unparseable sources (warning LOUDLY about
225
231
  // each — never a silent partial graph) and build from the rest instead of
@@ -262,7 +268,7 @@ export async function buildUpdateTask(
262
268
  );
263
269
  if (usableInputs.length === 0)
264
270
  throw PragmaError.configError(
265
- `All ${inputs.length} configured source(s) failed to parse — nothing to build.`,
271
+ `None of the ${inputs.length} configured source(s) can be parsed — nothing to build.`,
266
272
  {
267
273
  recovery: cliRecovery(
268
274
  "sources update --verbose",
@@ -299,7 +305,7 @@ export async function buildUpdateTask(
299
305
  {
300
306
  recovery: cliRecovery(
301
307
  "sources update --verbose",
302
- "Check that the package sources actually contain RDF triples, then re-run.",
308
+ "Check that the pack sources actually contain RDF triples, then re-run.",
303
309
  ),
304
310
  },
305
311
  );
@@ -322,13 +328,63 @@ export async function buildUpdateTask(
322
328
 
323
329
  // Install package-provided skills (U10): symlink each resolved package's
324
330
  // `skills/*` into the installed-skills root, so `skill list` / `setup skills`
325
- // see them after an update. Kept in this Task (reversible: created links carry
326
- // an unlink undo) so `sources update --undo` also removes them.
327
- const skillLinks = planSkillInstall(resolved).filter(
328
- (link) => link.action !== "skipped",
331
+ // see them after an update — and RETIRE the links of skills those packages
332
+ // have since dropped, which the same plan reports as `pruned`. Kept in this
333
+ // Task (reversible: a created link carries an unlink undo, a pruned one a
334
+ // re-link undo) so `sources update --undo` restores the root as it was.
335
+ //
336
+ // The two are split, not counted together: a prune is a deletion, so folding
337
+ // it into "Installing N skill(s)" would report a removal as an install.
338
+ const skillPlan = planSkillInstall(resolved);
339
+ const skillLinks = skillPlan.filter(
340
+ (link) => link.action === "created" || link.action === "replaced",
329
341
  );
342
+ const staleLinks = skillPlan.filter((link) => link.action === "pruned");
330
343
  if (skillLinks.length > 0)
331
344
  report?.(`Installing ${skillLinks.length} skill(s)`);
345
+ if (staleLinks.length > 0)
346
+ report?.(
347
+ `Removing ${staleLinks.length} skill link(s) no longer provided by any package`,
348
+ );
349
+
350
+ // Converge the GLOBAL scope (layer 2). Layer 1 above is the installed root;
351
+ // the harness directories link AT it, and until now nothing here touched
352
+ // them — a new pack skill reached no harness directory until the user
353
+ // separately ran `setup skills`, and a dropped one left a dangling link that
354
+ // nothing would ever clear. That two-step was the reported bug.
355
+ //
356
+ // CONVERGE-ONLY, and this is a policy line, not an optimisation:
357
+ // `existingGlobalSkillDirs` returns only directories that ALREADY EXIST, and
358
+ // nothing below composes a `mkdir`. `sources update` is `mcp: {expose:true}`
359
+ // with `mutates: true` and `needsNetwork: true`, so creating directories here
360
+ // would mean an agent, over MCP, after a network fetch, conjuring
361
+ // `~/.claude/skills` into being and opting the user into linking they never
362
+ // asked for. Refresh what is there; never bring a directory into existence.
363
+ //
364
+ // Ownership is the SAME `withinAnyRoot` test `setup skills` applies, over the
365
+ // SAME root set (`globalSkillRoots`), so a real directory, a still-resolving
366
+ // link into the user's own checkout, and a `<root>-backup/foo` sibling are all
367
+ // left exactly as found — while a link still pointing at the BUNDLED snapshot
368
+ // for a skill this update just installed is ours, and is moved onto it.
369
+ const harnessPlan = planHarnessSkillLinks(
370
+ await existingGlobalSkillDirs(runtime.cwd),
371
+ globalSkillRoots(),
372
+ skillPlan
373
+ .filter((link) => link.action !== "pruned")
374
+ .map((link) => link.folderName),
375
+ staleLinks.map((link) => link.folderName),
376
+ );
377
+ const harnessLinks = harnessPlan.filter((link) => link.action !== "pruned");
378
+ const harnessStale = harnessPlan.filter((link) => link.action === "pruned");
379
+ if (harnessLinks.length > 0)
380
+ report?.(
381
+ `Linking ${harnessLinks.length} skill(s) into your harness folders`,
382
+ );
383
+ if (harnessStale.length > 0)
384
+ report?.(`Removing ${harnessStale.length} stale harness skill link(s)`);
385
+ if (verbose)
386
+ for (const link of harnessPlan)
387
+ report?.(` ${link.action} ${link.folderName} in ${link.dirName}`);
332
388
 
333
389
  report?.(`Pointing ${runtime.cwd} at pack ${built.contentHash.slice(0, 12)}`);
334
390
  return gen(function* () {
@@ -344,6 +400,58 @@ export async function buildUpdateTask(
344
400
  );
345
401
  }
346
402
  }
403
+ // No `mkdir` guard here: a stale link can only have been enumerated FROM
404
+ // the installed root, so the root necessarily exists.
405
+ //
406
+ // The undo re-creates the link exactly as found — dangling target and all —
407
+ // because undo's job is to restore the prior state, not to improve on it. It
408
+ // clears the path first because the undo interpreter MOCKS forward effects
409
+ // when collecting: the delete above may never have run, and `fs.symlink`
410
+ // refuses a path that already exists. Same delete-then-link shape the
411
+ // `replaced` branch above uses, for the same reason.
412
+ for (const stale of staleLinks) {
413
+ yield* $(
414
+ deleteFile(stale.linkPath, {
415
+ undo: gen(function* () {
416
+ yield* $(deleteFile(stale.linkPath));
417
+ yield* $(symlink(stale.target, stale.linkPath));
418
+ }),
419
+ }),
420
+ );
421
+ }
422
+ // Layer 2, in the same Task and so under the same `--undo`. Still no
423
+ // `mkdir`: every directory here was proven to exist at plan time, and
424
+ // creating one is the thing converge-only exists to forbid.
425
+ for (const link of harnessLinks) {
426
+ // A `created` link undoes by deletion — absent IS the state it replaced.
427
+ // A `replaced` one does not: the path held a link, and the delete above
428
+ // carries no undo of its own, so deleting what the symlink created would
429
+ // leave the path ABSENT rather than pointing where it pointed before.
430
+ // Its undo is therefore the same delete-then-relink shape the prunes
431
+ // below use, against the target detection recorded — and it clears the
432
+ // path first because undo collection MOCKS forward effects, so the link
433
+ // may still be there and `fs.symlink` refuses an existing path.
434
+ const previous = link.previousTarget;
435
+ const undoLink =
436
+ link.action === "replaced" && previous !== undefined
437
+ ? gen(function* () {
438
+ yield* $(deleteFile(link.linkPath));
439
+ yield* $(symlink(previous, link.linkPath));
440
+ })
441
+ : deleteFile(link.linkPath);
442
+ if (link.action === "replaced") yield* $(deleteFile(link.linkPath));
443
+ yield* $(symlink(link.target, link.linkPath, { undo: undoLink }));
444
+ }
445
+ for (const stale of harnessStale) {
446
+ yield* $(
447
+ deleteFile(stale.linkPath, {
448
+ undo: gen(function* () {
449
+ yield* $(deleteFile(stale.linkPath));
450
+ yield* $(symlink(stale.target, stale.linkPath));
451
+ }),
452
+ }),
453
+ );
454
+ }
347
455
  return data;
348
456
  });
349
457
  }
@@ -385,12 +493,12 @@ export async function classifySourceBuildError(
385
493
  const culprit = await isolateBadSource(inputs);
386
494
  const detail = culprit?.message ?? parserMessage;
387
495
  const where = culprit
388
- ? `Package source "${culprit.path}" could not be parsed`
389
- : "The configured package sources could not be built into a store";
496
+ ? `Pack source "${culprit.path}" cannot be parsed`
497
+ : "The configured packs cannot be built into a store";
390
498
  return PragmaError.configError(`${where}: ${detail}`, {
391
499
  recovery: cliRecovery(
392
500
  "sources update --verbose",
393
- "Re-run with --verbose to see each file as it parses. If a package ships malformed RDF, report it to that package's maintainer.",
501
+ "Re-run with --verbose to see each file as it parses. If a pack ships malformed RDF, report it to that pack's maintainer.",
394
502
  ),
395
503
  });
396
504
  }