@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
@@ -0,0 +1,347 @@
1
+ /**
2
+ * The BUNDLED skills snapshot — the third discovery root, last in precedence.
3
+ *
4
+ * `scripts/bundle.ts` already resolved every declared pack to read its TTL into
5
+ * `pack.generated.ts`; it now also copies each pack's `skills/<name>/` into the
6
+ * committed `bundled-skills/` directory at the package root. So a fresh install
7
+ * lists skills for the same reason it answers `block lookup`: the release
8
+ * carries a snapshot of what its packs shipped.
9
+ *
10
+ * WHAT THESE CELLS SAMPLE. Every expectation about skill CONTENT is read out of
11
+ * the committed artifact rather than written into a fixture beside the code.
12
+ * Inventing "a bundled skill" here would prove that a directory this test wrote
13
+ * can be discovered — which is already covered — while a snapshot that shipped
14
+ * empty, shipped a folder with no `SKILL.md`, or was dropped from `files` would
15
+ * stay green. The artifact is real upstream data; it is what has to work.
16
+ */
17
+
18
+ import { spawnSync } from "node:child_process";
19
+ import {
20
+ existsSync,
21
+ lstatSync,
22
+ mkdirSync,
23
+ mkdtempSync,
24
+ readdirSync,
25
+ readFileSync,
26
+ symlinkSync,
27
+ writeFileSync,
28
+ } from "node:fs";
29
+ import { tmpdir } from "node:os";
30
+ import { join } from "node:path";
31
+ import { fileURLToPath } from "node:url";
32
+ import { dryRun } from "@canonical/task";
33
+ import { runTask } from "@canonical/task/node";
34
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
35
+ import { BIN_NAME } from "../../constants.js";
36
+ import { bootRuntime } from "../../kernel/runtime/boot.js";
37
+ import type { GlobalFlags } from "../../kernel/runtime/types.js";
38
+ import { runCli } from "../../testing/helpers/runCli.js";
39
+ import { scopedChecks } from "../doctor/checks/targetHealth.js";
40
+ import {
41
+ composeSkills,
42
+ detectSkills,
43
+ staleSkillLinks,
44
+ } from "../setup/operations/setupSkills.js";
45
+ import {
46
+ bundledSkillsDir,
47
+ discoverSkills,
48
+ globalSkillRoots,
49
+ installedSkillsDir,
50
+ parseFrontmatter,
51
+ } from "./discover.js";
52
+
53
+ const packageRoot = fileURLToPath(new URL("../../../", import.meta.url));
54
+
55
+ /** The snapshot's folder → declared `name`, read from the shipped bytes. */
56
+ function shippedSkills(): { folder: string; name: string }[] {
57
+ const root = bundledSkillsDir();
58
+ if (root === undefined) return [];
59
+ return readdirSync(root)
60
+ .map((folder) => {
61
+ const skillMd = join(root, folder, "SKILL.md");
62
+ if (!existsSync(skillMd)) return undefined;
63
+ const frontmatter = parseFrontmatter(readFileSync(skillMd, "utf-8"));
64
+ return frontmatter ? { folder, name: frontmatter.name } : undefined;
65
+ })
66
+ .filter((entry): entry is { folder: string; name: string } => !!entry);
67
+ }
68
+
69
+ /** A FRESH INSTALL's environment: nothing of this machine is inherited. */
70
+ function freshInstallEnv(): Record<string, string> {
71
+ const home = mkdtempSync(join(tmpdir(), "pragma-fresh-home-"));
72
+ return {
73
+ HOME: home,
74
+ USERPROFILE: home,
75
+ XDG_CONFIG_HOME: mkdtempSync(join(tmpdir(), "pragma-fresh-cfg-")),
76
+ XDG_DATA_HOME: mkdtempSync(join(tmpdir(), "pragma-fresh-data-")),
77
+ XDG_STATE_HOME: mkdtempSync(join(tmpdir(), "pragma-fresh-state-")),
78
+ XDG_CACHE_HOME: mkdtempSync(join(tmpdir(), "pragma-fresh-cache-")),
79
+ };
80
+ }
81
+
82
+ describe("bundled skills — the shipped snapshot", () => {
83
+ it("the committed artifact is a real, well-formed skills root", () => {
84
+ const root = bundledSkillsDir();
85
+ expect(root).toBeDefined();
86
+ const entries = readdirSync(root as string);
87
+ // Not merely non-empty: EVERY entry must be a discoverable skill. A folder
88
+ // the copy pass half-wrote (or a stray file) would be skipped silently by
89
+ // discovery, which is exactly how a thinned snapshot ships unnoticed.
90
+ expect(entries.length).toBeGreaterThan(0);
91
+ expect(
92
+ shippedSkills()
93
+ .map((s) => s.folder)
94
+ .sort(),
95
+ ).toEqual([...entries].sort());
96
+ });
97
+
98
+ it("is the LAST discovery root, after project and installed", () => {
99
+ const roots = globalSkillRoots();
100
+ expect(roots[0]).toBe(installedSkillsDir());
101
+ expect(roots.at(-1)).toBe(bundledSkillsDir());
102
+ });
103
+ });
104
+
105
+ describe("bundled skills — a fresh install, through the shipped entry", () => {
106
+ it("lists the packs' skills with no `sources update` (REGRESSION)", () => {
107
+ // THE DEFECT. A fresh install had zero skills and a two-command, network-
108
+ // dependent recovery (`sources update` then `setup skills`) for content the
109
+ // release had already resolved at bundle time. Isolated HOME + all four XDG
110
+ // roots, so anything answered here was answered from the package itself.
111
+ const cwd = mkdtempSync(join(tmpdir(), "pragma-fresh-proj-"));
112
+ const outcome = runCli(["skill", "list", "--format", "json"], {
113
+ cwd,
114
+ env: freshInstallEnv(),
115
+ });
116
+ expect(outcome.exitCode).toBe(0);
117
+ const envelope = JSON.parse(outcome.stdout) as {
118
+ data: { name: string }[];
119
+ };
120
+ const listed = envelope.data.map((skill) => skill.name).sort();
121
+ expect(listed.length).toBeGreaterThan(0);
122
+ // Every skill the snapshot ships is listed — not just "some skills".
123
+ expect(listed).toEqual(
124
+ expect.arrayContaining(
125
+ shippedSkills()
126
+ .map((s) => s.name)
127
+ .sort(),
128
+ ),
129
+ );
130
+ expect(outcome.stderr).not.toContain("No skills found");
131
+ });
132
+
133
+ it("`setup --dry-run` OFFERS a skills row instead of skipping it", () => {
134
+ // The other half of the same defect: the global scope's only source was the
135
+ // installed root, so a fresh machine's setup plan skipped skills entirely
136
+ // and pointed at `sources update` as the remedy.
137
+ const cwd = mkdtempSync(join(tmpdir(), "pragma-fresh-setup-"));
138
+ const outcome = runCli(["setup", "--dry-run", "--global"], {
139
+ cwd,
140
+ env: freshInstallEnv(),
141
+ });
142
+ expect(outcome.exitCode).toBe(0);
143
+ expect(outcome.stdout).toMatch(/skills\s+link\s+\d+ skills? →/);
144
+ expect(outcome.stdout).not.toContain("no skills installed");
145
+ });
146
+ });
147
+
148
+ describe("bundled skills — precedence", () => {
149
+ let previousDataHome: string | undefined;
150
+ let dataHome: string;
151
+ let cwd: string;
152
+
153
+ /** The first skill the snapshot ships — the name both overrides reuse. */
154
+ const shadowed = (): { folder: string; name: string } => {
155
+ const first = shippedSkills()[0];
156
+ if (first === undefined) throw new Error("no bundled skills to shadow");
157
+ return first;
158
+ };
159
+
160
+ /** Write a `SKILL.md` for `name` under `root/folder`, with a marker body. */
161
+ const writeSkill = (root: string, folder: string, name: string): void => {
162
+ mkdirSync(join(root, folder), { recursive: true });
163
+ writeFileSync(
164
+ join(root, folder, "SKILL.md"),
165
+ `---\nname: ${name}\ndescription: OVERRIDE.\n---\n`,
166
+ );
167
+ };
168
+
169
+ beforeEach(() => {
170
+ previousDataHome = process.env.XDG_DATA_HOME;
171
+ dataHome = mkdtempSync(join(tmpdir(), "pragma-prec-data-"));
172
+ process.env.XDG_DATA_HOME = dataHome;
173
+ cwd = mkdtempSync(join(tmpdir(), "pragma-prec-proj-"));
174
+ });
175
+
176
+ afterEach(() => {
177
+ process.env.XDG_DATA_HOME = previousDataHome;
178
+ });
179
+
180
+ it("an INSTALLED skill of the same name wins over the bundled copy", () => {
181
+ // The rule someone who ran `sources update` is relying on: the update they
182
+ // asked for must reach them, never the copy frozen at release time.
183
+ const { folder, name } = shadowed();
184
+ writeSkill(installedSkillsDir(), folder, name);
185
+ const found = discoverSkills(cwd).find((skill) => skill.name === name);
186
+ expect(found?.description).toBe("OVERRIDE.");
187
+ expect(found?.sourcePath).toBe(join(installedSkillsDir(), folder));
188
+ });
189
+
190
+ it("a PROJECT skill wins over both", () => {
191
+ const { folder, name } = shadowed();
192
+ writeSkill(installedSkillsDir(), folder, name);
193
+ writeSkill(join(cwd, ".pragma", "skills"), folder, `${name}`);
194
+ const found = discoverSkills(cwd).find((skill) => skill.name === name);
195
+ expect(found?.sourcePath).toBe(join(cwd, ".pragma", "skills", folder));
196
+ });
197
+
198
+ it("shadowing REPLACES rather than duplicates the name", () => {
199
+ const { folder, name } = shadowed();
200
+ writeSkill(installedSkillsDir(), folder, name);
201
+ const matches = discoverSkills(cwd).filter((skill) => skill.name === name);
202
+ expect(matches).toHaveLength(1);
203
+ });
204
+ });
205
+
206
+ describe("bundled skills — the upgrade hazard", () => {
207
+ // THE HAZARD, spelled out. Every other link `setup skills` writes points into
208
+ // a directory pragma controls; a bundled one points into the package
209
+ // directory, which the PACKAGE MANAGER owns. `npm i -g` reuses the same path,
210
+ // but a pnpm / npx / versioned layout does not — so an upgrade can leave a
211
+ // harness link dangling at a package directory that no longer exists.
212
+ //
213
+ // The design turns on whether the EXISTING reconcile repairs that or leaves
214
+ // it, and that is answered here by construction rather than by reading the
215
+ // code: a link to a plausible previous release's path is planted in the
216
+ // harness directory, and the forward plan is inspected.
217
+ const FLAGS: GlobalFlags = {
218
+ format: "plain",
219
+ color: false,
220
+ quiet: false,
221
+ verbose: false,
222
+ };
223
+
224
+ let prevHome: string | undefined;
225
+ let prevDataHome: string | undefined;
226
+ let home: string;
227
+
228
+ beforeEach(() => {
229
+ prevHome = process.env.HOME;
230
+ prevDataHome = process.env.XDG_DATA_HOME;
231
+ home = mkdtempSync(join(tmpdir(), "pragma-upgrade-home-"));
232
+ process.env.HOME = home;
233
+ // An empty installed root, so the bundled snapshot is the scope's only
234
+ // source — exactly a fresh install that has never run `sources update`.
235
+ process.env.XDG_DATA_HOME = mkdtempSync(
236
+ join(tmpdir(), "pragma-upgrade-data-"),
237
+ );
238
+ });
239
+
240
+ afterEach(() => {
241
+ if (prevHome === undefined) delete process.env.HOME;
242
+ else process.env.HOME = prevHome;
243
+ if (prevDataHome === undefined) delete process.env.XDG_DATA_HOME;
244
+ else process.env.XDG_DATA_HOME = prevDataHome;
245
+ });
246
+
247
+ it("repairs a link into a REPLACED package directory (REGRESSION)", async () => {
248
+ const first = shippedSkills()[0];
249
+ if (first === undefined) throw new Error("no bundled skills");
250
+ // The harness directory as an upgrade would leave it: a link at the right
251
+ // name pointing into the version-stamped path of the release before this
252
+ // one, which no longer exists.
253
+ const harnessDir = join(home, ".agents", "skills");
254
+ mkdirSync(harnessDir, { recursive: true });
255
+ const linkPath = join(harnessDir, first.folder);
256
+ symlinkSync(
257
+ join(tmpdir(), "pragma-cli@0.34.0", "bundled-skills", first.folder),
258
+ linkPath,
259
+ );
260
+ expect(lstatSync(linkPath).isSymbolicLink()).toBe(true); // present…
261
+ expect(existsSync(linkPath)).toBe(false); // …and dangling.
262
+
263
+ const cwd = mkdtempSync(join(tmpdir(), "pragma-upgrade-proj-"));
264
+ const detected = await detectSkills(bootRuntime(FLAGS, cwd), "global");
265
+
266
+ // Planned as `replaced` — NOT skipped as somebody else's link, and NOT
267
+ // swept as an orphan: the per-skill pass covers the path, so the sweep
268
+ // never sees it. Both halves matter; either one alone would lose the link.
269
+ const action = detected.actions.find((a) => a.linkPath === linkPath);
270
+ expect(action?.action).toBe("replaced");
271
+ expect(action?.skillName).toBe(first.name);
272
+ expect(staleSkillLinks(detected).map((a) => a.linkPath)).not.toContain(
273
+ linkPath,
274
+ );
275
+
276
+ // And the forward run is delete-then-relink onto the CURRENT package, so
277
+ // one `setup skills` after an upgrade converges the harness.
278
+ expect(
279
+ dryRun(composeSkills(detected)).effects.map((e) => e._tag),
280
+ ).toContain("DeleteFile");
281
+ await runTask(composeSkills(detected));
282
+ expect(existsSync(linkPath)).toBe(true);
283
+ expect(readFileSync(join(linkPath, "SKILL.md"), "utf-8")).toContain(
284
+ `name: ${first.name}`,
285
+ );
286
+ });
287
+
288
+ it("doctor makes the upgrade window VISIBLE, with the command that closes it", async () => {
289
+ // The residual risk is the gap between an upgrade and the next
290
+ // `setup skills`: the link dangles and the harness sees a broken skill.
291
+ // One command converges it (above) — so what has to be true is that
292
+ // something TELLS the user to run it. This is that assertion. Without it
293
+ // the window is real but silent, which is the "doctor blind to orphans"
294
+ // shape sitting on a path an upgrade reaches routinely.
295
+ const first = shippedSkills()[0];
296
+ if (first === undefined) throw new Error("no bundled skills");
297
+ const harnessDir = join(home, ".agents", "skills");
298
+ mkdirSync(harnessDir, { recursive: true });
299
+ symlinkSync(
300
+ join(tmpdir(), "pragma-cli@0.34.0", "bundled-skills", first.folder),
301
+ join(harnessDir, first.folder),
302
+ );
303
+
304
+ const cwd = mkdtempSync(join(tmpdir(), "pragma-upgrade-doctor-"));
305
+ const rows = await scopedChecks(bootRuntime(FLAGS, cwd), BIN_NAME);
306
+ const row = rows.find((r) => r.name === "skills" && r.scope === "global");
307
+ expect(row?.status).toBe("fail");
308
+ expect(row?.detail).toContain("point elsewhere");
309
+ // No AUTHORED remedy on this branch: the row takes the derived one, which
310
+ // is exactly the command proven to repair it in the cell above.
311
+ expect(row?.remedy).toBe(`${BIN_NAME} setup skills`);
312
+ });
313
+
314
+ it("discovery itself cannot degrade on an upgrade", () => {
315
+ // The other half of the worry — that a moved package directory would make
316
+ // the snapshot vanish from DISCOVERY too, silently returning the CLI to the
317
+ // skips-everything state this change removes. It cannot: `bundledSkillsDir`
318
+ // walks up from `import.meta.url`, so it resolves against whichever copy of
319
+ // the package is EXECUTING, which is the new one by definition. There is no
320
+ // recorded path anywhere that an upgrade could invalidate.
321
+ expect((bundledSkillsDir() as string).startsWith(packageRoot)).toBe(true);
322
+ const cwd = mkdtempSync(join(tmpdir(), "pragma-upgrade-disc-"));
323
+ expect(discoverSkills(cwd).length).toBeGreaterThan(0);
324
+ });
325
+ });
326
+
327
+ describe("bundled skills — packaging", () => {
328
+ // Generous timeout: this shells out to the real packer over ~950 files.
329
+ it("the snapshot is in the published tarball (`files` allowlist)", () => {
330
+ // `files` allowlists are exactly the kind of thing that looks right and
331
+ // ships nothing: the directory would exist in the repo, every test above
332
+ // would pass from the source tree, and a consumer's install would carry no
333
+ // skills at all. Only the packer's own answer settles it.
334
+ const packed = spawnSync(
335
+ "npm",
336
+ ["pack", "--dry-run", "--json", "--ignore-scripts"],
337
+ { cwd: packageRoot, encoding: "utf-8", timeout: 120_000 },
338
+ );
339
+ expect(packed.status).toBe(0);
340
+ const files = (
341
+ JSON.parse(packed.stdout) as { files: { path: string }[] }[]
342
+ )[0]?.files.map((file) => file.path);
343
+ for (const { folder } of shippedSkills()) {
344
+ expect(files).toContain(`bundled-skills/${folder}/SKILL.md`);
345
+ }
346
+ }, 120_000);
347
+ });
@@ -4,15 +4,17 @@
4
4
  * A skill is a folder with a `SKILL.md` carrying YAML frontmatter (`name`,
5
5
  * `description`, and the #856 `prompt` flag among others). Skills are discovered
6
6
  * from conventional roots — project skills under `<cwd>/.pragma/skills`, which
7
- * take precedence, then installed skills under `$XDG_DATA_HOME/pragma/skills` —
8
- * with missing files and invalid frontmatter skipped gracefully. Reads only the
7
+ * take precedence, then installed skills under `$XDG_DATA_HOME/pragma/skills`,
8
+ * then the BUNDLED snapshot this package ships (`bundled-skills/`) — with
9
+ * missing files and invalid frontmatter skipped gracefully. Reads only the
9
10
  * filesystem, never the graph store, so `skill list`/`lookup` are storeless
10
11
  * (needsStore: false).
11
12
  */
12
13
 
13
- import { readdirSync, readFileSync, statSync } from "node:fs";
14
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
14
15
  import { homedir } from "node:os";
15
- import { basename, join } from "node:path";
16
+ import { basename, dirname, join } from "node:path";
17
+ import { fileURLToPath } from "node:url";
16
18
  import { BIN_NAME } from "../../constants.js";
17
19
 
18
20
  /** Parsed SKILL.md frontmatter. */
@@ -120,15 +122,115 @@ export function installedSkillsDir(): string {
120
122
  return join(dataHome, BIN_NAME, "skills");
121
123
  }
122
124
 
125
+ /**
126
+ * The project skills root: `<cwd>/.<bin>/skills` — skills that belong to THIS
127
+ * repository and travel with it. Named separately from {@link skillRoots}
128
+ * because the two roots are also the two setup SCOPES: `setup skills --local`
129
+ * links this root into the project's harness directories, while the global scope
130
+ * links {@link installedSkillsDir} into the user-level ones. Mixing them leaks
131
+ * machine state into a repository's directories, or applies one repository's
132
+ * skills machine-wide.
133
+ */
134
+ export function projectSkillsDir(cwd: string): string {
135
+ return join(cwd, `.${BIN_NAME}`, "skills");
136
+ }
137
+
138
+ /**
139
+ * The directory name of the SNAPSHOT of pack skills this package ships, at its
140
+ * own root. Written by `scripts/bundle.ts` and COMMITTED, exactly as
141
+ * `src/kernel/runtime/graphpack/embedded/pack.generated.ts` is — see
142
+ * {@link bundledSkillsDir}.
143
+ */
144
+ const BUNDLED_SKILLS_DIRNAME = "bundled-skills";
145
+
146
+ /**
147
+ * How far above this module the package root can be. `src/capabilities/skill`
148
+ * is three levels up; the emitted `dist/src/capabilities/skill` is four. The
149
+ * bound exists so a tree that is MISSING the artifact stops at the package
150
+ * instead of walking to `/` and adopting an unrelated directory.
151
+ */
152
+ const BUNDLED_SEARCH_DEPTH = 6;
153
+
154
+ /**
155
+ * The BUNDLED-skills root: `<package root>/bundled-skills`, the snapshot of the
156
+ * declared packs' `skills/<name>/` that `scripts/bundle.ts` commits alongside
157
+ * the embedded graph — `undefined` when this build ships none.
158
+ *
159
+ * WHY IT EXISTS. The embedded pack (`pack.generated.ts`) is what lets a fresh
160
+ * install answer `block lookup` offline. The skills came out of the very same
161
+ * `resolvePackage` calls and were left on the build machine's disk, so the same
162
+ * fresh install listed ZERO skills and told the user to run `sources update`
163
+ * first — a network round trip and two commands for something already resolved
164
+ * at release time. This is the skills half of the snapshot the graph has had
165
+ * all along.
166
+ *
167
+ * WHY IT IS FOUND BY WALKING UP rather than by a fixed relative path. `files`
168
+ * ships BOTH `src` and `dist`, and `tsconfig.build.json` sets `rootDir: "."`,
169
+ * so this module runs from `src/capabilities/skill/` in a source or test run
170
+ * and from `dist/src/capabilities/skill/` in the shipped one — the package root
171
+ * is three levels up in one and four in the other, and no single
172
+ * `new URL("../../..")` is right for both. The walk anchors on the artifact's
173
+ * own name sitting NEXT TO a `package.json`, which is true only at the package
174
+ * root: `dist/` carries a `package.json` too (`resolveJsonModule` copies it)
175
+ * but never the snapshot.
176
+ *
177
+ * @returns The bundled root, or `undefined` when no ancestor holds one.
178
+ * @note Impure — stats up to {@link BUNDLED_SEARCH_DEPTH} ancestor directories.
179
+ * Reached from the `__complete` fast path, so it stays `node:fs` /
180
+ * `node:path` / `node:url` only and costs a handful of `stat`s.
181
+ */
182
+ export function bundledSkillsDir(): string | undefined {
183
+ let dir = dirname(fileURLToPath(import.meta.url));
184
+ for (let up = 0; up < BUNDLED_SEARCH_DEPTH; up += 1) {
185
+ const candidate = join(dir, BUNDLED_SKILLS_DIRNAME);
186
+ if (existsSync(join(dir, "package.json")) && existsSync(candidate)) {
187
+ return candidate;
188
+ }
189
+ const parent = dirname(dir);
190
+ if (parent === dir) break;
191
+ dir = parent;
192
+ }
193
+ return undefined;
194
+ }
195
+
123
196
  /**
124
197
  * The conventional roots skills are discovered from, in PRECEDENCE order: the
125
198
  * project root (`<cwd>/.<bin>/skills`) FIRST so a project-local skill overrides
126
199
  * an installed skill of the same name (`discoverSkills` dedups first-seen-wins),
127
200
  * then installed skills under `$XDG_DATA_HOME/<bin>/skills` (where package
128
- * skills land on `sources update`).
201
+ * skills land on `sources update`), then the BUNDLED snapshot
202
+ * ({@link bundledSkillsDir}).
203
+ *
204
+ * BUNDLED IS LAST, and that order is the whole contract. The snapshot is as old
205
+ * as the release; an installed skill came from a `sources update` the user ran
206
+ * deliberately, and a project skill is the repository's own. So someone who
207
+ * updates gets the CURRENT skill and never the shipped copy, while a fresh
208
+ * install — which has neither of the first two roots — still gets the packs'
209
+ * skills instead of an empty list and a two-command recovery.
129
210
  */
130
211
  export function skillRoots(cwd: string): string[] {
131
- return [join(cwd, `.${BIN_NAME}`, "skills"), installedSkillsDir()];
212
+ return [projectSkillsDir(cwd), ...globalSkillRoots()];
213
+ }
214
+
215
+ /**
216
+ * The GLOBAL scope's source roots, in precedence order: the INSTALLED root
217
+ * (`sources update`'s output) first, then the BUNDLED snapshot.
218
+ *
219
+ * Named separately from {@link skillRoots} for the reason
220
+ * {@link projectSkillsDir} is: these are the two roots `setup skills --global`
221
+ * links into the user-level harness directories, and `skillRoots` is discovery,
222
+ * which spans both scopes. Reading the project root for the global scope is
223
+ * exactly the cross-scope leak the scope split exists to prevent.
224
+ *
225
+ * A BAND CAN HOLD MORE THAN ONE ROOT, and this is where that became true. The
226
+ * global scope's ownership test and its stale-link sweep therefore range over
227
+ * the SET (see `setup/operations/setupSkills.ts`), never over one path.
228
+ */
229
+ export function globalSkillRoots(): string[] {
230
+ const bundled = bundledSkillsDir();
231
+ return bundled === undefined
232
+ ? [installedSkillsDir()]
233
+ : [installedSkillsDir(), bundled];
132
234
  }
133
235
 
134
236
  /** Immediate subdirectories of `root` (each a candidate skill folder). */
@@ -149,16 +251,24 @@ function subdirs(root: string): string[] {
149
251
  }
150
252
 
151
253
  /**
152
- * Discover every skill reachable from the conventional roots.
254
+ * Discover every skill reachable from an EXPLICIT list of roots, in precedence
255
+ * order (first-seen wins on a duplicate name).
153
256
  *
154
- * @param cwd - The project directory (project skills root).
257
+ * Split out of {@link discoverSkills} so a caller that owns one scope can read
258
+ * exactly that scope's root: `setup skills` links the project root into project
259
+ * harness directories and the installed root into user-level ones, and reading
260
+ * both roots for either scope is what used to mix the two.
261
+ *
262
+ * @param roots - The roots to read, in precedence order.
155
263
  * @returns Discovered skills, sorted by name; malformed ones are skipped.
156
264
  * @note Impure — reads SKILL.md files.
157
265
  */
158
- export function discoverSkills(cwd: string): DiscoveredSkill[] {
266
+ export function discoverSkillsFrom(
267
+ roots: readonly string[],
268
+ ): DiscoveredSkill[] {
159
269
  const skills: DiscoveredSkill[] = [];
160
270
  const seen = new Set<string>();
161
- for (const root of skillRoots(cwd)) {
271
+ for (const root of roots) {
162
272
  for (const dir of subdirs(root)) {
163
273
  let content: string;
164
274
  try {
@@ -182,3 +292,14 @@ export function discoverSkills(cwd: string): DiscoveredSkill[] {
182
292
  a.name < b.name ? -1 : a.name > b.name ? 1 : 0,
183
293
  );
184
294
  }
295
+
296
+ /**
297
+ * Discover every skill reachable from the conventional roots.
298
+ *
299
+ * @param cwd - The project directory (project skills root).
300
+ * @returns Discovered skills, sorted by name; malformed ones are skipped.
301
+ * @note Impure — reads SKILL.md files.
302
+ */
303
+ export function discoverSkills(cwd: string): DiscoveredSkill[] {
304
+ return discoverSkillsFrom(skillRoots(cwd));
305
+ }
@@ -2,7 +2,7 @@
2
2
  * The `skill` capability module — storeless filesystem discovery.
3
3
  */
4
4
 
5
- import type { CapabilityModule } from "../../kernel/spec/types.js";
5
+ import type { CapabilityModule } from "../../kernel/spec/index.js";
6
6
  import { skillListVerb, skillLookupVerb } from "./verbs.js";
7
7
 
8
8
  /** The `skill` capability module (`list`, `lookup`). */
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { BIN_NAME } from "../../constants.js";
6
- import type { Formatters } from "../../kernel/spec/types.js";
6
+ import type { Formatters } from "../../kernel/spec/index.js";
7
7
  import type { DiscoveredSkill } from "./discover.js";
8
8
  import type { SkillLookup } from "./verbs.js";
9
9
 
@@ -12,15 +12,16 @@ const EMPTY_PLAIN = `No skills found.\nSkills come from design-system packs —
12
12
  const EMPTY_LLM = `## Skills (0)\n\nNo skills found. Skills come from design-system packs — add one to the project config's packs, run \`${BIN_NAME} sources update\`, then \`${BIN_NAME} setup skills\`.`;
13
13
 
14
14
  export const skillListFormatters: Formatters<DiscoveredSkill[]> = {
15
+ // Zero skills: plain stdout stays empty — the guidance is `notice`,
16
+ // which the dispatcher routes to stderr (exit 0) so a pipe reads no prose.
15
17
  plain: (skills) =>
16
- skills.length === 0
17
- ? EMPTY_PLAIN
18
- : skills
19
- .map(
20
- (s) =>
21
- `${s.name}${s.frontmatter.prompt ? " (prompt)" : ""} ${s.description}`,
22
- )
23
- .join("\n"),
18
+ skills
19
+ .map(
20
+ (s) =>
21
+ `${s.name}${s.frontmatter.prompt ? " (prompt)" : ""} ${s.description}`,
22
+ )
23
+ .join("\n"),
24
+ notice: (skills) => (skills.length === 0 ? EMPTY_PLAIN : undefined),
24
25
  llm: (skills) =>
25
26
  skills.length === 0
26
27
  ? EMPTY_LLM
@@ -15,7 +15,11 @@ import { bootRuntime } from "../../kernel/runtime/boot.js";
15
15
  import type { PragmaRuntime } from "../../kernel/runtime/types.js";
16
16
  import type { VerbSpec } from "../../kernel/spec/types.js";
17
17
  import { TEST_FLAGS } from "../../testing/helpers/projectCli.js";
18
- import type { DiscoveredSkill } from "./discover.js";
18
+ import {
19
+ bundledSkillsDir,
20
+ type DiscoveredSkill,
21
+ discoverSkillsFrom,
22
+ } from "./discover.js";
19
23
  import { skillModule } from "./index.js";
20
24
  import { skillListFormatters } from "./render.js";
21
25
  import type { SkillLookup } from "./verbs.js";
@@ -60,7 +64,16 @@ afterAll(() => {
60
64
  describe("skill list (storeless)", () => {
61
65
  it("discovers skills by name, carrying the prompt flag", async () => {
62
66
  const skills = (await listVerb.run({}, rt)) as DiscoveredSkill[];
63
- expect(skills.map((s) => s.name)).toEqual(["docx", "pdf"]);
67
+ // The list is the project root's two skills UNION the bundled snapshot the
68
+ // package ships (`bundledSkills.test.ts` owns the snapshot's own cells).
69
+ // Derived from the shipped artifact rather than spelled out, so a release
70
+ // that changes which skills the packs provide does not rewrite this test.
71
+ const bundled = discoverSkillsFrom([bundledSkillsDir() as string]).map(
72
+ (s) => s.name,
73
+ );
74
+ expect(skills.map((s) => s.name)).toEqual(
75
+ [...new Set(["docx", "pdf", ...bundled])].sort(),
76
+ );
64
77
  expect(skills.find((s) => s.name === "pdf")?.frontmatter.prompt).toBe(true);
65
78
  expect(
66
79
  skills.find((s) => s.name === "docx")?.frontmatter.prompt,
@@ -85,11 +98,13 @@ describe("skill lookup (storeless)", () => {
85
98
  });
86
99
 
87
100
  describe("skill list empty-state (U5)", () => {
88
- it("plain output is non-blank and guides toward package sources", () => {
89
- const plain = skillListFormatters.plain([]);
90
- expect(plain).not.toBe("");
91
- expect(plain).toContain("No skills found");
92
- expect(plain).toContain("pragma sources update");
101
+ it("the empty notice (stderr's text) guides toward package sources", () => {
102
+ // Zero skills: plain stdout is empty (a pipe reads no prose) and the
103
+ // guidance rides the dispatcher's stderr via `notice`.
104
+ expect(skillListFormatters.plain([])).toBe("");
105
+ const notice = skillListFormatters.notice?.([]);
106
+ expect(notice).toContain("No skills found");
107
+ expect(notice).toContain("pragma sources update");
93
108
  });
94
109
 
95
110
  it("llm output announces zero and guides, json stays []", () => {
@@ -9,12 +9,11 @@
9
9
  import { readFileSync } from "node:fs";
10
10
  import { join } from "node:path";
11
11
  import { BIN_NAME } from "../../constants.js";
12
- import { PragmaError } from "../../kernel/error/PragmaError.js";
13
- import { cliRecovery } from "../../kernel/error/recovery.js";
12
+ import { cliRecovery, PragmaError } from "../../kernel/error/index.js";
14
13
  import { suggestNames } from "../../kernel/project/cli/suggestNames.js";
15
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
14
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
16
15
  import { asVerb } from "../../kernel/spec/asVerb.js";
17
- import type { VerbSpec } from "../../kernel/spec/types.js";
16
+ import type { VerbSpec } from "../../kernel/spec/index.js";
18
17
  import { type DiscoveredSkill, discoverSkills } from "./discover.js";
19
18
  import { skillListFormatters, skillLookupFormatters } from "./render.js";
20
19
 
@@ -12,12 +12,17 @@
12
12
 
13
13
  import { existsSync, readFileSync } from "node:fs";
14
14
  import { join } from "node:path";
15
- import type { PackDeclaration } from "../../kernel/config/types.js";
15
+ import type { PackDeclaration } from "../../kernel/config/index.js";
16
+ // DIRECT LEAF IMPORTS, not `graphpack/index.js`. The barrel re-exports
17
+ // `build.ts`/`read.ts` (pulling `@canonical/ke` and `@canonical/ke-graphql`)
18
+ // and `embedded.ts`, whose generated payload is ~1.9 MB. `sources status`
19
+ // reads two manifests and prints them; routing that through the barrel
20
+ // would make a status-only command initialise the whole pack stack.
16
21
  import { embeddedManifest } from "../../kernel/runtime/graphpack/embedded.js";
17
22
  import { readManifest } from "../../kernel/runtime/graphpack/manifest.js";
18
23
  import { INDEX_FILE } from "../../kernel/runtime/graphpack/types.js";
24
+ import type { PragmaRuntime } from "../../kernel/runtime/index.js";
19
25
  import { resolveSources } from "../../kernel/runtime/resolveSources.js";
20
- import type { PragmaRuntime } from "../../kernel/runtime/types.js";
21
26
  import type { SourcesStatusData } from "./types.js";
22
27
 
23
28
  const entryName = (entry: PackDeclaration): string =>