@canonical/pragma-cli 0.18.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 (439) hide show
  1. package/README.md +377 -0
  2. package/package.json +78 -0
  3. package/src/bin.test.ts +52 -0
  4. package/src/bin.ts +19 -0
  5. package/src/compile-validation.runner.ts +137 -0
  6. package/src/compile-validation.ts +192 -0
  7. package/src/completions/computeSocketPath.test.ts +26 -0
  8. package/src/completions/computeSocketPath.ts +16 -0
  9. package/src/completions/constants.ts +18 -0
  10. package/src/completions/handleQuery.test.ts +93 -0
  11. package/src/completions/handleQuery.ts +30 -0
  12. package/src/completions/index.ts +14 -0
  13. package/src/completions/queryCompletions.test.ts +100 -0
  14. package/src/completions/queryCompletions.ts +61 -0
  15. package/src/completions/querySocket.test.ts +70 -0
  16. package/src/completions/querySocket.ts +44 -0
  17. package/src/completions/startCompletionsServer.test.ts +74 -0
  18. package/src/completions/startCompletionsServer.ts +75 -0
  19. package/src/completions/startCompletionsServer.unit.test.ts +131 -0
  20. package/src/completions/waitForSocket.test.ts +27 -0
  21. package/src/completions/waitForSocket.ts +27 -0
  22. package/src/config/configExists.ts +14 -0
  23. package/src/config/index.ts +6 -0
  24. package/src/config/readConfig.test.ts +152 -0
  25. package/src/config/readConfig.ts +64 -0
  26. package/src/config/resolveConfigPath.test.ts +20 -0
  27. package/src/config/resolveConfigPath.ts +11 -0
  28. package/src/config/types.ts +26 -0
  29. package/src/config/writeConfig.ts +49 -0
  30. package/src/constants.ts +78 -0
  31. package/src/domains/block/blockConfig.ts +53 -0
  32. package/src/domains/block/commands/index.ts +4 -0
  33. package/src/domains/block/commands/list.test.ts +111 -0
  34. package/src/domains/block/commands/list.ts +69 -0
  35. package/src/domains/block/commands/lookup.test.ts +187 -0
  36. package/src/domains/block/commands/lookup.ts +199 -0
  37. package/src/domains/block/formatters/index.ts +4 -0
  38. package/src/domains/block/formatters/list.test.ts +107 -0
  39. package/src/domains/block/formatters/list.ts +64 -0
  40. package/src/domains/block/formatters/lookup.test.ts +317 -0
  41. package/src/domains/block/formatters/lookup.ts +354 -0
  42. package/src/domains/block/formatters/types.ts +16 -0
  43. package/src/domains/block/helpers/index.ts +4 -0
  44. package/src/domains/block/helpers/resolveAspects.test.ts +64 -0
  45. package/src/domains/block/helpers/resolveAspects.ts +35 -0
  46. package/src/domains/block/index.ts +25 -0
  47. package/src/domains/block/mcp/index.ts +2 -0
  48. package/src/domains/block/mcp/specs.ts +199 -0
  49. package/src/domains/block/operations/index.ts +4 -0
  50. package/src/domains/block/operations/list.test.ts +80 -0
  51. package/src/domains/block/operations/list.ts +72 -0
  52. package/src/domains/block/operations/lookup.test.ts +108 -0
  53. package/src/domains/block/operations/lookup.ts +359 -0
  54. package/src/domains/block/orchestration/blockEmptyError.ts +19 -0
  55. package/src/domains/block/orchestration/buildBlockFilters.ts +12 -0
  56. package/src/domains/block/orchestration/enrichBlocks.ts +37 -0
  57. package/src/domains/block/orchestration/index.ts +5 -0
  58. package/src/domains/block/orchestration/resolveBlockList.ts +39 -0
  59. package/src/domains/block/orchestration/resolveBlockLookup.ts +21 -0
  60. package/src/domains/block/types.ts +30 -0
  61. package/src/domains/config/commands/channel.test.ts +101 -0
  62. package/src/domains/config/commands/channel.ts +80 -0
  63. package/src/domains/config/commands/index.ts +4 -0
  64. package/src/domains/config/commands/show.test.ts +61 -0
  65. package/src/domains/config/commands/show.ts +51 -0
  66. package/src/domains/config/commands/tier.test.ts +84 -0
  67. package/src/domains/config/commands/tier.ts +78 -0
  68. package/src/domains/config/formatters/channel.test.ts +56 -0
  69. package/src/domains/config/formatters/channel.ts +34 -0
  70. package/src/domains/config/formatters/index.ts +4 -0
  71. package/src/domains/config/formatters/show.test.ts +126 -0
  72. package/src/domains/config/formatters/show.ts +66 -0
  73. package/src/domains/config/formatters/tier.test.ts +70 -0
  74. package/src/domains/config/formatters/tier.ts +40 -0
  75. package/src/domains/config/index.ts +23 -0
  76. package/src/domains/config/mcp/index.ts +2 -0
  77. package/src/domains/config/mcp/specs.ts +108 -0
  78. package/src/domains/config/operations/index.ts +5 -0
  79. package/src/domains/config/operations/show.test.ts +60 -0
  80. package/src/domains/config/operations/show.ts +42 -0
  81. package/src/domains/config/operations/types.ts +13 -0
  82. package/src/domains/config/operations/validateChannel.test.ts +36 -0
  83. package/src/domains/config/operations/validateChannel.ts +24 -0
  84. package/src/domains/config/operations/validateTier.test.ts +56 -0
  85. package/src/domains/config/operations/validateTier.ts +35 -0
  86. package/src/domains/create/commands/component.test.ts +166 -0
  87. package/src/domains/create/commands/component.ts +129 -0
  88. package/src/domains/create/commands/index.ts +3 -0
  89. package/src/domains/create/commands/package.test.ts +35 -0
  90. package/src/domains/create/commands/package.ts +21 -0
  91. package/src/domains/create/index.ts +15 -0
  92. package/src/domains/create/mcp/index.ts +2 -0
  93. package/src/domains/create/mcp/specs.ts +174 -0
  94. package/src/domains/doctor/commands/doctor.test.ts +75 -0
  95. package/src/domains/doctor/commands/doctor.ts +43 -0
  96. package/src/domains/doctor/commands/index.ts +2 -0
  97. package/src/domains/doctor/formatters/doctor.test.ts +117 -0
  98. package/src/domains/doctor/formatters/doctor.ts +84 -0
  99. package/src/domains/doctor/formatters/index.ts +2 -0
  100. package/src/domains/doctor/index.ts +9 -0
  101. package/src/domains/doctor/mcp/index.ts +2 -0
  102. package/src/domains/doctor/mcp/specs.ts +88 -0
  103. package/src/domains/doctor/operations/checks/checkConfigFile.ts +28 -0
  104. package/src/domains/doctor/operations/checks/checkKeStore.ts +38 -0
  105. package/src/domains/doctor/operations/checks/checkMcpConfigured.ts +65 -0
  106. package/src/domains/doctor/operations/checks/checkNodeVersion.ts +25 -0
  107. package/src/domains/doctor/operations/checks/checkPragmaVersion.ts +20 -0
  108. package/src/domains/doctor/operations/checks/checkShellCompletions.ts +42 -0
  109. package/src/domains/doctor/operations/checks/checkSkillsSymlinked.ts +64 -0
  110. package/src/domains/doctor/operations/checks/index.ts +8 -0
  111. package/src/domains/doctor/operations/checks.test.ts +151 -0
  112. package/src/domains/doctor/operations/index.ts +3 -0
  113. package/src/domains/doctor/operations/runChecks.test.ts +89 -0
  114. package/src/domains/doctor/operations/runChecks.ts +38 -0
  115. package/src/domains/doctor/operations/types.ts +20 -0
  116. package/src/domains/graph/commands/index.ts +4 -0
  117. package/src/domains/graph/commands/inspect.test.ts +94 -0
  118. package/src/domains/graph/commands/inspect.ts +63 -0
  119. package/src/domains/graph/commands/query.test.ts +92 -0
  120. package/src/domains/graph/commands/query.ts +60 -0
  121. package/src/domains/graph/formatters/index.ts +4 -0
  122. package/src/domains/graph/formatters/inspect.ts +45 -0
  123. package/src/domains/graph/formatters/query.ts +37 -0
  124. package/src/domains/graph/helpers/index.ts +3 -0
  125. package/src/domains/graph/helpers/resolveUri.ts +70 -0
  126. package/src/domains/graph/index.ts +22 -0
  127. package/src/domains/graph/mcp/index.ts +2 -0
  128. package/src/domains/graph/mcp/specs.ts +82 -0
  129. package/src/domains/graph/operations/executeQuery.test.ts +68 -0
  130. package/src/domains/graph/operations/executeQuery.ts +32 -0
  131. package/src/domains/graph/operations/index.ts +4 -0
  132. package/src/domains/graph/operations/inspectUri.test.ts +101 -0
  133. package/src/domains/graph/operations/inspectUri.ts +61 -0
  134. package/src/domains/info/commands/index.ts +4 -0
  135. package/src/domains/info/commands/info.test.ts +88 -0
  136. package/src/domains/info/commands/info.ts +47 -0
  137. package/src/domains/info/commands/upgrade.test.ts +183 -0
  138. package/src/domains/info/commands/upgrade.ts +150 -0
  139. package/src/domains/info/constants.test.ts +22 -0
  140. package/src/domains/info/constants.ts +15 -0
  141. package/src/domains/info/formatters/index.ts +8 -0
  142. package/src/domains/info/formatters/info.test.ts +173 -0
  143. package/src/domains/info/formatters/info.ts +116 -0
  144. package/src/domains/info/formatters/upgrade.test.ts +133 -0
  145. package/src/domains/info/formatters/upgrade.ts +68 -0
  146. package/src/domains/info/index.ts +7 -0
  147. package/src/domains/info/operations/checkRegistryVersion.test.ts +124 -0
  148. package/src/domains/info/operations/checkRegistryVersion.ts +45 -0
  149. package/src/domains/info/operations/collectInfo.test.ts +111 -0
  150. package/src/domains/info/operations/collectInfo.ts +68 -0
  151. package/src/domains/info/operations/collectStoreSummary.test.ts +61 -0
  152. package/src/domains/info/operations/collectStoreSummary.ts +42 -0
  153. package/src/domains/info/operations/index.ts +5 -0
  154. package/src/domains/info/types.test-d.ts +35 -0
  155. package/src/domains/info/types.ts +46 -0
  156. package/src/domains/llm/commands/index.ts +3 -0
  157. package/src/domains/llm/commands/llm.ts +37 -0
  158. package/src/domains/llm/data/commandReference.ts +25 -0
  159. package/src/domains/llm/data/decisionTrees.ts +46 -0
  160. package/src/domains/llm/data/index.ts +4 -0
  161. package/src/domains/llm/formatters/index.ts +3 -0
  162. package/src/domains/llm/formatters/orientation.ts +53 -0
  163. package/src/domains/llm/index.ts +8 -0
  164. package/src/domains/llm/llmCommand.test.ts +93 -0
  165. package/src/domains/llm/mcp/index.ts +2 -0
  166. package/src/domains/llm/mcp/specs.ts +87 -0
  167. package/src/domains/llm/operations/collectContext.ts +47 -0
  168. package/src/domains/llm/operations/index.ts +3 -0
  169. package/src/domains/llm/types.ts +32 -0
  170. package/src/domains/modifier/commands/index.ts +4 -0
  171. package/src/domains/modifier/commands/list.test.ts +57 -0
  172. package/src/domains/modifier/commands/list.ts +33 -0
  173. package/src/domains/modifier/commands/lookup.test.ts +91 -0
  174. package/src/domains/modifier/commands/lookup.ts +105 -0
  175. package/src/domains/modifier/formatters/index.ts +4 -0
  176. package/src/domains/modifier/formatters/list.test.ts +38 -0
  177. package/src/domains/modifier/formatters/list.ts +35 -0
  178. package/src/domains/modifier/formatters/lookup.test.ts +33 -0
  179. package/src/domains/modifier/formatters/lookup.ts +38 -0
  180. package/src/domains/modifier/index.ts +22 -0
  181. package/src/domains/modifier/mcp/index.ts +2 -0
  182. package/src/domains/modifier/mcp/specs.ts +97 -0
  183. package/src/domains/modifier/operations/index.ts +4 -0
  184. package/src/domains/modifier/operations/list.test.ts +39 -0
  185. package/src/domains/modifier/operations/list.ts +41 -0
  186. package/src/domains/modifier/operations/lookup.test.ts +37 -0
  187. package/src/domains/modifier/operations/lookup.ts +57 -0
  188. package/src/domains/modifier/orchestration/index.ts +3 -0
  189. package/src/domains/modifier/orchestration/modifierEmptyError.ts +10 -0
  190. package/src/domains/modifier/orchestration/resolveModifierList.ts +16 -0
  191. package/src/domains/modifier/orchestration/resolveModifierLookup.ts +20 -0
  192. package/src/domains/modifier/types.ts +5 -0
  193. package/src/domains/ontology/commands/index.ts +4 -0
  194. package/src/domains/ontology/commands/list.test.ts +82 -0
  195. package/src/domains/ontology/commands/list.ts +46 -0
  196. package/src/domains/ontology/commands/show.test.ts +103 -0
  197. package/src/domains/ontology/commands/show.ts +66 -0
  198. package/src/domains/ontology/formatters/index.ts +4 -0
  199. package/src/domains/ontology/formatters/list.ts +37 -0
  200. package/src/domains/ontology/formatters/show.ts +74 -0
  201. package/src/domains/ontology/helpers/findNamespace.ts +23 -0
  202. package/src/domains/ontology/helpers/index.ts +7 -0
  203. package/src/domains/ontology/helpers/queryClasses.ts +50 -0
  204. package/src/domains/ontology/helpers/queryProperties.ts +57 -0
  205. package/src/domains/ontology/helpers/resolvePrefix.ts +45 -0
  206. package/src/domains/ontology/index.ts +26 -0
  207. package/src/domains/ontology/mcp/index.ts +2 -0
  208. package/src/domains/ontology/mcp/specs.ts +93 -0
  209. package/src/domains/ontology/operations/index.ts +5 -0
  210. package/src/domains/ontology/operations/listOntologies.test.ts +45 -0
  211. package/src/domains/ontology/operations/listOntologies.ts +101 -0
  212. package/src/domains/ontology/operations/showOntology.test.ts +65 -0
  213. package/src/domains/ontology/operations/showOntology.ts +41 -0
  214. package/src/domains/ontology/operations/showOntologyRaw.test.ts +39 -0
  215. package/src/domains/ontology/operations/showOntologyRaw.ts +50 -0
  216. package/src/domains/setup/commands/all.ts +58 -0
  217. package/src/domains/setup/commands/completions.ts +85 -0
  218. package/src/domains/setup/commands/entrypoints.test.ts +170 -0
  219. package/src/domains/setup/commands/index.ts +6 -0
  220. package/src/domains/setup/commands/lsp.ts +49 -0
  221. package/src/domains/setup/commands/mcp.ts +119 -0
  222. package/src/domains/setup/commands/skills.test.ts +64 -0
  223. package/src/domains/setup/commands/skills.ts +106 -0
  224. package/src/domains/setup/formatters/index.ts +2 -0
  225. package/src/domains/setup/formatters/skills.test.ts +103 -0
  226. package/src/domains/setup/formatters/skills.ts +112 -0
  227. package/src/domains/setup/formatters/types.ts +7 -0
  228. package/src/domains/setup/helpers/completionScripts.test.ts +58 -0
  229. package/src/domains/setup/helpers/completionScripts.ts +92 -0
  230. package/src/domains/setup/helpers/constants.ts +2 -0
  231. package/src/domains/setup/helpers/detectShell.test.ts +48 -0
  232. package/src/domains/setup/helpers/detectShell.ts +20 -0
  233. package/src/domains/setup/helpers/index.ts +12 -0
  234. package/src/domains/setup/helpers/runSetupTask.test.ts +279 -0
  235. package/src/domains/setup/helpers/runSetupTask.ts +229 -0
  236. package/src/domains/setup/index.ts +33 -0
  237. package/src/domains/setup/operations/index.ts +6 -0
  238. package/src/domains/setup/operations/setupAll.test.ts +48 -0
  239. package/src/domains/setup/operations/setupAll.ts +41 -0
  240. package/src/domains/setup/operations/setupCompletions.test.ts +94 -0
  241. package/src/domains/setup/operations/setupCompletions.ts +54 -0
  242. package/src/domains/setup/operations/setupLsp.test.ts +29 -0
  243. package/src/domains/setup/operations/setupLsp.ts +17 -0
  244. package/src/domains/setup/operations/setupMcp.test.ts +115 -0
  245. package/src/domains/setup/operations/setupMcp.ts +108 -0
  246. package/src/domains/setup/operations/setupSkills.test.ts +191 -0
  247. package/src/domains/setup/operations/setupSkills.ts +160 -0
  248. package/src/domains/setup/types.ts +18 -0
  249. package/src/domains/shared/ToolSpec.ts +49 -0
  250. package/src/domains/shared/bootStore.ts +77 -0
  251. package/src/domains/shared/buildQuery.ts +18 -0
  252. package/src/domains/shared/compactUri.test.ts +21 -0
  253. package/src/domains/shared/compactUri.ts +16 -0
  254. package/src/domains/shared/context.ts +15 -0
  255. package/src/domains/shared/contracts.ts +113 -0
  256. package/src/domains/shared/extractLocalName.test.ts +21 -0
  257. package/src/domains/shared/extractLocalName.ts +14 -0
  258. package/src/domains/shared/filters/buildChannelFilter.test.ts +52 -0
  259. package/src/domains/shared/filters/buildChannelFilter.ts +41 -0
  260. package/src/domains/shared/filters/buildFilterConfig.ts +16 -0
  261. package/src/domains/shared/filters/buildFilters.test.ts +33 -0
  262. package/src/domains/shared/filters/buildFilters.ts +30 -0
  263. package/src/domains/shared/filters/buildTierFilter.test.ts +78 -0
  264. package/src/domains/shared/filters/buildTierFilter.ts +69 -0
  265. package/src/domains/shared/filters/describeFilters.ts +14 -0
  266. package/src/domains/shared/filters/index.ts +10 -0
  267. package/src/domains/shared/formatters.ts +35 -0
  268. package/src/domains/shared/lookupMany.ts +45 -0
  269. package/src/domains/shared/namespaces.ts +18 -0
  270. package/src/domains/shared/packages.ts +76 -0
  271. package/src/domains/shared/prefixes.ts +37 -0
  272. package/src/domains/shared/runtime.ts +62 -0
  273. package/src/domains/shared/types.test-d.ts +127 -0
  274. package/src/domains/shared/types.ts +348 -0
  275. package/src/domains/skill/commands/index.ts +2 -0
  276. package/src/domains/skill/commands/list.test.ts +111 -0
  277. package/src/domains/skill/commands/list.ts +69 -0
  278. package/src/domains/skill/formatters/index.ts +2 -0
  279. package/src/domains/skill/formatters/list.test.ts +140 -0
  280. package/src/domains/skill/formatters/list.ts +119 -0
  281. package/src/domains/skill/formatters/types.ts +8 -0
  282. package/src/domains/skill/helpers/index.ts +6 -0
  283. package/src/domains/skill/helpers/parseFrontmatter.test.ts +122 -0
  284. package/src/domains/skill/helpers/parseFrontmatter.ts +112 -0
  285. package/src/domains/skill/helpers/resolveSkillSources.ts +34 -0
  286. package/src/domains/skill/index.ts +19 -0
  287. package/src/domains/skill/mcp/index.ts +2 -0
  288. package/src/domains/skill/mcp/specs.ts +38 -0
  289. package/src/domains/skill/operations/discover.test.ts +145 -0
  290. package/src/domains/skill/operations/discover.ts +68 -0
  291. package/src/domains/skill/operations/index.ts +4 -0
  292. package/src/domains/skill/operations/list.test.ts +68 -0
  293. package/src/domains/skill/operations/list.ts +47 -0
  294. package/src/domains/skill/types.ts +25 -0
  295. package/src/domains/standard/commands/categories.test.ts +70 -0
  296. package/src/domains/standard/commands/categories.ts +48 -0
  297. package/src/domains/standard/commands/index.ts +5 -0
  298. package/src/domains/standard/commands/list.test.ts +105 -0
  299. package/src/domains/standard/commands/list.ts +81 -0
  300. package/src/domains/standard/commands/lookup.test.ts +135 -0
  301. package/src/domains/standard/commands/lookup.ts +127 -0
  302. package/src/domains/standard/formatters/categories.test.ts +44 -0
  303. package/src/domains/standard/formatters/categories.ts +38 -0
  304. package/src/domains/standard/formatters/index.ts +6 -0
  305. package/src/domains/standard/formatters/list.test.ts +166 -0
  306. package/src/domains/standard/formatters/list.ts +156 -0
  307. package/src/domains/standard/formatters/lookup.test.ts +95 -0
  308. package/src/domains/standard/formatters/lookup.ts +86 -0
  309. package/src/domains/standard/formatters/types.ts +31 -0
  310. package/src/domains/standard/index.ts +32 -0
  311. package/src/domains/standard/mcp/index.ts +2 -0
  312. package/src/domains/standard/mcp/specs.ts +197 -0
  313. package/src/domains/standard/operations/categories.test.ts +61 -0
  314. package/src/domains/standard/operations/categories.ts +38 -0
  315. package/src/domains/standard/operations/index.ts +5 -0
  316. package/src/domains/standard/operations/list.test.ts +75 -0
  317. package/src/domains/standard/operations/list.ts +64 -0
  318. package/src/domains/standard/operations/lookup.test.ts +58 -0
  319. package/src/domains/standard/operations/lookup.ts +142 -0
  320. package/src/domains/standard/orchestration/buildStandardFilters.ts +11 -0
  321. package/src/domains/standard/orchestration/index.ts +4 -0
  322. package/src/domains/standard/orchestration/resolveStandardList.ts +42 -0
  323. package/src/domains/standard/orchestration/resolveStandardLookup.ts +20 -0
  324. package/src/domains/standard/orchestration/standardEmptyError.ts +19 -0
  325. package/src/domains/standard/types.ts +15 -0
  326. package/src/domains/tier/commands/index.ts +3 -0
  327. package/src/domains/tier/commands/list.test.ts +67 -0
  328. package/src/domains/tier/commands/list.ts +43 -0
  329. package/src/domains/tier/formatters/index.ts +3 -0
  330. package/src/domains/tier/formatters/list.test.ts +33 -0
  331. package/src/domains/tier/formatters/list.ts +40 -0
  332. package/src/domains/tier/index.ts +17 -0
  333. package/src/domains/tier/mcp/index.ts +2 -0
  334. package/src/domains/tier/mcp/specs.ts +38 -0
  335. package/src/domains/tier/operations/index.ts +3 -0
  336. package/src/domains/tier/operations/list.test.ts +32 -0
  337. package/src/domains/tier/operations/list.ts +33 -0
  338. package/src/domains/token/commands/add-config.test.ts +68 -0
  339. package/src/domains/token/commands/add-config.ts +62 -0
  340. package/src/domains/token/commands/index.ts +5 -0
  341. package/src/domains/token/commands/list.test.ts +82 -0
  342. package/src/domains/token/commands/list.ts +45 -0
  343. package/src/domains/token/commands/lookup.test.ts +125 -0
  344. package/src/domains/token/commands/lookup.ts +121 -0
  345. package/src/domains/token/formatters/index.ts +4 -0
  346. package/src/domains/token/formatters/list.test.ts +37 -0
  347. package/src/domains/token/formatters/list.ts +37 -0
  348. package/src/domains/token/formatters/lookup.test.ts +61 -0
  349. package/src/domains/token/formatters/lookup.ts +72 -0
  350. package/src/domains/token/index.ts +32 -0
  351. package/src/domains/token/mcp/index.ts +2 -0
  352. package/src/domains/token/mcp/specs.ts +145 -0
  353. package/src/domains/token/operations/add-config.test.ts +68 -0
  354. package/src/domains/token/operations/add-config.ts +61 -0
  355. package/src/domains/token/operations/index.ts +7 -0
  356. package/src/domains/token/operations/list.test.ts +50 -0
  357. package/src/domains/token/operations/list.ts +52 -0
  358. package/src/domains/token/operations/lookup.test.ts +42 -0
  359. package/src/domains/token/operations/lookup.ts +66 -0
  360. package/src/domains/token/orchestration/index.ts +3 -0
  361. package/src/domains/token/orchestration/resolveTokenList.ts +17 -0
  362. package/src/domains/token/orchestration/resolveTokenLookup.ts +20 -0
  363. package/src/domains/token/orchestration/tokenEmptyError.ts +17 -0
  364. package/src/domains/token/types.ts +6 -0
  365. package/src/error/PragmaError.test.ts +121 -0
  366. package/src/error/PragmaError.ts +164 -0
  367. package/src/error/constants.ts +12 -0
  368. package/src/error/index.ts +4 -0
  369. package/src/error/types.ts +41 -0
  370. package/src/index.ts +141 -0
  371. package/src/mcp/createMcpServer.test.ts +41 -0
  372. package/src/mcp/createMcpServer.ts +53 -0
  373. package/src/mcp/error/buildRecovery.test.ts +37 -0
  374. package/src/mcp/error/buildRecovery.ts +17 -0
  375. package/src/mcp/error/index.ts +12 -0
  376. package/src/mcp/error/serializeError.test.ts +121 -0
  377. package/src/mcp/error/serializeError.ts +31 -0
  378. package/src/mcp/error/serializeErrorPayload.test.ts +38 -0
  379. package/src/mcp/error/serializeErrorPayload.ts +27 -0
  380. package/src/mcp/error/types.ts +51 -0
  381. package/src/mcp/index.ts +15 -0
  382. package/src/mcp/registerResources.test.ts +236 -0
  383. package/src/mcp/registerResources.ts +303 -0
  384. package/src/mcp/runMcpServer.test.ts +66 -0
  385. package/src/mcp/runMcpServer.ts +24 -0
  386. package/src/mcp/tools/index.ts +55 -0
  387. package/src/mcp/tools/registerFromSpec.ts +97 -0
  388. package/src/mcp/tools/registerTools.test.ts +1124 -0
  389. package/src/mcp/types.ts +62 -0
  390. package/src/mcp/utils/estimateTokens.test.ts +14 -0
  391. package/src/mcp/utils/estimateTokens.ts +9 -0
  392. package/src/mcp/utils/index.ts +11 -0
  393. package/src/mcp/utils/wrapTool.test.ts +108 -0
  394. package/src/mcp/utils/wrapTool.ts +81 -0
  395. package/src/package-manager/constants.ts +29 -0
  396. package/src/package-manager/detectInstallSource.test.ts +23 -0
  397. package/src/package-manager/detectInstallSource.ts +111 -0
  398. package/src/package-manager/detectLocalInstall.test.ts +16 -0
  399. package/src/package-manager/detectLocalInstall.ts +43 -0
  400. package/src/package-manager/detectPackageManager.test.ts +81 -0
  401. package/src/package-manager/detectPackageManager.ts +30 -0
  402. package/src/package-manager/index.ts +6 -0
  403. package/src/package-manager/types.ts +12 -0
  404. package/src/pipeline/collectCommands.test.ts +37 -0
  405. package/src/pipeline/collectCommands.ts +47 -0
  406. package/src/pipeline/constants.ts +14 -0
  407. package/src/pipeline/createProgram.test.ts +112 -0
  408. package/src/pipeline/createProgram.ts +70 -0
  409. package/src/pipeline/formatTerminal.test.ts +43 -0
  410. package/src/pipeline/formatTerminal.ts +53 -0
  411. package/src/pipeline/index.ts +19 -0
  412. package/src/pipeline/mapExitCode.test.ts +41 -0
  413. package/src/pipeline/mapExitCode.ts +12 -0
  414. package/src/pipeline/parseGlobalFlags.ts +21 -0
  415. package/src/pipeline/renderError.test.ts +151 -0
  416. package/src/pipeline/renderError.ts +114 -0
  417. package/src/pipeline/resolveCommandKind.test.ts +68 -0
  418. package/src/pipeline/resolveCommandKind.ts +71 -0
  419. package/src/pipeline/runCli.orchestration.test.ts +418 -0
  420. package/src/pipeline/runCli.test.ts +70 -0
  421. package/src/pipeline/runCli.ts +215 -0
  422. package/src/pipeline/types.ts +17 -0
  423. package/src/testing/cli.ts +43 -0
  424. package/src/testing/createTestMcpClient.ts +64 -0
  425. package/src/testing/dsFixtures.ts +506 -0
  426. package/src/testing/fixtures/canonical-config.json +4 -0
  427. package/src/testing/fixtures/canonical.ttl +437 -0
  428. package/src/testing/fixtures/filtered-config.json +4 -0
  429. package/src/testing/fixtures.ts +34 -0
  430. package/src/testing/helpers/assertParity.ts +28 -0
  431. package/src/testing/helpers/createTestMcpClient.ts +40 -0
  432. package/src/testing/helpers/createTestRuntime.ts +67 -0
  433. package/src/testing/index.ts +8 -0
  434. package/src/testing/integration/agent-session.test.ts +148 -0
  435. package/src/testing/integration/boot.test.ts +67 -0
  436. package/src/testing/integration/mcp-surface.test.ts +574 -0
  437. package/src/testing/integration/parity.test.ts +192 -0
  438. package/src/testing/store.ts +39 -0
  439. package/src/testing/types.ts +20 -0
package/README.md ADDED
@@ -0,0 +1,377 @@
1
+ # @canonical/pragma-cli
2
+
3
+ CLI and MCP server for Canonical's design system. Query blocks, standards, modifiers, tokens, tiers, ontologies, and skills from the terminal or your AI editor.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ bun add -g @canonical/pragma-cli
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```bash
14
+ pragma --help # Show all commands
15
+ pragma block list # List design system blocks
16
+ pragma block lookup Button # Detailed block info
17
+ pragma standard list # List code standards
18
+ pragma setup mcp # Configure MCP for your editor
19
+ ```
20
+
21
+ See [docs/getting-started.md](docs/getting-started.md) for a full walkthrough.
22
+
23
+ ## CLI Commands
24
+
25
+ pragma organizes commands into 14 domains. Every command supports three output modes: plain text (default), `--llm` (condensed Markdown), and `--format json` (structured JSON).
26
+
27
+ ### Block
28
+
29
+ | Command | Description |
30
+ |---------|-------------|
31
+ | `pragma block list` | List all blocks (components) visible under current tier/channel |
32
+ | `pragma block lookup <name>` | Show detailed block info: anatomy, modifiers, tokens, standards |
33
+
34
+ ### Standard
35
+
36
+ | Command | Description |
37
+ |---------|-------------|
38
+ | `pragma standard list` | List all code standards |
39
+ | `pragma standard lookup <name>` | Show standard with do/don't examples |
40
+ | `pragma standard categories` | List standard categories with counts |
41
+
42
+ ### Modifier
43
+
44
+ | Command | Description |
45
+ |---------|-------------|
46
+ | `pragma modifier list` | List all modifier families |
47
+ | `pragma modifier lookup <name>` | Show modifier family with values |
48
+
49
+ ### Token
50
+
51
+ | Command | Description |
52
+ |---------|-------------|
53
+ | `pragma token list` | List all design tokens |
54
+ | `pragma token lookup <name>` | Show token with theme values |
55
+ | `pragma token add-config` | Add Terrazzo config for token build |
56
+
57
+ ### Tier
58
+
59
+ | Command | Description |
60
+ |---------|-------------|
61
+ | `pragma tier list` | List all tiers in the tier hierarchy |
62
+
63
+ ### Ontology
64
+
65
+ | Command | Description |
66
+ |---------|-------------|
67
+ | `pragma ontology list` | List loaded ontology namespaces |
68
+ | `pragma ontology show <prefix>` | Show classes and properties for a namespace |
69
+
70
+ ### Graph
71
+
72
+ | Command | Description |
73
+ |---------|-------------|
74
+ | `pragma graph query <sparql>` | Execute a raw SPARQL query against the ke store |
75
+ | `pragma graph inspect <uri>` | Inspect all triples for a given URI |
76
+
77
+ ### Config
78
+
79
+ | Command | Description |
80
+ |---------|-------------|
81
+ | `pragma config show` | Show current configuration (tier, channel) |
82
+ | `pragma config tier <path>` | Set the project's tier |
83
+ | `pragma config channel <name>` | Set the release channel |
84
+
85
+ ### Skill
86
+
87
+ | Command | Description |
88
+ |---------|-------------|
89
+ | `pragma skill list` | List discovered agent skills from installed packages |
90
+
91
+ ### LLM
92
+
93
+ | Command | Description |
94
+ |---------|-------------|
95
+ | `pragma llm` | Print LLM orientation context (decision trees, command reference) |
96
+
97
+ ### Setup
98
+
99
+ All setup commands support `--dry-run`, `--yes`, and `--undo`.
100
+
101
+ | Command | Description |
102
+ |---------|-------------|
103
+ | `pragma setup all` | Run all setup steps (MCP + completions + skills) |
104
+ | `pragma setup mcp` | Configure pragma MCP server for AI harnesses |
105
+ | `pragma setup completions` | Install shell completions (bash/zsh/fish) |
106
+ | `pragma setup skills` | Symlink agent skills into harness config |
107
+ | `pragma setup lsp` | Configure LSP integration |
108
+
109
+ ### Create
110
+
111
+ Create commands scaffold new code using summon generators. They support `--undo` to reverse.
112
+
113
+ | Command | Description |
114
+ |---------|-------------|
115
+ | `pragma create component <name>` | Scaffold a new design system component |
116
+ | `pragma create package <name>` | Scaffold a new monorepo package |
117
+
118
+ ### Doctor
119
+
120
+ | Command | Description |
121
+ |---------|-------------|
122
+ | `pragma doctor` | Run diagnostic checks on your pragma installation |
123
+
124
+ ### Info
125
+
126
+ | Command | Description |
127
+ |---------|-------------|
128
+ | `pragma info` | Show pragma version, store summary, installed packages |
129
+ | `pragma info upgrade` | Check for newer pragma versions on the registry |
130
+
131
+ ## Global Flags
132
+
133
+ | Flag | Description |
134
+ |------|-------------|
135
+ | `--llm` | Condensed Markdown output for LLM consumption |
136
+ | `--format json` | Structured JSON output |
137
+ | `--verbose` | Diagnostic output to stderr |
138
+
139
+ ## The `--undo` Flag
140
+
141
+ Setup and create commands support `--undo` to reverse previous operations. The undo interpreter walks the task tree produced by the original command, collects all registered undo steps, and executes them in reverse order.
142
+
143
+ ```bash
144
+ pragma setup mcp --undo # Remove MCP configuration
145
+ pragma setup completions --undo # Remove shell completions
146
+ pragma create component Foo --undo # Remove scaffolded component files
147
+ ```
148
+
149
+ ## MCP Integration
150
+
151
+ pragma ships a built-in MCP server accessible via `pragma mcp` (stdio transport). See [docs/mcp-integration.md](docs/mcp-integration.md) for the complete integration guide.
152
+
153
+ ### Setup
154
+
155
+ ```bash
156
+ pragma setup mcp # Auto-detect harness and configure
157
+ pragma setup mcp --claude-code # Configure for Claude Code only
158
+ pragma setup mcp --cursor # Configure for Cursor only
159
+ pragma setup mcp --windsurf # Configure for Windsurf only
160
+ ```
161
+
162
+ Or add manually to your `.mcp.json`:
163
+
164
+ ```json
165
+ {
166
+ "mcpServers": {
167
+ "pragma": {
168
+ "command": "pragma",
169
+ "args": ["mcp"],
170
+ "type": "stdio"
171
+ }
172
+ }
173
+ }
174
+ ```
175
+
176
+ ### MCP Tools (29)
177
+
178
+ All tools return a consistent envelope: `{ ok: true, data, meta }` for success, `{ ok: true, condensed: true, text, tokens }` for condensed mode, or `{ ok: false, error }` with structured recovery on failure.
179
+
180
+ #### Read Tools (20)
181
+
182
+ | Tool | Description |
183
+ |------|-------------|
184
+ | `block_list` | List blocks with optional tier filtering and disclosure levels |
185
+ | `block_lookup` | Look up detailed block info (anatomy, modifiers, tokens, standards) |
186
+ | `block_batch_lookup` | Look up multiple blocks by name in a single call |
187
+ | `standard_list` | List code standards with optional category/search filtering |
188
+ | `standard_lookup` | Look up standard with do/don't code examples |
189
+ | `standard_batch_lookup` | Look up multiple standards by name in a single call |
190
+ | `standard_categories` | List standard categories with counts |
191
+ | `modifier_list` | List modifier families |
192
+ | `modifier_lookup` | Look up modifier family with values |
193
+ | `modifier_batch_lookup` | Look up multiple modifier families by name in a single call |
194
+ | `token_list` | List design tokens with optional category filtering |
195
+ | `token_lookup` | Look up token with theme-resolved values |
196
+ | `token_batch_lookup` | Look up multiple tokens by name in a single call |
197
+ | `tier_list` | List all tiers in the hierarchy |
198
+ | `config_show` | Show current tier and channel configuration |
199
+ | `ontology_list` | List loaded ontology namespaces with class/property counts |
200
+ | `ontology_show` | Show classes and properties for a namespace |
201
+ | `graph_query` | Execute raw SPARQL against the ke store |
202
+ | `graph_inspect` | Inspect all triples for a URI |
203
+ | `skill_list` | List discovered agent skills |
204
+
205
+ #### Write Tools (5)
206
+
207
+ | Tool | Description |
208
+ |------|-------------|
209
+ | `config_tier` | Set the project's tier |
210
+ | `config_channel` | Set the release channel |
211
+ | `tokens_add_config` | Add Terrazzo token build configuration |
212
+ | `create_component` | Scaffold a new design system component |
213
+ | `create_package` | Scaffold a new monorepo package |
214
+
215
+ #### Orientation Tools (2)
216
+
217
+ | Tool | Description |
218
+ |------|-------------|
219
+ | `capabilities` | List all available tools with category counts (~100 tokens) |
220
+ | `llm` | Get full LLM orientation: context, decision trees, command reference |
221
+
222
+ #### Diagnostic Tools (2)
223
+
224
+ | Tool | Description |
225
+ |------|-------------|
226
+ | `doctor` | Run installation diagnostic checks |
227
+ | `info` | Show version, store summary, installed packages |
228
+
229
+ ### Envelope Format
230
+
231
+ Every MCP tool response is wrapped by `wrapTool` into one of three envelopes:
232
+
233
+ **Success (structured):**
234
+ ```json
235
+ { "ok": true, "data": { ... }, "meta": { "count": 42, "filters": {} } }
236
+ ```
237
+
238
+ **Success (condensed):**
239
+ ```json
240
+ { "ok": true, "condensed": true, "text": "...", "tokens": "~1.2k" }
241
+ ```
242
+
243
+ **Error (structured recovery):**
244
+ ```json
245
+ {
246
+ "ok": false,
247
+ "error": {
248
+ "code": "ENTITY_NOT_FOUND",
249
+ "message": "block \"Buton\" not found.",
250
+ "suggestions": ["Button", "ButtonGroup"],
251
+ "recovery": { "tool": "block_list" }
252
+ }
253
+ }
254
+ ```
255
+
256
+ ### Disclosure Levels
257
+
258
+ List tools support disclosure levels that control response verbosity:
259
+
260
+ - **summary** (default) — names and metadata only
261
+ - **digest** — summary plus implementation paths and key details
262
+ - **detailed** — full entity data including anatomy, tokens, and standards
263
+
264
+ ### Condensed Mode
265
+
266
+ Pass `condensed: true` to any read tool to receive token-optimized Markdown instead of structured JSON. The condensed output reuses the `--llm` formatter, keeping responses compact for token-budgeted agents.
267
+
268
+ ### Structured Recovery
269
+
270
+ Error responses include a `recovery` object that tells agents what tool to call next:
271
+
272
+ ```json
273
+ {
274
+ "recovery": {
275
+ "tool": "block_list",
276
+ "params": { "names": ["Button"] }
277
+ }
278
+ }
279
+ ```
280
+
281
+ ### Batch Results
282
+
283
+ List tools that accept a `names` filter return partial results — valid items in `results`, failures in `errors`:
284
+
285
+ ```json
286
+ {
287
+ "results": [{ "name": "Button", ... }],
288
+ "errors": [{ "name": "Buton", "code": "ENTITY_NOT_FOUND", "message": "..." }]
289
+ }
290
+ ```
291
+
292
+ ### MCP Resources
293
+
294
+ Every subject URI in the ke graph is exposed as a discoverable MCP resource via the `pragma:{uri}` template. Reading a resource returns all properties with level-1 object relations resolved to summaries.
295
+
296
+ ## Configuration
297
+
298
+ Create a `pragma.config.toml` in your project root:
299
+
300
+ ```toml
301
+ tier = "apps/lxd"
302
+ channel = "normal" # normal | experimental | prerelease
303
+ ```
304
+
305
+ When no config file is present, pragma defaults to no tier and `normal` channel.
306
+
307
+ ## Error Handling
308
+
309
+ Errors follow a three-part structure: message, context (suggestions or valid options), and recovery hint.
310
+
311
+ ```
312
+ Error: block "Buton" not found.
313
+
314
+ Did you mean?
315
+ - Button
316
+ - ButtonGroup
317
+
318
+ Run `pragma block list`
319
+ ```
320
+
321
+ With `--format json`, errors are returned as structured JSON with error code, suggestions, and recovery. With `--llm`, errors are rendered as Markdown.
322
+
323
+ ## Exit Codes
324
+
325
+ | Code | Meaning |
326
+ |------|---------|
327
+ | 0 | Success |
328
+ | 1 | Entity not found |
329
+ | 2 | Empty results |
330
+ | 3 | Invalid or ambiguous input |
331
+ | 4 | Configuration error |
332
+ | 5 | Store error |
333
+ | 127 | Internal error |
334
+
335
+ ## Architecture
336
+
337
+ pragma is structured as a domain-driven application using the federation pattern from `@canonical/cli-core`:
338
+
339
+ 1. **Domains** — 14 domain modules (block, standard, modifier, token, tier, ontology, graph, config, skill, llm, setup, create, doctor, info), each exporting `CommandDefinition[]`
340
+ 2. **Operations** — data retrieval functions that query the ke triple store via SPARQL
341
+ 3. **Formatters** — three-mode output adapters (plain/llm/json) for each operation
342
+ 4. **Commands** — thin wiring layer connecting Commander.js parameters to operations + formatters
343
+ 5. **MCP tools** — parallel surface that reuses the same operations, with `wrapTool` envelope construction
344
+ 6. **Pipeline** — `runCli` orchestrates boot, flag parsing, command resolution, and program execution
345
+
346
+ The ke store (Oxigraph WASM) holds RDF data from three packages: `@canonical/design-system` (ontology + component data), `@canonical/code-standards` (standard definitions + examples), and `@canonical/anatomy-dsl` (anatomy definitions).
347
+
348
+ ## Scripts
349
+
350
+ ```bash
351
+ bun run check # biome + tsc + webarchitect
352
+ bun run test # vitest
353
+ bun run build:compile # bun build --compile (produces dist/pragma)
354
+ bun run test:compile # WASM embedding validation
355
+ ```
356
+
357
+ ## Compiled Binary
358
+
359
+ pragma targets a compiled single-file executable via `bun build --compile`. The Oxigraph WASM module embeds automatically — no manual embedding or side-loading required.
360
+
361
+ ```bash
362
+ bun build --compile --minify src/bin.ts --outfile dist/pragma
363
+ ```
364
+
365
+ ## Dependencies
366
+
367
+ - [`@canonical/ke`](../runtime/ke/) — triple store runtime (Oxigraph WASM)
368
+ - [`@canonical/cli-core`](../core/) — shared CLI machinery (Commander.js registration, help formatting)
369
+ - [`@canonical/task`](../../lib/task/) — reversible task trees for setup/create with undo support
370
+ - [`@canonical/harnesses`](../../lib/harnesses/) — AI harness detection (Claude Code, Cursor, Windsurf)
371
+ - [`@canonical/summon-core`](../../lib/summon-core/) — code generation runtime
372
+ - [`@canonical/summon-component`](../../lib/summon-component/) — component generator
373
+ - [`@canonical/summon-package`](../../lib/summon-package/) — package generator
374
+
375
+ ## License
376
+
377
+ GPL-3.0
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@canonical/pragma-cli",
3
+ "description": "CLI and MCP server for Canonical's design system.",
4
+ "version": "0.18.0",
5
+ "type": "module",
6
+ "module": "src/index.ts",
7
+ "types": "src/index.ts",
8
+ "bin": {
9
+ "pragma": "src/bin.ts"
10
+ },
11
+ "files": [
12
+ "src"
13
+ ],
14
+ "author": {
15
+ "email": "webteam@canonical.com",
16
+ "name": "Canonical Webteam"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/canonical/pragma"
21
+ },
22
+ "license": "GPL-3.0",
23
+ "bugs": {
24
+ "url": "https://github.com/canonical/pragma/issues"
25
+ },
26
+ "homepage": "https://github.com/canonical/pragma#readme",
27
+ "imports": {
28
+ "#config": "./src/config/index.ts",
29
+ "#constants": "./src/constants.ts",
30
+ "#error": "./src/error/index.ts",
31
+ "#package-manager": "./src/package-manager/index.ts",
32
+ "#pipeline": "./src/pipeline/index.ts",
33
+ "#testing": "./src/testing/index.ts"
34
+ },
35
+ "scripts": {
36
+ "build": "echo 'No build needed - runs directly from TypeScript'",
37
+ "build:compile": "bun build --compile --minify src/bin.ts --outfile dist/pragma",
38
+ "check": "bun run check:biome && bun run check:ts && bun run check:webarchitect",
39
+ "check:webarchitect": "webarchitect tool-ts",
40
+ "check:fix": "bun run check:biome:fix && bun run check:ts",
41
+ "check:biome": "biome check",
42
+ "check:biome:fix": "biome check --write",
43
+ "check:ts": "tsc --noEmit",
44
+ "test": "vitest run",
45
+ "test:watch": "vitest",
46
+ "test:coverage": "vitest run --coverage",
47
+ "test:compile": "bun run src/compile-validation.runner.ts"
48
+ },
49
+ "devDependencies": {
50
+ "@biomejs/biome": "2.4.6",
51
+ "@canonical/biome-config": "^0.18.0",
52
+ "@canonical/typescript-config": "^0.18.0",
53
+ "@canonical/webarchitect": "^0.18.0",
54
+ "@types/bun": "^1.3.10",
55
+ "@types/node": "^24.12.0",
56
+ "expect-type": "^1.3.0",
57
+ "typescript": "^5.9.3",
58
+ "vitest": "^4.0.18"
59
+ },
60
+ "optionalDependencies": {
61
+ "@canonical/anatomy-dsl": "^0.2.2",
62
+ "@canonical/code-standards": "^0.1.2",
63
+ "@canonical/design-system": "^0.1.2"
64
+ },
65
+ "dependencies": {
66
+ "@canonical/cli-core": "^0.18.0",
67
+ "@canonical/harnesses": "^0.18.0",
68
+ "@canonical/ke": "^0.18.0",
69
+ "@canonical/summon-component": "^0.18.0",
70
+ "@canonical/summon-core": "^0.18.0",
71
+ "@canonical/summon-package": "^0.18.0",
72
+ "@canonical/task": "^0.18.0",
73
+ "@modelcontextprotocol/sdk": "^1.12.0",
74
+ "chalk": "^5.6.2",
75
+ "commander": "^14.0.3",
76
+ "zod": "^3.25.0"
77
+ }
78
+ }
@@ -0,0 +1,52 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+
3
+ const detectLocalInstallMock = vi.fn();
4
+ const runCliMock = vi.fn(async () => undefined);
5
+
6
+ vi.mock("./package-manager/index.js", async (importOriginal) => ({
7
+ ...(await importOriginal<typeof import("./package-manager/index.js")>()),
8
+ detectLocalInstall: detectLocalInstallMock,
9
+ }));
10
+
11
+ vi.mock("./pipeline/runCli.js", () => ({
12
+ default: runCliMock,
13
+ }));
14
+
15
+ describe("bin", () => {
16
+ const originalArgv = process.argv;
17
+
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ process.argv = ["bun", "pragma", "block", "list"];
21
+ });
22
+
23
+ afterEach(() => {
24
+ process.argv = originalArgv;
25
+ });
26
+
27
+ it("warns when a local install is detected and forwards argv to runCli", async () => {
28
+ vi.resetModules();
29
+ detectLocalInstallMock.mockReturnValue("Use local pragma install");
30
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
31
+
32
+ await import("./bin.ts");
33
+
34
+ expect(warnSpy).toHaveBeenCalledWith("Use local pragma install");
35
+ expect(runCliMock).toHaveBeenCalledWith(process.argv);
36
+
37
+ warnSpy.mockRestore();
38
+ });
39
+
40
+ it("does not warn when no local install warning is needed", async () => {
41
+ vi.resetModules();
42
+ detectLocalInstallMock.mockReturnValue(undefined);
43
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
44
+
45
+ await import("./bin.ts");
46
+
47
+ expect(warnSpy).not.toHaveBeenCalled();
48
+ expect(runCliMock).toHaveBeenCalledWith(process.argv);
49
+
50
+ warnSpy.mockRestore();
51
+ });
52
+ });
package/src/bin.ts ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * CLI entry point for `pragma`.
4
+ *
5
+ * Detects local vs global install, warns if shadowed, then delegates
6
+ * to the pipeline orchestrator.
7
+ *
8
+ * @note Impure
9
+ */
10
+
11
+ import { detectLocalInstall } from "./package-manager/index.js";
12
+ import runCli from "./pipeline/runCli.js";
13
+
14
+ const localWarning = detectLocalInstall();
15
+ if (localWarning) {
16
+ console.warn(localWarning);
17
+ }
18
+
19
+ await runCli(process.argv);
@@ -0,0 +1,137 @@
1
+ /**
2
+ * E1 WASM Embedding Validation — Compile Test Runner
3
+ *
4
+ * Compiles the pragma validation binary via `bun build --compile`, executes it,
5
+ * and verifies that Oxigraph WASM loads and queries correctly inside the
6
+ * compiled executable.
7
+ *
8
+ * Run: `bun run src/compile-validation.test.ts`
9
+ *
10
+ * @note This file is impure — it spawns processes, writes to disk, and reads
11
+ * process output. It is a build validation script, not a unit test.
12
+ */
13
+
14
+ import { existsSync, mkdirSync, rmSync, statSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import { $ } from "bun";
17
+
18
+ const PRAGMA_ROOT = join(import.meta.dir, "..");
19
+ const DIST_DIR = join(PRAGMA_ROOT, "dist");
20
+ const VALIDATION_ENTRY = join(PRAGMA_ROOT, "src", "compile-validation.ts");
21
+ const BINARY_PATH = join(DIST_DIR, "pragma-validate");
22
+
23
+ async function main() {
24
+ console.log("=== E1 WASM Embedding Validation ===\n");
25
+ console.log(`Bun version: ${Bun.version}`);
26
+ console.log(`Platform: ${process.platform}-${process.arch}\n`);
27
+
28
+ // --- Step 1: Compile ---
29
+ console.log("[1/4] Compiling validation binary...");
30
+ mkdirSync(DIST_DIR, { recursive: true });
31
+
32
+ const compileStart = performance.now();
33
+ const compileResult =
34
+ await $`bun build --compile --minify ${VALIDATION_ENTRY} --outfile ${BINARY_PATH}`.quiet();
35
+ const compileTime = performance.now() - compileStart;
36
+
37
+ if (compileResult.exitCode !== 0) {
38
+ console.error(" COMPILE FAILED:");
39
+ console.error(compileResult.stderr.toString());
40
+ process.exit(1);
41
+ }
42
+ console.log(` Compiled in ${compileTime.toFixed(0)}ms`);
43
+
44
+ // --- Step 2: Check binary ---
45
+ console.log("\n[2/4] Checking binary...");
46
+ if (!existsSync(BINARY_PATH)) {
47
+ console.error(" Binary not found at", BINARY_PATH);
48
+ process.exit(1);
49
+ }
50
+ const binarySize = statSync(BINARY_PATH).size;
51
+ console.log(` Binary size: ${(binarySize / 1024 / 1024).toFixed(1)} MB`);
52
+ console.log(` Path: ${BINARY_PATH}`);
53
+
54
+ // --- Step 3: Run binary ---
55
+ console.log("\n[3/4] Running compiled binary...");
56
+ const runStart = performance.now();
57
+ const runResult = await $`${BINARY_PATH}`.quiet().nothrow();
58
+ const runTime = performance.now() - runStart;
59
+
60
+ const stdout = runResult.stdout.toString();
61
+ const stderr = runResult.stderr.toString();
62
+
63
+ if (stdout) console.log(stdout.trim());
64
+ if (stderr) console.error(stderr.trim());
65
+
66
+ // --- Step 4: Validate output ---
67
+ console.log("\n[4/4] Validating results...");
68
+
69
+ const checks = [
70
+ {
71
+ name: "Exit code is 0",
72
+ pass: runResult.exitCode === 0,
73
+ detail: `exit code: ${runResult.exitCode}`,
74
+ },
75
+ {
76
+ name: "WASM loaded",
77
+ pass: stdout.includes("[validate] WASM loaded"),
78
+ detail: "oxigraph dynamic import succeeded",
79
+ },
80
+ {
81
+ name: "Store created",
82
+ pass: stdout.includes("[validate] Store created"),
83
+ detail: "createStore() completed",
84
+ },
85
+ {
86
+ name: "Query executed",
87
+ pass: stdout.includes("[validate] Query returned"),
88
+ detail: "SPARQL SELECT ran successfully",
89
+ },
90
+ {
91
+ name: "Correct results",
92
+ pass: stdout.includes('"Alice"') && stdout.includes('"Bob"'),
93
+ detail: "expected bindings present",
94
+ },
95
+ {
96
+ name: "All checks passed marker",
97
+ pass: stdout.includes("[validate] ALL CHECKS PASSED"),
98
+ detail: "internal validation succeeded",
99
+ },
100
+ ];
101
+
102
+ let allPassed = true;
103
+ for (const check of checks) {
104
+ const status = check.pass ? "PASS" : "FAIL";
105
+ console.log(` [${status}] ${check.name} — ${check.detail}`);
106
+ if (!check.pass) allPassed = false;
107
+ }
108
+
109
+ // --- Summary ---
110
+ console.log("\n=== Summary ===");
111
+ console.log(`Binary size: ${(binarySize / 1024 / 1024).toFixed(1)} MB`);
112
+ console.log(`Compile time: ${compileTime.toFixed(0)}ms`);
113
+ console.log(`Runtime: ${runTime.toFixed(0)}ms`);
114
+ console.log(`Platform: ${process.platform}-${process.arch}`);
115
+ console.log(`Bun version: ${Bun.version}`);
116
+ console.log(`Result: ${allPassed ? "SUCCESS" : "FAILED"}`);
117
+
118
+ // --- Cleanup ---
119
+ rmSync(BINARY_PATH, { force: true });
120
+
121
+ if (!allPassed) {
122
+ process.exit(1);
123
+ }
124
+
125
+ console.log(
126
+ "\nConclusion: Oxigraph WASM embeds correctly in `bun build --compile`.",
127
+ );
128
+ console.log("Strategy DI.02 option 1 (manual WASM embedding) is NOT needed.");
129
+ console.log(
130
+ "Bun 1.3.9+ handles WASM embedding automatically via its bundler.",
131
+ );
132
+ }
133
+
134
+ main().catch((err) => {
135
+ console.error("Validation runner failed:", err);
136
+ process.exit(1);
137
+ });