@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
@@ -2,15 +2,17 @@
2
2
  * Data shapes for `pragma doctor` (ported verbatim from the old shell).
3
3
  */
4
4
 
5
- /**
6
- * One of the two config bands a check can concern. Mirrors the harnesses
7
- * `ScopeBand` structurally but is redeclared here so this statically-reachable
8
- * type module never pulls the harnesses runtime into the fast-path module graph.
9
- */
10
- export type ScopeBand = "project" | "global";
5
+ // The scope and status types are part of the rendering vocabulary — the one
6
+ // module that owns both the states and the words (and glyphs) for them.
7
+ // Re-exported here so doctor's type surface stays complete; the definitions,
8
+ // the `available` tier's rationale, and the structural pin against
9
+ // `@canonical/harnesses` live with the vocabulary.
10
+ import type { CheckStatus, Scope } from "../../kernel/render/vocabulary.js";
11
11
 
12
- /** Status of a doctor check or one of its sub-items. */
13
- export type CheckStatus = "pass" | "fail" | "skip";
12
+ export type {
13
+ CheckStatus,
14
+ Scope,
15
+ } from "../../kernel/render/vocabulary.js";
14
16
 
15
17
  /**
16
18
  * A structured sub-item under a check — e.g. one resolved package under
@@ -35,22 +37,27 @@ export interface CheckResult {
35
37
  readonly detail: string;
36
38
  /** Optional structured breakdown, rendered as indented sub-items. */
37
39
  readonly items?: readonly CheckItem[];
38
- /** Remedial instruction shown inline under a failing check. */
40
+ /**
41
+ * Remedial instruction shown inline under the check: for `fail` the fix,
42
+ * for `available` the setup command that enables the integration.
43
+ */
39
44
  readonly remedy?: string;
40
45
  /**
41
- * Which config band the check concerns, if any: `global` for the user/home
46
+ * Which config scope the check concerns, if any: `global` for the user/home
42
47
  * level (shell completions), `project` for per-repo config (skills). The MCP
43
- * checks derive their band from the harnesses they found. The renderer groups
44
- * banded checks into Global/Project sections; environment checks (Node,
45
- * versions, store) carry no band.
48
+ * checks derive their scope from the harnesses they found. The renderer groups
49
+ * scoped checks into Global/Project sections; environment checks (Node,
50
+ * versions, store) carry no scope.
46
51
  */
47
- readonly band?: ScopeBand;
52
+ readonly scope?: Scope;
48
53
  }
49
54
 
50
- /** Aggregated results from all doctor checks. */
55
+ /** Aggregated results from all doctor checks — one count per status tier. */
51
56
  export interface DoctorData {
52
57
  readonly checks: readonly CheckResult[];
53
58
  readonly passed: number;
54
59
  readonly failed: number;
60
+ /** Opt-in integrations detected but not set up — counted apart from failures. */
61
+ readonly available: number;
55
62
  readonly skipped: number;
56
63
  }
@@ -35,6 +35,9 @@ function storyFor(noun: string): PackDefinition {
35
35
  const PREFIXES = {
36
36
  ds: "https://ds.canonical.com/",
37
37
  cs: "https://ds.canonical.com/code-standards/",
38
+ // The `standard` list query names `skos:broader` for its category roll-up —
39
+ // a CORE prefix on the real build path, which this in-memory helper bypasses.
40
+ skos: "http://www.w3.org/2004/02/skos/core#",
38
41
  owl: "http://www.w3.org/2002/07/owl#",
39
42
  rdfs: "http://www.w3.org/2000/01/rdf-schema#",
40
43
  xsd: "http://www.w3.org/2001/XMLSchema#",
@@ -85,7 +88,12 @@ const listVerb = (pack: PackDefinition): VerbSpec =>
85
88
  const PACK_LISTS: readonly { pack: PackDefinition; hint: RegExp }[] = [
86
89
  { pack: storyFor("modifier"), hint: /pragma sources update/ },
87
90
  { pack: storyFor("token"), hint: /pragma sources update/ },
88
- { pack: storyFor("standard"), hint: /broaden your filter/ },
91
+ // CHANGED DELIBERATELY. `standard` used to fall through to the generic
92
+ // build/broaden hint, and the build half of it is actively WRONG for this
93
+ // noun: the code standards ride the embedded snapshot and answer with no
94
+ // `sources update` at all. It now authors its own, pointing at the one
95
+ // surface that reads the category vocabulary out of the graph.
96
+ { pack: storyFor("standard"), hint: /pragma standard categories/ },
89
97
  ];
90
98
 
91
99
  const REAL = { dryRun: false, undo: false, yes: false };
@@ -101,21 +109,23 @@ describe("pack list empty-state (U5, PROTECTED)", () => {
101
109
 
102
110
  it.each(
103
111
  PACK_LISTS,
104
- )("$pack.noun list renders a non-blank message (+ hint) and keeps JSON []", ({
112
+ )("$pack.noun list declares a non-blank empty notice (+ hint), JSON stays []", ({
105
113
  pack,
106
114
  hint,
107
115
  }) => {
108
116
  const { formatters } = listVerb(pack).output;
109
- const plain = formatters.plain([]);
110
- expect(plain).toContain(`No ${pack.noun} entries found.`);
111
- expect(plain).toMatch(hint);
117
+ // The message + runnable hint live on the empty-state seam — the
118
+ // dispatcher routes them to stderr, keeping plain stdout pure data.
119
+ const notice = formatters.notice?.([]);
120
+ expect(notice).toContain(`No ${pack.noun} entries found.`);
121
+ expect(notice).toMatch(hint);
112
122
  // JSON is the uniform empty array — unchanged by the message.
113
123
  expect(formatters.json([])).toBe("[]");
114
124
  // The llm view stays non-blank too (the `(0)` heading plus the message).
115
125
  expect(formatters.llm([]).trim().length).toBeGreaterThan(0);
116
126
  });
117
127
 
118
- it("dispatch prints the empty message on stdout and exits 0 (end-to-end)", async () => {
128
+ it("dispatch routes the empty message to stderr and exits 0 (end-to-end)", async () => {
119
129
  const outcome = await executeVerb(
120
130
  listVerb(storyFor("modifier")),
121
131
  {},
@@ -123,7 +133,10 @@ describe("pack list empty-state (U5, PROTECTED)", () => {
123
133
  rt,
124
134
  );
125
135
  expect(outcome.exitCode).toBe(0);
126
- expect(outcome.stdout).toContain("No modifier entries found.");
127
- expect(outcome.stdout).toContain("pragma sources update");
136
+ // stdout carries no prose a pipe would read as a record; the calm notice
137
+ // and its hint reach the human on stderr.
138
+ expect(outcome.stdout ?? "").not.toContain("No modifier entries found.");
139
+ expect(outcome.stderr).toContain("No modifier entries found.");
140
+ expect(outcome.stderr).toContain("pragma sources update");
128
141
  });
129
142
  });
@@ -0,0 +1,107 @@
1
+ /**
2
+ * The documented examples, EXECUTED against the shipped pack (PROTECTED).
3
+ *
4
+ * The existing documentation suite validates example GRAMMAR — that a `cmd`
5
+ * parses as a command this CLI declares. Grammar is not truth: the previous
6
+ * `graph inspect ds:button` examples passed that check for as long as they
7
+ * existed while 404ing for every user who copied them, and the `graph query`
8
+ * ASK example passed while quietly answering `false`.
9
+ *
10
+ * So these run the examples as WRITTEN, against the embedded graph, and assert
11
+ * they answer. An example is a promise to a stranger; this is the only check
12
+ * that reads it as one.
13
+ */
14
+
15
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
16
+ import { verbKey } from "../../kernel/packs/uniqueness.js";
17
+ import { bootRuntime } from "../../kernel/runtime/boot.js";
18
+ import type { InspectResult } from "../../kernel/runtime/readEntity.js";
19
+ import type { PragmaRuntime } from "../../kernel/runtime/types.js";
20
+ import type { VerbSpec } from "../../kernel/spec/types.js";
21
+ import { TEST_FLAGS } from "../../testing/helpers/projectCli.js";
22
+ import { graphModule } from "./index.js";
23
+
24
+ const verb = (name: string): VerbSpec =>
25
+ graphModule.verbs.find((v) => verbKey(v.path) === name) as VerbSpec;
26
+
27
+ /**
28
+ * The name of a verb's single positional, read from the verb rather than
29
+ * retyped — the point of this file is that documentation and code agree, so it
30
+ * should not itself hardcode a name that could drift.
31
+ */
32
+ const positionalOf = (spec: VerbSpec): string =>
33
+ spec.params.find((p) => p.positional)?.name ?? "";
34
+
35
+ /**
36
+ * The argument an example passes, recovered from the example's own `cmd`.
37
+ *
38
+ * Read from the declaration rather than retyped, so editing an example without
39
+ * editing this file cannot leave the test asserting the old one.
40
+ */
41
+ function exampleArg(spec: VerbSpec, index: number): string {
42
+ const cmd = spec.examples?.[index]?.cmd ?? "";
43
+ const quoted = cmd.match(/"([^"]*)"/);
44
+ if (quoted?.[1]) return quoted[1];
45
+ return cmd.trim().split(/\s+/).slice(3).join(" ");
46
+ }
47
+
48
+ // ONE store for the file. Booting per case tripled this suite's cost against
49
+ // the shipped pack for no extra coverage, and the whole package already flakes
50
+ // under parallel contention — a test that need not add load should not.
51
+ let rt: PragmaRuntime;
52
+ beforeAll(() => {
53
+ rt = bootRuntime(TEST_FLAGS);
54
+ });
55
+ afterAll(async () => {
56
+ (await rt.store.get()).store.dispose();
57
+ });
58
+
59
+ describe("documented examples resolve against the shipped graph (PROTECTED)", () => {
60
+ it("runs every `graph inspect` example as written", async () => {
61
+ const inspect = verb("graph inspect");
62
+ expect(inspect.examples?.length).toBeGreaterThan(0);
63
+
64
+ for (const [index] of (inspect.examples ?? []).entries()) {
65
+ const uri = exampleArg(inspect, index);
66
+ const result = (await inspect.run(
67
+ { [positionalOf(inspect)]: uri },
68
+ rt,
69
+ )) as InspectResult;
70
+ // The prefixed and absolute forms are two spellings of one subject.
71
+ expect(
72
+ result.uri,
73
+ `example ${index} (${uri}) did not resolve to the documented entity`,
74
+ ).toBe("https://ds.canonical.com/global.component.button");
75
+ expect(result.groups.length).toBeGreaterThan(0);
76
+ }
77
+ });
78
+
79
+ it("runs the `graph query` ASK example and gets a true answer", async () => {
80
+ // The old example returned `false` — syntactically fine, semantically a lie
81
+ // about the graph. Asserting the ANSWER is what catches that.
82
+ const query = verb("graph query");
83
+ const ask = (query.examples ?? []).findIndex((e) => e.cmd.includes("ASK"));
84
+ expect(ask, "no ASK example to execute").toBeGreaterThanOrEqual(0);
85
+
86
+ const result = (await query.run(
87
+ { [positionalOf(query)]: exampleArg(query, ask) },
88
+ rt,
89
+ )) as { type: string; result?: boolean };
90
+
91
+ expect(result.type).toBe("ask");
92
+ expect(result.result, "the documented ASK example answers false").toBe(
93
+ true,
94
+ );
95
+ });
96
+
97
+ it("runs the `graph query` SELECT example and gets rows", async () => {
98
+ const query = verb("graph query");
99
+ const result = (await query.run(
100
+ { [positionalOf(query)]: exampleArg(query, 0) },
101
+ rt,
102
+ )) as { type: string; bindings?: unknown[] };
103
+
104
+ expect(result.type).toBe("select");
105
+ expect(result.bindings?.length ?? 0).toBeGreaterThan(0);
106
+ });
107
+ });
@@ -3,7 +3,7 @@
3
3
  * (the raw SPARQL escape hatch, PR6). The covenant blesses both.
4
4
  */
5
5
 
6
- import type { CapabilityModule } from "../../kernel/spec/types.js";
6
+ import type { CapabilityModule } from "../../kernel/spec/index.js";
7
7
  import { resourceProvider } from "../resources/index.js";
8
8
  import { graphInspectVerb } from "./inspect.verb.js";
9
9
  import { graphQueryVerb } from "./query.verb.js";
@@ -1,38 +1,86 @@
1
1
  /**
2
- * Formatters for `graph inspect` — predicate/object groups, prefix-compacted.
2
+ * Formatters for `graph inspect` — the entity's neighbourhood in three shapes.
3
+ *
4
+ * Terms arrive ALREADY compacted and named: the reader does it against the
5
+ * store's own merged prefix map, which is the map the graph was actually built
6
+ * with, so these formatters neither carry a prefix map nor re-derive one. They
7
+ * choose between the forms the reader supplies and nothing more.
3
8
  */
4
9
 
5
- import { compactUri } from "../../kernel/render/compactUri.js";
6
- import { DEFAULT_PREFIX_MAP } from "../../kernel/render/prefixes.js";
7
- import type { InspectResult } from "../../kernel/runtime/readEntity.js";
8
- import type { Formatters } from "../../kernel/spec/types.js";
10
+ import { toTurtle } from "../../kernel/render/turtle.js";
11
+ import type {
12
+ InboundGroup,
13
+ InspectResult,
14
+ ReadTerm,
15
+ } from "../../kernel/runtime/readEntity.js";
16
+ import type { Formatters } from "../../kernel/spec/index.js";
9
17
 
10
- const compact = (value: string): string =>
11
- compactUri(value, DEFAULT_PREFIX_MAP);
18
+ /** The short form of a term: prefixed when there is one, else the raw value. */
19
+ const short = (term: ReadTerm): string => term.prefixed ?? term.value;
20
+
21
+ /** A term as a reader should see it — short form, with its name when known. */
22
+ const named = (term: ReadTerm): string =>
23
+ term.title ? `${short(term)} (${term.title})` : short(term);
24
+
25
+ /**
26
+ * `predicate (330, sample of 5)` — the count is the truth, the list is not.
27
+ *
28
+ * A roster and a truncated relation read differently on purpose: "sample of"
29
+ * tells a reader that paging will not produce the rest and the noun's list verb
30
+ * is where the full set lives, where "showing" invites them to ask for more.
31
+ */
32
+ function inboundHeading(group: InboundGroup): string {
33
+ if (group.sampled) {
34
+ return `${short(group.predicate)} (${group.count}, sample of ${group.subjects.length})`;
35
+ }
36
+ const suffix = group.truncated
37
+ ? `${group.count}, showing ${group.subjects.length}`
38
+ : `${group.count}`;
39
+ return `${short(group.predicate)} (${suffix})`;
40
+ }
12
41
 
13
42
  export const inspectFormatters: Formatters<InspectResult> = {
14
43
  plain(data) {
15
44
  const title = data.label
16
- ? `${compact(data.uri)} — ${data.label}`
17
- : compact(data.uri);
45
+ ? `${short({ termType: "NamedNode", value: data.uri, ...(data.prefixed ? { prefixed: data.prefixed } : {}) })} — ${data.label}`
46
+ : (data.prefixed ?? data.uri);
18
47
  const lines = [title, "═".repeat(Math.max(title.length, 24)), ""];
19
48
  for (const group of data.groups) {
20
- lines.push(` ${compact(group.predicate)}:`);
21
- for (const object of group.objects) lines.push(` ${compact(object)}`);
49
+ lines.push(` ${short(group.predicate)}:`);
50
+ for (const object of group.objects) lines.push(` ${named(object)}`);
22
51
  }
23
- return lines.join("\n").trimEnd();
24
- },
25
- llm(data) {
26
- const lines = [
27
- `## ${compact(data.uri)}${data.label ? ` — ${data.label}` : ""}`,
28
- "",
29
- ];
30
- for (const group of data.groups) {
31
- lines.push(
32
- `- **${compact(group.predicate)}**: ${group.objects.map(compact).join(", ")}`,
33
- );
52
+ for (const [via, rows] of Object.entries(data.nested)) {
53
+ lines.push("", ` ${via}:`);
54
+ for (const row of rows) {
55
+ // Values are TERMS; `String(term)` rendered every nested field as
56
+ // `[object Object]`, which made the whole plain-format record unreadable.
57
+ const fields = Object.entries(row)
58
+ .map(([key, value]) => `${key}=${named(value)}`)
59
+ .join(" ");
60
+ lines.push(` ${fields}`);
61
+ }
62
+ }
63
+ if (data.inbound.length > 0) {
64
+ lines.push("", " Referenced by:");
65
+ for (const group of data.inbound) {
66
+ lines.push(` ${inboundHeading(group)}`);
67
+ for (const subject of group.subjects) {
68
+ lines.push(` ${named(subject)}`);
69
+ }
70
+ }
34
71
  }
35
72
  return lines.join("\n").trimEnd();
36
73
  },
74
+ /**
75
+ * The agent-facing format IS Turtle — same bytes the `pragma:{+uri}` resource
76
+ * read serves, which is what keeps the mirror contract meaningful now that the
77
+ * two are no longer both JSON. Measured on one button: 15.8 KB of JSON against
78
+ * 4.5 KB of Turtle for the same neighbourhood.
79
+ *
80
+ * `prefixes` comes from the reader, not from this formatter: it compacted the
81
+ * terms against the store's own merged map, so re-deriving a map here could
82
+ * only disagree with the names already in the payload.
83
+ */
84
+ llm: (data) => toTurtle(data, data.prefixes),
37
85
  json: (data) => JSON.stringify(data, null, 2),
38
86
  };
@@ -41,13 +41,185 @@ describe("graph inspect", () => {
41
41
  rt,
42
42
  )) as InspectResult;
43
43
  expect(result.uri).toBe(`${DS}button`);
44
+ expect(result.prefixed).toBe("ds:button");
44
45
  const rdfType = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
45
- const typeGroup = result.groups.find((g) => g.predicate === rdfType);
46
- expect(typeGroup?.objects).toContain(`${DS}Component`);
47
- const summary = result.groups.find((g) => g.predicate === `${DS}summary`);
48
- expect(summary?.objects[0]).toBe(
49
- "Primary action trigger with optional icon and label.",
46
+ const typeGroup = result.groups.find((g) => g.predicate.value === rdfType);
47
+ // The object is a NamedNode, so it compacts and stays addressable.
48
+ expect(typeGroup?.objects[0]).toMatchObject({
49
+ termType: "NamedNode",
50
+ value: `${DS}Component`,
51
+ prefixed: "ds:Component",
52
+ });
53
+ const summary = result.groups.find(
54
+ (g) => g.predicate.value === `${DS}summary`,
50
55
  );
56
+ expect(summary?.objects[0]).toMatchObject({
57
+ termType: "Literal",
58
+ value: "Primary action trigger with optional icon and label.",
59
+ });
60
+ });
61
+
62
+ it("never compacts a literal, only a named node", async () => {
63
+ // The lossy string view could not tell these apart, so a literal whose text
64
+ // began with a namespace IRI was rewritten into something that read back as
65
+ // an IRI. Reading ke's term view is what closes that: `ds:figmaLink` here
66
+ // holds a STRING that starts with the `ds:` namespace.
67
+ const result = (await inspectVerb.run(
68
+ { uri: "ds:literalTrap" },
69
+ rt,
70
+ )) as InspectResult;
71
+ const trap = result.groups.find(
72
+ (g) => g.predicate.value === `${DS}figmaLink`,
73
+ );
74
+ expect(trap?.objects[0]?.termType).toBe("Literal");
75
+ expect(trap?.objects[0]?.value).toBe(`${DS}not-an-iri`);
76
+ expect(trap?.objects[0]?.prefixed).toBeUndefined();
77
+ });
78
+
79
+ it("carries inbound relations with a true count, capped by detail", async () => {
80
+ // `ds:button.icon` is the OBJECT of `ds:hasSubcomponent` — the relation
81
+ // lives on the other side of the arrow, so a subject-only read could never
82
+ // surface who holds this subcomponent.
83
+ const result = (await inspectVerb.run(
84
+ { uri: "ds:button.icon" },
85
+ rt,
86
+ )) as InspectResult;
87
+ const held = result.inbound.find(
88
+ (g) => g.predicate.value === `${DS}hasSubcomponent`,
89
+ );
90
+ expect(held?.count).toBeGreaterThan(0);
91
+ expect(held?.subjects[0]?.prefixed).toBe("ds:button");
92
+ });
93
+
94
+ it("inlines blank nodes as records rather than dead handles", async () => {
95
+ const result = (await inspectVerb.run(
96
+ { uri: "ds:blankHolder" },
97
+ rt,
98
+ )) as InspectResult;
99
+ // The blank object itself is marked unreachable...
100
+ const via = result.groups.find(
101
+ (g) => g.predicate.value === `${DS}changeLog`,
102
+ );
103
+ expect(via?.objects[0]).toMatchObject({
104
+ termType: "BlankNode",
105
+ addressable: false,
106
+ });
107
+ // ...and its content is served as records instead. Asserted as a SET: the
108
+ // order is content-derived (see the next case), never the input order.
109
+ // Record VALUES are terms, not strings: a record's members are as much part
110
+ // of the graph as the subject's own, and flattening them would reintroduce
111
+ // the IRI-versus-literal ambiguity the term projection exists to close.
112
+ const changes = result.nested["ds:changeLog"] ?? [];
113
+ expect(changes).toHaveLength(2);
114
+ expect(changes.map((row) => row["ds:changeType"]?.value).sort()).toEqual([
115
+ "decision",
116
+ "revision",
117
+ ]);
118
+ expect(changes[0]?.["ds:changeType"]?.termType).toBe("Literal");
119
+ // `rdf:type` is hoisted to `type` rather than repeated as a field, and stays
120
+ // a NamedNode — so the Turtle serializer can write it back as `a ds:X`.
121
+ expect(changes[0]?.type).toMatchObject({
122
+ termType: "NamedNode",
123
+ prefixed: "ds:ChangeLogEntry",
124
+ });
125
+ });
126
+
127
+ it("counts every inbound edge at summary while listing none", async () => {
128
+ // The cap is what keeps a hub read bounded — this graph's worst is 335
129
+ // inbound edges. `count` must stay the TRUE total at every level: a sample
130
+ // silently passing for the whole set is how "1 implementation" becomes a
131
+ // wrong answer. `ds:global` is the tier both fixture blocks point at.
132
+ const summary = await buildFixtureRuntime({
133
+ ttl: BLOCK_TTL,
134
+ prefixes: BLOCK_PREFIXES,
135
+ detail: "summary",
136
+ });
137
+ const result = (await inspectVerb.run(
138
+ { uri: "ds:global" },
139
+ summary.rt,
140
+ )) as InspectResult;
141
+ (await summary.rt.store.get()).store.dispose();
142
+
143
+ const tier = result.inbound.find((g) => g.predicate.value === `${DS}tier`);
144
+ expect(result.detail).toBe("summary");
145
+ expect(tier?.count).toBe(2);
146
+ expect(tier?.subjects).toEqual([]);
147
+ expect(tier?.truncated).toBe(true);
148
+ // Blank-node inlining is skipped at summary — it is the expensive half.
149
+ expect(result.nested).toEqual({});
150
+ });
151
+
152
+ it("samples a roster instead of listing it, keeping the count exact", async () => {
153
+ // A relation and a roster are not the same kind of edge. `ds:tier` here
154
+ // fans in 22 deep — past the threshold — so the read shows exemplars and
155
+ // says so, rather than paging a list verb's job through a resource read.
156
+ // Listing rosters cost a `detailed` read 19.5 KB on one class of the real
157
+ // graph and 20.9 KB on one tier.
158
+ const detailed = await buildFixtureRuntime({
159
+ ttl: BLOCK_TTL,
160
+ prefixes: BLOCK_PREFIXES,
161
+ detail: "detailed",
162
+ });
163
+ const result = (await inspectVerb.run(
164
+ { uri: "ds:rosterHub" },
165
+ detailed.rt,
166
+ )) as InspectResult;
167
+ (await detailed.rt.store.get()).store.dispose();
168
+
169
+ const roster = result.inbound.find(
170
+ (g) => g.predicate.value === `${DS}tier`,
171
+ );
172
+ expect(roster?.count).toBe(22);
173
+ expect(roster?.sampled).toBe(true);
174
+ expect(roster?.truncated).toBe(true);
175
+ // Exemplars, not a page — far fewer than the 22 a listed relation would show.
176
+ expect(roster?.subjects.length).toBeLessThan(10);
177
+ expect(roster?.subjects.length).toBeGreaterThan(0);
178
+ });
179
+
180
+ it("lists a narrow relation in full, unsampled", async () => {
181
+ // The counterpart: `ds:hasSubcomponent` fans in once, so every subject is
182
+ // part of the answer and none of this bounding applies.
183
+ const result = (await inspectVerb.run(
184
+ { uri: "ds:button.icon" },
185
+ rt,
186
+ )) as InspectResult;
187
+ const held = result.inbound.find(
188
+ (g) => g.predicate.value === `${DS}hasSubcomponent`,
189
+ );
190
+ expect(held?.sampled).toBeUndefined();
191
+ expect(held?.truncated).toBeUndefined();
192
+ expect(held?.subjects).toHaveLength(held?.count ?? 0);
193
+ });
194
+
195
+ it("resolves the level from config when no flag is given", async () => {
196
+ // A resource read carries no params, so config is the level it lands on.
197
+ const configured = await buildFixtureRuntime({
198
+ ttl: BLOCK_TTL,
199
+ prefixes: BLOCK_PREFIXES,
200
+ configDetail: "summary",
201
+ detailOrigin: "project",
202
+ });
203
+ const result = (await inspectVerb.run(
204
+ { uri: "ds:global" },
205
+ configured.rt,
206
+ )) as InspectResult;
207
+ (await configured.rt.store.get()).store.dispose();
208
+ expect(result.detail).toBe("summary");
209
+ });
210
+
211
+ it("orders nested records by content, not by blank-node label", async () => {
212
+ // Oxigraph re-mints blank-node labels on every load, so ordering by them
213
+ // made two reads of the same unchanged entity disagree.
214
+ const first = (await inspectVerb.run(
215
+ { uri: "ds:blankHolder" },
216
+ rt,
217
+ )) as InspectResult;
218
+ const second = (await inspectVerb.run(
219
+ { uri: "ds:blankHolder" },
220
+ rt,
221
+ )) as InspectResult;
222
+ expect(first.nested).toEqual(second.nested);
51
223
  });
52
224
 
53
225
  it("resolves an absolute IRI to the same result", async () => {
@@ -78,3 +250,86 @@ describe("graph inspect", () => {
78
250
  ).rejects.toMatchObject({ code: "INVALID_INPUT" });
79
251
  });
80
252
  });
253
+
254
+ describe("bounds and losslessness the review surfaced", () => {
255
+ it("counts EVERY inbound predicate exactly, whatever the exemplar bound", async () => {
256
+ // One capped query answered counting and exhibiting at once, and answered
257
+ // neither: a single LIMIT applies to the whole ordered result, so the first
258
+ // predicate to fill it under-reported its own count AND every predicate
259
+ // after it vanished — while `count` promised the true total. The roster hub
260
+ // here fans in 22 deep, well past what any level exhibits.
261
+ const result = (await inspectVerb.run(
262
+ { uri: "ds:rosterHub" },
263
+ rt,
264
+ )) as InspectResult;
265
+ const roster = result.inbound.find(
266
+ (g) => g.predicate.value === `${DS}tier`,
267
+ );
268
+ expect(roster?.count).toBe(22);
269
+ // Counted in full, exhibited in part — the two are now separate questions.
270
+ expect(roster?.subjects.length).toBeLessThan(22);
271
+ // And the quiet neighbour survives the noisy one. Under the single capped
272
+ // query, a predicate ordered after one that filled the limit was dropped
273
+ // from the answer entirely.
274
+ const quiet = result.inbound.find(
275
+ (g) => g.predicate.value === `${DS}hasSubcomponent`,
276
+ );
277
+ expect(quiet?.count).toBe(1);
278
+ expect(quiet?.subjects[0]?.prefixed).toBe("ds:probe.quiet");
279
+ });
280
+
281
+ it("keeps a blank node reachable from two predicates under both", async () => {
282
+ // Keyed by node alone, whichever `via` arrived first won and the second
283
+ // edge disappeared — and Turtle filters the ordinary blank object out too,
284
+ // so nothing was left to notice the loss by.
285
+ const result = (await inspectVerb.run(
286
+ { uri: "ds:doubleLinked" },
287
+ rt,
288
+ )) as InspectResult;
289
+ expect(result.nested["ds:changeLog"]).toHaveLength(1);
290
+ expect(result.nested["ds:usageNote"]).toHaveLength(1);
291
+ });
292
+
293
+ it("says nothing about addressability at a level that exhibits none", async () => {
294
+ // At `summary` EVERY group is empty because the level shows no exemplars.
295
+ // Concluding "none individually addressable" there libels subjects that are
296
+ // perfectly nameable, so the group records what it WOULD have shown.
297
+ const summary = await buildFixtureRuntime({
298
+ ttl: BLOCK_TTL,
299
+ prefixes: BLOCK_PREFIXES,
300
+ detail: "summary",
301
+ });
302
+ const result = (await inspectVerb.run(
303
+ { uri: "ds:global" },
304
+ summary.rt,
305
+ )) as InspectResult;
306
+ (await summary.rt.store.get()).store.dispose();
307
+ const tier = result.inbound.find((g) => g.predicate.value === `${DS}tier`);
308
+ expect(tier?.exhibits).toBe(0);
309
+ expect(tier?.count).toBeGreaterThan(0);
310
+ });
311
+
312
+ it("carries the prefix map the payload was compacted against", async () => {
313
+ // A renderer that re-derives it from named nodes misses any prefix used
314
+ // only by the subject, a nested record key, or a literal datatype — and
315
+ // then emits compact names with no matching `@prefix`, i.e. invalid Turtle.
316
+ const result = (await inspectVerb.run(
317
+ { uri: "ds:button" },
318
+ rt,
319
+ )) as InspectResult;
320
+ expect(result.prefixes.ds).toBe(DS);
321
+ });
322
+
323
+ it("keeps an RDF 1.2 literal direction rather than flattening it", async () => {
324
+ const result = (await inspectVerb.run(
325
+ { uri: "ds:directional" },
326
+ rt,
327
+ )) as InspectResult;
328
+ const label = result.groups.find((g) => g.predicate.value === `${DS}name`);
329
+ expect(label?.objects[0]).toMatchObject({
330
+ termType: "Literal",
331
+ language: "ar",
332
+ direction: "rtl",
333
+ });
334
+ });
335
+ });