@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,164 @@
1
+ /**
2
+ * PROTECTED — the shipped-entry `create` guard.
3
+ *
4
+ * Spawns the EMITTED entry the published package points at
5
+ * (`node dist/src/bin.js`) and asserts every `create` noun writes a tree
6
+ * BYTE-IDENTICAL to a source run of the same generator (`bun src/bin.ts …`).
7
+ * The source run is the reference: it reads the `.ejs` templates from disk with
8
+ * no indirection.
9
+ *
10
+ * WHAT THIS REPLACES. Until the distribution stopped shipping a
11
+ * `bun build --compile` executable, this guard covered `create component` only,
12
+ * and its sibling describe pinned the REFUSAL of `create package` /
13
+ * `create application`: those generators call `template({ source })`, summon-core
14
+ * fell through to `readFile(options.source)`, and inside the binary's virtual
15
+ * filesystem that died with `ENOENT … /$bunfs/templates/package.json.ejs` after
16
+ * `mkdir` had already run — a half-made package on the user's disk. The gate
17
+ * existed to turn that crash into a clean refusal.
18
+ *
19
+ * There is no virtual filesystem now. Every generator's templates are real
20
+ * files under its own package, so all three nouns run from the shipped entry and
21
+ * all three are asserted here. THE REFUSAL CASES ARE GONE ON PURPOSE: a test
22
+ * asserting `create package` refuses would now be asserting a defect.
23
+ *
24
+ * The svelte + lit cases stay load-bearing: `types.ts.ejs` / `index.ts.ejs` /
25
+ * `styles.css.ejs` / `stories.ts.ejs` exist in react/, svelte/ AND lit/, so a
26
+ * basename-matching regression could emit the WRONG framework's file. A wrong
27
+ * file differs from the source run → red here.
28
+ */
29
+
30
+ import { execFileSync, spawnSync } from "node:child_process";
31
+ import { mkdtempSync, readdirSync, readFileSync } from "node:fs";
32
+ import { tmpdir } from "node:os";
33
+ import { dirname, join, resolve } from "node:path";
34
+ import { fileURLToPath } from "node:url";
35
+ import { describe, expect, it } from "vitest";
36
+
37
+ const here = dirname(fileURLToPath(import.meta.url));
38
+ const repoRoot = resolve(here, "../../../../../..");
39
+ const cliNextDir = join(repoRoot, "packages/cli/pragma");
40
+ const sourceEntry = join(cliNextDir, "src/bin.ts");
41
+ const shippedEntry = join(cliNextDir, "dist/src/bin.js");
42
+ const freshCwd = (): string => mkdtempSync(join(tmpdir(), "pragma-shipped-"));
43
+
44
+ // `dist/` is provisioned by `testing/perf/globalSetup.ts`, which re-emits it
45
+ // whenever it is missing or older than `src/**`, `scripts/**`, `pragma.conf.ts`
46
+ // or `package.json` — so these tests exercise the current emit without a second
47
+ // `beforeAll` writing `dist/` in place while another worker is spawning it.
48
+
49
+ /** Read a directory tree into a sorted map of relative path → contents. */
50
+ function snapshot(dir: string): Map<string, string> {
51
+ const out = new Map<string, string>();
52
+ const walk = (d: string, base: string): void => {
53
+ for (const entry of readdirSync(d, { withFileTypes: true }).sort((a, b) =>
54
+ a.name.localeCompare(b.name),
55
+ )) {
56
+ const rel = base ? `${base}/${entry.name}` : entry.name;
57
+ if (entry.isDirectory()) walk(join(d, entry.name), rel);
58
+ else out.set(rel, readFileSync(join(d, entry.name), "utf-8"));
59
+ }
60
+ };
61
+ walk(dir, "");
62
+ return out;
63
+ }
64
+
65
+ /**
66
+ * The create invocations under guard — a LITERAL table, deliberately not derived
67
+ * from `create`'s own declaration, so dropping a noun from the surface turns
68
+ * this red rather than silently shrinking the guard.
69
+ *
70
+ * No case installs dependencies (`runInstall` defaults false), so every tree is
71
+ * generator output alone and byte-comparable.
72
+ */
73
+ const CASES: ReadonlyArray<{ label: string; args: readonly string[] }> = [
74
+ ...(["react", "svelte", "lit"] as const).map((framework) => ({
75
+ label: `component ${framework}`,
76
+ // The framework is a PATH SEGMENT, not a flag — `create` mirrors summon's
77
+ // own tree (`summon component react <path>`), so the two CLIs take the
78
+ // same argv.
79
+ args: ["create", "component", framework, "src/components/Widget", "--yes"],
80
+ })),
81
+ {
82
+ label: "package",
83
+ args: ["create", "package", "--name", "@canonical/probe", "--yes"],
84
+ },
85
+ {
86
+ label: "application",
87
+ // `react` is a path segment here too — the declared binding is
88
+ // `application/react`, and the tree mirrors summon's.
89
+ args: ["create", "application", "react", "probeapp", "--yes"],
90
+ },
91
+ ];
92
+
93
+ /** Run one create invocation in its own cwd and snapshot what it wrote. */
94
+ function create(
95
+ command: string,
96
+ prefix: readonly string[],
97
+ args: readonly string[],
98
+ ): Map<string, string> {
99
+ const dir = freshCwd();
100
+ execFileSync(command, [...prefix, ...args], { cwd: dir, stdio: "pipe" });
101
+ return snapshot(dir);
102
+ }
103
+
104
+ describe("shipped pragma create (PROTECTED)", () => {
105
+ for (const { label, args } of CASES) {
106
+ it(`${label}: shipped entry ≡ source run, byte-for-byte`, () => {
107
+ // (1) The shipped entry, exactly as a consumer's `pragma` runs it.
108
+ const shipped = create(process.execPath, [shippedEntry], args);
109
+ // (2) A source run — the reference output.
110
+ const source = create("bun", [sourceEntry], args);
111
+
112
+ // Wrote something. Before the distribution stopped shipping a compiled
113
+ // binary, `package` and `application` wrote NOTHING here — they refused.
114
+ expect(shipped.size).toBeGreaterThan(0);
115
+ // Same file set …
116
+ expect([...shipped.keys()].sort()).toEqual([...source.keys()].sort());
117
+ // … and byte-identical contents.
118
+ for (const [path, content] of shipped) {
119
+ expect(source.get(path), `content of ${path}`).toBe(content);
120
+ }
121
+ }, 180_000);
122
+ }
123
+ });
124
+
125
+ /**
126
+ * PROTECTED — the shipped-entry READ guard (U1-orig).
127
+ *
128
+ * A READ command (`block list`, `--help`) never calls a generator's
129
+ * `generate()`, so — with the generators loading their templates LAZILY on first
130
+ * `generate()` rather than at module-eval — it must never touch a `.ejs` at all.
131
+ * This is the exact gap the create-only smoke above missed: the component
132
+ * generators used to load templates via a top-level `await`, so a READ crashed
133
+ * with `Template not found`. The lazy load makes a READ template-free, and this
134
+ * pins it at the process boundary where an eager load would resurface.
135
+ */
136
+ describe("shipped pragma READ smoke (PROTECTED)", () => {
137
+ // A cold store cleanly reports STORE_UNAVAILABLE (exit 3); `--help` never needs
138
+ // a store (exit 0). Both fully exercise startup + dispatch — the phase where an
139
+ // eager generator template load would have crashed — without a store or writes.
140
+ const READS: ReadonlyArray<{
141
+ args: readonly string[];
142
+ okExit: readonly number[];
143
+ }> = [
144
+ { args: ["block", "list"], okExit: [0, 3] },
145
+ { args: ["--help"], okExit: [0] },
146
+ ];
147
+
148
+ for (const { args, okExit } of READS) {
149
+ it(`\`${args.join(" ")}\` runs without a Template-not-found crash`, () => {
150
+ const result = spawnSync(process.execPath, [shippedEntry, ...args], {
151
+ cwd: freshCwd(),
152
+ stdio: "pipe",
153
+ encoding: "utf-8",
154
+ });
155
+ const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
156
+ // The exact crash the lazy-template fix closes.
157
+ expect(output).not.toMatch(/Template not found/);
158
+ // Nor does it collapse to the internal-bug path (the crash's other tell).
159
+ expect(output).not.toMatch(/Internal error/);
160
+ // It reaches a clean dispatch outcome, not an uncaught startup crash.
161
+ expect(okExit).toContain(result.status);
162
+ }, 30_000);
163
+ }
164
+ });
@@ -10,3 +10,23 @@ import type { CREATE_GENERATORS } from "./constants.js";
10
10
  * heavy generator imports — into the static graph.
11
11
  */
12
12
  export type CreateKind = keyof typeof CREATE_GENERATORS;
13
+
14
+ /**
15
+ * The REGISTERED CLI spelling of one generator prompt, baked into
16
+ * `createSurface.generated.ts` at build time (the build derives it with the
17
+ * same summon-core helpers the mount registers through). Consumers that need
18
+ * only the spelling — completion tokens, the reference's usage lines — read
19
+ * this baked record instead of calling the projection, which keeps the
20
+ * `--help`/`__complete` fast paths free of the registration machinery.
21
+ */
22
+ export interface PromptCliSyntax {
23
+ /**
24
+ * The registered flag token (`--component-path`; a default-true confirm
25
+ * registers ONLY its `--no-<kebab>` form).
26
+ */
27
+ readonly flag: string;
28
+ /** Whether the registered flag takes a value (`--styles` does not). */
29
+ readonly takesValue: boolean;
30
+ /** The prompt name's kebab-case CLI spelling (`componentPath` → `component-path`). */
31
+ readonly kebabName: string;
32
+ }
@@ -30,6 +30,10 @@ if (!standardPack) {
30
30
  const CS = "http://pragma.canonical.com/codestandards#";
31
31
  const PREFIXES = {
32
32
  cs: CS,
33
+ // The store the fixture builds is queried with the story queries verbatim,
34
+ // and the category roll-up names `skos:broader` — a CORE prefix on the real
35
+ // build path (`buildPackPrefixes`), which this in-memory helper does not use.
36
+ skos: "http://www.w3.org/2004/02/skos/core#",
33
37
  owl: "http://www.w3.org/2002/07/owl#",
34
38
  rdfs: "http://www.w3.org/2000/01/rdf-schema#",
35
39
  xsd: "http://www.w3.org/2001/XMLSchema#",
@@ -33,12 +33,14 @@ function declaredShape(verb: VerbSpec): Record<string, unknown> {
33
33
  }
34
34
 
35
35
  describe("the distribution's declared stories (PROTECTED)", () => {
36
- it("declares exactly the five domain nouns", () => {
36
+ it("declares exactly the seven domain nouns", () => {
37
37
  // Every domain noun is now nothing BUT its story (L-OPEN-9), so a renamed
38
38
  // or dropped noun deletes a whole command rather than shrinking one — it
39
39
  // must fail HERE.
40
40
  expect([...declaredStories.keys()].sort()).toEqual([
41
41
  "block",
42
+ "concept",
43
+ "implementation",
42
44
  "modifier",
43
45
  "standard",
44
46
  "tier",
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * `pragma.conf.ts` declares them on the packs that supply them; this is the ONE
5
5
  * place those declarations become capabilities. They come through the SAME door
6
- * a third-party story does — {@link compilePack} — so the mechanism the CLI
6
+ * a third-party story does — {@link compileStoryModule} — so the mechanism the CLI
7
7
  * offers forks is the mechanism the CLI itself runs on.
8
8
  *
9
9
  * They are compiled STATICALLY rather than merged at dispatch on purpose: the
@@ -11,7 +11,7 @@
11
11
  * `surface/surface.v2.json` freezes the emitted surface, so a noun that only
12
12
  * arrived at dispatch would vanish from help and completion on a fresh install.
13
13
  * That is affordable because this module is zod-free and pure — `pragma.conf.ts`
14
- * is inert data and `compilePack` builds specs without touching the store.
14
+ * is inert data and the compiler builds specs without touching the store.
15
15
  *
16
16
  * Config- and package-declared stories still OVERRIDE these at dispatch; the
17
17
  * `story` marker on each module is what tells `assembleEffectiveModules` which
@@ -19,13 +19,13 @@
19
19
  */
20
20
 
21
21
  import conf from "../../pragma.conf.js";
22
- import { compilePack } from "../kernel/packs/compile.js";
22
+ import { compileStoryModule } from "../kernel/packs/compile.js";
23
23
  import {
24
24
  distributionSource,
25
25
  type PackDefinition,
26
26
  } from "../kernel/packs/types.js";
27
- import { DEFAULT_PREFIX_MAP } from "../kernel/render/prefixes.js";
28
- import type { CapabilityModule } from "../kernel/spec/types.js";
27
+ import { DEFAULT_PREFIX_MAP } from "../kernel/render/index.js";
28
+ import type { CapabilityModule } from "../kernel/spec/index.js";
29
29
 
30
30
  /** The read stories `pragma.conf.ts` declares on its packs, by noun. */
31
31
  export const declaredStories: ReadonlyMap<string, PackDefinition> = new Map(
@@ -45,15 +45,10 @@ export const declaredStories: ReadonlyMap<string, PackDefinition> = new Map(
45
45
  export const storyModules: ReadonlyMap<string, CapabilityModule> = new Map(
46
46
  [...declaredStories].map(([noun, story]) => [
47
47
  noun,
48
- {
49
- name: noun,
50
- story: true,
51
- verbs: compilePack(
52
- story,
53
- distributionSource("pragma.conf.ts"),
54
- DEFAULT_PREFIX_MAP,
55
- ),
56
- colophon: story.colophon,
57
- },
48
+ compileStoryModule(
49
+ story,
50
+ distributionSource("pragma.conf.ts"),
51
+ DEFAULT_PREFIX_MAP,
52
+ ),
58
53
  ]),
59
54
  );
@@ -1,10 +1,12 @@
1
1
  import { BIN_NAME } from "../../../constants.js";
2
2
  import { entityTotal } from "../../../kernel/completion/entitySource.js";
3
- import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
3
+ import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
4
4
  import type { CheckResult } from "../types.js";
5
5
 
6
6
  /**
7
- * Check that the ke store boots, reporting the entity total and boot time.
7
+ * Check that the local store boots, reporting the entity total and boot time.
8
+ * The check is NAMED "store" in the report — the same word every other surface
9
+ * uses for it; the ke library it boots through is an implementation detail.
8
10
  *
9
11
  * This is the ONE check that touches the store — it boots the shared lazy store
10
12
  * inside a try/catch, so doctor stays storeless-by-default at the dispatch level
@@ -24,15 +26,15 @@ export async function checkKeStore(rt: PragmaRuntime): Promise<CheckResult> {
24
26
  const total = entityTotal(session.index);
25
27
  const elapsed = Math.round(performance.now() - start);
26
28
  return {
27
- name: "ke store",
29
+ name: "store",
28
30
  status: "pass",
29
31
  detail: `${total.toLocaleString()} entities in ${elapsed}ms`,
30
32
  };
31
33
  } catch {
32
34
  return {
33
- name: "ke store",
35
+ name: "store",
34
36
  status: "fail",
35
- detail: "failed to boot",
37
+ detail: "cannot boot",
36
38
  remedy: `Ensure design-system packs are configured and run \`${BIN_NAME} sources update\`.`,
37
39
  };
38
40
  }
@@ -20,13 +20,15 @@ import {
20
20
  entityTotal,
21
21
  readPackIndex,
22
22
  } from "../../../kernel/completion/entitySource.js";
23
- import { validateStories } from "../../../kernel/packs/collect.js";
24
- import { embeddedManifest } from "../../../kernel/runtime/graphpack/embedded.js";
25
- import { readManifest } from "../../../kernel/runtime/graphpack/manifest.js";
23
+ import { validateStories } from "../../../kernel/packs/index.js";
24
+ import {
25
+ embeddedManifest,
26
+ readManifest,
27
+ } from "../../../kernel/runtime/graphpack/index.js";
26
28
  import { activeStories } from "../../../kernel/runtime/graphpack/stories.js";
29
+ import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
27
30
  import type { SourcesDecision } from "../../../kernel/runtime/resolveSources.js";
28
31
  import { resolveSources } from "../../../kernel/runtime/resolveSources.js";
29
- import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
30
32
  import type { CheckItem, CheckResult } from "../types.js";
31
33
 
32
34
  /**
@@ -58,6 +60,51 @@ function ignoredSuffix(items: readonly CheckItem[]): string {
58
60
  return ` · ${items.length} ${items.length === 1 ? "story" : "stories"} ignored`;
59
61
  }
60
62
 
63
+ /**
64
+ * The answering pack's provenance, one item per pack it was built from.
65
+ *
66
+ * `sourceRef` is a single comma-joined string — `@canonical/design-system@git:
67
+ * d6d8a6c8268cf2bd103e956a2540d6e36bd08d72, @canonical/anatomy-dsl@npm:0.2.2,
68
+ * …` — and printing it whole put four packs and two forty-character SHAs on one
69
+ * line, in a report whose every other multi-part check (`mcp`, `harnesses`)
70
+ * uses the sub-item mechanism. Provenance is the thing a reader is here for
71
+ * when they read this line at all: which revision of which pack answered.
72
+ *
73
+ * The scheme (`git`/`npm`/`self`/`file`) is kept because it says how to move
74
+ * the pin, and a git hash is cut to the seven characters every other tool in
75
+ * this workflow shows. A ref that does not parse is passed through whole rather
76
+ * than dropped — an unreadable provenance is still provenance, and hiding it
77
+ * would be the one failure this check exists to prevent.
78
+ *
79
+ * @param sourceRef - The manifest's comma-joined provenance string.
80
+ * @returns One passing item per pack, in the order the pack records them.
81
+ */
82
+ function packItems(sourceRef: string): CheckItem[] {
83
+ return sourceRef
84
+ .split(",")
85
+ .map((ref) => ref.trim())
86
+ .filter((ref) => ref !== "")
87
+ .map((ref) => {
88
+ const parsed = /^(.+)@(git|npm|self|file|link):(.+)$/.exec(ref);
89
+ if (parsed === null) return { label: ref, status: "pass" as const };
90
+ const [, pack, scheme, revision] = parsed as unknown as [
91
+ string,
92
+ string,
93
+ string,
94
+ string,
95
+ ];
96
+ const short =
97
+ scheme === "git" && /^[0-9a-f]{40}$/.test(revision)
98
+ ? revision.slice(0, 7)
99
+ : revision;
100
+ return {
101
+ label: pack,
102
+ detail: `${scheme} ${short}`,
103
+ status: "pass" as const,
104
+ };
105
+ });
106
+ }
107
+
61
108
  /**
62
109
  * Report which pack answers reads, its provenance, and its entity total.
63
110
  *
@@ -87,13 +134,30 @@ export async function checkPackageRefs(
87
134
  // The pack DOES answer reads, so the check itself passes; the ignored stories
88
135
  // are failing sub-items under it. (A `warn` status would ripple through the
89
136
  // renderer and the DoctorData counts to buy an icon.)
90
- const items = await ignoredStoryItems(decision);
91
- const suffix = ignoredSuffix(items);
137
+ const ignored = await ignoredStoryItems(decision);
138
+ const suffix = ignoredSuffix(ignored);
139
+ const sourceRef =
140
+ decision.kind === "embedded"
141
+ ? embeddedManifest().sourceRef
142
+ : (readManifest(decision.dir)?.sourceRef ?? "");
143
+ // Packs first, then anything wrong with them: the composition is the answer to
144
+ // "which revision am I reading", and a failing story is a note about one of
145
+ // the rows above it.
146
+ const packs = packItems(sourceRef);
147
+ const items = [...packs, ...ignored];
148
+ const composition = `${packs.length} ${packs.length === 1 ? "pack" : "packs"}, ${entities} entities${suffix}`;
149
+
92
150
  if (decision.kind === "embedded") {
93
151
  return {
94
152
  name,
95
153
  status: "pass",
96
- detail: `embedded snapshot @ ${embeddedManifest().sourceRef} — ${entities} entities${suffix} · \`${BIN_NAME} sources update\` to build from the configured packs`,
154
+ // The update hint stays in the DETAIL rather than moving to `remedy`:
155
+ // the renderer prints a remedy only where there is something to fix or
156
+ // to finish, and a snapshot that is answering reads correctly is
157
+ // neither. "shipped with the CLI" rather than "embedded snapshot" — the
158
+ // reader needs to know where these packs came from, not what the build
159
+ // calls the artefact.
160
+ detail: `shipped with the CLI — ${composition} · run \`${BIN_NAME} sources update\` to build from your own configured packs instead`,
97
161
  ...(items.length > 0 ? { items } : {}),
98
162
  };
99
163
  }
@@ -101,7 +165,10 @@ export async function checkPackageRefs(
101
165
  return {
102
166
  name,
103
167
  status: "pass",
104
- detail: `${manifest?.sourceRef ?? decision.contentHash.slice(0, 12)} — ${entities} entities, built ${manifest?.createdAt ?? "?"}${suffix}`,
168
+ detail:
169
+ packs.length > 0
170
+ ? `built ${manifest?.createdAt ?? "?"} — ${composition}`
171
+ : `${decision.contentHash.slice(0, 12)} — ${composition}, built ${manifest?.createdAt ?? "?"}`,
105
172
  ...(items.length > 0 ? { items } : {}),
106
173
  };
107
174
  }
@@ -1,6 +1,6 @@
1
1
  import { BIN_NAME } from "../../../constants.js";
2
- import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
3
- import { detectInstallSource } from "../../shared/packageManager.js";
2
+ import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
3
+ import { detectInstallSource } from "../../shared/index.js";
4
4
  import type { CheckResult } from "../types.js";
5
5
 
6
6
  /**
@@ -2,7 +2,7 @@
2
2
  * `checkShellCompletions` — the doctor check that verifies completions are
3
3
  * installed AND up to date AND functional.
4
4
  *
5
- * Runs against an isolated HOME and a controlled `$SHELL` so the three gates —
5
+ * Runs against an isolated HOME and an injected shell so the gates —
6
6
  * the resolver effect test, the install probe, and the zsh fpath activation
7
7
  * gate — are deterministic. The effect test (gate 1) drives the real
8
8
  * `runComplete` resolver; the install/fpath gates write real files under the
@@ -22,7 +22,12 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest";
22
22
  import { emitScripts } from "../../../kernel/completion/emitScripts.js";
23
23
  import { capabilities } from "../../index.js";
24
24
  import { detectCompletions } from "../../setup/operations/setupCompletions.js";
25
- import { completionScriptPath, type ShellId } from "../../setup/shell.js";
25
+ import {
26
+ completionScriptPath,
27
+ type ShellDetection,
28
+ type ShellId,
29
+ } from "../../setup/shell.js";
30
+ import type { CheckResult } from "../types.js";
26
31
  import { checkShellCompletions } from "./checkShellCompletions.js";
27
32
 
28
33
  const roots: string[] = [];
@@ -33,16 +38,21 @@ const tmp = (): string => {
33
38
  };
34
39
 
35
40
  let prevHome: string | undefined;
36
- let prevShell: string | undefined;
41
+ let prevPath: string | undefined;
37
42
  beforeEach(() => {
38
43
  prevHome = process.env.HOME;
39
- prevShell = process.env.SHELL;
44
+ prevPath = process.env.PATH;
40
45
  process.env.HOME = tmp();
46
+ // The installed script spawns `pragma` for every name context, and the check
47
+ // now verifies that it can. Put one on an isolated PATH so these cases are
48
+ // about the SCRIPT rather than about the host's install.
49
+ const bin = tmp();
50
+ writeFileSync(join(bin, "pragma"), "");
51
+ process.env.PATH = bin;
41
52
  });
42
53
  afterEach(() => {
43
54
  process.env.HOME = prevHome;
44
- if (prevShell === undefined) delete process.env.SHELL;
45
- else process.env.SHELL = prevShell;
55
+ process.env.PATH = prevPath;
46
56
  for (const dir of roots) rmSync(dir, { recursive: true, force: true });
47
57
  roots.length = 0;
48
58
  });
@@ -59,6 +69,20 @@ function installScript(shell: ShellId): void {
59
69
  writeScript(shell, emitScripts(capabilities)[shell]);
60
70
  }
61
71
 
72
+ /**
73
+ * Run the check the way `doctor` does: the `completions` target detects once
74
+ * per invocation and the check reads that one answer, so the test drives the
75
+ * same pairing rather than letting the check re-read behind its own back.
76
+ */
77
+ async function check(cwd: string, shell: ShellId | null): Promise<CheckResult> {
78
+ // The shell is INJECTED rather than forced through `$SHELL`: detection reads
79
+ // the process tree now, and a test that set `$SHELL` was only ever asserting
80
+ // against the login shell — the exact confusion this check exists to catch.
81
+ const detection: ShellDetection =
82
+ shell === null ? { kind: "unknown" } : { kind: "detected", shell };
83
+ return checkShellCompletions(cwd, await detectCompletions(cwd, detection));
84
+ }
85
+
62
86
  /** Write a `.zshrc` that puts ~/.zfunc on fpath. */
63
87
  function wireZfunc(): void {
64
88
  writeFileSync(
@@ -70,35 +94,58 @@ function wireZfunc(): void {
70
94
  describe("checkShellCompletions — effect test (gate 1)", () => {
71
95
  it("passes the resolver gate: `pragma <TAB>` resolves nouns", async () => {
72
96
  // No shell → skip, but only AFTER the resolver answered — the detail proves
73
- // the effect test ran and succeeded.
74
- delete process.env.SHELL;
75
- const result = await checkShellCompletions(tmp());
97
+ // the effect test ran and succeeded. The proof is the same fact worded for
98
+ // a reader ("pragma answers `<TAB>`") rather than as "resolver OK": the
99
+ // gate it pins is unchanged, only the sentence that reports it.
100
+ const result = await check(tmp(), null);
76
101
  expect(result.status).toBe("skip");
77
- expect(result.detail).toMatch(/resolver OK/);
102
+ expect(result.detail).toMatch(/answers `<TAB>`/);
78
103
  });
79
104
  });
80
105
 
81
106
  describe("checkShellCompletions — install probe (gate 2)", () => {
82
- it("fails when $SHELL is set but no script is installed", async () => {
83
- process.env.SHELL = "/usr/bin/bash";
84
- const result = await checkShellCompletions(tmp());
85
- expect(result.status).toBe("fail");
107
+ it("a never-installed script is available (opt-in, not a fault) with the setup command", async () => {
108
+ const result = await check(tmp(), "bash");
109
+ expect(result.status).toBe("available");
86
110
  expect(result.detail).toMatch(/not installed/);
87
111
  expect(result.remedy).toBe("pragma setup completions");
88
112
  });
89
113
 
114
+ it("does not claim a script is installed when the binary is off PATH", async () => {
115
+ // This gate runs before the install probe, so it saw only that the binary
116
+ // does not resolve — and reported `bash script installed, but ...` on a
117
+ // machine where nothing had ever been installed. Anyone invoking this CLI
118
+ // by absolute path lands here, and the row invented the file it exists to
119
+ // report on.
120
+ process.env.PATH = tmp(); // an empty PATH: no binary to find
121
+ const result = await check(tmp(), "bash");
122
+ expect(result.detail).not.toMatch(/script installed/);
123
+ expect(result.detail).toMatch(/is not on PATH/);
124
+ // Nothing was installed, so nothing that exists is broken.
125
+ expect(result.status).toBe("available");
126
+ expect(result.remedy).toMatch(/on your PATH/);
127
+ });
128
+
129
+ it("fails when an INSTALLED script cannot reach the binary", async () => {
130
+ installScript("bash");
131
+ process.env.PATH = tmp();
132
+ const result = await check(tmp(), "bash");
133
+ expect(result.status).toBe("fail");
134
+ expect(result.detail).toMatch(/script installed, but/);
135
+ });
136
+
90
137
  it("passes for bash once the up-to-date script is at its real path", async () => {
91
- process.env.SHELL = "/usr/bin/bash";
92
138
  installScript("bash");
93
- const result = await checkShellCompletions(tmp());
139
+ const result = await check(tmp(), "bash");
94
140
  expect(result.status).toBe("pass");
95
- expect(result.detail).toMatch(/bash up to date and resolving/);
141
+ expect(result.detail).toMatch(
142
+ /bash \(the shell you are in\) — installed, up to date, and completing/,
143
+ );
96
144
  });
97
145
 
98
146
  it("passes for fish once the up-to-date script is at its real path", async () => {
99
- process.env.SHELL = "/usr/bin/fish";
100
147
  installScript("fish");
101
- const result = await checkShellCompletions(tmp());
148
+ const result = await check(tmp(), "fish");
102
149
  expect(result.status).toBe("pass");
103
150
  });
104
151
 
@@ -110,9 +157,8 @@ describe("checkShellCompletions — install probe (gate 2)", () => {
110
157
  // Every user upgrading across a grammar change lands here: the old script
111
158
  // offers the old nouns and misses the new ones, and doctor is the one
112
159
  // command whose job is to say so.
113
- process.env.SHELL = "/usr/bin/bash";
114
160
  writeScript("bash", "# STALE JUNK\n");
115
- const result = await checkShellCompletions(tmp());
161
+ const result = await check(tmp(), "bash");
116
162
  expect(result.status).toBe("fail");
117
163
  expect(result.detail).toMatch(/out of date/);
118
164
  expect(result.remedy).toBe("pragma setup completions");
@@ -127,23 +173,23 @@ describe("checkShellCompletions — install probe (gate 2)", () => {
127
173
  // failure back rather than closing it. The first assertion is the
128
174
  // discriminator — this project really does ask for a different body — so
129
175
  // deleting the config write below turns the test red.
130
- process.env.SHELL = "/usr/bin/bash";
131
176
  installScript("bash");
132
177
  const cwd = tmp();
133
178
  writeFileSync(
134
179
  join(cwd, "pragma.config.ts"),
135
180
  "export default { completion: { minChars: 5 } };\n",
136
181
  );
137
- expect((await detectCompletions(cwd)).state).toBe("stale");
138
- expect((await checkShellCompletions(cwd)).status).toBe("pass");
182
+ expect(
183
+ (await detectCompletions(cwd, { kind: "detected", shell: "bash" })).state,
184
+ ).toBe("stale");
185
+ expect((await check(cwd, "bash")).status).toBe("pass");
139
186
  });
140
187
  });
141
188
 
142
189
  describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
143
190
  it("fails when the zsh script is installed but ~/.zfunc is not on fpath", async () => {
144
- process.env.SHELL = "/usr/bin/zsh";
145
191
  installScript("zsh");
146
- const result = await checkShellCompletions(tmp());
192
+ const result = await check(tmp(), "zsh");
147
193
  expect(result.status).toBe("fail");
148
194
  expect(result.detail).toMatch(/not on your fpath/);
149
195
  // The remedy IS the activation hint — the exact ~/.zshrc lines.
@@ -151,11 +197,12 @@ describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
151
197
  });
152
198
 
153
199
  it("passes once the zsh script is installed AND ~/.zfunc is on fpath", async () => {
154
- process.env.SHELL = "/usr/bin/zsh";
155
200
  installScript("zsh");
156
201
  wireZfunc();
157
- const result = await checkShellCompletions(tmp());
202
+ const result = await check(tmp(), "zsh");
158
203
  expect(result.status).toBe("pass");
159
- expect(result.detail).toMatch(/zsh up to date and resolving/);
204
+ expect(result.detail).toMatch(
205
+ /zsh \(the shell you are in\) — installed, up to date, and completing/,
206
+ );
160
207
  });
161
208
  });