@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,1016 @@
1
+ /**
2
+ * The pragma distribution config — identity, default packs, and the read
3
+ * stories those packs supply.
4
+ *
5
+ * Consumed three times: statically imported by `src/kernel/config/defaults.ts`
6
+ * as the lowest config layer (compiled with the source — no fs), by
7
+ * `src/capabilities/distribution.ts` (which compiles the declared stories into
8
+ * capability modules at module load), and at build time by the bundler. A
9
+ * NON-magic name on purpose: `findProjectConfig` only discovers
10
+ * `pragma.config.{ts,js}`, so this file is never mistaken for a project config.
11
+ * Validated by the same `parseRawConfig` as every layer.
12
+ *
13
+ * INERT DATA. It must never gain a value import: `src/constants.ts` statically
14
+ * imports it to project the program's identity, so anything that runs at this
15
+ * module's load runs on `--help`, `__complete` and `--version`. That also makes
16
+ * the reverse edge impossible — importing `constants.js` from here is a
17
+ * temporal-dead-zone cycle. It is also why no string below names the binary
18
+ * except `name` itself: an `emptyRecovery.cli` is the command WITHOUT the
19
+ * binary name, and the renderer prepends the consuming distribution's.
20
+ * `capabilities/lazy.test.ts` pins both halves of that.
21
+ */
22
+ /**
23
+ * The design-system domain colophon — the ontology + graph story, surfaced by
24
+ * `pragma colophon` after pragma's own. Declared on the flagship UI-block noun
25
+ * because `block` most embodies the design system; it narrates the DOMAIN (what
26
+ * the graph models), not the toolchain (pragma's built-in section).
27
+ */
28
+ const DESIGN_SYSTEM_COLOPHON = `The Canonical design system is a **knowledge graph**, not a component library.
29
+ Every block, token, modifier, standard, and tier is a node in an RDF store,
30
+ described by the \`ds:\` ontology and queried the same way whether you reach it
31
+ over GraphQL or raw SPARQL.
32
+
33
+ ## What the graph models
34
+
35
+ - **Blocks** — components, patterns, layouts, and subcomponents (the \`ds:UIBlock\`
36
+ family). A block carries its anatomy, guidelines, and \`when to use\` / \`when
37
+ not to use\` narrative as graph properties, not prose in a wiki.
38
+ - **Modifiers** — families of variant values (\`ds:hasModifierFamily\` →
39
+ \`ds:hasModifier\`) a block composes, so a variant is a relationship, not a
40
+ string.
41
+ - **Tokens** — the themeable design values, resolved per theme.
42
+ - **Standards** — the do / don't coding guidance, categorized and linked to the
43
+ blocks they govern.
44
+ - **Concepts** — the long-form documentation that belongs to no single block:
45
+ foundations, decision guides, and how-to guides, each typed by a
46
+ \`ds:ConceptType\`.
47
+ - **Implementations** — which library implements which block, in which
48
+ framework, with a source link pinned to the release that shipped it: the
49
+ spec and the code realizing it are edges in one graph.
50
+
51
+ ## How it fits together
52
+
53
+ - **Tiers** are a hierarchy (\`global\` > \`apps\` > \`apps/lxd\`): a lower tier
54
+ inherits and overrides the blocks of its ancestors, so scoping a query to a
55
+ tier walks that chain.
56
+ - **Channels** (\`normal\`, \`experimental\`, \`prerelease\`) gate visibility, so an
57
+ in-progress block never leaks into a stable answer.
58
+
59
+ ## Why RDF
60
+
61
+ One graph makes every relationship first-class and queryable: \`block lookup\`
62
+ follows edges to modifiers and subcomponents, \`concept lookup\` reads the
63
+ long-form documentation, \`graph query\` runs arbitrary SPARQL, and
64
+ \`ontology lookup\` reads the schema itself. Which React components implement
65
+ a global-tier block is one query, not an afternoon. The store is built once
66
+ by \`sources update\` and addressed by content hash, so the domain you query is
67
+ exactly the domain that was published.`;
68
+ /**
69
+ * The read stories the design-system pack supplies — `block`, `token`,
70
+ * `modifier` and `tier` as declared data rather than code.
71
+ *
72
+ * The association with the pack is the point: when `@canonical/design-system`
73
+ * starts shipping its own `stories/*.json`, this block is deleted and the
74
+ * package tier takes over with no code change here or anywhere else. The local
75
+ * `readonly PackDefinition[]` annotation is what type-checks them —
76
+ * `PackSource.stories` is deliberately `readonly unknown[]`, because the config
77
+ * layer does not know the pack grammar (`parsePackDefinition` does).
78
+ */
79
+ const designSystemStories = [
80
+ // `block list` is declared content (L-OPEN-9): one unfiltered SELECT over
81
+ // the four UIBlock classes, listing ALL blocks — experimental and alpha ones
82
+ // included, for everyone — until filtering returns in declared form. The
83
+ // hand-written tier-chain/channel filtering (and its `--all-tiers` escape)
84
+ // is removed with the code, an owner-signed consequence. Display parity
85
+ // lives IN the query: `VALUES ?class` closes the type set, so the BINDs
86
+ // that derive `name` (declared name, else the IRI's local name), `type`
87
+ // (lowercased class local name), and `tier` (tier IRI's local name) operate
88
+ // over known shapes — the `standard` story's BIND/COALESCE precedent.
89
+ //
90
+ // `block lookup` is served over the GraphQL fetch path (ONE generated document
91
+ // over the `UIBlock` interface covering Component/Pattern/Layout/Subcomponent).
92
+ // Base level mirrors the old summary view (name/tier/summary); the default is
93
+ // `detailed`, matching the old CLI which rendered anatomy and modifiers
94
+ // without a flag. A derived name that maps onto no schema field is omitted
95
+ // (OPTIONAL parity), so a graph missing one of these properties degrades
96
+ // gracefully rather than erroring.
97
+ //
98
+ // That graceful degradation is also how this story went silent: it used to
99
+ // read `ds:whenToUse`/`ds:whenNotToUse`, which the ontology RETIRED in favour
100
+ // of a single `ds:usage` — "Subsumes the former whenToUse/whenNotToUse" is
101
+ // that property's own skos:definition. The shipped pack asserts `ds:usage` on
102
+ // all 264 blocks and neither retired term on any of them, so every
103
+ // `block lookup` on every install rendered no usage narrative at all —
104
+ // silently, because a name that maps onto no schema field is exactly the case
105
+ // OPTIONAL parity swallows. The retired terms are NOT kept as a fallback:
106
+ // `ds:usage` subsumes them, so a pack carrying both would print the same
107
+ // guidance twice, and a declaration no shipped graph can satisfy is
108
+ // untestable by construction — which is what let the silence ship.
109
+ // `block.shipped.exec.test.ts` now holds every graph term declared here — the
110
+ // identity property, fields, sections, expand relations, and every term
111
+ // selected beneath them, walked recursively — to being DEFINED as a property
112
+ // by the SHIPPED ontology. Defined, not asserted, and the difference is the
113
+ // whole point: a term the ontology never defines is a story bug that can
114
+ // never render, on any block, on any install — this defect. A term it defines
115
+ // that no instance asserts yet (`ds:figmaLink` today) is a content gap
116
+ // upstream, which the OPTIONAL parity above degrades over gracefully and
117
+ // which this pack has no business failing on. `ds:usage` alone is ALSO held
118
+ // to being asserted, on every block, because its absence is what shipped.
119
+ //
120
+ // Disclosure declares the FULL canonical ladder `[summary, standard,
121
+ // detailed]` — the same set `standard` declares — so a config
122
+ // `detail=standard` names a level `block` advertises rather than one it
123
+ // silently accepts-then-degrades. Block carries no `standard`-tier content of
124
+ // its own; gating is by canonical index, so `standard` resolves to the base
125
+ // view. Only the level SET is aligned: the per-noun DEFAULT stays domain-tuned
126
+ // (`block` rich-by-default, `standard` terse-by-default).
127
+ {
128
+ noun: "block",
129
+ description: "List all design system blocks.",
130
+ toolDescription: "List all design system blocks with their type, tier, and modifier families. Use when browsing which blocks exist. Example: block_list {}.",
131
+ colophon: DESIGN_SYSTEM_COLOPHON,
132
+ list: {
133
+ query: [
134
+ "SELECT ?uri ?name ?type ?tier",
135
+ ' (GROUP_CONCAT(DISTINCT ?modName; separator=", ") AS ?modifiers)',
136
+ "WHERE {",
137
+ " VALUES ?class { ds:Component ds:Pattern ds:Layout ds:Subcomponent }",
138
+ " ?uri a ?class .",
139
+ " OPTIONAL { ?uri ds:name ?dsName }",
140
+ " OPTIONAL { ?uri ds:tier ?tierUri . OPTIONAL { ?tierUri ds:name ?tierName } }",
141
+ " OPTIONAL { ?uri ds:hasModifierFamily ?family . ?family ds:name ?modName }",
142
+ ' BIND(COALESCE(?dsName, REPLACE(STR(?uri), "^.*[/#]", "")) AS ?name)',
143
+ ' BIND(LCASE(REPLACE(STR(?class), "^.*[/#]", "")) AS ?type)',
144
+ ' BIND(REPLACE(STR(?tierUri), "^.*[/#]", "") AS ?tier)',
145
+ // `ORDER BY ?name` alone is not a total order, and 25 names here are
146
+ // shared by two or three blocks. SPARQL says nothing about tied rows,
147
+ // so the store's scan decided: ONE run gave `Button` launchpad-first
148
+ // and `CheckboxInput` global-first. Tier depth, then `STR(?uri)`,
149
+ // makes it total — the shallower tier leads its name group, and equal
150
+ // depths fall back to a key that cannot tie.
151
+ //
152
+ // The depth is the same one `lookup` ranks by, spelled out because a
153
+ // list query is declared TEXT the kernel does not compose. Only the
154
+ // depth: a browse ordered by NAME is not the place to re-litigate which
155
+ // block the name MEANS (that is `lookup`'s ranking, which also weighs
156
+ // the block's type), and every row here already prints its own type.
157
+ //
158
+ // The depth-0 IF is the store's, not style: oxigraph raises on
159
+ // `0.2 * 0`, and a raising BIND leaves `?tierRank` unbound — which is
160
+ // exactly how a top-tier block silently sorted last (see
161
+ // `sparqlProduct` in kernel/packs/sparql/buildLookupQuery.ts).
162
+ ' BIND(STRLEN(?tierName) - STRLEN(REPLACE(?tierName, "/", "")) AS ?tierDepth)',
163
+ " BIND(COALESCE(IF(?tierDepth = 0, 1, 1 - (0.2 * ?tierDepth)), 0) AS ?tierRank)",
164
+ "}",
165
+ "GROUP BY ?uri ?name ?type ?tier ?tierRank",
166
+ "ORDER BY ?name DESC(?tierRank) STR(?uri)",
167
+ ].join("\n"),
168
+ columns: [
169
+ { field: "name", label: "Name" },
170
+ { field: "type", label: "Type" },
171
+ { field: "tier", label: "Tier" },
172
+ { field: "modifiers", label: "Modifiers" },
173
+ { field: "uri", label: "IRI" },
174
+ ],
175
+ emptyRecovery: {
176
+ message: "No blocks in the store. Build it from the configured design-system packs.",
177
+ cli: "sources update",
178
+ },
179
+ },
180
+ lookup: {
181
+ source: "graphql",
182
+ toolDescription: 'Get detailed information about one or more design system blocks including anatomy, modifiers, and properties. Use when you need the full spec of specific blocks by name — detail: "summary" trims to the base view. Example: block_lookup { name: ["Button"] }.',
183
+ by: "ds:name",
184
+ types: ["ds:Component", "ds:Pattern", "ds:Layout", "ds:Subcomponent"],
185
+ // A subcomponent is a PART of a block, never the block someone means:
186
+ // for the query "button" the 86 `…-close_button` subcomponents used to
187
+ // outrank `ds:global.component.button` on the alphabet alone. Weighting
188
+ // them below 1 sinks every one of them under every component at equal
189
+ // match score, lowers their `annotations.priority` in the resource
190
+ // listing, and — since a name resolve now RANKS rather than picks — sorts
191
+ // them under every component a shared name also reaches.
192
+ weights: { "ds:Subcomponent": 0.6 },
193
+ // The other half of that judgement, and the reason it is a PRODUCT and
194
+ // not a tiebreak. 25 live block names are shared by two or three blocks
195
+ // across tiers, and `weights` alone cannot separate two components; the
196
+ // alphabet decided, so `Button` answered with Launchpad's and never
197
+ // mentioned the global one. A tier's DEPTH is what ranks it: `Global` is
198
+ // depth 1 and worth 1, `Apps/Launchpad` is depth 2 and worth 0.8, so
199
+ //
200
+ // Button global component 1 × 1 > launchpad component 1 × 0.8
201
+ // TextInput global SUBcomponent 0.6 × 1 < launchpad component 1 × 0.8
202
+ //
203
+ // — the global block wins where both are whole blocks, and the editorial
204
+ // rule that a whole component beats a part survives the addition. A pure
205
+ // tier tiebreak would have inverted the second case.
206
+ //
207
+ // DERIVED, never enumerated: the depth is the `/` count in the tier's
208
+ // OWN `ds:name` (`"Apps/Launchpad"`), not in its IRI (`ds:apps_launchpad`
209
+ // — the slash exists only in the name), so a tier added upstream tomorrow
210
+ // is ranked correctly without editing anything here.
211
+ //
212
+ // Declared as DATA beside `weights` for the same reason `weights` is:
213
+ // editorial judgement the ontology has not yet made belongs in the config
214
+ // layer, which "wins every harvest" when upstream is silent. `asserted`
215
+ // is the exit: the day `ds:tierRank` is asserted upstream it takes
216
+ // precedence over the derived depth (`COALESCE`), and this whole entry is
217
+ // deleted with no code change.
218
+ scopeWeight: {
219
+ via: "ds:tier",
220
+ by: "ds:name",
221
+ falloff: 0.2,
222
+ asserted: "ds:tierRank",
223
+ },
224
+ graphqlType: "UIBlock",
225
+ fields: [
226
+ { name: "tier", property: "ds:tier", label: "Tier" },
227
+ {
228
+ name: "figmaLink",
229
+ property: "ds:figmaLink",
230
+ label: "Figma",
231
+ level: "detailed",
232
+ },
233
+ ],
234
+ sections: [
235
+ { name: "summary", property: "ds:summary", label: "Summary" },
236
+ // ONE section, because `ds:usage` is ONE property: its literal is
237
+ // free-text Markdown carrying its own `### When to use` / `### When not
238
+ // to use` sub-sections (78 and 71 of the 126 non-empty ones do), so
239
+ // splitting it back into two headings here would mean parsing prose the
240
+ // graph deliberately keeps whole. The renderer demotes a body's own ATX
241
+ // headings below the section heading, so those sub-sections nest UNDER
242
+ // `### Usage` instead of colliding with it. Half the blocks assert an
243
+ // EMPTY `ds:usage` (138 of 264); the renderer skips empty sections, so
244
+ // those print no heading rather than an empty one.
245
+ {
246
+ name: "usage",
247
+ property: "ds:usage",
248
+ label: "Usage",
249
+ level: "detailed",
250
+ },
251
+ {
252
+ name: "guidelines",
253
+ property: "ds:guidelines",
254
+ label: "Guidelines",
255
+ level: "detailed",
256
+ },
257
+ {
258
+ name: "anatomyDsl",
259
+ property: "ds:anatomyDsl",
260
+ label: "Anatomy (DSL)",
261
+ kind: "code",
262
+ level: "detailed",
263
+ },
264
+ {
265
+ name: "anatomyClassic",
266
+ property: "ds:anatomyClassic",
267
+ label: "Anatomy (classic)",
268
+ kind: "code",
269
+ level: "detailed",
270
+ },
271
+ ],
272
+ expand: [
273
+ {
274
+ name: "modifierFamilies",
275
+ heading: "Modifier Families",
276
+ relation: "ds:hasModifierFamily",
277
+ level: "detailed",
278
+ select: [
279
+ { name: "name", property: "ds:name" },
280
+ {
281
+ name: "values",
282
+ relation: "ds:hasModifier",
283
+ select: [{ name: "name", property: "ds:name" }],
284
+ },
285
+ ],
286
+ },
287
+ {
288
+ name: "properties",
289
+ heading: "Properties",
290
+ relation: "ds:hasProperty",
291
+ kind: "table",
292
+ level: "detailed",
293
+ select: [
294
+ { name: "name", property: "ds:name" },
295
+ { name: "type", property: "ds:propertyType" },
296
+ { name: "optional", property: "ds:optional" },
297
+ ],
298
+ },
299
+ {
300
+ name: "subcomponents",
301
+ heading: "Subcomponents",
302
+ relation: "ds:hasSubcomponent",
303
+ level: "detailed",
304
+ select: [
305
+ { name: "name", property: "ds:name" },
306
+ { name: "uri", property: "ds:name", graphqlField: "uri" },
307
+ ],
308
+ },
309
+ ],
310
+ disclosure: {
311
+ levels: ["summary", "standard", "detailed"],
312
+ default: "detailed",
313
+ },
314
+ sample: {
315
+ fixedCount: true,
316
+ toolDescription: "Return randomly selected complete design-system blocks as exemplars. Use BEFORE writing queries to see actual data shapes, anatomy, and property names. Example: block_sample {}.",
317
+ },
318
+ },
319
+ },
320
+ // Design tokens: SPARQL-sourced on both verbs. There is no `ds:Token` GraphQL
321
+ // type to project against when the graph ships no tokens, and the lookup reads
322
+ // a property path (`ds:tokenType/rdfs:label`) only SPARQL can express. The
323
+ // `emptyRecovery` install hint is the story users see on an empty store. The
324
+ // noun is now purely declarative: `token add-config` wrote a starter file, and
325
+ // L-OPEN-9 removed it rather than growing the read grammar a mutation verb.
326
+ {
327
+ noun: "token",
328
+ description: "List all design tokens.",
329
+ toolDescription: "List all design tokens with their type. Use when browsing which tokens exist under the active scope. Example: token_list {}.",
330
+ list: {
331
+ query: [
332
+ "SELECT ?uri ?name ?category WHERE {",
333
+ " ?uri a ds:Token ;",
334
+ " ds:tokenId ?name .",
335
+ " OPTIONAL {",
336
+ " ?uri ds:tokenType ?type .",
337
+ " ?type rdfs:label ?category .",
338
+ " }",
339
+ "}",
340
+ "ORDER BY ?name",
341
+ ].join("\n"),
342
+ columns: [
343
+ { field: "uri", label: "IRI" },
344
+ { field: "name", label: "Name" },
345
+ { field: "category", label: "Type" },
346
+ ],
347
+ emptyRecovery: {
348
+ message: "No tokens in the store. Build it from the configured design-system packs.",
349
+ cli: "sources update",
350
+ },
351
+ },
352
+ lookup: {
353
+ source: "sparql",
354
+ by: "ds:tokenId",
355
+ type: "ds:Token",
356
+ toolDescription: 'Get type and theme values for one or more design tokens by name. Use when resolving specific tokens\' light/dark values. Example: token_lookup { name: ["color.primary"] }.',
357
+ fields: [
358
+ {
359
+ name: "category",
360
+ property: "ds:tokenType/rdfs:label",
361
+ label: "Type",
362
+ },
363
+ { name: "valueLight", property: "ds:valueLight", label: "Light value" },
364
+ { name: "valueDark", property: "ds:valueDark", label: "Dark value" },
365
+ ],
366
+ sample: {
367
+ fixedCount: true,
368
+ toolDescription: "Return randomly selected complete design tokens (with theme values) as exemplars. Use BEFORE writing queries to see actual data shapes. Example: token_sample {}.",
369
+ },
370
+ },
371
+ },
372
+ // Modifier families. `modifier list` is SPARQL (an alternation path collects
373
+ // values asserted in either direction); `modifier lookup` is GRAPHQL, where
374
+ // the compiled `ModifierFamily.modifiers` field is the declared-inverse union
375
+ // and resolves both directions in ONE generated document — exactly the case
376
+ // the GraphQL fetch path exists for.
377
+ {
378
+ noun: "modifier",
379
+ description: "List all modifier families.",
380
+ toolDescription: "List all modifier families with their values. Use when browsing which modifier families exist and the values each allows. Example: modifier_list {}.",
381
+ list: {
382
+ query: [
383
+ "SELECT ?uri ?name",
384
+ ' (GROUP_CONCAT(DISTINCT ?valueName; separator=", ") AS ?values)',
385
+ "WHERE {",
386
+ " ?uri a ds:ModifierFamily ;",
387
+ " ds:name ?name .",
388
+ " OPTIONAL {",
389
+ " ?uri (ds:hasModifier|^ds:modifierFamily) ?value .",
390
+ " ?value ds:name ?valueName .",
391
+ " }",
392
+ "}",
393
+ "GROUP BY ?uri ?name",
394
+ "ORDER BY ?name",
395
+ ].join("\n"),
396
+ columns: [
397
+ { field: "uri", label: "IRI" },
398
+ { field: "name", label: "Name" },
399
+ { field: "values", label: "Values" },
400
+ ],
401
+ emptyRecovery: {
402
+ message: "No modifier families in the store. Build it from the configured design-system packs.",
403
+ cli: "sources update",
404
+ },
405
+ },
406
+ lookup: {
407
+ source: "graphql",
408
+ by: "ds:name",
409
+ type: "ds:ModifierFamily",
410
+ toolDescription: 'Get values and usage details for one or more modifier families by name. Use when you need the allowed values of specific families. Example: modifier_lookup { name: ["importance"] }.',
411
+ expand: [
412
+ {
413
+ name: "values",
414
+ heading: "Values",
415
+ relation: "ds:hasModifier",
416
+ select: [{ name: "name", property: "ds:name" }],
417
+ },
418
+ ],
419
+ sample: {
420
+ fixedCount: true,
421
+ toolDescription: "Return randomly selected complete modifier families (with value lists) as exemplars. Use BEFORE writing queries to see actual data shapes. Example: modifier_sample {}.",
422
+ },
423
+ },
424
+ },
425
+ // Tiers. The hierarchy is encoded in the slash-separated path string
426
+ // (`apps/lxd`), not in graph edges, so `tier list` is a flat, name-ordered
427
+ // list. `tier lookup` resolves a tier by its declared name and expands the
428
+ // blocks scoped DIRECTLY to it through the inverse path `^ds:tier` — a
429
+ // single-hop expand the generated sub-SELECT emits as `<tier> ^ds:tier ?child`
430
+ // (property paths, inverse included, are in-contract for `PackExpand.relation`).
431
+ // Retiring the bespoke single-`<name>` lookup for this declared variadic one
432
+ // is an L-OPEN-9 covenant change, recorded in the covenant's $comment.
433
+ {
434
+ noun: "tier",
435
+ description: "List all tiers in the design system ontology.",
436
+ toolDescription: "List all tiers in the design-system ontology. Use when understanding the tier hierarchy before setting a tier filter. Example: tier_list {}.",
437
+ list: {
438
+ query: [
439
+ "SELECT ?uri ?name WHERE {",
440
+ " ?uri a ds:Tier ;",
441
+ " ds:name ?name .",
442
+ "} ORDER BY ?name",
443
+ ].join("\n"),
444
+ columns: [
445
+ { field: "uri", label: "IRI" },
446
+ { field: "name", label: "Name" },
447
+ ],
448
+ },
449
+ lookup: {
450
+ source: "sparql",
451
+ by: "ds:name",
452
+ type: "ds:Tier",
453
+ description: "Show tiers by name, with the blocks scoped to each.",
454
+ toolDescription: 'Get one or more tiers by name, with the blocks scoped directly to each. Use when you need which blocks a specific tier carries. Example: tier_lookup { name: ["apps/lxd"] }.',
455
+ expand: [
456
+ {
457
+ name: "blocks",
458
+ heading: "Blocks",
459
+ relation: "^ds:tier",
460
+ select: [{ name: "name", property: "ds:name" }],
461
+ },
462
+ ],
463
+ },
464
+ },
465
+ ];
466
+ /**
467
+ * The `concept` story the design-system pack also supplies: long-form
468
+ * documentation not bound to a single UIBlock (foundations, how-to guides,
469
+ * decision guides) — ds:Concept entries ingested from Coda. The list stays
470
+ * terse (name/type/summary); the Markdown body is the lookup's payload,
471
+ * served at the `standard` level with knownEdgeCases behind `detailed`.
472
+ */
473
+ const conceptStory = {
474
+ noun: "concept",
475
+ description: "List design-system concepts.",
476
+ toolDescription: 'List design-system concepts — long-form foundations, how-to guides, and decision guides not bound to a single UI block. Optionally filter by type or search. Example: concept_list { type: "Explanation" }.',
477
+ list: {
478
+ query: [
479
+ "SELECT ?uri ?name ?type ?summary",
480
+ "WHERE {",
481
+ " ?uri a ds:Concept ;",
482
+ " ds:name ?name .",
483
+ " OPTIONAL { ?uri ds:conceptType/ds:name ?type . }",
484
+ " OPTIONAL { ?uri ds:summary ?summary . }",
485
+ "}",
486
+ "ORDER BY ?name",
487
+ ].join("\n"),
488
+ columns: [
489
+ { field: "uri", label: "IRI" },
490
+ { field: "name", label: "Name" },
491
+ { field: "type", label: "Type" },
492
+ { field: "summary", label: "Summary" },
493
+ ],
494
+ filters: [
495
+ {
496
+ param: "type",
497
+ variable: "type",
498
+ // `ds:ConceptType` is the vocabulary; the concepts are the population.
499
+ // The shipped graph declares six types and uses two, so validating
500
+ // against the rows rejected "Decision guide" — a type the ontology
501
+ // declares — as an invalid argument instead of answering with the
502
+ // empty list it actually has.
503
+ vocabulary: {
504
+ query: [
505
+ "SELECT DISTINCT ?name WHERE {",
506
+ " ?conceptType a ds:ConceptType ;",
507
+ " ds:name ?name .",
508
+ "}",
509
+ ].join("\n"),
510
+ variable: "name",
511
+ },
512
+ description: "Filter by concept type (e.g. Explanation, How-to guide).",
513
+ },
514
+ ],
515
+ search: {
516
+ variables: ["name", "summary"],
517
+ description: "Search in name and summary.",
518
+ },
519
+ emptyRecovery: {
520
+ message: "No concepts in the store. The @canonical/design-system pack provides them; refresh the local store.",
521
+ cli: "sources update",
522
+ },
523
+ },
524
+ lookup: {
525
+ source: "sparql",
526
+ by: "ds:name",
527
+ type: "ds:Concept",
528
+ description: "Look up a concept's full documentation by name, IRI, or glob.",
529
+ toolDescription: 'Get a design-system concept\'s full Markdown documentation. Address concepts by the name concept_list publishes, by prefixed name (ds:concept.…), by absolute IRI, or by a glob. Example: concept_lookup { name: ["Foundations: Grid"] }.',
530
+ fields: [
531
+ { name: "type", property: "ds:conceptType/ds:name", label: "Type" },
532
+ { name: "tier", property: "ds:tier", label: "Tier" },
533
+ { name: "summary", property: "ds:summary", label: "Summary" },
534
+ ],
535
+ sections: [
536
+ {
537
+ name: "content",
538
+ property: "ds:content",
539
+ label: "Content",
540
+ level: "standard",
541
+ },
542
+ {
543
+ name: "knownEdgeCases",
544
+ property: "ds:knownEdgeCases",
545
+ label: "Known edge cases",
546
+ level: "detailed",
547
+ },
548
+ ],
549
+ disclosure: {
550
+ levels: ["summary", "standard", "detailed"],
551
+ default: "standard",
552
+ },
553
+ },
554
+ };
555
+ /**
556
+ * The read story the implementation-graph pack supplies — which library
557
+ * implements which block, collected from the `@implements` annotations in this
558
+ * monorepo's source.
559
+ *
560
+ * The join this noun exists for crosses two packs: `ds:implementsBlock` points
561
+ * from an implementation collected HERE at the IRI of a block declared in
562
+ * `@canonical/design-system`. Both land in one store under the pinned `ds:`
563
+ * namespace, so `implementation list` answers "which React components implement
564
+ * a global-tier block" as a query rather than an afternoon of grepping — which
565
+ * is what {@link DESIGN_SYSTEM_COLOPHON} promises.
566
+ *
567
+ * LIST-ONLY, deliberately. A `ds:ImplementationObject` carries no name literal
568
+ * — it IS the edge from a library to a block, plus the two source links — so
569
+ * there is nothing a `lookup` could disclose that the list row does not already
570
+ * hold. The grammar admits a story with only one half; a lookup keyed on a
571
+ * synthesised name would be a name nobody would ever type. The libraries
572
+ * themselves ARE named, and `implementation libraries` lists them through the
573
+ * same list machinery (as `standard categories` does).
574
+ */
575
+ const implementationStory = {
576
+ noun: "implementation",
577
+ description: "List which library implements which design-system block.",
578
+ toolDescription: 'List the implementations of design-system blocks — which library implements which block, on which platform, and the source file it lives in. Optionally filter by platform or library, or search. Example: implementation_list { platform: "react" }.',
579
+ list: {
580
+ // The library is the subject that carries the platform, so the row is
581
+ // assembled from BOTH ends of `ds:hasImplementation`. `?block` prefers the
582
+ // block's own `ds:name` and falls back to its IRI local name, so a row
583
+ // stays readable even when the design-system pack is absent from the store
584
+ // and only the bare `ds:implementsBlock` IRI is known.
585
+ query: [
586
+ "SELECT ?uri ?block ?library ?platform ?source",
587
+ "WHERE {",
588
+ " ?libUri a ds:ImplementationLibrary ;",
589
+ " ds:libraryName ?library ;",
590
+ " ds:hasImplementation ?uri .",
591
+ " ?uri a ds:ImplementationObject ;",
592
+ " ds:implementsBlock ?blockUri .",
593
+ " OPTIONAL { ?libUri ds:platform ?platform }",
594
+ " OPTIONAL { ?uri ds:headLink ?source }",
595
+ " OPTIONAL { ?blockUri ds:name ?dsName }",
596
+ ' BIND(COALESCE(?dsName, REPLACE(STR(?blockUri), "^.*[/#]", "")) AS ?block)',
597
+ "}",
598
+ "ORDER BY ?block ?library",
599
+ ].join("\n"),
600
+ columns: [
601
+ { field: "block", label: "Block" },
602
+ { field: "library", label: "Library" },
603
+ { field: "platform", label: "Platform" },
604
+ { field: "source", label: "Source" },
605
+ { field: "uri", label: "IRI" },
606
+ ],
607
+ filters: [
608
+ // Both vocabularies are read off `ds:ImplementationLibrary`, the subject
609
+ // that carries them — the same terms `implementation libraries`
610
+ // enumerates. A library that implements nothing yet still exists, and
611
+ // asking for it is an empty answer rather than a bad argument.
612
+ {
613
+ param: "platform",
614
+ variable: "platform",
615
+ vocabulary: {
616
+ query: [
617
+ "SELECT DISTINCT ?platform WHERE {",
618
+ " ?lib a ds:ImplementationLibrary ;",
619
+ " ds:platform ?platform .",
620
+ "}",
621
+ ].join("\n"),
622
+ },
623
+ description: "Filter by platform (e.g. react, svelte, typescript).",
624
+ },
625
+ {
626
+ param: "library",
627
+ variable: "library",
628
+ vocabulary: {
629
+ query: [
630
+ "SELECT DISTINCT ?library WHERE {",
631
+ " ?lib a ds:ImplementationLibrary ;",
632
+ " ds:libraryName ?library .",
633
+ "}",
634
+ ].join("\n"),
635
+ },
636
+ description: "Filter by implementation library name.",
637
+ },
638
+ ],
639
+ search: {
640
+ variables: ["block", "library"],
641
+ description: "Search in block and library name.",
642
+ },
643
+ emptyRecovery: {
644
+ message: "No implementations in the store. The @canonical/ds-implementations pack provides them; refresh the local store.",
645
+ cli: "sources update",
646
+ },
647
+ },
648
+ verbs: [
649
+ {
650
+ verb: "libraries",
651
+ description: "List the implementation libraries.",
652
+ toolDescription: "List the design-system implementation libraries — platform, tier, released version, and how many blocks each one implements. Example: implementation_libraries {}.",
653
+ // `ds:implementationCount` is asserted by the aggregate index on the SAME
654
+ // subject the per-library file describes, so the two merge in the store
655
+ // and the count needs no aggregation here.
656
+ query: [
657
+ "SELECT ?uri ?name ?platform ?tier ?version ?count",
658
+ "WHERE {",
659
+ " ?uri a ds:ImplementationLibrary ;",
660
+ " ds:libraryName ?name .",
661
+ " OPTIONAL { ?uri ds:platform ?platform }",
662
+ " OPTIONAL { ?uri ds:libraryTier ?tierUri }",
663
+ " OPTIONAL { ?uri ds:version ?version }",
664
+ " OPTIONAL { ?uri ds:implementationCount ?count }",
665
+ ' BIND(REPLACE(STR(?tierUri), "^.*[/#]", "") AS ?tier)',
666
+ "}",
667
+ "ORDER BY ?name",
668
+ ].join("\n"),
669
+ columns: [
670
+ { field: "name", label: "Library" },
671
+ { field: "platform", label: "Platform" },
672
+ { field: "tier", label: "Tier" },
673
+ { field: "version", label: "Version" },
674
+ { field: "count", label: "Blocks" },
675
+ { field: "uri", label: "IRI" },
676
+ ],
677
+ emptyRecovery: {
678
+ message: "No implementation libraries in the store. The @canonical/ds-implementations pack provides them; refresh the local store.",
679
+ cli: "sources update",
680
+ },
681
+ },
682
+ ],
683
+ };
684
+ /**
685
+ * The read story the code-standards pack supplies — `standard` as declared data.
686
+ *
687
+ * Normalized for the v2 grammar: the old `digest` level is the canonical
688
+ * `standard`, so disclosure gates by the canonical index. The default is
689
+ * `summary` (base fields by name), `--detail standard` adds the `dos` examples,
690
+ * `--detail detailed` adds `donts`. `cs:extends` stays the raw IRI in JSON
691
+ * (renderers compact it at display time).
692
+ */
693
+ const codeStandardsStories = [
694
+ {
695
+ noun: "standard",
696
+ description: "List all code standards.",
697
+ toolDescription: 'List code standards: one ROW per standard — its IRI, name, category and description — not the standards themselves. Take a row\'s `name` VERBATIM to standard_lookup for the dos and donts. Optionally filter by category slug (a parent slug answers for its whole branch; standard_categories lists them) or by search term. Example: standard_list { category: "react" }.',
698
+ list: {
699
+ query: [
700
+ // `?category` is the LEAF a standard is filed under — what a row
701
+ // displays. `?categories` is that leaf plus every ancestor, which is
702
+ // what `--category` matches against, so asking for a parent answers for
703
+ // the whole branch. The traversal is written ONCE, here, rather than
704
+ // repeated by each consumer.
705
+ "SELECT ?uri ?name ?category ?description",
706
+ ' (GROUP_CONCAT(DISTINCT ?ancestorSlug; SEPARATOR=" ") AS ?categories)',
707
+ "WHERE {",
708
+ " ?uri a cs:CodeStandard ;",
709
+ " cs:description ?description .",
710
+ // `rdfs:label`, matching `lookup.by` below. Both COALESCE over the
711
+ // SAME property with the SAME IRI fallback, and that agreement IS the
712
+ // two-step grammar: a row's `name` goes VERBATIM to lookup. Keyed on
713
+ // different properties they diverge for exactly the entities carrying
714
+ // one and not the other — 16 standards in the shipped snapshot
715
+ // published `Turtle local-name casing` from `cs:name` while lookup,
716
+ // reading `rdfs:label`, bound the derived slug and answered
717
+ // ENTITY_NOT_FOUND. Change one, change both.
718
+ " OPTIONAL { ?uri rdfs:label ?n . }",
719
+ ' BIND(COALESCE(?n, REPLACE(STRAFTER(STR(?uri), "#"), "\\\\.", "/")) AS ?name)',
720
+ " OPTIONAL {",
721
+ " ?uri cs:hasCategory ?cat .",
722
+ " ?cat cs:slug ?category .",
723
+ // `skos:broader` is deliberately NOT transitive, and this store
724
+ // (oxigraph) has no reasoner — so `skos:broaderTransitive` returns zero
725
+ // rows and hand-asserting it would be materialisation wearing a
726
+ // standards badge. `broader*` is the only thing that works.
727
+ // The `*` is REFLEXIVE and that is load-bearing: `+` would silently
728
+ // drop every standard filed DIRECTLY on the category being asked for
729
+ // (one of the 8 under `testing` today). Do not "correct" it.
730
+ " ?cat skos:broader* ?ancestor .",
731
+ " ?ancestor cs:slug ?ancestorSlug .",
732
+ " }",
733
+ "}",
734
+ "GROUP BY ?uri ?name ?category ?description",
735
+ "ORDER BY ?name",
736
+ ].join("\n"),
737
+ columns: [
738
+ { field: "uri", label: "IRI" },
739
+ { field: "name", label: "Name" },
740
+ { field: "category", label: "Category" },
741
+ { field: "description", label: "Description" },
742
+ ],
743
+ filters: [
744
+ {
745
+ param: "category",
746
+ variable: "categories",
747
+ match: "set",
748
+ // The SAME terms `standard categories` enumerates (`cs:Category` /
749
+ // `cs:slug`), so the slugs that surface hands out are exactly the
750
+ // slugs this filter accepts. Read from the graph rather than the
751
+ // returned ROWS: a category the graph declares with no standards
752
+ // filed under it is reported by `standard categories` with count 0,
753
+ // and asking for it must be the documented calm empty list, not
754
+ // INVALID_INPUT.
755
+ vocabulary: {
756
+ query: [
757
+ "SELECT DISTINCT ?slug WHERE {",
758
+ " ?cat a cs:Category ;",
759
+ " cs:slug ?slug .",
760
+ "}",
761
+ ].join("\n"),
762
+ variable: "slug",
763
+ },
764
+ description: "Filter by category slug. A parent category answers for its whole branch.",
765
+ },
766
+ ],
767
+ search: {
768
+ variables: ["name", "description"],
769
+ description: "Search in name and description.",
770
+ },
771
+ // Deliberately NOT `sources update`: the code standards ship in the
772
+ // embedded snapshot and answer with no update at all, so the generic
773
+ // build hint is actively wrong here. An empty result on this noun means
774
+ // the filter, and the vocabulary it must be drawn from lives in the graph
775
+ // — which is what `standard categories` reads out.
776
+ emptyRecovery: {
777
+ message: "Category slugs come from the graph, and a parent slug answers for its whole branch — read them out rather than guessing.",
778
+ cli: "standard categories",
779
+ },
780
+ },
781
+ verbs: [
782
+ {
783
+ verb: "categories",
784
+ description: "List all standard categories with counts (a parent counts its whole branch).",
785
+ toolDescription: "List all code standard categories with the number of standards each covers. Categories are a hierarchy: a parent's count includes every descendant, and `standard_list { category }` answers for the same set. Use this to pick a valid slug before filtering. Example: standard_categories {}.",
786
+ query: [
787
+ // The same reflexive roll-up `list` filters with — written the other
788
+ // way round (every category whose broader-chain reaches ?cat), so the
789
+ // count a category reports and the rows `--category` returns are the
790
+ // same set. `COUNT(DISTINCT ?standard)`: a standard reachable by two
791
+ // paths is still one standard.
792
+ "SELECT ?name (COUNT(DISTINCT ?standard) AS ?count)",
793
+ "WHERE {",
794
+ " ?cat a cs:Category ;",
795
+ " cs:slug ?name .",
796
+ " OPTIONAL {",
797
+ " ?descendant skos:broader* ?cat .",
798
+ " ?standard a cs:CodeStandard ;",
799
+ " cs:hasCategory ?descendant .",
800
+ " }",
801
+ "}",
802
+ "GROUP BY ?name",
803
+ "ORDER BY ?name",
804
+ ].join("\n"),
805
+ columns: [
806
+ { field: "name", label: "Category" },
807
+ { field: "count", label: "Standards" },
808
+ ],
809
+ // Also not `sources update`. The categories ride the same embedded
810
+ // snapshot, so zero rows means the store did not load — a health
811
+ // question, not a staleness one.
812
+ emptyRecovery: {
813
+ message: "The code standards ship with the CLI itself, so no categories at all means the store did not load — not that it is out of date.",
814
+ cli: "doctor",
815
+ },
816
+ },
817
+ ],
818
+ lookup: {
819
+ source: "sparql",
820
+ // `rdfs:label`, not `cs:name`. The pack pin above moved to v0.1.5, which
821
+ // retired the bespoke `cs:name` for the standard property every RDF
822
+ // consumer already reads — measured against that tag: 0 standards carry
823
+ // `cs:name`, 148 of 148 carry exactly one `rdfs:label`. Left keyed on the
824
+ // retired property, this story would still ANSWER — every title would
825
+ // simply stop reaching a reader and each row would fall back to its
826
+ // IRI-derived name, with nothing raised. That is the same silent shape as
827
+ // reading a retired `ds:whenToUse`, one noun over.
828
+ by: "rdfs:label",
829
+ // The fallback stays, and is now near-inert rather than load-bearing: it
830
+ // covered the ~87% of standards that carried no display title at all, and
831
+ // v0.1.5 gives every one of them a curated label. It remains declared
832
+ // because a pack is data — a future release that drops a label should
833
+ // degrade to the IRI-derived name, not become unaddressable.
834
+ //
835
+ // Deliberately NOT declared on `block`/`token`/`tier`/`concept`: each of
836
+ // those lists REQUIRES its `by` property, so an entity without one is a
837
+ // row they never publish, and making it addressable (or sampleable) here
838
+ // would be the mirror of the defect this repairs.
839
+ nameFallback: "iri",
840
+ type: "cs:CodeStandard",
841
+ description: "Look up one or more standards by name, IRI, or glob. --detail standard adds the dos, --detail detailed adds the don'ts.",
842
+ toolDescription: 'Get one or more code standards in full, with dos and don\'ts as code examples. `detail` DEFAULTS to "summary", which returns neither: pass detail: "standard" for the dos and detail: "detailed" for dos AND don\'ts. Address a standard by the name standard_list publishes (`react/component/tsdoc`), by prefixed name (`cs:react.component.tsdoc`), by absolute IRI, or by a glob over any of those. Example: standard_lookup { name: ["react/component/tsdoc"], detail: "detailed" }.',
843
+ fields: [
844
+ {
845
+ name: "category",
846
+ property: "cs:hasCategory/cs:slug",
847
+ label: "Category",
848
+ },
849
+ {
850
+ name: "description",
851
+ property: "cs:description",
852
+ label: "Description",
853
+ },
854
+ { name: "extends", property: "cs:extends", label: "Extends" },
855
+ ],
856
+ expand: [
857
+ {
858
+ name: "dos",
859
+ heading: "Do",
860
+ relation: "cs:do",
861
+ select: [
862
+ { name: "caption", property: "cs:description" },
863
+ { name: "language", property: "cs:language" },
864
+ { name: "code", property: "cs:code" },
865
+ ],
866
+ level: "standard",
867
+ },
868
+ {
869
+ name: "donts",
870
+ heading: "Don't",
871
+ relation: "cs:dont",
872
+ select: [
873
+ { name: "caption", property: "cs:description" },
874
+ { name: "language", property: "cs:language" },
875
+ { name: "code", property: "cs:code" },
876
+ ],
877
+ level: "detailed",
878
+ },
879
+ ],
880
+ disclosure: {
881
+ levels: ["summary", "standard", "detailed"],
882
+ default: "summary",
883
+ },
884
+ sample: {
885
+ description: "Return randomly selected complete standard instances as exemplars for shape discovery.",
886
+ toolDescription: "Return 1–5 randomly selected complete code standard instances as exemplars. Use BEFORE writing queries to see actual data shapes, property names, and value formats. Each call returns different instances. Example: standard_sample { count: 2 }.",
887
+ },
888
+ },
889
+ },
890
+ ];
891
+ export default {
892
+ name: "pragma",
893
+ help: "Explore the design system",
894
+ // The `--help` wordmark. Data, not code: `kernel/copy.test.ts` forbids any
895
+ // kernel string from naming the distribution, and a wordmark spells the name.
896
+ // Lines rather than one string — the art holds a backtick and backslashes.
897
+ logo: [
898
+ " _",
899
+ " /' `\\",
900
+ " /' )",
901
+ " /' (___,/'____ ____ ____ ,__________ ____",
902
+ " /' )' )--/' ) /' ) /' ) ) /' )",
903
+ " /' /' /' /' /' /' /' /' /' /' /'",
904
+ "(,/' /' (___,/(__(___,/(__/' /' /(__(___,/(__",
905
+ " /'",
906
+ " / /'",
907
+ " (___,/'",
908
+ ],
909
+ // The toolchain's own colophon — CONTENT this distribution declares, not
910
+ // machinery: `pragma colophon` renders whatever stands here as its first
911
+ // section, titled with the distribution's name, before any active pack's
912
+ // domain colophon. A fork tells its own story by editing this declaration.
913
+ // `markdown` is the full narrative; `summary` is the condensed `--format llm`
914
+ // form. Both are BODIES with no leading H1 (the renderer supplies the
915
+ // heading), grounded in this tree's real architecture.
916
+ colophon: {
917
+ // The architecture handoff is a URL, not a repo path: `docs/` is outside
918
+ // the package's `files` allowlist and is not copied into `dist`, so an
919
+ // installed user has no `docs/architecture.md` to open.
920
+ markdown: `pragma is a **domain-based toolchain** — one CLI and one MCP server
921
+ projected from a single grammar. That machinery is documented at
922
+ https://github.com/canonical/pragma/blob/main/packages/cli/pragma/docs/architecture.md;
923
+ what follows is the domain it serves.
924
+
925
+ Made by the Canonical Webteam — https://canonical.com.`,
926
+ summary: `pragma is a domain-based toolchain: one CLI + MCP server projected from a single grammar (https://github.com/canonical/pragma/blob/main/packages/cli/pragma/docs/architecture.md). The domain it serves follows.
927
+
928
+ Made by the Canonical Webteam — https://canonical.com.`,
929
+ },
930
+ issuesUrl: "https://github.com/canonical/pragma/issues",
931
+ packs: [
932
+ {
933
+ name: "@canonical/design-system",
934
+ source: "git+https://github.com/canonical/design-system.git#main",
935
+ stories: [...designSystemStories, conceptStory],
936
+ },
937
+ {
938
+ name: "@canonical/anatomy-dsl",
939
+ source: "git+https://github.com/canonical/anatomy-dsl.git#main",
940
+ },
941
+ // Pinned to a TAG, and the only source here that is. The standards are the
942
+ // pack an agent is most likely to quote back at a human as policy, so which
943
+ // revision answered a query has to be recoverable — a floating ref makes
944
+ // "the CLI told me this was the rule" unfalsifiable. The other three still
945
+ // float: they are read for shape and identity, where the newest answer is
946
+ // the right one.
947
+ //
948
+ // Bump this deliberately. `sources update` resolves the tag, so a new
949
+ // upstream release reaches users only when this line moves — which is the
950
+ // point, and the cost.
951
+ {
952
+ name: "@canonical/code-standards",
953
+ source: "git+https://github.com/canonical/web-code-standards.git#v0.1.5",
954
+ stories: codeStandardsStories,
955
+ },
956
+ // The implementation graph: ds:ImplementationLibrary / ds:ImplementationObject
957
+ // nodes collected from `@implements` annotations across this monorepo
958
+ // (regenerated each release into the root `data/` directory, which is what
959
+ // a git ref scans — the npm distribution is `@canonical/ds-implementations`).
960
+ {
961
+ name: "@canonical/ds-implementations",
962
+ source: "git+https://github.com/canonical/pragma.git#main",
963
+ stories: [implementationStory],
964
+ },
965
+ ],
966
+ // This distribution's domain namespaces, declared once and read twice.
967
+ //
968
+ // (1) They pin what `sources update` builds the store with. The design system
969
+ // declares `ds:` twice — `…/` in `definitions/` and `…/data/` in `data/` —
970
+ // and prefix harvesting is last-wins over a filename sort, so which one binds
971
+ // is an accident of file naming. The config layer wins every harvest: without
972
+ // this pin an added or renamed upstream file can silently compact every `ds:`
973
+ // entity to the wrong prefix, and `block list` stops resolving.
974
+ //
975
+ // (2) They are the domain half of the kernel's `DEFAULT_PREFIX_MAP`
976
+ // (`src/kernel/render/prefixes.ts`) — what the CLI compacts in output AND
977
+ // what it expands a user-typed `ds:Button` / `cs:rule` through before a
978
+ // lookup. Drop a namespace here and its lookups stop resolving; that is why
979
+ // `cs:` is listed even though nothing rebinds it upstream.
980
+ prefixes: {
981
+ ds: "https://ds.canonical.com/",
982
+ cs: "http://pragma.canonical.com/codestandards#",
983
+ },
984
+ channel: "normal",
985
+ detail: "standard",
986
+ };
987
+ /**
988
+ * The domain terms the kernel reads this distribution's graph with.
989
+ *
990
+ * A separate export because it is NOT a config layer field: it is compiled in
991
+ * and read at module load by `src/kernel/vocabulary.ts`, whose readers (the
992
+ * storeless completion fast path, the pack index builder) cannot reach a config
993
+ * layer at all. Layering it would let a project config set it and change
994
+ * nothing. A fork edits these values and rebuilds; `parseVocabulary` type-checks
995
+ * the shape and rejects a term that is not a prefixed name.
996
+ *
997
+ * Every prefix used here must be bound in `prefixes` above. `rdfs:label` and
998
+ * `rdfs:comment` are deliberately absent — the kernel treats standard
999
+ * vocabulary as universal.
1000
+ *
1001
+ * The `prompt` terms are a READ CONTRACT, not a claim about instances: this
1002
+ * distribution's graph currently carries no `ds:Prompt` entities at all, so
1003
+ * `prompt list` is honestly empty. Declaring the shape anyway is what makes an
1004
+ * empty result mean "the graph has none" rather than "nothing was declared".
1005
+ */
1006
+ export const vocabulary = {
1007
+ altName: "ds:name",
1008
+ prompt: {
1009
+ type: "ds:Prompt",
1010
+ body: "ds:promptBody",
1011
+ argument: "ds:promptArgument",
1012
+ argName: "ds:argName",
1013
+ argRequired: "ds:argRequired",
1014
+ },
1015
+ };
1016
+ //# sourceMappingURL=pragma.conf.js.map