@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,27 +2,37 @@
2
2
  * Look up one or more pack entities by name, prefixed name, absolute IRI, or
3
3
  * glob, via the fetch strategy the pack declares.
4
4
  *
5
- * The name→URI resolve is ALWAYS generated SPARQL (an escaped literal or a
6
- * validated `<iri>` BIND) regardless of `source`; from the resolved IRI, values
7
- * are fetched either through more generated SELECTs (`sparql`) or one generated
5
+ * The resolve is ALWAYS generated SPARQL (an escaped literal or a validated
6
+ * `<iri>` BIND) regardless of `source`; from the resolved IRI, values are
7
+ * fetched either through more generated SELECTs (`sparql`) or one generated
8
8
  * GraphQL document (`graphql`). One poisoned query never discards the batch —
9
9
  * per-query failures are collected as structured error entries.
10
10
  *
11
+ * WHICH query is chosen is decided by the ARGUMENT'S SHAPE first and the pack's
12
+ * `source` second, and both dispatches live here. Getting that order wrong is
13
+ * not a style question: it is what made an IRI reach a name FILTER on every
14
+ * graphql-sourced pack, and what left an IRI-shaped glob expanding against a
15
+ * population of names. The shape a user typed is a fact about the argument; the
16
+ * fetch strategy is a fact about the pack, and it cannot change what the
17
+ * argument means.
18
+ *
11
19
  * Reached only behind a dynamic import from the lookup run body, so its imports
12
20
  * (including the GraphQL path) stay off the storeless fast path.
13
21
  */
14
22
 
15
- import { PragmaError } from "../error/PragmaError.js";
16
- import { cliRecovery } from "../error/recovery.js";
23
+ import { cliRecovery, PragmaError } from "../error/index.js";
17
24
  import { suggestNames } from "../project/cli/suggestNames.js";
18
- import type { PragmaRuntime } from "../runtime/types.js";
25
+ import { compactUri } from "../render/index.js";
26
+ import type { PragmaRuntime } from "../runtime/index.js";
19
27
  import { activeExpands } from "./disclosure.js";
20
28
  import { expandGlob, isGlobPattern } from "./glob.js";
21
29
  import { fetchGraphqlLookup } from "./graphql/fetchGraphqlLookup.js";
22
30
  import { isEmbeddableIri, resolveUri } from "./iri.js";
23
31
  import {
24
32
  buildExpandQuery,
33
+ buildIriResolveQuery,
25
34
  buildLookupByIriQuery,
35
+ buildLookupIrisQuery,
26
36
  buildLookupNamesQuery,
27
37
  buildLookupQuery,
28
38
  buildNameResolveQuery,
@@ -32,6 +42,7 @@ import type {
32
42
  PackChildRow,
33
43
  PackEntity,
34
44
  PackLookup,
45
+ PackRow,
35
46
  StorySource,
36
47
  } from "./types.js";
37
48
 
@@ -43,7 +54,15 @@ export interface LookupError {
43
54
  readonly suggestions?: readonly string[];
44
55
  }
45
56
 
46
- /** The result of a (possibly multi-name) lookup. */
57
+ /**
58
+ * The result of a (possibly multi-name) lookup.
59
+ *
60
+ * `results` may be LONGER than the arguments that produced it: a name several
61
+ * entities share answers with all of them, ranked. There is no companion field
62
+ * naming the ones not answered with, because there are none — an earlier draft
63
+ * kept the single-entity arity and carried the rest as IRIs in a notice, which
64
+ * is a sentence about an address where the payload is the address.
65
+ */
47
66
  export interface LookupOutput {
48
67
  readonly results: PackEntity[];
49
68
  readonly errors: LookupError[];
@@ -70,11 +89,21 @@ export async function resolveLookup(
70
89
  throw PragmaError.invalidInput("names", "(empty)", {
71
90
  recovery: cliRecovery(`${noun} list`, `List available ${noun} entries.`, {
72
91
  tool: `${noun}_list`,
92
+ // A concrete, valid argument bag rather than a bare tool name: an
93
+ // agent can call the recovery as written instead of guessing one.
94
+ params: {},
73
95
  }),
74
96
  });
75
97
  }
76
98
 
77
- const expanded = await expandQueries(rt, lookup, noun, source, queries);
99
+ const expanded = await expandQueries(
100
+ rt,
101
+ lookup,
102
+ noun,
103
+ source,
104
+ queries,
105
+ prefixes,
106
+ );
78
107
  const results: PackEntity[] = [];
79
108
  const errors: LookupError[] = [...expanded.globErrors];
80
109
  const settled = await Promise.allSettled(
@@ -86,7 +115,7 @@ export async function resolveLookup(
86
115
  const query = expanded.names[index];
87
116
  if (query === undefined) continue;
88
117
  if (outcome.status === "fulfilled") {
89
- results.push(outcome.value);
118
+ results.push(...outcome.value);
90
119
  continue;
91
120
  }
92
121
  const error = outcome.reason;
@@ -110,17 +139,34 @@ export async function resolveLookup(
110
139
  return { results, errors };
111
140
  }
112
141
 
113
- /** Expand glob queries against the entity name list; literals pass through. */
142
+ /**
143
+ * Expand glob queries against the population their own shape addresses;
144
+ * literals pass through.
145
+ *
146
+ * A name glob expands over the `by` values, an IRI glob over the entity IRIs —
147
+ * the same split {@link buildResolveQuery} makes, because a glob is just a
148
+ * lookup argument with a `*` in it. Expanding an IRI pattern over names was why
149
+ * `ds:global.component.but*` matched nothing on any pack while shell completion
150
+ * offered nothing BUT those IRIs. Each population is fetched at most once, and
151
+ * only when a glob of that shape is actually present.
152
+ */
114
153
  async function expandQueries(
115
154
  rt: LookupRuntime,
116
155
  lookup: PackLookup,
117
156
  noun: string,
118
157
  source: StorySource,
119
158
  queries: readonly string[],
159
+ prefixes: Readonly<Record<string, string>>,
120
160
  ): Promise<{ names: string[]; globErrors: LookupError[] }> {
121
161
  if (!queries.some(isGlobPattern))
122
162
  return { names: [...queries], globErrors: [] };
123
- const allNames = await listEntityNames(rt, lookup, source);
163
+ const globs = queries.filter(isGlobPattern);
164
+ const byIri = globs.some(looksLikeIri)
165
+ ? await listEntityIriSpellings(rt, lookup, source, prefixes)
166
+ : new Map<string, string>();
167
+ const byName = globs.some((glob) => !looksLikeIri(glob))
168
+ ? await listEntityNames(rt, lookup, source)
169
+ : [];
124
170
  const names: string[] = [];
125
171
  const globErrors: LookupError[] = [];
126
172
  for (const query of queries) {
@@ -128,7 +174,17 @@ async function expandQueries(
128
174
  names.push(query);
129
175
  continue;
130
176
  }
131
- const matches = expandGlob(query, allNames);
177
+ // An IRI glob expands over every spelling, then collapses to the entity:
178
+ // matching `ds:button` and its absolute twin must not list it twice.
179
+ const matches = looksLikeIri(query)
180
+ ? [
181
+ ...new Set(
182
+ expandGlob(query, [...byIri.keys()]).map(
183
+ (spelling) => byIri.get(spelling) ?? spelling,
184
+ ),
185
+ ),
186
+ ]
187
+ : expandGlob(query, byName);
132
188
  if (matches.length === 0) {
133
189
  globErrors.push({
134
190
  query,
@@ -142,7 +198,35 @@ async function expandQueries(
142
198
  return { names, globErrors };
143
199
  }
144
200
 
145
- /** Look up one entity, dispatching to the pack's declared fetch source. */
201
+ /**
202
+ * Look up every entity a lookup argument reaches, dispatching to the pack's
203
+ * declared fetch source.
204
+ *
205
+ * One argument, EVERY entity it reaches — ranked, best first.
206
+ *
207
+ * `lookup` is deliberately one tool for the singular and the plural case. An
208
+ * agent that had to decide up front whether a name is unique would pay two
209
+ * round trips to find out, and the answer is not knowable from the name: 25
210
+ * live block names reach two or three blocks apiece, and the caller cannot
211
+ * tell which until it asks. Returning them all costs the caller nothing when a
212
+ * name is unique — the array is one long — and saves a whole exchange when it
213
+ * is not.
214
+ *
215
+ * That is why the `LIMIT 1` had to go rather than be compensated for. With it,
216
+ * `block lookup button` answered with Launchpad's Button and gave no sign the
217
+ * global one existed, because `apps_launchpad…` sorts before `global…`. An
218
+ * earlier draft of this change kept the arity and named the losers in a notice;
219
+ * a notice is a sentence about an address, and the payload is the address.
220
+ *
221
+ * Ranking still matters, and matters more: it is now what ORDERS the answer
222
+ * rather than what silently picks it. The best row leads, so a caller reading
223
+ * only the first gets the entity the ranking believes was meant.
224
+ *
225
+ * The rows are collapsed to one per `?uri` first. The sparql form projects its
226
+ * fields in the same SELECT, so a multi-valued field yields one row per value;
227
+ * that has always been true and `LIMIT 1` merely hid it. Without the collapse
228
+ * one entity would report itself as several.
229
+ */
146
230
  async function lookupOne(
147
231
  rt: LookupRuntime,
148
232
  lookup: PackLookup,
@@ -151,59 +235,94 @@ async function lookupOne(
151
235
  source: StorySource,
152
236
  prefixes: Readonly<Record<string, string>>,
153
237
  level: string | undefined,
154
- ): Promise<PackEntity> {
238
+ ): Promise<PackEntity[]> {
155
239
  const graphqlSourced = lookup.source === "graphql";
156
240
  const rows = await runSelect(
157
241
  rt,
158
- graphqlSourced
159
- ? buildNameResolveQuery(lookup, query)
160
- : buildEntityQuery(lookup, query, prefixes, level),
242
+ buildResolveQuery(lookup, query, prefixes, level),
161
243
  source,
162
244
  );
163
- const base = rows.at(0);
164
- if (!base?.uri) {
245
+ const bases = firstRowPerEntity(rows);
246
+ if (bases.length === 0) {
165
247
  const candidates = await listEntityNames(rt, lookup, source);
166
248
  throw PragmaError.notFound(noun, query, {
167
249
  suggestions: suggestNames(query, candidates),
168
250
  recovery: cliRecovery(`${noun} list`, `List available ${noun} entries.`, {
169
251
  tool: `${noun}_list`,
252
+ // A concrete, valid argument bag rather than a bare tool name: an
253
+ // agent can call the recovery as written instead of guessing one.
254
+ params: {},
170
255
  }),
171
256
  });
172
257
  }
173
258
 
174
259
  if (graphqlSourced) {
175
- return fetchGraphqlLookup(
176
- rt,
177
- lookup,
178
- base.uri,
179
- base.name ?? query,
180
- // The GraphQL lane's only use of the source is CONFIG_ERROR attribution,
181
- // which is right for any origin — so it takes the label, not provenance.
182
- source.label,
183
- prefixes,
184
- level,
260
+ return Promise.all(
261
+ bases.map((base) =>
262
+ fetchGraphqlLookup(
263
+ rt,
264
+ lookup,
265
+ String(base.uri),
266
+ base.name ?? query,
267
+ // The GraphQL lane's only use of the source is CONFIG_ERROR
268
+ // attribution, which is right for any origin — so it takes the label,
269
+ // not provenance.
270
+ source.label,
271
+ prefixes,
272
+ level,
273
+ ),
274
+ ),
185
275
  );
186
276
  }
187
277
 
188
- const entity: PackEntity = { ...base };
189
- for (const expand of activeExpands(lookup, level)) {
190
- entity[expand.name] = (await runSelect(
191
- rt,
192
- buildExpandQuery(expand, base.uri),
193
- source,
194
- )) as readonly PackChildRow[];
278
+ const entities: PackEntity[] = [];
279
+ for (const base of bases) {
280
+ const entity: PackEntity = { ...base };
281
+ for (const expand of activeExpands(lookup, level)) {
282
+ entity[expand.name] = (await runSelect(
283
+ rt,
284
+ buildExpandQuery(expand, String(base.uri)),
285
+ source,
286
+ )) as readonly PackChildRow[];
287
+ }
288
+ entities.push(entity);
289
+ }
290
+ return entities;
291
+ }
292
+
293
+ /** Collapse a ranked resolve to one row per entity, keeping the best-ranked. */
294
+ function firstRowPerEntity(rows: readonly PackRow[]): PackRow[] {
295
+ const seen = new Set<string>();
296
+ const bases: PackRow[] = [];
297
+ for (const row of rows) {
298
+ if (!row.uri || seen.has(row.uri)) continue;
299
+ seen.add(row.uri);
300
+ bases.push(row);
195
301
  }
196
- return entity;
302
+ return bases;
197
303
  }
198
304
 
199
- /** Build the base entity SELECT for the SPARQL path (name or IRI form). */
200
- function buildEntityQuery(
305
+ /**
306
+ * Build the resolve SELECT for one lookup argument: shape first, source second.
307
+ *
308
+ * The four cells of that 2×2 are the whole dispatch. A graphql-sourced pack
309
+ * resolves to an IRI and fetches everything else through its document, so both
310
+ * of its queries are the minimal `?uri ?name` pair; a sparql-sourced pack reads
311
+ * its fields in the same SELECT, so both of its queries carry the level-gated
312
+ * projection.
313
+ */
314
+ function buildResolveQuery(
201
315
  lookup: PackLookup,
202
316
  query: string,
203
317
  prefixes: Readonly<Record<string, string>>,
204
318
  level: string | undefined,
205
319
  ): string {
206
- if (!looksLikeIri(query)) return buildLookupQuery(lookup, query, level);
320
+ const graphqlSourced = lookup.source === "graphql";
321
+ if (!looksLikeIri(query)) {
322
+ return graphqlSourced
323
+ ? buildNameResolveQuery(lookup, query)
324
+ : buildLookupQuery(lookup, query, level);
325
+ }
207
326
  const resolved = resolveUri(query, prefixes);
208
327
  if (!isEmbeddableIri(resolved)) {
209
328
  throw PragmaError.invalidInput("name", query, {
@@ -213,7 +332,9 @@ function buildEntityQuery(
213
332
  },
214
333
  });
215
334
  }
216
- return buildLookupByIriQuery(lookup, resolved, level);
335
+ return graphqlSourced
336
+ ? buildIriResolveQuery(lookup, resolved)
337
+ : buildLookupByIriQuery(lookup, resolved, level);
217
338
  }
218
339
 
219
340
  /** Whether a lookup query addresses an entity by IRI or prefixed name. */
@@ -221,10 +342,47 @@ function looksLikeIri(query: string): boolean {
221
342
  return (
222
343
  query.startsWith("http://") ||
223
344
  query.startsWith("https://") ||
224
- query.includes(":")
345
+ // Neither an IRI nor a SPARQL prefixed name may contain whitespace, so a
346
+ // colon in a spaced string is part of a plain entity name — e.g. the
347
+ // concept "Foundations: Grid" — not a prefix separator.
348
+ (query.includes(":") && !/\s/.test(query))
225
349
  );
226
350
  }
227
351
 
352
+ /**
353
+ * Every SPELLING an IRI-shaped glob may be written against, mapped to the one
354
+ * entity it addresses.
355
+ *
356
+ * An entity under a registered prefix has two legal spellings — the compact
357
+ * `ds:button` shell completion offers, and the absolute
358
+ * `https://ds.canonical.com/button` a user pastes from a browser. Both resolve
359
+ * to the same entity in a literal lookup, so a glob must expand over both;
360
+ * offering only the compact form made `https://ds.canonical.com/but*` return
361
+ * EMPTY_RESULTS while the literal IRI it generalises succeeded.
362
+ *
363
+ * The map is spelling → CANONICAL IRI precisely so a pattern that matches an
364
+ * entity under both spellings still yields it once. Matching over a flat list
365
+ * of both would render the entity twice, which is why the previous shape
366
+ * offered only one.
367
+ */
368
+ async function listEntityIriSpellings(
369
+ rt: LookupRuntime,
370
+ lookup: PackLookup,
371
+ source: StorySource,
372
+ prefixes: Readonly<Record<string, string>>,
373
+ ): Promise<Map<string, string>> {
374
+ const rows = await runSelect(rt, buildLookupIrisQuery(lookup), source);
375
+ const spellings = new Map<string, string>();
376
+ for (const row of rows) {
377
+ const uri = row.uri ?? "";
378
+ if (uri === "") continue;
379
+ spellings.set(uri, uri);
380
+ const compact = compactUri(uri, prefixes);
381
+ if (compact !== uri) spellings.set(compact, uri);
382
+ }
383
+ return spellings;
384
+ }
385
+
228
386
  /** List every entity name the lookup can address (miss suggestions + sample/glob). */
229
387
  export async function listEntityNames(
230
388
  rt: LookupRuntime,
@@ -9,9 +9,8 @@
9
9
  * factories carry no heavy static import.
10
10
  */
11
11
 
12
- import { PragmaError } from "../error/PragmaError.js";
13
- import { cliRecovery } from "../error/recovery.js";
14
- import type { PragmaRuntime } from "../runtime/types.js";
12
+ import { cliRecovery, PragmaError } from "../error/index.js";
13
+ import type { PragmaRuntime } from "../runtime/index.js";
15
14
  import { resolvePackDetail } from "./disclosure.js";
16
15
  import type { SampleOutput } from "./renderPack.js";
17
16
  import {
@@ -20,14 +19,39 @@ import {
20
19
  resolveLookup,
21
20
  } from "./resolveEntity.js";
22
21
  import { parseSampleCount, pickRandom } from "./sample.js";
23
- import { applyPackFilters } from "./sparql/applyFilters.js";
22
+ import {
23
+ applyPackFilters,
24
+ type FilterVocabularies,
25
+ } from "./sparql/applyFilters.js";
24
26
  import { applyPackSearch } from "./sparql/applySearch.js";
25
27
  import { runSelect } from "./sparql/runSelect.js";
26
- import type { PackList, PackLookup, PackRow, StorySource } from "./types.js";
28
+ import type {
29
+ PackFilter,
30
+ PackList,
31
+ PackLookup,
32
+ PackRow,
33
+ StorySource,
34
+ } from "./types.js";
27
35
 
28
36
  /** The highest canonical level — sample fetches everything for shape discovery. */
29
37
  const HIGHEST_LEVEL = "detailed";
30
38
 
39
+ /**
40
+ * The recovery every lookup-shaped miss carries: browse the noun's list.
41
+ *
42
+ * `mcp.params` is populated rather than left off. A bare tool NAME is only half
43
+ * an instruction to an agent — it still has to guess an argument bag, and a
44
+ * guess that misses returns `-32602 Invalid arguments`, which reads like the
45
+ * recovery itself was wrong. `{}` is the concrete, valid call: every compiled
46
+ * list verb's params are optional, so the recovery is now copy-pasteable.
47
+ */
48
+ function listRecovery(noun: string) {
49
+ return cliRecovery(`${noun} list`, `List available ${noun} entries.`, {
50
+ tool: `${noun}_list`,
51
+ params: {},
52
+ });
53
+ }
54
+
31
55
  /** Facts a list-shaped run body needs beyond its `shape`. */
32
56
  export interface ListRunMeta {
33
57
  readonly source: StorySource;
@@ -46,16 +70,64 @@ export function makeListRun(
46
70
  shape: PackList,
47
71
  meta: ListRunMeta,
48
72
  ): (params: Record<string, unknown>, rt: PragmaRuntime) => Promise<PackRow[]> {
49
- return async (params, rt) =>
50
- applyPackSearch(
51
- applyPackFilters(
52
- await runSelect(rt, shape.query, meta.source),
53
- shape.filters,
54
- params,
55
- ),
73
+ return async (params, rt) => {
74
+ const rows = await runSelect(rt, shape.query, meta.source);
75
+ const vocabularies = await readFilterVocabularies(
76
+ rt,
77
+ shape.filters,
78
+ params,
79
+ meta.source,
80
+ );
81
+ return applyPackSearch(
82
+ applyPackFilters(rows, shape.filters, params, vocabularies),
56
83
  shape.search,
57
84
  params,
58
85
  );
86
+ };
87
+ }
88
+
89
+ /**
90
+ * Read the declared vocabulary of each value-free filter the caller actually
91
+ * used.
92
+ *
93
+ * WHY a second query rather than the rows already in hand: the rows are a
94
+ * population, not a vocabulary. A category the graph declares with no standards
95
+ * filed under it, or a `ds:ConceptType` no concept uses yet, is a REAL value
96
+ * that appears in no row — and rejecting it as `INVALID_INPUT` contradicts both
97
+ * `standard categories` (which lists it, with count 0) and the documented calm
98
+ * empty list. The query reads the same terms the enumerating surface reads, so
99
+ * "the graph is the vocabulary" stays true of the graph rather than of whatever
100
+ * the list happened to return.
101
+ *
102
+ * Only for a filter that is DECLARED with a vocabulary, carries no `values`
103
+ * (a declared set is already the vocabulary), and was actually PROVIDED — an
104
+ * unfiltered `list` runs exactly the one query it always did.
105
+ */
106
+ async function readFilterVocabularies(
107
+ rt: PragmaRuntime,
108
+ filters: readonly PackFilter[] | undefined,
109
+ params: Record<string, unknown>,
110
+ source: StorySource,
111
+ ): Promise<FilterVocabularies | undefined> {
112
+ const needed = (filters ?? []).filter(
113
+ (filter) =>
114
+ filter.vocabulary !== undefined &&
115
+ filter.values === undefined &&
116
+ params[filter.param] !== undefined,
117
+ );
118
+ if (needed.length === 0) return undefined;
119
+ const resolved = new Map<string, readonly string[]>();
120
+ for (const filter of needed) {
121
+ const vocabulary = filter.vocabulary;
122
+ if (!vocabulary) continue;
123
+ const variable = vocabulary.variable ?? filter.variable;
124
+ const rows = await runSelect(rt, vocabulary.query, source);
125
+ resolved.set(
126
+ filter.param,
127
+ rows.map((row) => row[variable] ?? "").filter((value) => value !== ""),
128
+ );
129
+ }
130
+ return resolved;
59
131
  }
60
132
 
61
133
  /** Build the run body for a lookup verb (variadic names → resolved entities). */
@@ -89,11 +161,7 @@ export function makeLookupRun(
89
161
  code: first.code as PragmaError["code"],
90
162
  message: first.message,
91
163
  suggestions: first.suggestions ? [...first.suggestions] : undefined,
92
- recovery: cliRecovery(
93
- `${noun} list`,
94
- `List available ${noun} entries.`,
95
- { tool: `${noun}_list` },
96
- ),
164
+ recovery: listRecovery(noun),
97
165
  });
98
166
  }
99
167
  }
@@ -120,11 +188,7 @@ export function makeSampleRun(
120
188
  if (names.length === 0) {
121
189
  throw PragmaError.emptyResults(noun, {
122
190
  message: `No ${noun} entries to sample.`,
123
- recovery: cliRecovery(
124
- `${noun} list`,
125
- `List available ${noun} entries.`,
126
- { tool: `${noun}_list` },
127
- ),
191
+ recovery: listRecovery(noun),
128
192
  });
129
193
  }
130
194
  const selected = pickRandom(names, count);
@@ -6,7 +6,7 @@
6
6
  * the supported 1–5 range. Selection is a Fisher-Yates partial shuffle.
7
7
  */
8
8
 
9
- import { PragmaError } from "../error/PragmaError.js";
9
+ import { PragmaError } from "../error/index.js";
10
10
  import type { PackLookup } from "./types.js";
11
11
 
12
12
  /** Smallest number of samples the `sample` verb returns. */
@@ -18,7 +18,7 @@
18
18
 
19
19
  import { z } from "zod";
20
20
  import { DETAIL_LEVELS, RECOVERY_CLI_PREFIX } from "../../constants.js";
21
- import { PragmaError } from "../error/PragmaError.js";
21
+ import { PragmaError } from "../error/index.js";
22
22
  import type { PackDefinition } from "./types.js";
23
23
 
24
24
  const NOUN_PATTERN = /^[a-z][a-z0-9-]*$/;
@@ -41,6 +41,16 @@ const TERM_PATTERN =
41
41
  /** Params a filter/verb may not claim (they are the shared read vocabulary). */
42
42
  const RESERVED_PARAMS = new Set(["search", "detail", "name", "count"]);
43
43
 
44
+ /**
45
+ * Whether an author-supplied query is a SELECT (optionally preceded by its own
46
+ * PREFIX lines). Every author query a story declares runs through `runSelect`,
47
+ * which reads `result.bindings` — so a non-SELECT is a shape mismatch caught
48
+ * here rather than downstream.
49
+ */
50
+ function isSelectQuery(query: string): boolean {
51
+ return /^\s*(?:PREFIX\s+[^\n]*\n\s*)*SELECT\s/i.test(query);
52
+ }
53
+
44
54
  const term = z.string().regex(TERM_PATTERN, "must be a prefixed name or IRI");
45
55
  const graphqlName = z.string().regex(GRAPHQL_NAME_PATTERN);
46
56
  const fieldName = z.string().regex(FIELD_PATTERN);
@@ -49,16 +59,35 @@ const columnSchema = z
49
59
  .object({ field: fieldName, label: z.string().optional() })
50
60
  .strict();
51
61
 
62
+ const vocabularySchema = z
63
+ .object({
64
+ query: z.string().min(1),
65
+ variable: fieldName.optional(),
66
+ })
67
+ .strict();
68
+
52
69
  const filterSchema = z
53
70
  .object({
54
71
  param: z.string().regex(FILTER_PARAM_PATTERN),
55
72
  variable: fieldName,
56
73
  values: z.array(z.string()).min(1).optional(),
74
+ match: z.enum(["exact", "set"]).optional(),
75
+ vocabulary: vocabularySchema.optional(),
57
76
  description: z.string().optional(),
58
77
  })
59
78
  .strict()
60
79
  .refine((f) => !RESERVED_PARAMS.has(f.param), {
61
80
  message: "filter param is a reserved name",
81
+ })
82
+ // A declared `values` set IS the vocabulary — the filter projects it as an
83
+ // enum and canonicalizes against it. A second, graph-read one alongside would
84
+ // be a silent no-op at best and a disagreement at worst.
85
+ .refine((f) => !(f.values && f.vocabulary), {
86
+ message:
87
+ '"values" and "vocabulary" are mutually exclusive — a declared value set is already the vocabulary',
88
+ })
89
+ .refine((f) => !f.vocabulary || isSelectQuery(f.vocabulary.query), {
90
+ message: '"vocabulary.query" must be a SPARQL SELECT query',
62
91
  });
63
92
 
64
93
  const searchSchema = z
@@ -204,14 +233,31 @@ const completionSchema = z
204
233
  })
205
234
  .strict();
206
235
 
236
+ /**
237
+ * The declared scope-ranking factor (`PackScopeWeight`). `falloff` is bounded
238
+ * the same way `weights` is — a factor outside 0–1 is a promotion, and this
239
+ * declaration only ever DEMOTES a deeper scope below a shallower one.
240
+ */
241
+ const scopeWeightSchema = z
242
+ .object({
243
+ via: term,
244
+ by: term,
245
+ falloff: z.number().min(0).max(1),
246
+ asserted: term.optional(),
247
+ })
248
+ .strict();
249
+
207
250
  const lookupSchema = z
208
251
  .object({
209
252
  source: z.enum(["sparql", "graphql"]).optional(),
210
253
  by: term,
254
+ nameFallback: z.enum(["iri"]).optional(),
211
255
  type: term.optional(),
212
256
  description: z.string().optional(),
213
257
  toolDescription: z.string().optional(),
214
258
  types: z.array(term).min(1).optional(),
259
+ weights: z.record(term, z.number().min(0).max(1)).optional(),
260
+ scopeWeight: scopeWeightSchema.optional(),
215
261
  graphqlType: graphqlName.optional(),
216
262
  fields: z.array(fieldSchema).min(1).optional(),
217
263
  sections: z.array(sectionSchema).min(1).optional(),
@@ -240,10 +286,7 @@ const definitionSchema = z
240
286
  message: 'a pack must declare at least one of "list" or "lookup".',
241
287
  });
242
288
  }
243
- if (
244
- def.list &&
245
- !/^\s*(?:PREFIX\s+[^\n]*\n\s*)*SELECT\s/i.test(def.list.query)
246
- ) {
289
+ if (def.list && !isSelectQuery(def.list.query)) {
247
290
  ctx.addIssue({
248
291
  code: z.ZodIssueCode.custom,
249
292
  message: '"list.query" must be a SPARQL SELECT query.',
@@ -332,6 +375,36 @@ function refineLookup(
332
375
  });
333
376
  }
334
377
 
378
+ // An IRI-derived name is only as trustworthy as the class vouching for the
379
+ // entity it came from, and without a class constraint nothing bounds the scan
380
+ // the derived-name population would run. Rejected rather than ignored, for the
381
+ // same reason a stale weight is: a silent no-op is how a declaration that
382
+ // never applied survives review.
383
+ if (lookup.nameFallback !== undefined && !lookup.type && !lookup.types) {
384
+ ctx.addIssue({
385
+ code: z.ZodIssueCode.custom,
386
+ message:
387
+ '"lookup.nameFallback" requires a class constraint ("lookup.type" or "lookup.types") to vouch for the entities it names.',
388
+ path: ["lookup", "nameFallback"],
389
+ });
390
+ }
391
+
392
+ // A weight naming a type the lookup does not address can never apply. Reject
393
+ // it rather than ignore it — a silent no-op is how a stale weight survives a
394
+ // rename (the type moves, the weight stays, and nothing says so).
395
+ const addressed = new Set<string>(
396
+ lookup.types ?? (lookup.type ? [lookup.type] : []),
397
+ );
398
+ for (const named of Object.keys(lookup.weights ?? {})) {
399
+ if (!addressed.has(named)) {
400
+ ctx.addIssue({
401
+ code: z.ZodIssueCode.custom,
402
+ message: `"lookup.weights" names "${named}", which is not in "lookup.type"/"lookup.types".`,
403
+ path: ["lookup", "weights"],
404
+ });
405
+ }
406
+ }
407
+
335
408
  if (source === "graphql" && !lookup.graphqlType && !lookup.type) {
336
409
  ctx.addIssue({
337
410
  code: z.ZodIssueCode.custom,