@canonical/pragma-cli 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (892) hide show
  1. package/README.md +153 -30
  2. package/dist/.build-ok +0 -0
  3. package/dist/package.json +83 -0
  4. package/dist/pragma.conf.js +814 -0
  5. package/dist/pragma.conf.js.map +1 -0
  6. package/dist/src/bin.js +356 -0
  7. package/dist/src/bin.js.map +1 -0
  8. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  9. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  10. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  11. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  12. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  13. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  14. package/dist/src/capabilities/capabilities/hints.js +195 -0
  15. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  16. package/dist/src/capabilities/capabilities/index.js +11 -0
  17. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/types.js +11 -0
  19. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  20. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  21. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  22. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  23. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  24. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  25. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  26. package/dist/src/capabilities/colophon/index.js +5 -0
  27. package/dist/src/capabilities/colophon/index.js.map +1 -0
  28. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  29. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  30. package/dist/src/capabilities/colophon/types.js +10 -0
  31. package/dist/src/capabilities/colophon/types.js.map +1 -0
  32. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  33. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  34. package/dist/src/capabilities/config/field.render.js +22 -0
  35. package/dist/src/capabilities/config/field.render.js.map +1 -0
  36. package/dist/src/capabilities/config/fields.js +46 -0
  37. package/dist/src/capabilities/config/fields.js.map +1 -0
  38. package/dist/src/capabilities/config/get.verb.js +61 -0
  39. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  40. package/dist/src/capabilities/config/index.js +5 -0
  41. package/dist/src/capabilities/config/index.js.map +1 -0
  42. package/dist/src/capabilities/config/runField.js +59 -0
  43. package/dist/src/capabilities/config/runField.js.map +1 -0
  44. package/dist/src/capabilities/config/runGet.js +28 -0
  45. package/dist/src/capabilities/config/runGet.js.map +1 -0
  46. package/dist/src/capabilities/config/runSet.js +53 -0
  47. package/dist/src/capabilities/config/runSet.js.map +1 -0
  48. package/dist/src/capabilities/config/set.verb.js +66 -0
  49. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/show.render.js +84 -0
  51. package/dist/src/capabilities/config/show.render.js.map +1 -0
  52. package/dist/src/capabilities/config/show.verb.js +44 -0
  53. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  54. package/dist/src/capabilities/config/types.js +5 -0
  55. package/dist/src/capabilities/config/types.js.map +1 -0
  56. package/dist/src/capabilities/config/unset.verb.js +49 -0
  57. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  58. package/dist/src/capabilities/create/cliProjection.js +195 -0
  59. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  60. package/dist/src/capabilities/create/constants.js +47 -0
  61. package/dist/src/capabilities/create/constants.js.map +1 -0
  62. package/dist/src/capabilities/create/create.render.js +100 -0
  63. package/dist/src/capabilities/create/create.render.js.map +1 -0
  64. package/dist/src/capabilities/create/create.verb.js +438 -0
  65. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  66. package/dist/src/capabilities/create/createHelp.js +47 -0
  67. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  68. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  69. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  70. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  71. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  72. package/dist/src/capabilities/create/index.js +18 -0
  73. package/dist/src/capabilities/create/index.js.map +1 -0
  74. package/dist/src/capabilities/create/messages.js +16 -0
  75. package/dist/src/capabilities/create/messages.js.map +1 -0
  76. package/dist/src/capabilities/create/mount.js +293 -0
  77. package/dist/src/capabilities/create/mount.js.map +1 -0
  78. package/dist/src/capabilities/create/pathJail.js +65 -0
  79. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  80. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  81. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  82. package/dist/src/capabilities/create/types.js +2 -0
  83. package/dist/src/capabilities/create/types.js.map +1 -0
  84. package/dist/src/capabilities/distribution.js +40 -0
  85. package/dist/src/capabilities/distribution.js.map +1 -0
  86. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  87. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  88. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  89. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  90. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
  91. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  92. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  93. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  94. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  95. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  97. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  99. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
  101. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  102. package/dist/src/capabilities/doctor/doctor.render.js +185 -0
  103. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  104. package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
  105. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  106. package/dist/src/capabilities/doctor/index.js +5 -0
  107. package/dist/src/capabilities/doctor/index.js.map +1 -0
  108. package/dist/src/capabilities/doctor/runChecks.js +83 -0
  109. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  110. package/dist/src/capabilities/doctor/types.js +5 -0
  111. package/dist/src/capabilities/doctor/types.js.map +1 -0
  112. package/dist/src/capabilities/graph/index.js +19 -0
  113. package/dist/src/capabilities/graph/index.js.map +1 -0
  114. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  115. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  116. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  117. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  118. package/dist/src/capabilities/graph/query.render.js +73 -0
  119. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  120. package/dist/src/capabilities/graph/query.verb.js +49 -0
  121. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  122. package/dist/src/capabilities/graph/runQuery.js +41 -0
  123. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  124. package/dist/src/capabilities/index.js +56 -0
  125. package/dist/src/capabilities/index.js.map +1 -0
  126. package/dist/src/capabilities/info/collectInfo.js +66 -0
  127. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  128. package/dist/src/capabilities/info/index.js +5 -0
  129. package/dist/src/capabilities/info/index.js.map +1 -0
  130. package/dist/src/capabilities/info/info.render.js +53 -0
  131. package/dist/src/capabilities/info/info.render.js.map +1 -0
  132. package/dist/src/capabilities/info/info.verb.js +42 -0
  133. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  134. package/dist/src/capabilities/info/types.js +5 -0
  135. package/dist/src/capabilities/info/types.js.map +1 -0
  136. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  137. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  138. package/dist/src/capabilities/meta/index.js +13 -0
  139. package/dist/src/capabilities/meta/index.js.map +1 -0
  140. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  141. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  142. package/dist/src/capabilities/ontology/index.js +21 -0
  143. package/dist/src/capabilities/ontology/index.js.map +1 -0
  144. package/dist/src/capabilities/ontology/queries.js +123 -0
  145. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  146. package/dist/src/capabilities/ontology/render.js +66 -0
  147. package/dist/src/capabilities/ontology/render.js.map +1 -0
  148. package/dist/src/capabilities/ontology/verbs.js +181 -0
  149. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  150. package/dist/src/capabilities/prompt/index.js +16 -0
  151. package/dist/src/capabilities/prompt/index.js.map +1 -0
  152. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  153. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  154. package/dist/src/capabilities/prompt/types.js +10 -0
  155. package/dist/src/capabilities/prompt/types.js.map +1 -0
  156. package/dist/src/capabilities/prompt/verbs.js +93 -0
  157. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  158. package/dist/src/capabilities/resources/index.js +10 -0
  159. package/dist/src/capabilities/resources/index.js.map +1 -0
  160. package/dist/src/capabilities/resources/provider.js +423 -0
  161. package/dist/src/capabilities/resources/provider.js.map +1 -0
  162. package/dist/src/capabilities/setup/buildPlan.js +168 -0
  163. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  164. package/dist/src/capabilities/setup/index.js +5 -0
  165. package/dist/src/capabilities/setup/index.js.map +1 -0
  166. package/dist/src/capabilities/setup/mode.js +53 -0
  167. package/dist/src/capabilities/setup/mode.js.map +1 -0
  168. package/dist/src/capabilities/setup/operations/index.js +39 -0
  169. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  170. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  171. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  172. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  173. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  174. package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
  175. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  176. package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
  177. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  178. package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
  179. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
  181. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  182. package/dist/src/capabilities/setup/plan.js +128 -0
  183. package/dist/src/capabilities/setup/plan.js.map +1 -0
  184. package/dist/src/capabilities/setup/plan.render.js +193 -0
  185. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  186. package/dist/src/capabilities/setup/setup.render.js +54 -0
  187. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  188. package/dist/src/capabilities/setup/setup.verb.js +334 -0
  189. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  190. package/dist/src/capabilities/setup/shell.js +196 -0
  191. package/dist/src/capabilities/setup/shell.js.map +1 -0
  192. package/dist/src/capabilities/setup/targets.js +263 -0
  193. package/dist/src/capabilities/setup/targets.js.map +1 -0
  194. package/dist/src/capabilities/setup/types.js +5 -0
  195. package/dist/src/capabilities/setup/types.js.map +1 -0
  196. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  197. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  198. package/dist/src/capabilities/shared/bands.js +16 -0
  199. package/dist/src/capabilities/shared/bands.js.map +1 -0
  200. package/dist/src/capabilities/shared/index.js +26 -0
  201. package/dist/src/capabilities/shared/index.js.map +1 -0
  202. package/dist/src/capabilities/shared/packageManager.js +103 -0
  203. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  204. package/dist/src/capabilities/shared/registry.js +55 -0
  205. package/dist/src/capabilities/shared/registry.js.map +1 -0
  206. package/dist/src/capabilities/skill/discover.js +195 -0
  207. package/dist/src/capabilities/skill/discover.js.map +1 -0
  208. package/dist/src/capabilities/skill/index.js +10 -0
  209. package/dist/src/capabilities/skill/index.js.map +1 -0
  210. package/dist/src/capabilities/skill/render.js +49 -0
  211. package/dist/src/capabilities/skill/render.js.map +1 -0
  212. package/dist/src/capabilities/skill/verbs.js +83 -0
  213. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  214. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  215. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  216. package/dist/src/capabilities/sources/index.js +13 -0
  217. package/dist/src/capabilities/sources/index.js.map +1 -0
  218. package/dist/src/capabilities/sources/installSkills.js +167 -0
  219. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  220. package/dist/src/capabilities/sources/runUpdate.js +394 -0
  221. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  222. package/dist/src/capabilities/sources/status.render.js +64 -0
  223. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  224. package/dist/src/capabilities/sources/status.verb.js +40 -0
  225. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  226. package/dist/src/capabilities/sources/types.js +6 -0
  227. package/dist/src/capabilities/sources/types.js.map +1 -0
  228. package/dist/src/capabilities/sources/update.render.js +34 -0
  229. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  230. package/dist/src/capabilities/sources/update.verb.js +55 -0
  231. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  232. package/dist/src/capabilities/upgrade/index.js +5 -0
  233. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  234. package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
  235. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  236. package/dist/src/capabilities/upgrade/types.js +5 -0
  237. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  238. package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
  239. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  240. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  241. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  242. package/dist/src/capabilities/version/index.js +10 -0
  243. package/dist/src/capabilities/version/index.js.map +1 -0
  244. package/dist/src/capabilities/version/version.verb.js +36 -0
  245. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  246. package/dist/src/constants.js +82 -0
  247. package/dist/src/constants.js.map +1 -0
  248. package/dist/src/index.js +12 -0
  249. package/dist/src/index.js.map +1 -0
  250. package/dist/src/kernel/completion/complete.js +66 -0
  251. package/dist/src/kernel/completion/complete.js.map +1 -0
  252. package/dist/src/kernel/completion/emitScripts.js +92 -0
  253. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  254. package/dist/src/kernel/completion/entitySource.js +285 -0
  255. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  256. package/dist/src/kernel/completion/index.js +14 -0
  257. package/dist/src/kernel/completion/index.js.map +1 -0
  258. package/dist/src/kernel/completion/model.js +301 -0
  259. package/dist/src/kernel/completion/model.js.map +1 -0
  260. package/dist/src/kernel/completion/parse.js +253 -0
  261. package/dist/src/kernel/completion/parse.js.map +1 -0
  262. package/dist/src/kernel/completion/rank.js +101 -0
  263. package/dist/src/kernel/completion/rank.js.map +1 -0
  264. package/dist/src/kernel/completion/resolve.js +100 -0
  265. package/dist/src/kernel/completion/resolve.js.map +1 -0
  266. package/dist/src/kernel/completion/templates/bash.js +209 -0
  267. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  268. package/dist/src/kernel/completion/templates/fish.js +214 -0
  269. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  270. package/dist/src/kernel/completion/templates/index.js +23 -0
  271. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  272. package/dist/src/kernel/completion/templates/shared.js +98 -0
  273. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  274. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  275. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  276. package/dist/src/kernel/completion/types.js +13 -0
  277. package/dist/src/kernel/completion/types.js.map +1 -0
  278. package/dist/src/kernel/config/defaults.js +17 -0
  279. package/dist/src/kernel/config/defaults.js.map +1 -0
  280. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  281. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  282. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  283. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  284. package/dist/src/kernel/config/firstRun.js +34 -0
  285. package/dist/src/kernel/config/firstRun.js.map +1 -0
  286. package/dist/src/kernel/config/globalConfig.js +79 -0
  287. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  288. package/dist/src/kernel/config/index.js +16 -0
  289. package/dist/src/kernel/config/index.js.map +1 -0
  290. package/dist/src/kernel/config/paths.js +35 -0
  291. package/dist/src/kernel/config/paths.js.map +1 -0
  292. package/dist/src/kernel/config/readConfig.js +78 -0
  293. package/dist/src/kernel/config/readConfig.js.map +1 -0
  294. package/dist/src/kernel/config/schema.js +130 -0
  295. package/dist/src/kernel/config/schema.js.map +1 -0
  296. package/dist/src/kernel/config/types.js +19 -0
  297. package/dist/src/kernel/config/types.js.map +1 -0
  298. package/dist/src/kernel/config/writeConfigField.js +59 -0
  299. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  300. package/dist/src/kernel/copy.js +43 -0
  301. package/dist/src/kernel/copy.js.map +1 -0
  302. package/dist/src/kernel/error/PragmaError.js +149 -0
  303. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  304. package/dist/src/kernel/error/constants.js +40 -0
  305. package/dist/src/kernel/error/constants.js.map +1 -0
  306. package/dist/src/kernel/error/fromTaskError.js +96 -0
  307. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  308. package/dist/src/kernel/error/index.js +13 -0
  309. package/dist/src/kernel/error/index.js.map +1 -0
  310. package/dist/src/kernel/error/recovery.js +52 -0
  311. package/dist/src/kernel/error/recovery.js.map +1 -0
  312. package/dist/src/kernel/error/renderError.js +115 -0
  313. package/dist/src/kernel/error/renderError.js.map +1 -0
  314. package/dist/src/kernel/error/serialize.js +25 -0
  315. package/dist/src/kernel/error/serialize.js.map +1 -0
  316. package/dist/src/kernel/error/types.js +9 -0
  317. package/dist/src/kernel/error/types.js.map +1 -0
  318. package/dist/src/kernel/index.js +25 -0
  319. package/dist/src/kernel/index.js.map +1 -0
  320. package/dist/src/kernel/packs/collect.js +187 -0
  321. package/dist/src/kernel/packs/collect.js.map +1 -0
  322. package/dist/src/kernel/packs/compile.js +304 -0
  323. package/dist/src/kernel/packs/compile.js.map +1 -0
  324. package/dist/src/kernel/packs/disclosure.js +76 -0
  325. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  326. package/dist/src/kernel/packs/glob.js +38 -0
  327. package/dist/src/kernel/packs/glob.js.map +1 -0
  328. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  329. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  330. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  331. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  332. package/dist/src/kernel/packs/graphql/index.js +20 -0
  333. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  334. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  335. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  336. package/dist/src/kernel/packs/index.js +34 -0
  337. package/dist/src/kernel/packs/index.js.map +1 -0
  338. package/dist/src/kernel/packs/iri.js +110 -0
  339. package/dist/src/kernel/packs/iri.js.map +1 -0
  340. package/dist/src/kernel/packs/renderPack.js +129 -0
  341. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  342. package/dist/src/kernel/packs/resolveEntity.js +223 -0
  343. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  344. package/dist/src/kernel/packs/runBodies.js +87 -0
  345. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  346. package/dist/src/kernel/packs/sample.js +56 -0
  347. package/dist/src/kernel/packs/sample.js.map +1 -0
  348. package/dist/src/kernel/packs/schema.js +369 -0
  349. package/dist/src/kernel/packs/schema.js.map +1 -0
  350. package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
  351. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  352. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  353. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  354. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
  355. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  356. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  357. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  358. package/dist/src/kernel/packs/sparql/index.js +31 -0
  359. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  360. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  361. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  362. package/dist/src/kernel/packs/types.js +30 -0
  363. package/dist/src/kernel/packs/types.js.map +1 -0
  364. package/dist/src/kernel/packs/uniqueness.js +30 -0
  365. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  366. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  367. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  368. package/dist/src/kernel/project/cli/constants.js +27 -0
  369. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  370. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  371. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  372. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  373. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  374. package/dist/src/kernel/project/cli/globalFlags.js +216 -0
  375. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  376. package/dist/src/kernel/project/cli/helpFormat.js +59 -0
  377. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  378. package/dist/src/kernel/project/cli/index.js +14 -0
  379. package/dist/src/kernel/project/cli/index.js.map +1 -0
  380. package/dist/src/kernel/project/cli/rootHelp.js +197 -0
  381. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  382. package/dist/src/kernel/project/cli/suggest.js +75 -0
  383. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  384. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  385. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  386. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  387. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  388. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  389. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  390. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  391. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  392. package/dist/src/kernel/project/mcp/index.js +8 -0
  393. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  394. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  395. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  396. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  397. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  398. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  399. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  401. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  403. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
  405. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/serve.js +35 -0
  407. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  408. package/dist/src/kernel/render/compactUri.js +24 -0
  409. package/dist/src/kernel/render/compactUri.js.map +1 -0
  410. package/dist/src/kernel/render/contracts.js +10 -0
  411. package/dist/src/kernel/render/contracts.js.map +1 -0
  412. package/dist/src/kernel/render/disclosure.js +34 -0
  413. package/dist/src/kernel/render/disclosure.js.map +1 -0
  414. package/dist/src/kernel/render/envelope.js +30 -0
  415. package/dist/src/kernel/render/envelope.js.map +1 -0
  416. package/dist/src/kernel/render/formatters.js +27 -0
  417. package/dist/src/kernel/render/formatters.js.map +1 -0
  418. package/dist/src/kernel/render/index.js +15 -0
  419. package/dist/src/kernel/render/index.js.map +1 -0
  420. package/dist/src/kernel/render/prefixes.js +46 -0
  421. package/dist/src/kernel/render/prefixes.js.map +1 -0
  422. package/dist/src/kernel/render/renderers.js +468 -0
  423. package/dist/src/kernel/render/renderers.js.map +1 -0
  424. package/dist/src/kernel/render/style.js +85 -0
  425. package/dist/src/kernel/render/style.js.map +1 -0
  426. package/dist/src/kernel/render/turtle.js +194 -0
  427. package/dist/src/kernel/render/turtle.js.map +1 -0
  428. package/dist/src/kernel/render/writeStdout.js +43 -0
  429. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  430. package/dist/src/kernel/runtime/boot.js +49 -0
  431. package/dist/src/kernel/runtime/boot.js.map +1 -0
  432. package/dist/src/kernel/runtime/facade.js +39 -0
  433. package/dist/src/kernel/runtime/facade.js.map +1 -0
  434. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  435. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  436. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  437. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  438. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  439. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  440. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  441. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  442. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  443. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  444. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  445. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  446. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  447. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  449. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  451. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  453. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  455. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  457. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  459. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  460. package/dist/src/kernel/runtime/index.js +8 -0
  461. package/dist/src/kernel/runtime/index.js.map +1 -0
  462. package/dist/src/kernel/runtime/loadSession.js +34 -0
  463. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  464. package/dist/src/kernel/runtime/paths.js +78 -0
  465. package/dist/src/kernel/runtime/paths.js.map +1 -0
  466. package/dist/src/kernel/runtime/probe.js +37 -0
  467. package/dist/src/kernel/runtime/probe.js.map +1 -0
  468. package/dist/src/kernel/runtime/readEntity.js +363 -0
  469. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  470. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  471. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  472. package/dist/src/kernel/runtime/refs/index.js +29 -0
  473. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  474. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  475. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  476. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  477. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  478. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  479. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  480. package/dist/src/kernel/runtime/store.js +75 -0
  481. package/dist/src/kernel/runtime/store.js.map +1 -0
  482. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  483. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  484. package/dist/src/kernel/runtime/types.js +11 -0
  485. package/dist/src/kernel/runtime/types.js.map +1 -0
  486. package/dist/src/kernel/spec/asVerb.js +21 -0
  487. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  488. package/dist/src/kernel/spec/emitReference.js +578 -0
  489. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  490. package/dist/src/kernel/spec/emitSurface.js +202 -0
  491. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  492. package/dist/src/kernel/spec/index.js +11 -0
  493. package/dist/src/kernel/spec/index.js.map +1 -0
  494. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  495. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  496. package/dist/src/kernel/spec/types.js +14 -0
  497. package/dist/src/kernel/spec/types.js.map +1 -0
  498. package/dist/src/kernel/spec/validate.js +110 -0
  499. package/dist/src/kernel/spec/validate.js.map +1 -0
  500. package/dist/src/kernel/vocabulary.js +97 -0
  501. package/dist/src/kernel/vocabulary.js.map +1 -0
  502. package/dist/src/types.js +11 -0
  503. package/dist/src/types.js.map +1 -0
  504. package/package.json +25 -24
  505. package/pragma.conf.ts +853 -0
  506. package/src/bin.ts +276 -82
  507. package/src/capabilities/block.parity.test.ts +253 -0
  508. package/src/capabilities/capabilities/capabilities.render.ts +4 -3
  509. package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
  510. package/src/capabilities/capabilities/catalog.ts +20 -12
  511. package/src/capabilities/capabilities/hints.ts +43 -24
  512. package/src/capabilities/capabilities/index.ts +1 -1
  513. package/src/capabilities/colophon/collectColophon.ts +50 -24
  514. package/src/capabilities/colophon/colophon.render.ts +25 -1
  515. package/src/capabilities/colophon/colophon.test.ts +42 -21
  516. package/src/capabilities/colophon/colophon.verb.ts +9 -5
  517. package/src/capabilities/colophon/types.ts +16 -7
  518. package/src/capabilities/config/collectConfigShow.test.ts +58 -0
  519. package/src/capabilities/config/collectConfigShow.ts +43 -6
  520. package/src/capabilities/config/field.render.ts +4 -5
  521. package/src/capabilities/config/fields.ts +17 -37
  522. package/src/capabilities/config/get.verb.ts +70 -0
  523. package/src/capabilities/config/getUnset.test.ts +264 -0
  524. package/src/capabilities/config/index.ts +5 -1
  525. package/src/capabilities/config/runField.ts +40 -22
  526. package/src/capabilities/config/runGet.ts +34 -0
  527. package/src/capabilities/config/runSet.ts +35 -9
  528. package/src/capabilities/config/set.test.ts +48 -14
  529. package/src/capabilities/config/set.verb.ts +14 -9
  530. package/src/capabilities/config/show.render.test.ts +77 -5
  531. package/src/capabilities/config/show.render.ts +8 -13
  532. package/src/capabilities/config/show.verb.ts +13 -9
  533. package/src/capabilities/config/types.ts +26 -4
  534. package/src/capabilities/config/unset.verb.ts +58 -0
  535. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  536. package/src/capabilities/create/byteEquality.test.ts +95 -103
  537. package/src/capabilities/create/cliProjection.ts +227 -0
  538. package/src/capabilities/create/constants.ts +50 -0
  539. package/src/capabilities/create/create.mcp.test.ts +91 -7
  540. package/src/capabilities/create/create.render.ts +71 -7
  541. package/src/capabilities/create/create.test.ts +523 -162
  542. package/src/capabilities/create/create.verb.ts +361 -321
  543. package/src/capabilities/create/createGrammar.test.ts +865 -0
  544. package/src/capabilities/create/createHelp.ts +71 -0
  545. package/src/capabilities/create/createSurface.generated.ts +400 -0
  546. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  547. package/src/capabilities/create/cwdJail.test.ts +24 -5
  548. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  549. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  550. package/src/capabilities/create/index.ts +9 -14
  551. package/src/capabilities/create/messages.ts +18 -0
  552. package/src/capabilities/create/mount.ts +391 -0
  553. package/src/capabilities/create/pathJail.test.ts +90 -0
  554. package/src/capabilities/create/pathJail.ts +8 -5
  555. package/src/capabilities/create/pickGenerator.ts +40 -46
  556. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  557. package/src/capabilities/create/types.ts +29 -5
  558. package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
  559. package/src/capabilities/distribution.test.ts +122 -0
  560. package/src/capabilities/distribution.ts +54 -0
  561. package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
  562. package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
  563. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
  564. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
  565. package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
  566. package/src/capabilities/doctor/checks/index.ts +27 -0
  567. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  568. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  569. package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
  570. package/src/capabilities/doctor/doctor.render.test.ts +24 -13
  571. package/src/capabilities/doctor/doctor.render.ts +45 -20
  572. package/src/capabilities/doctor/doctor.test.ts +158 -40
  573. package/src/capabilities/doctor/doctor.verb.ts +9 -5
  574. package/src/capabilities/doctor/runChecks.ts +65 -66
  575. package/src/capabilities/doctor/types.ts +21 -5
  576. package/src/capabilities/emptyRecovery.test.ts +44 -22
  577. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  578. package/src/capabilities/graph/index.ts +1 -1
  579. package/src/capabilities/graph/inspect.render.ts +70 -22
  580. package/src/capabilities/graph/inspect.test.ts +260 -5
  581. package/src/capabilities/graph/inspect.verb.ts +18 -5
  582. package/src/capabilities/graph/query.render.ts +15 -3
  583. package/src/capabilities/graph/query.verb.ts +5 -4
  584. package/src/capabilities/graph/runQuery.ts +9 -7
  585. package/src/capabilities/index.ts +25 -19
  586. package/src/capabilities/info/collectInfo.ts +15 -10
  587. package/src/capabilities/info/info.render.ts +4 -3
  588. package/src/capabilities/info/info.verb.ts +4 -3
  589. package/src/capabilities/lazy.test.ts +125 -2
  590. package/src/capabilities/meta/complete.verb.ts +1 -1
  591. package/src/capabilities/meta/index.ts +1 -1
  592. package/src/capabilities/meta/mcp.verb.ts +10 -8
  593. package/src/capabilities/ontology/index.ts +15 -11
  594. package/src/capabilities/ontology/ontology.test.ts +6 -55
  595. package/src/capabilities/ontology/queries.ts +2 -2
  596. package/src/capabilities/ontology/render.ts +3 -4
  597. package/src/capabilities/ontology/verbs.ts +42 -83
  598. package/src/capabilities/prompt/index.ts +2 -2
  599. package/src/capabilities/prompt/prompt.render.ts +6 -2
  600. package/src/capabilities/prompt/prompt.test.ts +12 -6
  601. package/src/capabilities/prompt/types.ts +1 -1
  602. package/src/capabilities/prompt/verbs.ts +26 -14
  603. package/src/capabilities/reference.test.ts +63 -0
  604. package/src/capabilities/resources/provider.ts +367 -91
  605. package/src/capabilities/resources/resources.test.ts +411 -59
  606. package/src/capabilities/setup/buildPlan.ts +236 -0
  607. package/src/capabilities/setup/index.ts +7 -7
  608. package/src/capabilities/setup/mode.ts +74 -0
  609. package/src/capabilities/setup/operations/index.ts +74 -0
  610. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  611. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  612. package/src/capabilities/setup/operations/setupGenerator.ts +397 -320
  613. package/src/capabilities/setup/operations/setupLsp.ts +329 -68
  614. package/src/capabilities/setup/operations/setupMcp.ts +137 -97
  615. package/src/capabilities/setup/operations/setupSkills.ts +336 -108
  616. package/src/capabilities/setup/plan.render.ts +241 -0
  617. package/src/capabilities/setup/plan.ts +236 -0
  618. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  619. package/src/capabilities/setup/setup.render.test.ts +281 -73
  620. package/src/capabilities/setup/setup.render.ts +45 -77
  621. package/src/capabilities/setup/setup.test.ts +972 -209
  622. package/src/capabilities/setup/setup.verb.ts +233 -74
  623. package/src/capabilities/setup/shell.test.ts +86 -0
  624. package/src/capabilities/setup/shell.ts +166 -14
  625. package/src/capabilities/setup/targets.ts +367 -0
  626. package/src/capabilities/setup/types.ts +18 -57
  627. package/src/capabilities/shared/assertExecOk.ts +68 -10
  628. package/src/capabilities/shared/index.ts +32 -0
  629. package/src/capabilities/shared/packageManager.test.ts +55 -0
  630. package/src/capabilities/shared/packageManager.ts +62 -6
  631. package/src/capabilities/skill/discover.ts +47 -9
  632. package/src/capabilities/skill/index.ts +1 -1
  633. package/src/capabilities/skill/render.ts +14 -14
  634. package/src/capabilities/skill/skill.test.ts +7 -5
  635. package/src/capabilities/skill/verbs.ts +9 -10
  636. package/src/capabilities/sources/collectStatus.ts +61 -51
  637. package/src/capabilities/sources/index.ts +2 -2
  638. package/src/capabilities/sources/installSkills.ts +86 -9
  639. package/src/capabilities/sources/runUpdate.ts +164 -141
  640. package/src/capabilities/sources/sources.test.ts +265 -119
  641. package/src/capabilities/sources/status.render.test.ts +53 -24
  642. package/src/capabilities/sources/status.render.ts +25 -30
  643. package/src/capabilities/sources/status.verb.ts +16 -9
  644. package/src/capabilities/sources/types.ts +18 -25
  645. package/src/capabilities/sources/update.render.ts +10 -3
  646. package/src/capabilities/sources/update.verb.ts +13 -24
  647. package/src/capabilities/surface.test.ts +165 -25
  648. package/src/capabilities/tier.parity.test.ts +144 -0
  649. package/src/capabilities/upgrade/runUpgrade.ts +8 -8
  650. package/src/capabilities/upgrade/upgrade.render.ts +4 -5
  651. package/src/capabilities/upgrade/upgrade.test.ts +3 -3
  652. package/src/capabilities/upgrade/upgrade.verb.ts +8 -4
  653. package/src/capabilities/version/index.ts +12 -0
  654. package/src/capabilities/version/version.test.ts +66 -0
  655. package/src/capabilities/version/version.verb.ts +39 -0
  656. package/src/constants.test.ts +8 -6
  657. package/src/constants.ts +78 -22
  658. package/src/identity.test.ts +348 -0
  659. package/src/index.ts +2 -2
  660. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
  661. package/src/kernel/completion/complete.test.ts +12 -2
  662. package/src/kernel/completion/complete.ts +1 -1
  663. package/src/kernel/completion/emitScripts.test.ts +1 -1
  664. package/src/kernel/completion/emitScripts.ts +5 -3
  665. package/src/kernel/completion/entitySource.test.ts +185 -41
  666. package/src/kernel/completion/entitySource.ts +133 -110
  667. package/src/kernel/completion/model.test.ts +165 -13
  668. package/src/kernel/completion/model.ts +105 -14
  669. package/src/kernel/completion/parse.test.ts +4 -7
  670. package/src/kernel/completion/parse.ts +15 -0
  671. package/src/kernel/completion/resolve.test.ts +0 -1
  672. package/src/kernel/completion/safety.test.ts +104 -50
  673. package/src/kernel/completion/shellDrive.test.ts +611 -0
  674. package/src/kernel/completion/templates/bash.ts +7 -2
  675. package/src/kernel/completion/templates/fish.ts +28 -6
  676. package/src/kernel/completion/templates/index.ts +23 -0
  677. package/src/kernel/completion/types.ts +10 -3
  678. package/src/kernel/config/defaults.test.ts +108 -0
  679. package/src/kernel/config/defaults.ts +13 -23
  680. package/src/kernel/config/evaluateProjectConfig.ts +33 -11
  681. package/src/kernel/config/findProjectConfig.ts +4 -3
  682. package/src/kernel/config/firstRun.test.ts +44 -38
  683. package/src/kernel/config/firstRun.ts +24 -81
  684. package/src/kernel/config/globalConfig.ts +2 -2
  685. package/src/kernel/config/index.ts +5 -6
  686. package/src/kernel/config/paths.ts +17 -17
  687. package/src/kernel/config/readConfig.test.ts +246 -7
  688. package/src/kernel/config/readConfig.ts +8 -8
  689. package/src/kernel/config/schema.test.ts +50 -0
  690. package/src/kernel/config/schema.ts +100 -11
  691. package/src/kernel/config/types.ts +75 -19
  692. package/src/kernel/copy.test.ts +483 -0
  693. package/src/kernel/copy.ts +54 -0
  694. package/src/kernel/error/PragmaError.test.ts +6 -3
  695. package/src/kernel/error/PragmaError.ts +4 -2
  696. package/src/kernel/error/constants.ts +7 -4
  697. package/src/kernel/error/fromTaskError.ts +28 -6
  698. package/src/kernel/error/index.ts +1 -1
  699. package/src/kernel/error/recovery.test.ts +22 -45
  700. package/src/kernel/error/recovery.ts +36 -27
  701. package/src/kernel/error/renderError.ts +42 -1
  702. package/src/kernel/error/types.ts +25 -4
  703. package/src/kernel/index.ts +26 -0
  704. package/src/kernel/packs/collect.test.ts +195 -11
  705. package/src/kernel/packs/collect.ts +212 -61
  706. package/src/kernel/packs/compile.test.ts +293 -8
  707. package/src/kernel/packs/compile.ts +108 -15
  708. package/src/kernel/packs/disclosure.test.ts +5 -2
  709. package/src/kernel/packs/disclosure.ts +2 -2
  710. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  711. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
  712. package/src/kernel/packs/graphql/index.ts +20 -0
  713. package/src/kernel/packs/graphqlSource.test.ts +6 -3
  714. package/src/kernel/packs/index.ts +40 -0
  715. package/src/kernel/packs/iri.test.ts +73 -0
  716. package/src/kernel/packs/iri.ts +70 -20
  717. package/src/kernel/packs/renderPack.ts +28 -7
  718. package/src/kernel/packs/resolveEntity.test.ts +213 -0
  719. package/src/kernel/packs/resolveEntity.ts +132 -34
  720. package/src/kernel/packs/runBodies.ts +16 -16
  721. package/src/kernel/packs/sample.ts +1 -1
  722. package/src/kernel/packs/schema.ts +114 -11
  723. package/src/kernel/packs/sparql/applyFilters.ts +16 -17
  724. package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
  725. package/src/kernel/packs/sparql/index.ts +37 -0
  726. package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
  727. package/src/kernel/packs/sparql/runSelect.ts +75 -37
  728. package/src/kernel/packs/toolDescription.test.ts +52 -5
  729. package/src/kernel/packs/types.ts +52 -4
  730. package/src/kernel/packs/uniqueness.ts +5 -5
  731. package/src/kernel/project/cli/buildProgram.test.ts +157 -17
  732. package/src/kernel/project/cli/buildProgram.ts +77 -18
  733. package/src/kernel/project/cli/constants.ts +34 -0
  734. package/src/kernel/project/cli/dispatch.test.ts +227 -3
  735. package/src/kernel/project/cli/dispatch.ts +250 -48
  736. package/src/kernel/project/cli/exitCodes.ts +1 -1
  737. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  738. package/src/kernel/project/cli/globalFlags.ts +130 -30
  739. package/src/kernel/project/cli/helpFormat.ts +14 -1
  740. package/src/kernel/project/cli/rootHelp.ts +140 -111
  741. package/src/kernel/project/cli/suggest.test.ts +33 -1
  742. package/src/kernel/project/cli/suggest.ts +25 -1
  743. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  744. package/src/kernel/project/cli/verbHelp.ts +23 -7
  745. package/src/kernel/project/mcp/buildServer.ts +18 -10
  746. package/src/kernel/project/mcp/envelope.ts +2 -2
  747. package/src/kernel/project/mcp/instructions.ts +12 -7
  748. package/src/kernel/project/mcp/mcpError.ts +1 -1
  749. package/src/kernel/project/mcp/parity.test.ts +42 -1
  750. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  751. package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
  752. package/src/kernel/project/mcp/prompts/provider.ts +22 -8
  753. package/src/kernel/project/mcp/prompts/source.ts +69 -68
  754. package/src/kernel/project/mcp/registerVerb.ts +56 -11
  755. package/src/kernel/project/mcp/serve.ts +13 -5
  756. package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
  757. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  758. package/src/kernel/render/contracts.ts +21 -0
  759. package/src/kernel/render/disclosure.ts +4 -2
  760. package/src/kernel/render/envelope.ts +2 -3
  761. package/src/kernel/render/formatters.ts +1 -1
  762. package/src/kernel/render/prefixes.test.ts +36 -0
  763. package/src/kernel/render/prefixes.ts +40 -13
  764. package/src/kernel/render/renderers.test.ts +244 -7
  765. package/src/kernel/render/renderers.ts +222 -20
  766. package/src/kernel/render/style.test.ts +75 -24
  767. package/src/kernel/render/style.ts +31 -1
  768. package/src/kernel/render/turtle.ts +222 -0
  769. package/src/kernel/runtime/graphpack/build.ts +29 -3
  770. package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
  771. package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
  772. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
  773. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
  775. package/src/kernel/runtime/graphpack/embedded.ts +39 -13
  776. package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
  777. package/src/kernel/runtime/graphpack/hash.ts +3 -2
  778. package/src/kernel/runtime/graphpack/index.ts +1 -1
  779. package/src/kernel/runtime/graphpack/manifest.ts +114 -12
  780. package/src/kernel/runtime/graphpack/read.ts +5 -11
  781. package/src/kernel/runtime/graphpack/schemas.ts +74 -0
  782. package/src/kernel/runtime/graphpack/stories.ts +84 -0
  783. package/src/kernel/runtime/graphpack/types.ts +61 -48
  784. package/src/kernel/runtime/loadSession.ts +1 -1
  785. package/src/kernel/runtime/paths.ts +64 -15
  786. package/src/kernel/runtime/probe.test.ts +8 -4
  787. package/src/kernel/runtime/probe.ts +6 -6
  788. package/src/kernel/runtime/readEntity.ts +477 -32
  789. package/src/kernel/runtime/refs/gitOps.ts +1 -19
  790. package/src/kernel/runtime/refs/index.ts +39 -0
  791. package/src/kernel/runtime/refs/parseRef.ts +8 -8
  792. package/src/kernel/runtime/refs/resolve.ts +82 -66
  793. package/src/kernel/runtime/resolveSources.test.ts +63 -24
  794. package/src/kernel/runtime/resolveSources.ts +36 -25
  795. package/src/kernel/runtime/storeReadiness.ts +10 -10
  796. package/src/kernel/runtime/storeless.test.ts +1 -1
  797. package/src/kernel/runtime/types.ts +15 -1
  798. package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
  799. package/src/kernel/spec/emitReference.test.ts +3 -3
  800. package/src/kernel/spec/emitReference.ts +242 -34
  801. package/src/kernel/spec/emitSurface.ts +57 -11
  802. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  803. package/src/kernel/spec/surfaceConformance.ts +8 -0
  804. package/src/kernel/spec/types.ts +277 -13
  805. package/src/kernel/spec/validate.ts +2 -1
  806. package/src/kernel/vocabulary.test.ts +164 -0
  807. package/src/kernel/vocabulary.ts +146 -0
  808. package/src/testing/PARITY_GAPS.ts +8 -2
  809. package/src/testing/behavioral/README.md +3 -3
  810. package/src/testing/behavioral/completion.test.ts +19 -6
  811. package/src/testing/behavioral/docExamples.test.ts +14 -0
  812. package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
  813. package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
  814. package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
  815. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  816. package/src/testing/behavioral/harness.foundation.test.ts +14 -5
  817. package/src/testing/behavioral/journeys.cli.test.ts +117 -76
  818. package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
  819. package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
  820. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  821. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  822. package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +9 -6
  823. package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
  824. package/src/testing/behavioral/liveReadSurface.ts +4 -3
  825. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  826. package/src/testing/behavioral/mcpSurface.test.ts +10 -5
  827. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  828. package/src/testing/behavioral/staleCommands.test.ts +10 -0
  829. package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
  830. package/src/testing/eval/cases/assembly.ts +13 -6
  831. package/src/testing/eval/cases/effectful.ts +28 -15
  832. package/src/testing/eval/cases/readNouns.ts +22 -20
  833. package/src/testing/eval/cases/stable.ts +5 -1
  834. package/src/testing/eval/eval.test.ts +7 -1
  835. package/src/testing/fixtures/blockGraph.ts +79 -0
  836. package/src/testing/fixtures/fixtureCapability.ts +45 -1
  837. package/src/testing/fixtures/graph/canonical.ts +94 -5
  838. package/src/testing/fixtures/graph/defaultPack.ts +7 -6
  839. package/src/testing/fixtures/graph/owlExport.ts +7 -5
  840. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  841. package/src/testing/helpers/fixtureGraph.ts +33 -16
  842. package/src/testing/helpers/packRuntime.ts +2 -3
  843. package/src/testing/helpers/projectCli.ts +2 -1
  844. package/src/testing/helpers/projectMcp.ts +38 -6
  845. package/src/testing/helpers/runCli.ts +35 -18
  846. package/src/testing/perf/budgets.test.ts +24 -9
  847. package/src/testing/perf/budgets.ts +76 -12
  848. package/src/testing/perf/codegen.test.ts +126 -0
  849. package/src/testing/perf/globalSetup.test.ts +286 -0
  850. package/src/testing/perf/globalSetup.ts +611 -14
  851. package/src/testing/perf/measure.test.ts +38 -0
  852. package/src/testing/perf/measure.ts +23 -4
  853. package/src/testing/setupXdgIsolation.ts +81 -21
  854. package/src/testing/tempRoot.globalSetup.ts +122 -0
  855. package/src/types.ts +2 -2
  856. package/dist/pragma +0 -0
  857. package/src/capabilities/block/blockList.test.ts +0 -79
  858. package/src/capabilities/block/blockList.verb.ts +0 -163
  859. package/src/capabilities/block/index.ts +0 -25
  860. package/src/capabilities/block/pack.ts +0 -166
  861. package/src/capabilities/block/parity.test.ts +0 -187
  862. package/src/capabilities/block/tierChain.ts +0 -78
  863. package/src/capabilities/colophon/pragmaColophon.ts +0 -66
  864. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
  865. package/src/capabilities/create/templates.embedded.generated.ts +0 -53
  866. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
  867. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  868. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
  869. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
  870. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  871. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  872. package/src/capabilities/modifier/index.ts +0 -15
  873. package/src/capabilities/modifier/pack.ts +0 -64
  874. package/src/capabilities/standard/index.ts +0 -18
  875. package/src/capabilities/standard/pack.ts +0 -128
  876. package/src/capabilities/tier/index.ts +0 -19
  877. package/src/capabilities/tier/lookup.render.test.ts +0 -72
  878. package/src/capabilities/tier/lookup.render.ts +0 -59
  879. package/src/capabilities/tier/lookup.test.ts +0 -83
  880. package/src/capabilities/tier/lookup.verb.ts +0 -44
  881. package/src/capabilities/tier/pack.ts +0 -28
  882. package/src/capabilities/tier/runLookup.ts +0 -87
  883. package/src/capabilities/token/addConfig.render.ts +0 -27
  884. package/src/capabilities/token/addConfig.test.ts +0 -62
  885. package/src/capabilities/token/addConfig.verb.ts +0 -40
  886. package/src/capabilities/token/index.ts +0 -19
  887. package/src/capabilities/token/pack.ts +0 -58
  888. package/src/capabilities/token/runAddConfig.ts +0 -95
  889. package/src/kernel/completion/bashDrive.test.ts +0 -73
  890. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
  891. package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
  892. package/src/kernel/runtime/lock.ts +0 -90
@@ -4,10 +4,16 @@
4
4
  * list/autocomplete are storeless over the enriched pack index; a read is
5
5
  * store-backed and shares `graph inspect`'s entity reader (the mirror). Resources
6
6
  * never enter the emitted tool surface. On a missing/legacy index the listing
7
- * degrades to a `pragma sources update` hint (never a live re-index).
7
+ * degrades to a `pragma sources update` hint (never a live re-index) — and that
8
+ * hint is itself readable.
9
+ *
10
+ * The listing is CURATED, not paged: the SDK's `McpServer` list handler ignores
11
+ * `cursor` and never returns `nextCursor`, so everything listed is sent on every
12
+ * connect. A module declares the SLICES of the index it contributes and the
13
+ * listing is their union — collections and schema, not 712 individuals.
8
14
  */
9
15
 
10
- import { mkdtempSync } from "node:fs";
16
+ import { mkdtempSync, writeFileSync } from "node:fs";
11
17
  import { tmpdir } from "node:os";
12
18
  import { join } from "node:path";
13
19
  import { ErrorCode } from "@modelcontextprotocol/sdk/types.js";
@@ -16,37 +22,136 @@ import { readPackIndex } from "../../kernel/completion/entitySource.js";
16
22
  import { verbKey } from "../../kernel/packs/uniqueness.js";
17
23
  import { bootRuntime } from "../../kernel/runtime/boot.js";
18
24
  import type { PackIndex } from "../../kernel/runtime/graphpack/types.js";
19
- import { writeLock } from "../../kernel/runtime/lock.js";
20
25
  import type { InspectResult } from "../../kernel/runtime/readEntity.js";
21
- import type { VerbSpec } from "../../kernel/spec/types.js";
26
+ import type { McpListable, VerbSpec } from "../../kernel/spec/types.js";
22
27
  import { TEST_FLAGS } from "../../testing/helpers/projectCli.js";
23
28
  import { projectMcp } from "../../testing/helpers/projectMcp.js";
24
29
  import { graphModule } from "../graph/index.js";
25
- import { buildResourceList, rankUriCompletions } from "./provider.js";
30
+ import { capabilities } from "../index.js";
31
+ import { ontologyModule } from "../ontology/index.js";
32
+ import {
33
+ buildResourceList,
34
+ collectListable,
35
+ completionWeights,
36
+ rankUriCompletions,
37
+ resourceProvider,
38
+ } from "./provider.js";
39
+
40
+ /**
41
+ * Two entities of the committed embedded pack, chosen for what they PROVE: an
42
+ * abox individual and the tbox class it instantiates, so the collection-vs-
43
+ * individual split has both sides. Named, not counted — the roster moves
44
+ * whenever the design system does.
45
+ */
46
+ const BUTTON_NAME = "ds:global.component.button";
47
+ const BUTTON_URI = `pragma:${BUTTON_NAME}`;
48
+ const COMPONENT_URI = "pragma:ds:Component";
49
+
50
+ /** The distribution's own declared listing — the union every module contributes. */
51
+ const declaredListing = (): McpListable => collectListable(capabilities);
52
+
53
+ /** Every entity in the index, whatever its type — the widest possible slice. */
54
+ const EVERYTHING: McpListable = { sources: [{ as: "entities" }] };
55
+
56
+ /**
57
+ * The listing budget, in bytes of the `resources/list` payload.
58
+ *
59
+ * `BUDGETS.md` documents an "MCP p95 (warm) < 100 ms" target that no test
60
+ * enforces — the perf pass spawns `dist/src/bin.js` and measures CLI latency
61
+ * only. Payload SIZE is the property that actually regressed (712 entries /
62
+ * ~155 KB on every connect), and it is the one an agent pays for twice: once in
63
+ * transfer, once in the context window it can no longer spend on the task.
64
+ */
65
+ const LISTING_BUDGET_BYTES = 60_000;
26
66
 
27
67
  describe("resource listing (storeless, over the pack index)", () => {
28
68
  it("degrades to a recovery entry on a missing or legacy index", () => {
29
- expect(buildResourceList(undefined)).toEqual([
69
+ expect(buildResourceList(undefined, declaredListing())).toEqual([
30
70
  expect.objectContaining({
31
71
  uri: "pragma:sources",
32
- name: "Store not indexed",
72
+ title: "Store not indexed",
33
73
  }),
34
74
  ]);
35
75
  const legacy = { version: 1, entities: [] } as unknown as PackIndex;
36
- expect(buildResourceList(legacy)[0]?.uri).toBe("pragma:sources");
76
+ expect(buildResourceList(legacy, declaredListing())[0]?.uri).toBe(
77
+ "pragma:sources",
78
+ );
37
79
  });
38
80
 
39
- it("lists the enriched (v2) embedded index, schema entries first", () => {
40
- const index = readPackIndex(process.cwd());
81
+ it("lists the declared COLLECTIONS with their counts, not the individuals", () => {
82
+ const index = readPackIndex({ kind: "embedded" });
41
83
  expect(index?.version).toBe(2);
42
- const resources = buildResourceList(index);
43
- expect(resources.some((r) => r.uri === "pragma:ex:Button")).toBe(true);
44
- // A class (tbox) sorts before an individual (abox).
45
- const componentIdx = resources.findIndex(
46
- (r) => r.uri === "pragma:ex:Component",
84
+ const resources = buildResourceList(index, declaredListing());
85
+
86
+ // The collection entry for `ds:Component` is listed, carrying the count of
87
+ // its individuals — one entry standing in for 110.
88
+ const component = resources.find((r) => r.uri === COMPONENT_URI);
89
+ expect(component?._meta?.["pragma/instanceCount"]).toBe(
90
+ index?.instanceCountByType["https://ds.canonical.com/Component"],
91
+ );
92
+ // The individuals themselves are NOT listed — they stay reachable through
93
+ // the `{+uri}` template and its autocomplete.
94
+ expect(resources.some((r) => r.uri === BUTTON_URI)).toBe(false);
95
+ // ...and the listing is a fraction of the index it summarizes.
96
+ expect(resources.length).toBeLessThan((index?.entities.length ?? 0) / 4);
97
+ });
98
+
99
+ it("keeps the whole listing inside the payload budget", () => {
100
+ const resources = buildResourceList(
101
+ readPackIndex({ kind: "embedded" }),
102
+ declaredListing(),
47
103
  );
48
- const buttonIdx = resources.findIndex((r) => r.uri === "pragma:ex:Button");
49
- expect(componentIdx).toBeLessThan(buttonIdx);
104
+ // UTF-8 BYTES, not `String.length`'s UTF-16 code units: the budget is about
105
+ // what crosses the wire, and a graph with non-ASCII labels would otherwise
106
+ // blow the ceiling while this assertion still passed.
107
+ const bytes = Buffer.byteLength(JSON.stringify({ resources }), "utf8");
108
+ expect(
109
+ bytes,
110
+ `resources/list payload is ${bytes} bytes — every connect spends it`,
111
+ ).toBeLessThan(LISTING_BUDGET_BYTES);
112
+ });
113
+
114
+ it("DERIVES a story's collection from the types its lookup declares", () => {
115
+ // The proof that this is derived, not agreed: the block story is compiled
116
+ // from `pragma.conf.ts` and its module authors NO listing — the four types
117
+ // its lookup constrains its name resolve to are the four collections it
118
+ // contributes. Read from the compiled module, so a hand-written listing
119
+ // that merely happens to match today cannot satisfy it.
120
+ const block = capabilities.find((module) => module.name === "block");
121
+ const declaredTypes = (block?.mcpListable?.sources ?? []).map(
122
+ (source) => source.type,
123
+ );
124
+ expect(declaredTypes).toEqual([
125
+ "ds:Component",
126
+ "ds:Pattern",
127
+ "ds:Layout",
128
+ "ds:Subcomponent",
129
+ ]);
130
+ // ...and each of those reaches the listing as a collection entry.
131
+ const resources = buildResourceList(
132
+ readPackIndex({ kind: "embedded" }),
133
+ collectListable([block ?? { name: "none", verbs: [] }]),
134
+ );
135
+ expect(resources.map((r) => r.name).sort()).toEqual([
136
+ "ds:Component",
137
+ "ds:Layout",
138
+ "ds:Pattern",
139
+ "ds:Subcomponent",
140
+ ]);
141
+ });
142
+
143
+ it("contributes NOTHING for a declared type the index does not know", () => {
144
+ // `ds:Token` is declared by the token read story but SPARQL-served, never
145
+ // indexed. An empty collection would advertise a browse with nothing to
146
+ // show, so the slice yields no entry at all.
147
+ const index = readPackIndex({ kind: "embedded" });
148
+ expect(
149
+ index?.entities.some((e) => (e.prefixed ?? e.name) === "ds:Token"),
150
+ ).toBe(false);
151
+ const listed = buildResourceList(index, {
152
+ sources: [{ type: "ds:Token", as: "collection" }],
153
+ });
154
+ expect(listed).toEqual([]);
50
155
  });
51
156
 
52
157
  it("emits ONE resource per URI for an OWL-punned subject (A8)", () => {
@@ -83,7 +188,7 @@ describe("resource listing (storeless, over the pack index)", () => {
83
188
  ],
84
189
  instanceCountByType: {},
85
190
  };
86
- const slider = buildResourceList(punned).filter(
191
+ const slider = buildResourceList(punned, EVERYTHING).filter(
87
192
  (r) => r.uri === "pragma:ex:Slider",
88
193
  );
89
194
  expect(slider).toHaveLength(1);
@@ -91,80 +196,226 @@ describe("resource listing (storeless, over the pack index)", () => {
91
196
  expect(slider.at(0)?._meta?.["pragma/box"]).toBe("tbox");
92
197
  });
93
198
 
94
- it("enriches each entry with the _meta taxonomy (pragma/box + priority)", () => {
95
- const resources = buildResourceList(readPackIndex(process.cwd()));
96
- const component = resources.find((r) => r.uri === "pragma:ex:Component");
97
- const button = resources.find((r) => r.uri === "pragma:ex:Button");
98
- // A schema class: tbox, higher priority, carries its instance count.
199
+ it("enriches each entry with the _meta taxonomy (box + type + count)", () => {
200
+ const resources = buildResourceList(
201
+ readPackIndex({ kind: "embedded" }),
202
+ declaredListing(),
203
+ );
204
+ const component = resources.find((r) => r.uri === COMPONENT_URI);
99
205
  expect(component?._meta?.["pragma/box"]).toBe("tbox");
100
- expect(component?.annotations?.audience).toEqual(["assistant"]);
101
- expect(component?.annotations?.priority).toBe(0.9);
102
- expect(component?._meta?.["pragma/instanceCount"]).toBe(3);
103
- // An individual: abox, lower priority, no instance count.
104
- expect(button?._meta?.["pragma/box"]).toBe("abox");
105
- expect(button?.annotations?.priority).toBe(0.3);
106
- expect(button?._meta?.["pragma/instanceCount"]).toBeUndefined();
206
+ // `pragma/type` is the ADDITION: an agent can narrow the listing to a
207
+ // family without spending a read to discover what each entry is.
208
+ expect(component?._meta?.["pragma/type"]).toBe("owl:Class");
209
+ expect(resources.every((r) => r._meta?.["pragma/type"])).toBe(true);
210
+ // Both audiences: `["assistant"]` hides every resource from the human
211
+ // picker in a client that honours the field, and browsing a design system
212
+ // in a picker is exactly a human use case.
213
+ expect(component?.annotations?.audience).toEqual(["user", "assistant"]);
107
214
  });
108
215
 
216
+ it("names an entry by its URI and TITLES it from the index's human name", () => {
217
+ // 383 of the 714 indexed entities carry an `altNames[0]` ("Button",
218
+ // "FileTree") and no `rdfs:label`; before this the listing showed them as a
219
+ // bare URI while the readable name sat unused one field away. `name` stays
220
+ // the stable identifier, `title` is what a human reads.
221
+ const index: PackIndex = {
222
+ version: 2,
223
+ contentHash: "test",
224
+ prefixes: {},
225
+ entities: [
226
+ {
227
+ name: "ex:file_tree",
228
+ type: "ex:Widget",
229
+ uri: "https://ex.test/#file_tree",
230
+ prefixed: "ex:file_tree",
231
+ label: null,
232
+ altNames: ["FileTree"],
233
+ box: "abox",
234
+ },
235
+ ],
236
+ instanceCountByType: {},
237
+ };
238
+ const [entry] = buildResourceList(index, EVERYTHING);
239
+ expect(entry?.name).toBe("ex:file_tree");
240
+ expect(entry?.title).toBe("FileTree");
241
+ });
242
+
243
+ it("mints every URI in the scheme the declared template routes", () => {
244
+ // Two writings of one decision: the template `register` installs (and the
245
+ // covenant publishes as `mcpSurface.resources`) and the scheme every listed
246
+ // URI carries. Nothing compared them, and a half-derivation left a fork
247
+ // advertising `recipes:{+uri}` over a list of `pragma:` URIs — every
248
+ // resource offered was unreadable and the readable form was unadvertised.
249
+ // DERIVED from the declared surface, so this cannot be satisfied by two
250
+ // literals that agree today.
251
+ const declared = resourceProvider.surface?.templates?.[0];
252
+ const scheme = `${declared?.split(":")[0]}:`;
253
+ const listed = [
254
+ ...buildResourceList(readPackIndex({ kind: "embedded" }), EVERYTHING),
255
+ ...buildResourceList(undefined, EVERYTHING),
256
+ ];
257
+ expect(listed.length).toBeGreaterThan(1);
258
+ expect(listed.filter((r) => !r.uri.startsWith(scheme))).toEqual([]);
259
+ });
260
+ });
261
+
262
+ describe("URI completion ranking", () => {
109
263
  it("ranks autocomplete over prefixed URI and label", () => {
110
- const index = readPackIndex(process.cwd());
111
- const hits = rankUriCompletions(index?.entities ?? [], "but", 10);
112
- expect(hits).toContain("ex:Button");
264
+ const index = readPackIndex({ kind: "embedded" });
265
+ const hits = rankUriCompletions(
266
+ index?.entities ?? [],
267
+ "global.component.button",
268
+ );
269
+ expect(hits).toContain(BUTTON_NAME);
270
+ });
271
+
272
+ it("sinks a lightly weighted type below every heavier one at equal match", () => {
273
+ // The declared `weights: { "ds:Subcomponent": 0.6 }` on the block story does
274
+ // TWO jobs, and this is the second: with ties broken alphabetically alone,
275
+ // `ds:apps_launchpad.subcomponent.modal-content-header-close_button` and its
276
+ // kin outranked `ds:global.component.button` for the query "button" on the
277
+ // strength of their spelling. Read from the compiled story, not restated.
278
+ const index = readPackIndex({ kind: "embedded" });
279
+ const entities = index?.entities ?? [];
280
+ const weights = completionWeights(declaredListing());
281
+ expect(weights["ds:Subcomponent"]).toBe(0.6);
282
+ expect(weights["ds:Component"]).toBe(1);
283
+
284
+ const typeOf = (prefixed: string) =>
285
+ entities.find((e) => (e.prefixed ?? e.name) === prefixed)?.type;
286
+ const weighted = rankUriCompletions(entities, "button", weights);
287
+ const lastComponent = weighted.findLastIndex(
288
+ (uri) => typeOf(uri) === "ds:Component",
289
+ );
290
+ const firstSubcomponent = weighted.findIndex(
291
+ (uri) => typeOf(uri) === "ds:Subcomponent",
292
+ );
293
+ expect(firstSubcomponent).toBeGreaterThan(lastComponent);
294
+
295
+ // ...and the weight is what moved it: unweighted, the answer ranks lower.
296
+ const unweighted = rankUriCompletions(entities, "button");
297
+ expect(weighted.indexOf(BUTTON_NAME)).toBeLessThan(
298
+ unweighted.indexOf(BUTTON_NAME),
299
+ );
300
+ });
301
+
302
+ it("returns EVERY match so the SDK's total/hasMore can be honest", () => {
303
+ // The SDK derives the wire's `total`/`hasMore` from this array
304
+ // (`values.slice(0, 100)`, `total: length`, `hasMore: length > 100`), so a
305
+ // cap here made a truncated answer describe itself as complete.
306
+ const index = readPackIndex({ kind: "embedded" });
307
+ const entities = index?.entities ?? [];
308
+ const hits = rankUriCompletions(entities, "ds:");
309
+ // Distinct prefixed URIs: a punned subject is two index entities sharing
310
+ // one URI, and the ranker dedups them.
311
+ const matching = new Set(
312
+ entities
313
+ .map((e) => e.prefixed ?? e.name)
314
+ .filter((uri) => uri.startsWith("ds:")),
315
+ );
316
+ expect(hits.length).toBe(matching.size);
317
+ expect(hits.length).toBeGreaterThan(100);
113
318
  });
114
319
  });
115
320
 
116
321
  describe("resource surface over the server (embedded pack)", () => {
117
322
  let harness: Awaited<ReturnType<typeof projectMcp>>;
118
323
  beforeAll(async () => {
119
- harness = await projectMcp([graphModule]);
324
+ harness = await projectMcp(capabilities);
120
325
  });
121
326
  afterAll(async () => {
122
327
  await harness.cleanup();
123
328
  });
124
329
 
125
- it("registers the {+uri} template and lists resources (not tools)", async () => {
330
+ it("registers the {+uri} template and lists collections (not tools)", async () => {
126
331
  const resources = await harness.listResources();
127
- expect(resources.some((r) => r.uri === "pragma:ex:Button")).toBe(true);
128
- // Resources are NOT tools — the graph module's tools (inspect + the PR6
129
- // SPARQL escape hatch) are what appear in the tool surface.
332
+ const component = resources.find((r) => r.uri === COMPONENT_URI);
333
+ expect(component?._meta?.["pragma/instanceCount"]).toBeGreaterThan(0);
334
+ expect(component?.title).toBe("Component");
335
+ // The individuals are not enumerated — autocomplete is their discovery path.
336
+ expect(resources.some((r) => r.uri === BUTTON_URI)).toBe(false);
337
+ // Resources are NOT tools — the graph module's tools appear in the tool
338
+ // surface, and the resource entries never do.
130
339
  const tools = await harness.listTools();
131
- expect(tools.map((t) => t.name).sort()).toEqual([
132
- "graph_inspect",
133
- "graph_query",
134
- ]);
340
+ expect(tools.map((t) => t.name)).toContain("graph_inspect");
341
+ expect(tools.map((t) => t.name)).not.toContain(COMPONENT_URI);
342
+ });
343
+
344
+ it("keeps what crosses the wire inside the payload budget", async () => {
345
+ const resources = await harness.listResources();
346
+ const bytes = Buffer.byteLength(JSON.stringify({ resources }), "utf8");
347
+ expect(bytes).toBeLessThan(LISTING_BUDGET_BYTES);
135
348
  });
136
349
 
137
350
  it("autocompletes a partial URI through the template", async () => {
138
- const values = await harness.completeResource("But");
139
- expect(values).toContain("ex:Button");
351
+ const { values } = await harness.completeResource("global.component.butt");
352
+ expect(values).toContain(BUTTON_NAME);
140
353
  });
141
354
 
142
- it("reads an entity, mirroring `graph inspect` content", async () => {
143
- const read = await harness.readResource("pragma:ex:Button");
144
- expect(read.mimeType).toBe("application/json");
145
- const fromResource = JSON.parse(read.text) as InspectResult;
355
+ it("reports total/hasMore truthfully for a query with >100 matches", async () => {
356
+ const result = await harness.completeResource("ds:");
357
+ // The SDK caps the wire at 100 values; `total` must be the real match count
358
+ // and `hasMore` must admit the truncation.
359
+ expect(result.values.length).toBe(100);
360
+ expect(result.total ?? 0).toBeGreaterThan(100);
361
+ expect(result.hasMore).toBe(true);
362
+ });
363
+
364
+ it("serves Turtle, mirroring `graph inspect --format llm` byte for byte", async () => {
365
+ // The mirror survives the encoding change: both surfaces serialize the SAME
366
+ // reader through the SAME serializer, so this still fails the moment one of
367
+ // them grows a projection the other does not have.
368
+ const read = await harness.readResource(BUTTON_URI);
369
+ expect(read.mimeType).toBe("text/turtle");
146
370
 
147
- // The CLI twin over the same (embedded) pack must return identical content.
148
371
  const rt = bootRuntime(TEST_FLAGS);
149
372
  const inspect = graphModule.verbs.find(
150
373
  (v) => verbKey(v.path) === "graph inspect",
151
374
  ) as VerbSpec;
152
375
  const fromCli = (await inspect.run(
153
- { uri: "ex:Button" },
376
+ { uri: BUTTON_NAME },
154
377
  rt,
155
378
  )) as InspectResult;
156
379
  (await rt.store.get()).store.dispose();
157
380
 
158
- expect(fromResource).toEqual(fromCli);
159
- expect(fromResource.uri).toBe("https://pragma.canonical.com/sample#Button");
381
+ const llm = inspect.output?.formatters?.llm;
382
+ expect(llm).toBeDefined();
383
+ expect(read.text).toBe(llm?.(fromCli, TEST_FLAGS));
384
+ });
385
+
386
+ it("emits Turtle an RDF parser accepts", async () => {
387
+ // The point of serving `text/turtle` is that it IS Turtle. Asserted by
388
+ // PARSING it with the same engine the store uses, not by matching shapes —
389
+ // a document that only looks right is how a reader gets a syntax error
390
+ // instead of an entity.
391
+ const read = await harness.readResource(BUTTON_URI);
392
+ const dir = mkdtempSync(join(tmpdir(), "pragma-resource-ttl-"));
393
+ const file = join(dir, "entity.ttl");
394
+ writeFileSync(file, read.text);
395
+
396
+ const ke = await import("@canonical/ke");
397
+ const store = await ke.createStore({ sources: [file] });
398
+ const result = await store.query(
399
+ "SELECT (COUNT(*) AS ?n) WHERE { ?s ?p ?o }",
400
+ );
401
+ store.dispose();
402
+ expect(Number(result.bindings[0]?.n ?? 0)).toBeGreaterThan(0);
403
+ });
404
+
405
+ it("previews a long literal rather than spending the whole body", async () => {
406
+ // Measured: one button carried 8,572 of its 9,734 literal characters in two
407
+ // prose fields. Serving those in full at the DEFAULT level makes every read
408
+ // pay for documentation the reader may not have asked for.
409
+ const read = await harness.readResource(BUTTON_URI);
410
+ expect(read.text).toMatch(/# ds:guidelines — [\d,]+ chars, showing \d+/);
160
411
  });
161
412
 
162
413
  it("rejects a read of an absent entity as InvalidParams carrying ENTITY_NOT_FOUND", async () => {
163
- // The warm embedded pack resolves the `ex:` prefix but holds no `Nonexistent`
414
+ // The warm embedded pack resolves the `ds:` prefix but holds no `Nonexistent`
164
415
  // subject, so the read fails ENTITY_NOT_FOUND — the caller's fault, which
165
416
  // `mcpErrorFrom` maps to JSON-RPC InvalidParams, NOT the InternalError a cold
166
417
  // store (STORE_UNAVAILABLE) earns.
167
- const error = await harness.readResource("pragma:ex:Nonexistent").then(
418
+ const error = await harness.readResource("pragma:ds:Nonexistent").then(
168
419
  () => undefined,
169
420
  (caught: unknown) => caught,
170
421
  );
@@ -181,22 +432,27 @@ describe("resource surface over the server (embedded pack)", () => {
181
432
  * D3 — a resource-read failure surfaces as a JSON-RPC error (the read analogue of
182
433
  * a tool result's `isError`) carrying the recovery, NOT swallowed into a
183
434
  * `text/plain` "success" body that drops the recovery and reads as though the
184
- * entity itself were malformed. A lock pointing at an evicted pack is the cold
185
- * store; the read boots the store, so it must refuse with STORE_UNAVAILABLE.
435
+ * entity itself were malformed. A project that declares its own packs and has
436
+ * never built them is the cold store — it must NOT be served the distribution's
437
+ * embedded graph; the read boots the store, so it refuses with
438
+ * STORE_UNAVAILABLE.
186
439
  */
187
440
  describe("resource read — cold-store failure surfaces isError + recovery (D3)", () => {
188
441
  let harness: Awaited<ReturnType<typeof projectMcp>>;
189
442
  beforeAll(async () => {
190
443
  const cwd = mkdtempSync(join(tmpdir(), "pragma-resource-cold-"));
191
- writeLock(cwd, { version: 1, contentHash: "b".repeat(64), packs: [] });
192
- harness = await projectMcp([graphModule], cwd);
444
+ writeFileSync(
445
+ join(cwd, "pragma.config.ts"),
446
+ `export default { packs: [{ name: "unbuilt", source: "file:///pragma-never-built" }] };\n`,
447
+ );
448
+ harness = await projectMcp([graphModule, ontologyModule], cwd);
193
449
  });
194
450
  afterAll(async () => {
195
451
  await harness.cleanup();
196
452
  });
197
453
 
198
454
  it("rejects (does not return text/plain content) with the STORE_UNAVAILABLE recovery", async () => {
199
- const error = await harness.readResource("pragma:ex:Button").then(
455
+ const error = await harness.readResource(BUTTON_URI).then(
200
456
  () => undefined,
201
457
  (caught: unknown) => caught,
202
458
  );
@@ -210,4 +466,100 @@ describe("resource read — cold-store failure surfaces isError + recovery (D3)"
210
466
  expect(data?.code).toBe("STORE_UNAVAILABLE");
211
467
  expect(data?.recovery?.mcp?.tool).toBe("sources_update");
212
468
  });
469
+
470
+ it("SERVES the one resource it advertises — `pragma:sources` reads", async () => {
471
+ // On a cold store the recovery hint is the entire listing. It used to fail
472
+ // `INVALID_INPUT — Invalid uri "sources"`: the only resource offered
473
+ // refused to be read, so the explanation of the cold store was unreachable
474
+ // from the surface that showed it.
475
+ const listed = await harness.listResources();
476
+ expect(listed.map((r) => r.uri)).toEqual(["pragma:sources"]);
477
+ const read = await harness.readResource("pragma:sources");
478
+ expect(read.text).toMatch(/sources update/);
479
+ });
480
+ });
481
+
482
+ describe("a percent-encoded resource URI reads (PROTECTED)", () => {
483
+ let harness: Awaited<ReturnType<typeof projectMcp>>;
484
+ beforeAll(async () => {
485
+ harness = await projectMcp([graphModule]);
486
+ });
487
+ afterAll(async () => {
488
+ await harness.cleanup();
489
+ });
490
+
491
+ it("resolves the encoded form to the same entity as the plain one", async () => {
492
+ // A client that percent-encodes the URI it puts in a `pragma:{+uri}` read is
493
+ // not doing anything wrong, and the surface was rejecting its own advertised
494
+ // identifiers. Asserted THROUGH the server, since that is where a client
495
+ // meets it — the unit test on `resolveUri` cannot see the template.
496
+ const plain = await harness.readResource("pragma:ds:Component");
497
+ const encoded = await harness.readResource("pragma:ds%3AComponent");
498
+ expect(encoded.text).toBe(plain.text);
499
+ });
500
+
501
+ it("still refuses a malformed escape as InvalidParams", async () => {
502
+ const error = await harness.readResource("pragma:%E0%A4%A").then(
503
+ () => undefined,
504
+ (caught: unknown) => caught,
505
+ );
506
+ expect(error, "a malformed escape must not read as success").toBeDefined();
507
+ expect((error as { data?: { code?: string } }).data?.code).toBe(
508
+ "INVALID_INPUT",
509
+ );
510
+ });
511
+ });
512
+
513
+ describe("listing + ranking edge cases the review surfaced", () => {
514
+ it("states zero for a declared collection whose class has no instances", () => {
515
+ // Without a default, an empty collection carries NO `pragma/instanceCount`
516
+ // and is indistinguishable from an entry that is not a collection at all.
517
+ const index: PackIndex = {
518
+ version: 2,
519
+ contentHash: "test",
520
+ prefixes: {},
521
+ entities: [
522
+ {
523
+ name: "ex:Empty",
524
+ type: "owl:Class",
525
+ uri: "https://ex.test/#Empty",
526
+ prefixed: "ex:Empty",
527
+ types: ["owl:Class"],
528
+ label: "Empty",
529
+ box: "tbox",
530
+ description: null,
531
+ },
532
+ ],
533
+ instanceCountByType: {},
534
+ };
535
+ const listed = buildResourceList(index, {
536
+ sources: [{ type: "ex:Empty", as: "collection" }],
537
+ });
538
+ expect(listed).toHaveLength(1);
539
+ expect(listed[0]?._meta?.["pragma/instanceCount"]).toBe(0);
540
+ });
541
+
542
+ it("weighs an entity by every type it is declared under, not the primary one", () => {
543
+ // `type` is one lexically chosen primary among `types`. Weighing only that
544
+ // ignored a weight declared for a secondary type, and let ranking move when
545
+ // an unrelated, lexically earlier type was added.
546
+ const entity = {
547
+ name: "ex:thing",
548
+ type: "ex:Alpha",
549
+ prefixed: "ex:thing",
550
+ types: ["ex:Alpha", "ex:Demoted"],
551
+ } as PackIndex["entities"][number];
552
+ const rival = {
553
+ name: "ex:thing_other",
554
+ type: "ex:Alpha",
555
+ prefixed: "ex:thing_other",
556
+ types: ["ex:Alpha"],
557
+ } as PackIndex["entities"][number];
558
+
559
+ // Equal match quality; only the SECONDARY type's weight separates them.
560
+ const ranked = rankUriCompletions([entity, rival], "thing", {
561
+ "ex:Demoted": 0.2,
562
+ });
563
+ expect(ranked).toEqual(["ex:thing_other", "ex:thing"]);
564
+ });
213
565
  });