@canonical/pragma-cli 0.34.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (832) hide show
  1. package/README.md +153 -30
  2. package/bundled-skills/add-standard/SKILL.md +338 -0
  3. package/bundled-skills/adoption-a1-styles/SKILL.md +269 -0
  4. package/bundled-skills/adoption-a2-components/SKILL.md +291 -0
  5. package/bundled-skills/adoption-a3-forms/SKILL.md +260 -0
  6. package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +406 -0
  7. package/bundled-skills/anatomy-author/SKILL.md +1226 -0
  8. package/bundled-skills/design-auditor/SKILL.md +455 -0
  9. package/bundled-skills/implement-component/SKILL.md +333 -0
  10. package/bundled-skills/specify-component/SKILL.md +331 -0
  11. package/bundled-skills/specify-pattern/SKILL.md +292 -0
  12. package/dist/.build-ok +0 -0
  13. package/dist/package.json +84 -0
  14. package/dist/pragma.conf.js +1016 -0
  15. package/dist/pragma.conf.js.map +1 -0
  16. package/dist/src/bin.js +356 -0
  17. package/dist/src/bin.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  19. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  20. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  21. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  22. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  23. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  24. package/dist/src/capabilities/capabilities/hints.js +195 -0
  25. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  26. package/dist/src/capabilities/capabilities/index.js +11 -0
  27. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  28. package/dist/src/capabilities/capabilities/types.js +11 -0
  29. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  30. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  31. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  32. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  33. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  34. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  35. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  36. package/dist/src/capabilities/colophon/index.js +5 -0
  37. package/dist/src/capabilities/colophon/index.js.map +1 -0
  38. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  39. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  40. package/dist/src/capabilities/colophon/types.js +10 -0
  41. package/dist/src/capabilities/colophon/types.js.map +1 -0
  42. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  43. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  44. package/dist/src/capabilities/config/field.render.js +22 -0
  45. package/dist/src/capabilities/config/field.render.js.map +1 -0
  46. package/dist/src/capabilities/config/fields.js +46 -0
  47. package/dist/src/capabilities/config/fields.js.map +1 -0
  48. package/dist/src/capabilities/config/get.verb.js +61 -0
  49. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/index.js +5 -0
  51. package/dist/src/capabilities/config/index.js.map +1 -0
  52. package/dist/src/capabilities/config/runField.js +59 -0
  53. package/dist/src/capabilities/config/runField.js.map +1 -0
  54. package/dist/src/capabilities/config/runGet.js +28 -0
  55. package/dist/src/capabilities/config/runGet.js.map +1 -0
  56. package/dist/src/capabilities/config/runSet.js +53 -0
  57. package/dist/src/capabilities/config/runSet.js.map +1 -0
  58. package/dist/src/capabilities/config/set.verb.js +66 -0
  59. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  60. package/dist/src/capabilities/config/show.render.js +84 -0
  61. package/dist/src/capabilities/config/show.render.js.map +1 -0
  62. package/dist/src/capabilities/config/show.verb.js +44 -0
  63. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  64. package/dist/src/capabilities/config/types.js +5 -0
  65. package/dist/src/capabilities/config/types.js.map +1 -0
  66. package/dist/src/capabilities/config/unset.verb.js +49 -0
  67. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  68. package/dist/src/capabilities/create/cliProjection.js +195 -0
  69. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  70. package/dist/src/capabilities/create/constants.js +47 -0
  71. package/dist/src/capabilities/create/constants.js.map +1 -0
  72. package/dist/src/capabilities/create/create.render.js +100 -0
  73. package/dist/src/capabilities/create/create.render.js.map +1 -0
  74. package/dist/src/capabilities/create/create.verb.js +438 -0
  75. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  76. package/dist/src/capabilities/create/createHelp.js +47 -0
  77. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  78. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  79. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  80. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  81. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  82. package/dist/src/capabilities/create/index.js +18 -0
  83. package/dist/src/capabilities/create/index.js.map +1 -0
  84. package/dist/src/capabilities/create/messages.js +16 -0
  85. package/dist/src/capabilities/create/messages.js.map +1 -0
  86. package/dist/src/capabilities/create/mount.js +294 -0
  87. package/dist/src/capabilities/create/mount.js.map +1 -0
  88. package/dist/src/capabilities/create/pathJail.js +65 -0
  89. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  90. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  91. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  92. package/dist/src/capabilities/create/types.js +2 -0
  93. package/dist/src/capabilities/create/types.js.map +1 -0
  94. package/dist/src/capabilities/distribution.js +40 -0
  95. package/dist/src/capabilities/distribution.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  97. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  99. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +148 -0
  101. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  102. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  103. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  104. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  105. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  106. package/dist/src/capabilities/doctor/checks/harnessInventory.js +195 -0
  107. package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -0
  108. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  109. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  110. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  111. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  112. package/dist/src/capabilities/doctor/checks/targetHealth.js +349 -0
  113. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  114. package/dist/src/capabilities/doctor/doctor.render.js +164 -0
  115. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  116. package/dist/src/capabilities/doctor/doctor.verb.js +49 -0
  117. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  118. package/dist/src/capabilities/doctor/index.js +5 -0
  119. package/dist/src/capabilities/doctor/index.js.map +1 -0
  120. package/dist/src/capabilities/doctor/runChecks.js +86 -0
  121. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  122. package/dist/src/capabilities/doctor/types.js +5 -0
  123. package/dist/src/capabilities/doctor/types.js.map +1 -0
  124. package/dist/src/capabilities/graph/index.js +19 -0
  125. package/dist/src/capabilities/graph/index.js.map +1 -0
  126. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  127. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  128. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  129. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  130. package/dist/src/capabilities/graph/query.render.js +73 -0
  131. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  132. package/dist/src/capabilities/graph/query.verb.js +49 -0
  133. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  134. package/dist/src/capabilities/graph/runQuery.js +41 -0
  135. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  136. package/dist/src/capabilities/index.js +56 -0
  137. package/dist/src/capabilities/index.js.map +1 -0
  138. package/dist/src/capabilities/info/collectInfo.js +72 -0
  139. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  140. package/dist/src/capabilities/info/index.js +5 -0
  141. package/dist/src/capabilities/info/index.js.map +1 -0
  142. package/dist/src/capabilities/info/info.render.js +57 -0
  143. package/dist/src/capabilities/info/info.render.js.map +1 -0
  144. package/dist/src/capabilities/info/info.verb.js +42 -0
  145. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  146. package/dist/src/capabilities/info/types.js +5 -0
  147. package/dist/src/capabilities/info/types.js.map +1 -0
  148. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  149. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  150. package/dist/src/capabilities/meta/index.js +13 -0
  151. package/dist/src/capabilities/meta/index.js.map +1 -0
  152. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  153. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  154. package/dist/src/capabilities/ontology/index.js +21 -0
  155. package/dist/src/capabilities/ontology/index.js.map +1 -0
  156. package/dist/src/capabilities/ontology/queries.js +123 -0
  157. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  158. package/dist/src/capabilities/ontology/render.js +66 -0
  159. package/dist/src/capabilities/ontology/render.js.map +1 -0
  160. package/dist/src/capabilities/ontology/verbs.js +181 -0
  161. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  162. package/dist/src/capabilities/prompt/index.js +16 -0
  163. package/dist/src/capabilities/prompt/index.js.map +1 -0
  164. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  165. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  166. package/dist/src/capabilities/prompt/types.js +10 -0
  167. package/dist/src/capabilities/prompt/types.js.map +1 -0
  168. package/dist/src/capabilities/prompt/verbs.js +93 -0
  169. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  170. package/dist/src/capabilities/resources/index.js +10 -0
  171. package/dist/src/capabilities/resources/index.js.map +1 -0
  172. package/dist/src/capabilities/resources/provider.js +423 -0
  173. package/dist/src/capabilities/resources/provider.js.map +1 -0
  174. package/dist/src/capabilities/setup/buildPlan.js +172 -0
  175. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  176. package/dist/src/capabilities/setup/index.js +5 -0
  177. package/dist/src/capabilities/setup/index.js.map +1 -0
  178. package/dist/src/capabilities/setup/mode.js +53 -0
  179. package/dist/src/capabilities/setup/mode.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/index.js +39 -0
  181. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  182. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  183. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  184. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  185. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  186. package/dist/src/capabilities/setup/operations/setupGenerator.js +390 -0
  187. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  188. package/dist/src/capabilities/setup/operations/setupLsp.js +329 -0
  189. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  190. package/dist/src/capabilities/setup/operations/setupMcp.js +253 -0
  191. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  192. package/dist/src/capabilities/setup/operations/setupSkills.js +594 -0
  193. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  194. package/dist/src/capabilities/setup/plan.js +128 -0
  195. package/dist/src/capabilities/setup/plan.js.map +1 -0
  196. package/dist/src/capabilities/setup/plan.render.js +271 -0
  197. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  198. package/dist/src/capabilities/setup/setup.render.js +54 -0
  199. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  200. package/dist/src/capabilities/setup/setup.verb.js +387 -0
  201. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  202. package/dist/src/capabilities/setup/shell.js +196 -0
  203. package/dist/src/capabilities/setup/shell.js.map +1 -0
  204. package/dist/src/capabilities/setup/targets.js +328 -0
  205. package/dist/src/capabilities/setup/targets.js.map +1 -0
  206. package/dist/src/capabilities/setup/types.js +5 -0
  207. package/dist/src/capabilities/setup/types.js.map +1 -0
  208. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  209. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  210. package/dist/src/capabilities/shared/index.js +27 -0
  211. package/dist/src/capabilities/shared/index.js.map +1 -0
  212. package/dist/src/capabilities/shared/packageManager.js +349 -0
  213. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  214. package/dist/src/capabilities/shared/registry.js +55 -0
  215. package/dist/src/capabilities/shared/registry.js.map +1 -0
  216. package/dist/src/capabilities/skill/discover.js +281 -0
  217. package/dist/src/capabilities/skill/discover.js.map +1 -0
  218. package/dist/src/capabilities/skill/index.js +10 -0
  219. package/dist/src/capabilities/skill/index.js.map +1 -0
  220. package/dist/src/capabilities/skill/render.js +49 -0
  221. package/dist/src/capabilities/skill/render.js.map +1 -0
  222. package/dist/src/capabilities/skill/verbs.js +83 -0
  223. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  224. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  225. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  226. package/dist/src/capabilities/sources/index.js +13 -0
  227. package/dist/src/capabilities/sources/index.js.map +1 -0
  228. package/dist/src/capabilities/sources/installSkills.js +309 -0
  229. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  230. package/dist/src/capabilities/sources/runUpdate.js +460 -0
  231. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  232. package/dist/src/capabilities/sources/status.render.js +64 -0
  233. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  234. package/dist/src/capabilities/sources/status.verb.js +40 -0
  235. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  236. package/dist/src/capabilities/sources/types.js +6 -0
  237. package/dist/src/capabilities/sources/types.js.map +1 -0
  238. package/dist/src/capabilities/sources/update.render.js +34 -0
  239. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  240. package/dist/src/capabilities/sources/update.verb.js +55 -0
  241. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  242. package/dist/src/capabilities/upgrade/index.js +5 -0
  243. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  244. package/dist/src/capabilities/upgrade/runUpgrade.js +135 -0
  245. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  246. package/dist/src/capabilities/upgrade/types.js +5 -0
  247. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  248. package/dist/src/capabilities/upgrade/upgrade.render.js +52 -0
  249. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  250. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  251. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  252. package/dist/src/capabilities/version/index.js +10 -0
  253. package/dist/src/capabilities/version/index.js.map +1 -0
  254. package/dist/src/capabilities/version/version.verb.js +36 -0
  255. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  256. package/dist/src/constants.js +87 -0
  257. package/dist/src/constants.js.map +1 -0
  258. package/dist/src/index.js +12 -0
  259. package/dist/src/index.js.map +1 -0
  260. package/dist/src/kernel/completion/complete.js +66 -0
  261. package/dist/src/kernel/completion/complete.js.map +1 -0
  262. package/dist/src/kernel/completion/emitScripts.js +92 -0
  263. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  264. package/dist/src/kernel/completion/entitySource.js +285 -0
  265. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  266. package/dist/src/kernel/completion/index.js +14 -0
  267. package/dist/src/kernel/completion/index.js.map +1 -0
  268. package/dist/src/kernel/completion/model.js +301 -0
  269. package/dist/src/kernel/completion/model.js.map +1 -0
  270. package/dist/src/kernel/completion/parse.js +253 -0
  271. package/dist/src/kernel/completion/parse.js.map +1 -0
  272. package/dist/src/kernel/completion/rank.js +101 -0
  273. package/dist/src/kernel/completion/rank.js.map +1 -0
  274. package/dist/src/kernel/completion/resolve.js +100 -0
  275. package/dist/src/kernel/completion/resolve.js.map +1 -0
  276. package/dist/src/kernel/completion/templates/bash.js +209 -0
  277. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  278. package/dist/src/kernel/completion/templates/fish.js +214 -0
  279. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  280. package/dist/src/kernel/completion/templates/index.js +23 -0
  281. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  282. package/dist/src/kernel/completion/templates/shared.js +98 -0
  283. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  284. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  285. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  286. package/dist/src/kernel/completion/types.js +13 -0
  287. package/dist/src/kernel/completion/types.js.map +1 -0
  288. package/dist/src/kernel/config/defaults.js +17 -0
  289. package/dist/src/kernel/config/defaults.js.map +1 -0
  290. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  291. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  292. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  293. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  294. package/dist/src/kernel/config/firstRun.js +34 -0
  295. package/dist/src/kernel/config/firstRun.js.map +1 -0
  296. package/dist/src/kernel/config/globalConfig.js +79 -0
  297. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  298. package/dist/src/kernel/config/index.js +16 -0
  299. package/dist/src/kernel/config/index.js.map +1 -0
  300. package/dist/src/kernel/config/paths.js +35 -0
  301. package/dist/src/kernel/config/paths.js.map +1 -0
  302. package/dist/src/kernel/config/readConfig.js +78 -0
  303. package/dist/src/kernel/config/readConfig.js.map +1 -0
  304. package/dist/src/kernel/config/schema.js +130 -0
  305. package/dist/src/kernel/config/schema.js.map +1 -0
  306. package/dist/src/kernel/config/types.js +19 -0
  307. package/dist/src/kernel/config/types.js.map +1 -0
  308. package/dist/src/kernel/config/writeConfigField.js +59 -0
  309. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  310. package/dist/src/kernel/copy.js +43 -0
  311. package/dist/src/kernel/copy.js.map +1 -0
  312. package/dist/src/kernel/error/PragmaError.js +149 -0
  313. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  314. package/dist/src/kernel/error/constants.js +40 -0
  315. package/dist/src/kernel/error/constants.js.map +1 -0
  316. package/dist/src/kernel/error/fromTaskError.js +96 -0
  317. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  318. package/dist/src/kernel/error/index.js +13 -0
  319. package/dist/src/kernel/error/index.js.map +1 -0
  320. package/dist/src/kernel/error/recovery.js +52 -0
  321. package/dist/src/kernel/error/recovery.js.map +1 -0
  322. package/dist/src/kernel/error/renderError.js +115 -0
  323. package/dist/src/kernel/error/renderError.js.map +1 -0
  324. package/dist/src/kernel/error/serialize.js +25 -0
  325. package/dist/src/kernel/error/serialize.js.map +1 -0
  326. package/dist/src/kernel/error/types.js +9 -0
  327. package/dist/src/kernel/error/types.js.map +1 -0
  328. package/dist/src/kernel/index.js +34 -0
  329. package/dist/src/kernel/index.js.map +1 -0
  330. package/dist/src/kernel/interactivity.js +68 -0
  331. package/dist/src/kernel/interactivity.js.map +1 -0
  332. package/dist/src/kernel/packs/collect.js +187 -0
  333. package/dist/src/kernel/packs/collect.js.map +1 -0
  334. package/dist/src/kernel/packs/compile.js +304 -0
  335. package/dist/src/kernel/packs/compile.js.map +1 -0
  336. package/dist/src/kernel/packs/disclosure.js +76 -0
  337. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  338. package/dist/src/kernel/packs/glob.js +38 -0
  339. package/dist/src/kernel/packs/glob.js.map +1 -0
  340. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  341. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  342. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  343. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  344. package/dist/src/kernel/packs/graphql/index.js +20 -0
  345. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  346. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  347. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  348. package/dist/src/kernel/packs/index.js +34 -0
  349. package/dist/src/kernel/packs/index.js.map +1 -0
  350. package/dist/src/kernel/packs/iri.js +110 -0
  351. package/dist/src/kernel/packs/iri.js.map +1 -0
  352. package/dist/src/kernel/packs/renderPack.js +129 -0
  353. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  354. package/dist/src/kernel/packs/resolveEntity.js +274 -0
  355. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  356. package/dist/src/kernel/packs/runBodies.js +140 -0
  357. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  358. package/dist/src/kernel/packs/sample.js +56 -0
  359. package/dist/src/kernel/packs/sample.js.map +1 -0
  360. package/dist/src/kernel/packs/schema.js +421 -0
  361. package/dist/src/kernel/packs/schema.js.map +1 -0
  362. package/dist/src/kernel/packs/sparql/applyFilters.js +167 -0
  363. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  364. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  365. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  366. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +480 -0
  367. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  368. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  369. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  370. package/dist/src/kernel/packs/sparql/index.js +31 -0
  371. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  372. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  373. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  374. package/dist/src/kernel/packs/types.js +30 -0
  375. package/dist/src/kernel/packs/types.js.map +1 -0
  376. package/dist/src/kernel/packs/uniqueness.js +30 -0
  377. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  378. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  379. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  380. package/dist/src/kernel/project/cli/constants.js +27 -0
  381. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  382. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  383. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  384. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  385. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  386. package/dist/src/kernel/project/cli/globalFlags.js +219 -0
  387. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  388. package/dist/src/kernel/project/cli/helpFormat.js +58 -0
  389. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  390. package/dist/src/kernel/project/cli/index.js +14 -0
  391. package/dist/src/kernel/project/cli/index.js.map +1 -0
  392. package/dist/src/kernel/project/cli/rootHelp.js +227 -0
  393. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  394. package/dist/src/kernel/project/cli/suggest.js +75 -0
  395. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  396. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  397. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  398. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  399. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  401. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  403. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/index.js +8 -0
  405. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  407. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  408. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  409. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  410. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  411. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  412. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  413. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  414. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  415. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  416. package/dist/src/kernel/project/mcp/registerVerb.js +315 -0
  417. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  418. package/dist/src/kernel/project/mcp/serve.js +35 -0
  419. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  420. package/dist/src/kernel/render/compactUri.js +24 -0
  421. package/dist/src/kernel/render/compactUri.js.map +1 -0
  422. package/dist/src/kernel/render/contracts.js +10 -0
  423. package/dist/src/kernel/render/contracts.js.map +1 -0
  424. package/dist/src/kernel/render/disclosure.js +34 -0
  425. package/dist/src/kernel/render/disclosure.js.map +1 -0
  426. package/dist/src/kernel/render/envelope.js +30 -0
  427. package/dist/src/kernel/render/envelope.js.map +1 -0
  428. package/dist/src/kernel/render/formatters.js +27 -0
  429. package/dist/src/kernel/render/formatters.js.map +1 -0
  430. package/dist/src/kernel/render/index.js +15 -0
  431. package/dist/src/kernel/render/index.js.map +1 -0
  432. package/dist/src/kernel/render/prefixes.js +46 -0
  433. package/dist/src/kernel/render/prefixes.js.map +1 -0
  434. package/dist/src/kernel/render/renderers.js +468 -0
  435. package/dist/src/kernel/render/renderers.js.map +1 -0
  436. package/dist/src/kernel/render/style.js +105 -0
  437. package/dist/src/kernel/render/style.js.map +1 -0
  438. package/dist/src/kernel/render/turtle.js +194 -0
  439. package/dist/src/kernel/render/turtle.js.map +1 -0
  440. package/dist/src/kernel/render/vocabulary.js +174 -0
  441. package/dist/src/kernel/render/vocabulary.js.map +1 -0
  442. package/dist/src/kernel/render/writeStdout.js +43 -0
  443. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  444. package/dist/src/kernel/runtime/boot.js +49 -0
  445. package/dist/src/kernel/runtime/boot.js.map +1 -0
  446. package/dist/src/kernel/runtime/facade.js +39 -0
  447. package/dist/src/kernel/runtime/facade.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  449. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  451. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  453. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  455. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  457. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  459. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  460. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  461. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  462. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  463. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  464. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  465. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  466. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  467. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  468. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  469. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  470. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  471. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  472. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  473. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  474. package/dist/src/kernel/runtime/index.js +8 -0
  475. package/dist/src/kernel/runtime/index.js.map +1 -0
  476. package/dist/src/kernel/runtime/loadSession.js +34 -0
  477. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  478. package/dist/src/kernel/runtime/paths.js +78 -0
  479. package/dist/src/kernel/runtime/paths.js.map +1 -0
  480. package/dist/src/kernel/runtime/probe.js +37 -0
  481. package/dist/src/kernel/runtime/probe.js.map +1 -0
  482. package/dist/src/kernel/runtime/readEntity.js +363 -0
  483. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  484. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  485. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  486. package/dist/src/kernel/runtime/refs/index.js +29 -0
  487. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  488. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  489. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  490. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  491. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  492. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  493. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  494. package/dist/src/kernel/runtime/store.js +75 -0
  495. package/dist/src/kernel/runtime/store.js.map +1 -0
  496. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  497. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  498. package/dist/src/kernel/runtime/types.js +11 -0
  499. package/dist/src/kernel/runtime/types.js.map +1 -0
  500. package/dist/src/kernel/spec/asVerb.js +21 -0
  501. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  502. package/dist/src/kernel/spec/emitReference.js +578 -0
  503. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  504. package/dist/src/kernel/spec/emitSurface.js +202 -0
  505. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  506. package/dist/src/kernel/spec/index.js +11 -0
  507. package/dist/src/kernel/spec/index.js.map +1 -0
  508. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  509. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  510. package/dist/src/kernel/spec/types.js +14 -0
  511. package/dist/src/kernel/spec/types.js.map +1 -0
  512. package/dist/src/kernel/spec/validate.js +110 -0
  513. package/dist/src/kernel/spec/validate.js.map +1 -0
  514. package/dist/src/kernel/vocabulary.js +97 -0
  515. package/dist/src/kernel/vocabulary.js.map +1 -0
  516. package/dist/src/types.js +11 -0
  517. package/dist/src/types.js.map +1 -0
  518. package/package.json +22 -23
  519. package/pragma.conf.ts +486 -90
  520. package/src/bin.ts +274 -82
  521. package/src/capabilities/block.parity.test.ts +29 -12
  522. package/src/capabilities/block.shipped.exec.test.ts +282 -0
  523. package/src/capabilities/block.tierRank.exec.test.ts +300 -0
  524. package/src/capabilities/capabilities/capabilities.render.ts +1 -1
  525. package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
  526. package/src/capabilities/capabilities/catalog.ts +3 -3
  527. package/src/capabilities/capabilities/hints.ts +32 -7
  528. package/src/capabilities/capabilities/index.ts +1 -1
  529. package/src/capabilities/colophon/collectColophon.ts +35 -24
  530. package/src/capabilities/colophon/colophon.render.ts +24 -1
  531. package/src/capabilities/colophon/colophon.test.ts +42 -21
  532. package/src/capabilities/colophon/colophon.verb.ts +4 -4
  533. package/src/capabilities/config/collectConfigShow.test.ts +1 -0
  534. package/src/capabilities/config/collectConfigShow.ts +3 -3
  535. package/src/capabilities/config/field.render.ts +4 -5
  536. package/src/capabilities/config/fields.ts +17 -10
  537. package/src/capabilities/config/get.verb.ts +70 -0
  538. package/src/capabilities/config/getUnset.test.ts +264 -0
  539. package/src/capabilities/config/index.ts +5 -1
  540. package/src/capabilities/config/runField.ts +40 -22
  541. package/src/capabilities/config/runGet.ts +34 -0
  542. package/src/capabilities/config/runSet.ts +35 -9
  543. package/src/capabilities/config/set.test.ts +48 -14
  544. package/src/capabilities/config/set.verb.ts +8 -7
  545. package/src/capabilities/config/show.render.ts +1 -1
  546. package/src/capabilities/config/show.verb.ts +9 -6
  547. package/src/capabilities/config/types.ts +18 -4
  548. package/src/capabilities/config/unset.verb.ts +58 -0
  549. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  550. package/src/capabilities/create/byteEquality.test.ts +25 -11
  551. package/src/capabilities/create/cliProjection.ts +227 -0
  552. package/src/capabilities/create/constants.ts +36 -61
  553. package/src/capabilities/create/create.mcp.test.ts +89 -5
  554. package/src/capabilities/create/create.render.ts +71 -7
  555. package/src/capabilities/create/create.test.ts +433 -219
  556. package/src/capabilities/create/create.verb.ts +297 -328
  557. package/src/capabilities/create/createGrammar.test.ts +865 -0
  558. package/src/capabilities/create/createHelp.ts +71 -0
  559. package/src/capabilities/create/createSurface.generated.ts +400 -0
  560. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  561. package/src/capabilities/create/cwdJail.test.ts +24 -5
  562. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  563. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  564. package/src/capabilities/create/index.ts +7 -4
  565. package/src/capabilities/create/messages.ts +18 -0
  566. package/src/capabilities/create/mount.ts +391 -0
  567. package/src/capabilities/create/pathJail.test.ts +90 -0
  568. package/src/capabilities/create/pathJail.ts +8 -5
  569. package/src/capabilities/create/pickGenerator.ts +23 -35
  570. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  571. package/src/capabilities/create/types.ts +20 -0
  572. package/src/capabilities/distribution.parity.test.ts +4 -0
  573. package/src/capabilities/distribution.test.ts +3 -1
  574. package/src/capabilities/distribution.ts +10 -15
  575. package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
  576. package/src/capabilities/doctor/checks/checkPackageRefs.ts +75 -8
  577. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
  578. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +76 -29
  579. package/src/capabilities/doctor/checks/checkShellCompletions.ts +63 -17
  580. package/src/capabilities/doctor/checks/harnessInventory.test.ts +219 -0
  581. package/src/capabilities/doctor/checks/harnessInventory.ts +298 -0
  582. package/src/capabilities/doctor/checks/index.ts +27 -0
  583. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  584. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  585. package/src/capabilities/doctor/checks/targetHealth.ts +444 -0
  586. package/src/capabilities/doctor/doctor.render.test.ts +125 -38
  587. package/src/capabilities/doctor/doctor.render.ts +74 -74
  588. package/src/capabilities/doctor/doctor.test.ts +338 -37
  589. package/src/capabilities/doctor/doctor.verb.ts +8 -3
  590. package/src/capabilities/doctor/runChecks.ts +65 -63
  591. package/src/capabilities/doctor/types.ts +22 -15
  592. package/src/capabilities/emptyRecovery.test.ts +21 -8
  593. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  594. package/src/capabilities/graph/index.ts +1 -1
  595. package/src/capabilities/graph/inspect.render.ts +70 -22
  596. package/src/capabilities/graph/inspect.test.ts +260 -5
  597. package/src/capabilities/graph/inspect.verb.ts +18 -6
  598. package/src/capabilities/graph/query.render.ts +15 -3
  599. package/src/capabilities/graph/query.verb.ts +3 -3
  600. package/src/capabilities/graph/runQuery.ts +2 -3
  601. package/src/capabilities/index.ts +3 -1
  602. package/src/capabilities/info/collectInfo.ts +13 -5
  603. package/src/capabilities/info/info.render.ts +7 -3
  604. package/src/capabilities/info/info.test.ts +37 -1
  605. package/src/capabilities/info/info.verb.ts +1 -1
  606. package/src/capabilities/info/types.ts +10 -2
  607. package/src/capabilities/lazy.test.ts +32 -0
  608. package/src/capabilities/meta/complete.verb.ts +1 -1
  609. package/src/capabilities/meta/index.ts +1 -1
  610. package/src/capabilities/meta/mcp.verb.ts +10 -8
  611. package/src/capabilities/ontology/index.ts +15 -11
  612. package/src/capabilities/ontology/ontology.test.ts +6 -55
  613. package/src/capabilities/ontology/queries.ts +2 -2
  614. package/src/capabilities/ontology/render.ts +3 -4
  615. package/src/capabilities/ontology/verbs.ts +27 -68
  616. package/src/capabilities/prompt/index.ts +2 -2
  617. package/src/capabilities/prompt/prompt.render.ts +6 -2
  618. package/src/capabilities/prompt/types.ts +1 -1
  619. package/src/capabilities/prompt/verbs.ts +4 -5
  620. package/src/capabilities/reference.test.ts +63 -0
  621. package/src/capabilities/renderVocabularySync.test.ts +82 -0
  622. package/src/capabilities/resources/provider.ts +342 -85
  623. package/src/capabilities/resources/resources.test.ts +355 -59
  624. package/src/capabilities/scopeTypeSync.test.ts +29 -15
  625. package/src/capabilities/setup/buildPlan.ts +240 -0
  626. package/src/capabilities/setup/index.ts +7 -7
  627. package/src/capabilities/setup/mode.ts +74 -0
  628. package/src/capabilities/setup/operations/index.ts +79 -0
  629. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  630. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  631. package/src/capabilities/setup/operations/setupGenerator.ts +478 -334
  632. package/src/capabilities/setup/operations/setupLsp.ts +420 -67
  633. package/src/capabilities/setup/operations/setupMcp.ts +238 -127
  634. package/src/capabilities/setup/operations/setupSkills.ts +667 -105
  635. package/src/capabilities/setup/plan.render.ts +336 -0
  636. package/src/capabilities/setup/plan.ts +241 -0
  637. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  638. package/src/capabilities/setup/setup.render.test.ts +297 -75
  639. package/src/capabilities/setup/setup.render.ts +45 -77
  640. package/src/capabilities/setup/setup.test.ts +1819 -225
  641. package/src/capabilities/setup/setup.verb.ts +288 -78
  642. package/src/capabilities/setup/shell.test.ts +86 -0
  643. package/src/capabilities/setup/shell.ts +137 -11
  644. package/src/capabilities/setup/targets.ts +435 -0
  645. package/src/capabilities/setup/types.ts +23 -70
  646. package/src/capabilities/shared/assertExecOk.ts +68 -10
  647. package/src/capabilities/shared/index.ts +43 -0
  648. package/src/capabilities/shared/packageManager.test.ts +470 -0
  649. package/src/capabilities/shared/packageManager.ts +425 -34
  650. package/src/capabilities/skill/bundledSkills.test.ts +347 -0
  651. package/src/capabilities/skill/discover.ts +131 -10
  652. package/src/capabilities/skill/index.ts +1 -1
  653. package/src/capabilities/skill/render.ts +10 -9
  654. package/src/capabilities/skill/skill.test.ts +22 -7
  655. package/src/capabilities/skill/verbs.ts +3 -4
  656. package/src/capabilities/sources/collectStatus.ts +7 -2
  657. package/src/capabilities/sources/index.ts +1 -1
  658. package/src/capabilities/sources/installSkills.ts +265 -10
  659. package/src/capabilities/sources/runUpdate.ts +131 -23
  660. package/src/capabilities/sources/sources.test.ts +382 -2
  661. package/src/capabilities/sources/status.render.ts +1 -1
  662. package/src/capabilities/sources/status.verb.ts +1 -1
  663. package/src/capabilities/sources/update.render.ts +1 -1
  664. package/src/capabilities/sources/update.verb.ts +4 -4
  665. package/src/capabilities/surface.test.ts +136 -19
  666. package/src/capabilities/upgrade/runUpgrade.ts +53 -14
  667. package/src/capabilities/upgrade/types.ts +10 -2
  668. package/src/capabilities/upgrade/upgrade.render.ts +13 -7
  669. package/src/capabilities/upgrade/upgrade.test.ts +75 -3
  670. package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
  671. package/src/capabilities/version/index.ts +12 -0
  672. package/src/capabilities/version/version.test.ts +66 -0
  673. package/src/capabilities/version/version.verb.ts +39 -0
  674. package/src/constants.ts +36 -1
  675. package/src/identity.test.ts +57 -29
  676. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
  677. package/src/kernel/completion/complete.test.ts +12 -2
  678. package/src/kernel/completion/complete.ts +1 -1
  679. package/src/kernel/completion/emitScripts.ts +1 -1
  680. package/src/kernel/completion/entitySource.test.ts +16 -3
  681. package/src/kernel/completion/entitySource.ts +21 -8
  682. package/src/kernel/completion/model.test.ts +164 -12
  683. package/src/kernel/completion/model.ts +94 -14
  684. package/src/kernel/completion/parse.test.ts +4 -7
  685. package/src/kernel/completion/parse.ts +15 -0
  686. package/src/kernel/completion/resolve.test.ts +0 -1
  687. package/src/kernel/completion/safety.test.ts +50 -35
  688. package/src/kernel/completion/shellDrive.test.ts +28 -9
  689. package/src/kernel/completion/templates/bash.ts +7 -2
  690. package/src/kernel/completion/templates/index.ts +23 -0
  691. package/src/kernel/completion/types.ts +7 -0
  692. package/src/kernel/config/defaults.test.ts +27 -3
  693. package/src/kernel/config/defaults.ts +4 -3
  694. package/src/kernel/config/evaluateProjectConfig.ts +31 -8
  695. package/src/kernel/config/firstRun.test.ts +44 -38
  696. package/src/kernel/config/firstRun.ts +24 -88
  697. package/src/kernel/config/index.ts +1 -1
  698. package/src/kernel/config/readConfig.test.ts +6 -3
  699. package/src/kernel/config/readConfig.ts +1 -1
  700. package/src/kernel/config/schema.ts +3 -1
  701. package/src/kernel/config/types.ts +3 -1
  702. package/src/kernel/copy.test.ts +34 -4
  703. package/src/kernel/copy.ts +54 -0
  704. package/src/kernel/error/PragmaError.test.ts +5 -2
  705. package/src/kernel/error/PragmaError.ts +4 -2
  706. package/src/kernel/error/constants.ts +7 -5
  707. package/src/kernel/error/fromTaskError.ts +28 -6
  708. package/src/kernel/error/recovery.ts +14 -0
  709. package/src/kernel/error/renderError.ts +42 -1
  710. package/src/kernel/error/types.ts +21 -1
  711. package/src/kernel/index.ts +35 -0
  712. package/src/kernel/interactivity.test.ts +76 -0
  713. package/src/kernel/interactivity.ts +69 -0
  714. package/src/kernel/packs/collect.ts +12 -16
  715. package/src/kernel/packs/compile.test.ts +222 -1
  716. package/src/kernel/packs/compile.ts +93 -3
  717. package/src/kernel/packs/disclosure.ts +2 -2
  718. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  719. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
  720. package/src/kernel/packs/graphql/index.ts +20 -0
  721. package/src/kernel/packs/index.ts +40 -0
  722. package/src/kernel/packs/iri.test.ts +73 -0
  723. package/src/kernel/packs/iri.ts +66 -14
  724. package/src/kernel/packs/renderPack.ts +25 -6
  725. package/src/kernel/packs/resolveEntity.test.ts +274 -0
  726. package/src/kernel/packs/resolveEntity.ts +200 -42
  727. package/src/kernel/packs/runBodies.ts +86 -22
  728. package/src/kernel/packs/sample.ts +1 -1
  729. package/src/kernel/packs/schema.ts +78 -5
  730. package/src/kernel/packs/sparql/applyFilters.ts +136 -16
  731. package/src/kernel/packs/sparql/buildLookupQuery.test.ts +290 -0
  732. package/src/kernel/packs/sparql/buildLookupQuery.ts +367 -17
  733. package/src/kernel/packs/sparql/index.ts +37 -0
  734. package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
  735. package/src/kernel/packs/sparql/runSelect.ts +3 -4
  736. package/src/kernel/packs/toolDescription.test.ts +77 -4
  737. package/src/kernel/packs/types.ts +136 -0
  738. package/src/kernel/packs/uniqueness.ts +1 -1
  739. package/src/kernel/project/cli/buildProgram.test.ts +218 -12
  740. package/src/kernel/project/cli/buildProgram.ts +84 -18
  741. package/src/kernel/project/cli/constants.ts +34 -0
  742. package/src/kernel/project/cli/dispatch.test.ts +160 -2
  743. package/src/kernel/project/cli/dispatch.ts +226 -45
  744. package/src/kernel/project/cli/exitCodes.ts +1 -1
  745. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  746. package/src/kernel/project/cli/globalFlags.ts +134 -31
  747. package/src/kernel/project/cli/helpFormat.ts +14 -2
  748. package/src/kernel/project/cli/rootHelp.ts +74 -12
  749. package/src/kernel/project/cli/suggest.test.ts +33 -1
  750. package/src/kernel/project/cli/suggest.ts +25 -1
  751. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  752. package/src/kernel/project/cli/verbHelp.ts +23 -7
  753. package/src/kernel/project/mcp/buildServer.ts +7 -4
  754. package/src/kernel/project/mcp/envelope.ts +2 -2
  755. package/src/kernel/project/mcp/instructions.ts +2 -2
  756. package/src/kernel/project/mcp/mcpError.ts +1 -1
  757. package/src/kernel/project/mcp/parity.test.ts +5 -2
  758. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  759. package/src/kernel/project/mcp/prompts/source.ts +2 -2
  760. package/src/kernel/project/mcp/registerVerb.ts +55 -10
  761. package/src/kernel/project/mcp/serve.ts +2 -2
  762. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  763. package/src/kernel/render/contracts.ts +21 -0
  764. package/src/kernel/render/envelope.ts +2 -3
  765. package/src/kernel/render/formatters.ts +1 -1
  766. package/src/kernel/render/renderers.test.ts +243 -6
  767. package/src/kernel/render/renderers.ts +222 -20
  768. package/src/kernel/render/style.test.ts +75 -24
  769. package/src/kernel/render/style.ts +59 -6
  770. package/src/kernel/render/turtle.ts +222 -0
  771. package/src/kernel/render/vocabulary.ts +276 -0
  772. package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
  773. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
  775. package/src/kernel/runtime/graphpack/embedded.ts +3 -3
  776. package/src/kernel/runtime/graphpack/manifest.ts +1 -1
  777. package/src/kernel/runtime/graphpack/read.ts +1 -2
  778. package/src/kernel/runtime/loadSession.ts +1 -1
  779. package/src/kernel/runtime/probe.ts +6 -6
  780. package/src/kernel/runtime/readEntity.ts +472 -28
  781. package/src/kernel/runtime/refs/index.ts +39 -0
  782. package/src/kernel/runtime/refs/parseRef.ts +2 -2
  783. package/src/kernel/runtime/refs/resolve.ts +4 -4
  784. package/src/kernel/runtime/storeReadiness.ts +1 -2
  785. package/src/kernel/runtime/types.ts +15 -1
  786. package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
  787. package/src/kernel/spec/emitReference.ts +105 -30
  788. package/src/kernel/spec/emitSurface.ts +48 -6
  789. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  790. package/src/kernel/spec/types.ts +277 -4
  791. package/src/testing/PARITY_GAPS.ts +9 -3
  792. package/src/testing/behavioral/docExamples.test.ts +16 -0
  793. package/src/testing/behavioral/errorMatrix.mcp.test.ts +112 -9
  794. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  795. package/src/testing/behavioral/journeys.cli.test.ts +1 -1
  796. package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
  797. package/src/testing/behavioral/journeys.firstInstall.test.ts +7 -2
  798. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  799. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  800. package/src/testing/behavioral/journeys.packageStories.test.ts +10 -7
  801. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  802. package/src/testing/behavioral/mcpSurface.test.ts +1 -1
  803. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  804. package/src/testing/eval/__snapshots__/eval.test.ts.snap +26 -1
  805. package/src/testing/eval/cases/effectful.ts +3 -2
  806. package/src/testing/eval/cases/readNouns.ts +245 -9
  807. package/src/testing/fixtures/blockGraph.ts +104 -10
  808. package/src/testing/fixtures/graph/canonical.ts +182 -13
  809. package/src/testing/fixtures/graph/defaultPack.ts +1 -1
  810. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  811. package/src/testing/helpers/projectMcp.ts +32 -6
  812. package/src/testing/helpers/runCli.ts +35 -18
  813. package/src/testing/perf/budgets.test.ts +20 -9
  814. package/src/testing/perf/budgets.ts +58 -9
  815. package/src/testing/perf/codegen.test.ts +126 -0
  816. package/src/testing/perf/globalSetup.test.ts +286 -0
  817. package/src/testing/perf/globalSetup.ts +505 -23
  818. package/src/testing/perf/measure.test.ts +38 -0
  819. package/src/testing/perf/measure.ts +23 -4
  820. package/src/testing/setupXdgIsolation.ts +81 -21
  821. package/src/testing/tempRoot.globalSetup.ts +122 -0
  822. package/dist/pragma +0 -0
  823. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
  824. package/src/capabilities/create/templates.embedded.generated.ts +0 -28
  825. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
  826. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  827. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
  828. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
  829. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  830. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  831. package/src/capabilities/shared/bands.ts +0 -16
  832. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
@@ -0,0 +1,423 @@
1
+ /**
2
+ * The MCP resource browser — a `pragma:{+uri}` template over the pack index.
3
+ *
4
+ * Listing and autocomplete are STORELESS: they read the enriched `index.json`
5
+ * (readPackIndex) off disk, so the resource surface costs nothing until an agent
6
+ * reads one. They read it for the pack the BOOT DECISION names, so the listing
7
+ * can never advertise entities whose reads then fail STORE_UNAVAILABLE. A read
8
+ * is STORE-BACKED through the SHARED {@link readEntity} — the same reader
9
+ * `graph inspect` uses — so a resource read and a `graph inspect` of the same
10
+ * URI return identical content (the mirror contract).
11
+ *
12
+ * The listing is CURATED, not paged. MCP has a `cursor`/`nextCursor` contract
13
+ * for `resources/list`, but the SDK's high-level `McpServer` list handler
14
+ * ignores `request.params.cursor` and never returns a `nextCursor` (verified on
15
+ * the wire against 1.27.1), so "list everything, the client will page it" means
16
+ * "send everything, every connect". Listing all 712 indexed entities cost an
17
+ * agent ~155 KB of context before it had asked a single question. So a module
18
+ * DECLARES the slices of the index it contributes ({@link McpListable}) and the
19
+ * listing is their union: the collections, plus the schema that describes them.
20
+ * The individuals stay fully reachable — by the `{+uri}` template, whose
21
+ * autocomplete still offers every one of them.
22
+ *
23
+ * Degradation (Risk4): on a missing or legacy (pre-v2) index the listing returns
24
+ * a single "run `pragma sources update`" hint — never a live re-index of the
25
+ * store on the resource path. That hint is itself READABLE (it is the only
26
+ * resource a cold server advertises, and an advertised resource that refuses to
27
+ * be read is worse than no resource at all).
28
+ *
29
+ * The MCP SDK's `ResourceTemplate` is dynamic-imported inside `register` so this
30
+ * module — reachable on the capabilities import graph — never pulls the SDK onto
31
+ * the `--help`/`__complete` fast path.
32
+ */
33
+ import { BIN_NAME } from "../../constants.js";
34
+ import { matchesType, readPackIndex, } from "../../kernel/completion/entitySource.js";
35
+ import { asPragmaError } from "../../kernel/error/fromTaskError.js";
36
+ import { PragmaError } from "../../kernel/error/index.js";
37
+ import { mcpErrorFrom } from "../../kernel/project/mcp/mcpError.js";
38
+ import { toTurtle } from "../../kernel/render/turtle.js";
39
+ import { readEntity } from "../../kernel/runtime/readEntity.js";
40
+ import { resolveSources } from "../../kernel/runtime/resolveSources.js";
41
+ /**
42
+ * The weight an unweighted slice carries — "as important as any other".
43
+ *
44
+ * The ONLY editorial number left in this module. The judgements that used to
45
+ * live here as `CLASS_PRIORITY = 0.9` / `INDIVIDUAL_PRIORITY = 0.3` are now
46
+ * declared data (`McpListableRef.weight`, derived from `PackLookup.weights`):
47
+ * which of a distribution's classes deserves an agent's attention first is a
48
+ * fact about that distribution's graph, not about the kernel that serves it.
49
+ */
50
+ const DEFAULT_WEIGHT = 1;
51
+ /** The reserved listing entry that explains an unusable store. */
52
+ const SOURCES_URI = "pragma:sources";
53
+ /** The `{+uri}` variable value that addresses {@link SOURCES_URI}. */
54
+ const SOURCES_VARIABLE = "sources";
55
+ /**
56
+ * The media type an entity read RETURNS — and therefore the one the listing
57
+ * ADVERTISES for every entry it mints.
58
+ *
59
+ * One constant, three readers (the template registration, the read body, and
60
+ * each listed entry). The listing promising `application/json` while the read
61
+ * answers Turtle is the same shape of failure as the `recipes:{+uri}` template
62
+ * over `pragma:` URIs: a surface describing content it does not serve.
63
+ */
64
+ const ENTITY_MIME_TYPE = "text/turtle";
65
+ /** The recovery hint is prose about a broken store, not graph content. */
66
+ const RECOVERY_MIME_TYPE = "text/plain";
67
+ /**
68
+ * The `pragma:` URI scheme + the single reserved-expansion template variable.
69
+ *
70
+ * A LITERAL, and it must stay one until the wire identifiers move together.
71
+ * `surface/surface.v2.json` freezes `pragma:{+uri}` as protocol identity, and
72
+ * `buildResourceList` mints `pragma:<prefixed>` for every entry it lists —
73
+ * three writings of one decision. Deriving only this one made a fork advertise
74
+ * `recipes:{+uri}` over a list of 653 `pragma:` URIs: every resource the server
75
+ * offered became unreadable, and the readable form was never advertised.
76
+ * `resources.test.ts` pins the pair through {@link resourceProvider}'s declared
77
+ * surface; `identity.test.ts` masks this template out of its leak scan for the
78
+ * same reason.
79
+ */
80
+ const URI_TEMPLATE = "pragma:{+uri}";
81
+ const TEMPLATE_DESCRIPTION = "Knowledge-graph entities from the local pack, as Turtle. Read any entry by " +
82
+ "its prefixed URI (e.g. pragma:ds:global.component.button); autocomplete " +
83
+ "matches URI or label substrings. A read returns the entity's neighbourhood — " +
84
+ "its own triples, the edges pointing AT it, and its blank nodes inlined. " +
85
+ `Content mirrors \`${BIN_NAME} graph inspect <uri> --format llm\`.`;
86
+ /**
87
+ * The audience every listed resource carries.
88
+ *
89
+ * BOTH roles. `["assistant"]` tells a client that honours the field to hide the
90
+ * resource from its human picker, and browsing a design system in a picker is
91
+ * exactly a human use case — the same entries serve an agent orienting itself
92
+ * and a person looking for the button spec.
93
+ */
94
+ const LISTING_AUDIENCE = ["user", "assistant"];
95
+ /**
96
+ * The human name for an entity, best-available-first.
97
+ *
98
+ * `altNames` is the distribution's declared alternative-name property — the
99
+ * name a bespoke lookup MATCHES on ("Button", "FileTree"). 383 of the embedded
100
+ * pack's 714 entities carry one and no `rdfs:label`, so before this the listing
101
+ * showed them as a bare URI with no description while the readable name sat
102
+ * unused in the index one field away.
103
+ */
104
+ function humanName(entity) {
105
+ return entity.label ?? entity.altNames?.[0] ?? undefined;
106
+ }
107
+ /** Render one index entity as a listed resource at a given weight. */
108
+ function listEntity(entity, weight, instanceCount) {
109
+ const title = humanName(entity);
110
+ // `pragma/box` + `pragma/instanceCount` are FROZEN protocol identity (see
111
+ // `surface.v2.json` and docs/mcp-integration.md). `pragma/type` is an
112
+ // ADDITION: all 714 entities carry a type, and publishing it lets an agent
113
+ // narrow the listing to a family without spending a read to find out what
114
+ // each entry is.
115
+ const meta = {
116
+ "pragma/box": entity.box ?? "abox",
117
+ "pragma/type": entity.type,
118
+ };
119
+ if (typeof instanceCount === "number") {
120
+ meta["pragma/instanceCount"] = instanceCount;
121
+ }
122
+ return {
123
+ uri: `pragma:${entity.prefixed ?? entity.name}`,
124
+ name: entity.prefixed ?? entity.name,
125
+ ...(title ? { title } : {}),
126
+ ...(entity.description ? { description: entity.description } : {}),
127
+ mimeType: ENTITY_MIME_TYPE,
128
+ annotations: { audience: LISTING_AUDIENCE, priority: weight },
129
+ _meta: meta,
130
+ };
131
+ }
132
+ /** The recovery entry a missing/legacy index degrades to (and its read body). */
133
+ const SOURCES_RECOVERY = `No enriched entity index. Run \`${BIN_NAME} sources update\` to build it.`;
134
+ /** The single entry a server with no usable index advertises. */
135
+ function sourcesEntry() {
136
+ return {
137
+ uri: SOURCES_URI,
138
+ name: SOURCES_VARIABLE,
139
+ title: "Store not indexed",
140
+ description: SOURCES_RECOVERY,
141
+ mimeType: RECOVERY_MIME_TYPE,
142
+ };
143
+ }
144
+ /**
145
+ * Resolve one declared slice into listed resources.
146
+ *
147
+ * `as: "collection"` yields at most ONE entry — the class entry for the slice's
148
+ * type, carrying `pragma/instanceCount`. A type the index does not know
149
+ * contributes NOTHING rather than an empty collection: `ds:Token` is declared by
150
+ * a read story but SPARQL-served, never indexed, and advertising an empty
151
+ * collection for it would promise a browse that has nothing to show.
152
+ */
153
+ function listSlice(index, byPrefixed, ref) {
154
+ const weight = ref.weight ?? DEFAULT_WEIGHT;
155
+ if (ref.as === "collection") {
156
+ const type = ref.type;
157
+ if (!type)
158
+ return [];
159
+ const entity = byPrefixed.get(type);
160
+ if (!entity)
161
+ return [];
162
+ // A class with no instances has NO key in `instanceCountByType`, so reading
163
+ // it straight through reports `undefined` — and an empty collection then
164
+ // looks identical to an entry that is not a collection at all. A declared
165
+ // collection whose class the index knows always states a count, and for an
166
+ // empty one that count is zero.
167
+ const count = entity.uri ? (index.instanceCountByType[entity.uri] ?? 0) : 0;
168
+ return [listEntity(entity, weight, count)];
169
+ }
170
+ const listed = [];
171
+ for (const entity of index.entities) {
172
+ if (ref.box && (entity.box ?? "abox") !== ref.box)
173
+ continue;
174
+ if (!matchesType(entity, ref.type ?? ""))
175
+ continue;
176
+ const count = entity.box === "tbox" && entity.uri
177
+ ? index.instanceCountByType[entity.uri]
178
+ : undefined;
179
+ listed.push(listEntity(entity, weight, count));
180
+ }
181
+ return listed;
182
+ }
183
+ /**
184
+ * Build the resource listing from the storeless pack index.
185
+ *
186
+ * @param index - The active pack index, or `undefined` when none is reachable.
187
+ * @param listing - The union of the modules' declared slices.
188
+ * @returns One resource per contributed entry, heaviest slice first; a single
189
+ * recovery entry when the index is missing or pre-v2 (no enrichment).
190
+ */
191
+ export function buildResourceList(index, listing) {
192
+ // readPackIndex returns raw JSON.parse output (no zod), so guard structurally:
193
+ // a malformed index missing `version` must degrade to the recovery hint, not
194
+ // fall through to `[...index.entities]` (a TypeError inside the MCP handler).
195
+ if (!index || index.version !== 2 || !Array.isArray(index.entities)) {
196
+ return [sourcesEntry()];
197
+ }
198
+ const byPrefixed = new Map();
199
+ for (const entity of index.entities) {
200
+ const key = entity.prefixed ?? entity.name;
201
+ // A punned subject is indexed as two facets sharing one key; the schema
202
+ // facet is the one a collection entry means.
203
+ if (!byPrefixed.has(key) || entity.box === "tbox")
204
+ byPrefixed.set(key, entity);
205
+ }
206
+ const candidates = listing.sources.flatMap((ref) => listSlice(index, byPrefixed, ref));
207
+ candidates.sort((a, b) => {
208
+ const priority = (r) => r.annotations?.priority ?? 0;
209
+ const boxRank = (r) => r._meta?.["pragma/box"] === "tbox" ? 0 : 1;
210
+ return (priority(b) - priority(a) ||
211
+ boxRank(a) - boxRank(b) ||
212
+ a.uri.localeCompare(b.uri));
213
+ });
214
+ // Dedup by resource URI. Two slices may contribute the same entry (a story's
215
+ // collection IS one of the ontology's schema entries), and an OWL-punned
216
+ // subject (a class/property IRI ALSO asserted as a domain individual) is
217
+ // indexed as TWO entities — a tbox and an abox facet — that compact to the
218
+ // SAME `pragma:<uri>` (A8). The sort above puts the heavier slice, then the
219
+ // tbox facet, first, so keeping the first occurrence per URI surfaces the
220
+ // richer entry (its instance count and higher priority) and drops the rest.
221
+ const seen = new Set();
222
+ const resources = [];
223
+ for (const candidate of candidates) {
224
+ if (seen.has(candidate.uri))
225
+ continue;
226
+ seen.add(candidate.uri);
227
+ resources.push(candidate);
228
+ }
229
+ return resources;
230
+ }
231
+ /**
232
+ * The per-type ranking weights a declared listing implies.
233
+ *
234
+ * A slice that names a `type` is an opinion about that type's importance, and
235
+ * the SAME opinion should decide both what the listing surfaces first and what
236
+ * autocomplete offers first — one declaration, two readers. A slice that names
237
+ * only a `box` carries no opinion about a candidate URI, so it contributes none.
238
+ *
239
+ * @param listing - The union of the modules' declared slices.
240
+ * @returns Prefixed type → weight (heaviest declaration wins on a repeat).
241
+ */
242
+ export function completionWeights(listing) {
243
+ const weights = {};
244
+ for (const ref of listing.sources) {
245
+ if (!ref.type)
246
+ continue;
247
+ const weight = ref.weight ?? DEFAULT_WEIGHT;
248
+ weights[ref.type] = Math.max(weights[ref.type] ?? 0, weight);
249
+ }
250
+ return weights;
251
+ }
252
+ /**
253
+ * Rank URI autocomplete candidates against a partial query (case-insensitive
254
+ * over both the prefixed URI and the label; exact > prefix > substring).
255
+ *
256
+ * UNCAPPED on purpose. The SDK derives the wire's `total`/`hasMore` from the
257
+ * array this returns — it slices to 100, reports `total: values.length` and
258
+ * `hasMore: values.length > 100` — so pre-truncating here made a truncated
259
+ * result describe itself as complete: `ds:` answered
260
+ * `{ values: 50, total: 50, hasMore: false }` while 499 entities matched.
261
+ * Completion keeps offering EVERY entity: it is the discovery path for the
262
+ * individuals the curated listing no longer enumerates.
263
+ *
264
+ * @param entities - The index entities to rank.
265
+ * @param query - The partial the agent typed.
266
+ * @param weights - Prefixed type → weight, breaking ties between equal matches.
267
+ * @returns Every matching prefixed URI, best first.
268
+ */
269
+ /**
270
+ * The weight of an entity across EVERY type it is declared under.
271
+ *
272
+ * `PackIndexEntity.type` is one lexically chosen primary among `types`, and the
273
+ * listing's own `matchesType` already honours both. Weighing only the primary
274
+ * therefore ignored a weight declared for a secondary type, and let ranking
275
+ * shift when an unrelated, lexically earlier type was added to an entity.
276
+ *
277
+ * The LOWEST declared weight wins: a weight below the default is a demotion, and
278
+ * a demotion that any membership asks for should not be cancelled by another
279
+ * membership that simply never asked for anything. Types with no declared weight
280
+ * do not vote, so an entity nobody weighted keeps the default.
281
+ */
282
+ function effectiveWeight(entity, weights) {
283
+ const memberships = entity.types ?? [entity.type];
284
+ const declared = memberships
285
+ .map((type) => weights[type])
286
+ .filter((weight) => weight !== undefined);
287
+ return declared.length > 0 ? Math.min(...declared) : DEFAULT_WEIGHT;
288
+ }
289
+ export function rankUriCompletions(entities, query, weights = {}) {
290
+ const needle = query.toLowerCase();
291
+ const score = (field) => field === needle
292
+ ? 3
293
+ : field.startsWith(needle)
294
+ ? 2
295
+ : field.includes(needle)
296
+ ? 1
297
+ : 0;
298
+ const scored = [];
299
+ for (const entity of entities) {
300
+ const prefixed = entity.prefixed ?? entity.name;
301
+ const uriScore = score(prefixed.toLowerCase());
302
+ const labelScore = entity.label ? score(entity.label.toLowerCase()) : 0;
303
+ const best = Math.max(uriScore, labelScore);
304
+ if (best > 0) {
305
+ scored.push({
306
+ prefixed,
307
+ score: best,
308
+ weight: effectiveWeight(entity, weights),
309
+ });
310
+ }
311
+ }
312
+ // Match quality first, then the DECLARED weight, then the alphabet. The
313
+ // weight step is what stops 86 `…-close_button` subcomponents from burying
314
+ // `ds:global.component.button` on the strength of their spelling alone.
315
+ scored.sort((a, b) => b.score - a.score ||
316
+ b.weight - a.weight ||
317
+ a.prefixed.localeCompare(b.prefixed));
318
+ const seen = new Set();
319
+ const ranked = [];
320
+ for (const { prefixed } of scored) {
321
+ if (seen.has(prefixed))
322
+ continue;
323
+ seen.add(prefixed);
324
+ ranked.push(prefixed);
325
+ }
326
+ return ranked;
327
+ }
328
+ /**
329
+ * The union of every module's declared listing.
330
+ *
331
+ * @param modules - The effective capability modules.
332
+ * @returns One listing holding every declared slice, in module order.
333
+ */
334
+ export function collectListable(modules) {
335
+ return {
336
+ sources: modules.flatMap((module) => module.mcpListable?.sources ?? []),
337
+ };
338
+ }
339
+ /** Read the single `uri` template variable, tolerating array expansion. */
340
+ function readUriVariable(value) {
341
+ const uri = Array.isArray(value) ? value.at(0) : value;
342
+ if (uri === undefined) {
343
+ throw PragmaError.invalidInput("uri", String(value), {
344
+ recovery: { message: "Provide a prefixed or full entity URI." },
345
+ });
346
+ }
347
+ return uri;
348
+ }
349
+ /** The graph-entity resource provider (registered by buildServer). */
350
+ export const resourceProvider = {
351
+ // The single authoring point for the template id — the surface emitter reads
352
+ // this so `mcpSurface.resources` cannot drift from what `register` installs.
353
+ surface: { templates: [URI_TEMPLATE] },
354
+ async register(server, runtime, modules) {
355
+ const { ResourceTemplate } = await import("@modelcontextprotocol/sdk/server/mcp.js");
356
+ const { McpError, ErrorCode } = await import("@modelcontextprotocol/sdk/types.js");
357
+ // The index of the pack the boot decision names — `undefined` when the
358
+ // store is unavailable, which `buildResourceList` renders as the recovery
359
+ // entry rather than a catalogue of unreadable URIs.
360
+ const activeIndex = async () => readPackIndex(resolveSources(await runtime.loadConfig(), runtime.cwd));
361
+ // What the SERVER lists is the union of what its modules declare — not what
362
+ // this one module knows. Collected once, at registration.
363
+ const listing = collectListable(modules);
364
+ const weights = completionWeights(listing);
365
+ const template = new ResourceTemplate(URI_TEMPLATE, {
366
+ list: async () => ({
367
+ resources: buildResourceList(await activeIndex(), listing),
368
+ }),
369
+ complete: {
370
+ // Uncapped: the SDK slices to 100 and derives `total`/`hasMore` from
371
+ // the full array, so returning it is what makes those numbers honest.
372
+ uri: async (value) => rankUriCompletions((await activeIndex())?.entities ?? [], value, weights),
373
+ },
374
+ });
375
+ server.registerResource("graph-entity", template,
376
+ // `text/turtle` because that is what the body IS. The surface used to
377
+ // claim `application/json` for a graph, and paid ~95 bytes of wrapper per
378
+ // named node to do it — one button read carried ~6.1 KB of pure structure.
379
+ // Turtle spends the prefixes once, writes each term as itself, and says
380
+ // IRI-versus-literal in syntax rather than in a `termType` field.
381
+ { description: TEMPLATE_DESCRIPTION, mimeType: ENTITY_MIME_TYPE }, async (url, variables) => {
382
+ try {
383
+ const uri = readUriVariable(variables.uri);
384
+ // The recovery entry is a real resource, not a label. It is the ONLY
385
+ // thing a server with no usable index advertises, and reading it used
386
+ // to fail `INVALID_INPUT — Invalid uri "sources"`: the one resource on
387
+ // offer refused to be read, so the hint that explains the cold store
388
+ // was unreachable from the surface that showed it.
389
+ if (uri === SOURCES_VARIABLE) {
390
+ return {
391
+ contents: [
392
+ {
393
+ uri: url.href,
394
+ mimeType: RECOVERY_MIME_TYPE,
395
+ text: SOURCES_RECOVERY,
396
+ },
397
+ ],
398
+ };
399
+ }
400
+ const entity = await readEntity(runtime, uri);
401
+ const { prefixes } = await runtime.store.get();
402
+ return {
403
+ contents: [
404
+ {
405
+ uri: url.href,
406
+ mimeType: ENTITY_MIME_TYPE,
407
+ text: toTurtle(entity, prefixes),
408
+ },
409
+ ],
410
+ };
411
+ }
412
+ catch (error) {
413
+ // Surface the failure as a JSON-RPC error (the resource-read analogue
414
+ // of a tool result's `isError`), preserving the machine code AND the
415
+ // recovery in `data` — never swallow it into `text/plain` content an
416
+ // agent reads as a successful entity (which dropped the recovery and
417
+ // masked a cold store as though the entity itself were malformed).
418
+ throw mcpErrorFrom(asPragmaError(error), { McpError, ErrorCode });
419
+ }
420
+ });
421
+ },
422
+ };
423
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../../src/capabilities/resources/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Build the plan: run the target table's detections, then project them into
3
+ * {@link SetupPlan} rows.
4
+ *
5
+ * This is the ONE place a plan comes from. The dry-run, the wizard, the apply
6
+ * phase, the recap and `--format json` all read what this produces, so a row
7
+ * that is missing here is missing everywhere — which is the point: the run-all
8
+ * used to build its choices only from DETECTABLE steps, so a target that could
9
+ * not be offered vanished from the recap and "Setup complete" papered over it.
10
+ * Every selected target is a visible row here, including the ones that skip.
11
+ */
12
+ import { defaultSelected, } from "./plan.js";
13
+ import { supportsScope, TARGETS, } from "./targets.js";
14
+ /** The failure a row's detection ended in, or `undefined` when it settled. */
15
+ export const detectionFailure = (row) => row.failure;
16
+ /** The scopes a `--scope` selection runs, global before project. */
17
+ export const scopesForSelection = (scope) => scope === "both" ? ["global", "project"] : [scope];
18
+ /**
19
+ * The two named roots. The global root is the user's home directory (rendered
20
+ * `~`), the project root is the directory the invocation resolves against.
21
+ *
22
+ * @param rt - The per-invocation runtime.
23
+ * @returns The roots every row path renders relative to.
24
+ * @note Impure — reads the platform environment.
25
+ */
26
+ export async function resolveRoots(rt) {
27
+ const { readPlatformEnv, userHome } = await import("@canonical/harnesses");
28
+ return { global: userHome(readPlatformEnv()), project: rt.cwd };
29
+ }
30
+ /** The cause a rejected detection carries, as one line of copy. */
31
+ const messageOf = (reason) => reason instanceof Error ? reason.message : String(reason);
32
+ /**
33
+ * Detect every requested target in every scope the scope runs.
34
+ *
35
+ * Detections are started together and SETTLED INDEPENDENTLY: they are
36
+ * independent reads, and a run-all that probed five targets serially paid for
37
+ * it on every invocation.
38
+ *
39
+ * Independence is the whole premise, so one detection that throws — an
40
+ * unreadable config, a permission-denied directory — takes only its own row
41
+ * down. Awaiting them as one `Promise.all` meant the first rejection prevented
42
+ * a run from being built at all: none of the other targets ran, and doctor
43
+ * rendered no scoped rows whatsoever. The failed row carries its cause and is
44
+ * reported as a row, which is the same shape a failed COMPOSE already has.
45
+ *
46
+ * @param rt - The per-invocation runtime.
47
+ * @param ids - The targets to plan (all five for the run-all).
48
+ * @param scope - The resolved scope selection.
49
+ * @returns One entry per (target, scope) the scope actually runs.
50
+ * @note Impure — every target's `detect` reads the real filesystem.
51
+ */
52
+ export async function detectTargets(rt, ids, scope) {
53
+ const wanted = TARGETS.filter((target) => ids.includes(target.id));
54
+ const pairs = scopesForSelection(scope).flatMap((scope) => wanted
55
+ .filter((target) => supportsScope(target, scope))
56
+ .map((target) => ({
57
+ target,
58
+ scope,
59
+ })));
60
+ const settled = await Promise.allSettled(pairs.map(({ target, scope }) => target.detect(rt, scope)));
61
+ return pairs.map(({ target, scope }, index) => {
62
+ const outcome = settled[index];
63
+ if (outcome.status === "fulfilled") {
64
+ return { target, scope, detection: outcome.value };
65
+ }
66
+ return {
67
+ target,
68
+ scope,
69
+ detection: undefined,
70
+ failure: messageOf(outcome.reason),
71
+ };
72
+ });
73
+ }
74
+ /**
75
+ * The dim row a target gets when the SELECTED scope cannot hold it — `setup
76
+ * --local` still shows `completions`, saying why it is not in this run. A scope
77
+ * merely filters the run-all: the user asked for a scope, not for that target, so
78
+ * nothing errors, but nothing is silently absent either. (Asking for the
79
+ * impossible scope on the SUB-VERB is a different thing entirely — a typed
80
+ * contradiction, and a usage error.)
81
+ *
82
+ * The reason names the flag that WOULD reach the target, so the row is not a
83
+ * dead end: a reader who wanted `completions` under `--local` is told in the
84
+ * same line that `--global` is where it lives.
85
+ */
86
+ const outOfScopeRow = (target, scope) => ({
87
+ target: target.id,
88
+ scope,
89
+ action: "skip",
90
+ detail: "not part of this scope",
91
+ reason: scope === "project"
92
+ ? "this one is global only — run it with `--global`"
93
+ : "this one is per-project only — run it with `--local`",
94
+ selected: false,
95
+ });
96
+ /**
97
+ * The row a target gets when its own detection threw. It is a `skip` in the
98
+ * PLAN — nothing can be composed from a detection that does not exist — but it
99
+ * is not a quiet one: the reason is the cause, and the apply phase turns it
100
+ * into a `failed` outcome, so the run exits non-zero naming this target rather
101
+ * than reporting a clean sweep over the targets that did settle.
102
+ */
103
+ const failedDetectionRow = (target, scope, failure) => ({
104
+ target: target.id,
105
+ scope,
106
+ action: "skip",
107
+ detail: "detection did not complete",
108
+ reason: failure,
109
+ selected: false,
110
+ });
111
+ /**
112
+ * The draft a detected row produces — the forward plan, or the removal plan.
113
+ * Re-derivable from the detection at any time, which is why the plan row itself
114
+ * stores no remedy: a remedy belongs to an OUTCOME, and the apply phase reads it
115
+ * back from here when it fills one in.
116
+ *
117
+ * @param hit - The detected row.
118
+ * @param roots - The two named roots.
119
+ * @param removal - Whether this invocation removes rather than installs.
120
+ * @returns The target's draft.
121
+ */
122
+ export function draftFor(hit, roots, removal) {
123
+ return removal
124
+ ? hit.target.removalPlan(hit.detection, hit.scope, roots)
125
+ : hit.target.plan(hit.detection, hit.scope, roots);
126
+ }
127
+ /**
128
+ * Project detections into plan rows.
129
+ *
130
+ * @param selection - The resolved scope selection (named in the header).
131
+ * @param roots - The two named roots every path renders relative to.
132
+ * @param detected - The detections, in table order per scope.
133
+ * @param ids - The targets that were REQUESTED, so an out-of-scope one still
134
+ * gets a visible row.
135
+ * @param removal - Build the removal plan (`--undo`) instead of the forward one.
136
+ * @returns The plan.
137
+ */
138
+ export function buildPlan(selection, roots, detected, ids, removal = false) {
139
+ const rows = [];
140
+ for (const scope of scopesForSelection(selection)) {
141
+ for (const target of TARGETS) {
142
+ if (!ids.includes(target.id))
143
+ continue;
144
+ const hit = detected.find((d) => d.target.id === target.id && d.scope === scope);
145
+ if (hit === undefined) {
146
+ // Only worth a line when the target has no row in ANY selected scope —
147
+ // under `--scope both` a global-only target already appears above.
148
+ const elsewhere = detected.some((d) => d.target.id === target.id);
149
+ if (!elsewhere)
150
+ rows.push(outOfScopeRow(target, scope));
151
+ continue;
152
+ }
153
+ const failure = detectionFailure(hit);
154
+ if (failure !== undefined) {
155
+ rows.push(failedDetectionRow(target, scope, failure));
156
+ continue;
157
+ }
158
+ const draft = draftFor(hit, roots, removal);
159
+ rows.push({
160
+ target: target.id,
161
+ scope,
162
+ action: draft.action,
163
+ detail: draft.detail,
164
+ ...(draft.reason === undefined ? {} : { reason: draft.reason }),
165
+ ...(draft.children === undefined ? {} : { children: draft.children }),
166
+ selected: defaultSelected(draft.action),
167
+ });
168
+ }
169
+ }
170
+ return { scope: selection, roots, rows };
171
+ }
172
+ //# sourceMappingURL=buildPlan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildPlan.js","sourceRoot":"","sources":["../../../../src/capabilities/setup/buildPlan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * The `setup` capability barrel.
3
+ */
4
+ export { setupModule } from "./setup.verb.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/capabilities/setup/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}