@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
@@ -0,0 +1,303 @@
1
+ import type { Store } from "@canonical/ke";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { PragmaError } from "#error";
5
+ import { PROPERTY_MAP } from "../constants.js";
6
+ import resolveUri from "../domains/graph/helpers/resolveUri.js";
7
+ import { buildQuery } from "../domains/shared/buildQuery.js";
8
+ import compactUri from "../domains/shared/compactUri.js";
9
+ import type { PragmaRuntime } from "../domains/shared/runtime.js";
10
+
11
+ // =============================================================================
12
+ // Types
13
+ // =============================================================================
14
+
15
+ interface PropertyValueLiteral {
16
+ readonly type: "literal";
17
+ readonly value: string;
18
+ readonly datatype?: string;
19
+ }
20
+
21
+ interface PropertyValueUri {
22
+ readonly type: "uri";
23
+ readonly uri: string;
24
+ readonly prefixed: string;
25
+ readonly label: string | null;
26
+ }
27
+
28
+ type PropertyValue = PropertyValueLiteral | PropertyValueUri;
29
+
30
+ interface PropertyGroup {
31
+ readonly predicate: string;
32
+ readonly values: PropertyValue[];
33
+ }
34
+
35
+ interface ResourceEntity {
36
+ readonly uri: string;
37
+ readonly prefixed: string;
38
+ readonly types: string[];
39
+ readonly label: string | null;
40
+ readonly description: string | null;
41
+ readonly properties: PropertyGroup[];
42
+ }
43
+
44
+ // =============================================================================
45
+ // Helpers
46
+ // =============================================================================
47
+
48
+ const RDF_TYPE = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
49
+
50
+ /**
51
+ * Determine the namespace prefix for a full URI.
52
+ */
53
+ function findPrefix(
54
+ fullUri: string,
55
+ prefixes: Readonly<Record<string, string>>,
56
+ ): string | null {
57
+ for (const [prefix, namespace] of Object.entries(prefixes)) {
58
+ if (fullUri.startsWith(namespace)) return prefix;
59
+ }
60
+ return null;
61
+ }
62
+
63
+ /**
64
+ * Fetch a single property value for a URI using the PROPERTY_MAP.
65
+ */
66
+ async function fetchProperty(
67
+ store: Store,
68
+ fullUri: string,
69
+ prefixes: Readonly<Record<string, string>>,
70
+ field: "label" | "description",
71
+ ): Promise<string | null> {
72
+ const prefix = findPrefix(fullUri, prefixes);
73
+ if (!prefix) return null;
74
+
75
+ const propUri = PROPERTY_MAP[prefix]?.[field];
76
+ if (!propUri) return null;
77
+
78
+ const result = await store.query(
79
+ buildQuery(`
80
+ SELECT ?val
81
+ WHERE { <${fullUri}> <${propUri}> ?val }
82
+ LIMIT 1
83
+ `),
84
+ );
85
+
86
+ if (result.type === "select" && result.bindings.length > 0) {
87
+ return result.bindings[0]?.val ?? null;
88
+ }
89
+ return null;
90
+ }
91
+
92
+ /**
93
+ * Fetch the human-readable label for a URI using the PROPERTY_MAP.
94
+ */
95
+ async function fetchLabel(
96
+ store: Store,
97
+ fullUri: string,
98
+ prefixes: Readonly<Record<string, string>>,
99
+ ): Promise<string | null> {
100
+ return fetchProperty(store, fullUri, prefixes, "label");
101
+ }
102
+
103
+ /**
104
+ * Fetch the human-readable description for a URI using the PROPERTY_MAP.
105
+ */
106
+ async function fetchDescription(
107
+ store: Store,
108
+ fullUri: string,
109
+ prefixes: Readonly<Record<string, string>>,
110
+ ): Promise<string | null> {
111
+ return fetchProperty(store, fullUri, prefixes, "description");
112
+ }
113
+
114
+ /**
115
+ * Detect whether a SPARQL binding value is a URI or a literal.
116
+ * URIs start with http:// or https:// or are prefixed; literals are everything else.
117
+ */
118
+ function isUri(value: string): boolean {
119
+ return (
120
+ value.startsWith("http://") ||
121
+ value.startsWith("https://") ||
122
+ value.startsWith("urn:")
123
+ );
124
+ }
125
+
126
+ /**
127
+ * Enumerate all distinct subject URIs in the graph.
128
+ */
129
+ async function listAllSubjects(store: Store): Promise<string[]> {
130
+ const result = await store.query(
131
+ buildQuery("SELECT DISTINCT ?s WHERE { ?s ?p ?o } ORDER BY ?s"),
132
+ );
133
+
134
+ if (result.type !== "select") return [];
135
+ return result.bindings.map((b) => b.s ?? "").filter((s) => isUri(s));
136
+ }
137
+
138
+ /**
139
+ * Read a single entity: all its triples with level-1 object summaries.
140
+ */
141
+ async function readEntity(
142
+ store: Store,
143
+ fullUri: string,
144
+ prefixes: Readonly<Record<string, string>>,
145
+ ): Promise<ResourceEntity> {
146
+ const result = await store.query(
147
+ buildQuery(`
148
+ SELECT ?p ?o
149
+ WHERE { <${fullUri}> ?p ?o }
150
+ ORDER BY ?p ?o
151
+ `),
152
+ );
153
+
154
+ if (result.type !== "select" || result.bindings.length === 0) {
155
+ throw PragmaError.notFound("entity", compactUri(fullUri, prefixes), {
156
+ recovery: {
157
+ message:
158
+ "Check the URI is correct and run a SPARQL query to find valid URIs.",
159
+ cli: "pragma graph query 'SELECT ?s WHERE { ?s ?p ?o } LIMIT 10'",
160
+ mcp: { tool: "graph_query" },
161
+ },
162
+ });
163
+ }
164
+
165
+ const types: string[] = [];
166
+ const groupMap = new Map<string, PropertyValue[]>();
167
+
168
+ for (const b of result.bindings) {
169
+ const predicate = b.p ?? "";
170
+ const object = b.o ?? "";
171
+
172
+ if (predicate === RDF_TYPE) {
173
+ types.push(compactUri(object, prefixes));
174
+ continue;
175
+ }
176
+
177
+ const compactPred = compactUri(predicate, prefixes);
178
+ const existing = groupMap.get(compactPred) ?? [];
179
+
180
+ if (isUri(object)) {
181
+ const label = await fetchLabel(store, object, prefixes);
182
+ existing.push({
183
+ type: "uri",
184
+ uri: object,
185
+ prefixed: compactUri(object, prefixes),
186
+ label,
187
+ });
188
+ } else {
189
+ existing.push({ type: "literal", value: object });
190
+ }
191
+
192
+ groupMap.set(compactPred, existing);
193
+ }
194
+
195
+ const [label, description] = await Promise.all([
196
+ fetchLabel(store, fullUri, prefixes),
197
+ fetchDescription(store, fullUri, prefixes),
198
+ ]);
199
+
200
+ const properties: PropertyGroup[] = [...groupMap.entries()].map(
201
+ ([predicate, values]) => ({ predicate, values }),
202
+ );
203
+
204
+ return {
205
+ uri: fullUri,
206
+ prefixed: compactUri(fullUri, prefixes),
207
+ types,
208
+ label,
209
+ description,
210
+ properties,
211
+ };
212
+ }
213
+
214
+ // =============================================================================
215
+ // Registration
216
+ // =============================================================================
217
+
218
+ /**
219
+ * Register graph-driven MCP resources on the server.
220
+ *
221
+ * Every subject URI in the ke graph becomes a discoverable MCP resource.
222
+ * Reading a resource returns the entity's properties with level-1 object
223
+ * relations resolved to summaries (label and description from PROPERTY_MAP).
224
+ *
225
+ * @param server - The MCP server to register resources on.
226
+ * @param runtime - The pragma runtime providing the ke store and prefixes.
227
+ *
228
+ * @note Impure
229
+ */
230
+ export default function registerResources(
231
+ server: McpServer,
232
+ runtime: PragmaRuntime,
233
+ ): void {
234
+ const { store } = runtime;
235
+ const prefixes = store.prefixes;
236
+
237
+ const template = new ResourceTemplate("pragma:{+uri}", {
238
+ list: async () => {
239
+ const subjects = await listAllSubjects(store);
240
+ const resources = await Promise.all(
241
+ subjects.map(async (fullUri) => {
242
+ const prefixed = compactUri(fullUri, prefixes);
243
+ const label = await fetchLabel(store, fullUri, prefixes);
244
+ return {
245
+ uri: `pragma:${prefixed}`,
246
+ name: label ?? prefixed,
247
+ mimeType: "application/json" as const,
248
+ };
249
+ }),
250
+ );
251
+ return { resources };
252
+ },
253
+ complete: {
254
+ uri: async (value) => {
255
+ const subjects = await listAllSubjects(store);
256
+ const compacted = subjects.map((s) => compactUri(s, prefixes));
257
+ return compacted.filter((p) =>
258
+ p.toLowerCase().startsWith(value.toLowerCase()),
259
+ );
260
+ },
261
+ },
262
+ });
263
+
264
+ server.registerResource(
265
+ "graph-entity",
266
+ template,
267
+ {
268
+ description:
269
+ "An entity in the pragma knowledge graph. Returns all properties with level-1 relation summaries.",
270
+ mimeType: "application/json",
271
+ },
272
+ async (url, variables) => {
273
+ try {
274
+ const prefixedUri = variables.uri as string;
275
+ const fullUri = resolveUri(prefixedUri, prefixes);
276
+ const entity = await readEntity(store, fullUri, prefixes);
277
+ return {
278
+ contents: [
279
+ {
280
+ uri: url.href,
281
+ mimeType: "application/json",
282
+ text: JSON.stringify(entity, null, 2),
283
+ },
284
+ ],
285
+ };
286
+ } catch (error) {
287
+ const message =
288
+ error instanceof PragmaError
289
+ ? JSON.stringify({ code: error.code, message: error.message })
290
+ : String(error);
291
+ return {
292
+ contents: [
293
+ {
294
+ uri: url.href,
295
+ mimeType: "text/plain",
296
+ text: message,
297
+ },
298
+ ],
299
+ };
300
+ }
301
+ },
302
+ );
303
+ }
@@ -0,0 +1,66 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { resolve } from "node:path";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+
5
+ const createMcpServerMock = vi.fn();
6
+
7
+ vi.mock("./createMcpServer.js", () => ({
8
+ createMcpServer: createMcpServerMock,
9
+ }));
10
+
11
+ vi.mock("@modelcontextprotocol/sdk/server/stdio.js", () => ({
12
+ StdioServerTransport: class StdioServerTransport {},
13
+ }));
14
+
15
+ afterEach(() => {
16
+ vi.restoreAllMocks();
17
+ vi.clearAllMocks();
18
+ });
19
+
20
+ describe("runMcpServer", () => {
21
+ it("creates the server, connects stdio transport, and disposes on SIGINT", async () => {
22
+ const connect = vi.fn(async () => undefined);
23
+ const dispose = vi.fn();
24
+ createMcpServerMock.mockResolvedValue({
25
+ server: { connect },
26
+ dispose,
27
+ });
28
+
29
+ let sigintHandler: (() => void) | undefined;
30
+ vi.spyOn(process, "on").mockImplementation(((event, handler) => {
31
+ if (event === "SIGINT") sigintHandler = handler as () => void;
32
+ return process;
33
+ }) as typeof process.on);
34
+ const exitSpy = vi
35
+ .spyOn(process, "exit")
36
+ .mockImplementation((() => undefined) as never);
37
+
38
+ const { default: runMcpServer } = await import("./runMcpServer.js");
39
+ await runMcpServer();
40
+
41
+ expect(createMcpServerMock).toHaveBeenCalledTimes(1);
42
+ expect(connect).toHaveBeenCalledTimes(1);
43
+ expect(sigintHandler).toBeTypeOf("function");
44
+
45
+ sigintHandler?.();
46
+
47
+ expect(dispose).toHaveBeenCalledTimes(1);
48
+ expect(exitSpy).toHaveBeenCalledWith(0);
49
+ });
50
+
51
+ it("pragma mcp subcommand starts and exits on stdin close", () => {
52
+ const binPath = resolve(import.meta.dirname, "../bin.ts");
53
+ const result = spawnSync("bun", ["run", binPath, "mcp"], {
54
+ input: "",
55
+ encoding: "utf-8",
56
+ timeout: 10_000,
57
+ });
58
+
59
+ expect(result.error).toBeUndefined();
60
+ expect(result.signal).toBeNull();
61
+ if (result.status !== 0) {
62
+ console.error("pragma mcp stderr:", result.stderr);
63
+ }
64
+ expect(result.status).toBe(0);
65
+ });
66
+ });
@@ -0,0 +1,24 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { createMcpServer } from "./createMcpServer.js";
3
+
4
+ /**
5
+ * Start the MCP server over stdio transport.
6
+ *
7
+ * Boots the pragma runtime, connects to stdin/stdout, and runs until the
8
+ * process receives SIGINT or stdin closes.
9
+ *
10
+ * @returns Resolves when the transport connection is established.
11
+ *
12
+ * @note Impure
13
+ */
14
+ export default async function runMcpServer(): Promise<void> {
15
+ const { server, dispose } = await createMcpServer();
16
+ const transport = new StdioServerTransport();
17
+
18
+ process.on("SIGINT", () => {
19
+ dispose();
20
+ process.exit(0);
21
+ });
22
+
23
+ await server.connect(transport);
24
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * MCP tool registration orchestrator.
3
+ *
4
+ * Collects declarative ToolSpec arrays from each domain and registers
5
+ * them on the MCP server via the registerFromSpec adapter.
6
+ *
7
+ * @module
8
+ */
9
+
10
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import { specs as blockSpecs } from "../../domains/block/mcp/index.js";
12
+ import { specs as configSpecs } from "../../domains/config/mcp/index.js";
13
+ import { specs as createSpecs } from "../../domains/create/mcp/index.js";
14
+ import { specs as diagnosticSpecs } from "../../domains/doctor/mcp/index.js";
15
+ import { specs as graphSpecs } from "../../domains/graph/mcp/index.js";
16
+ import { specs as orientationSpecs } from "../../domains/llm/mcp/index.js";
17
+ import { specs as modifierSpecs } from "../../domains/modifier/mcp/index.js";
18
+ import { specs as ontologySpecs } from "../../domains/ontology/mcp/index.js";
19
+ import type { PragmaRuntime } from "../../domains/shared/runtime.js";
20
+ import type { ToolSpec } from "../../domains/shared/ToolSpec.js";
21
+ import { specs as skillSpecs } from "../../domains/skill/mcp/index.js";
22
+ import { specs as standardSpecs } from "../../domains/standard/mcp/index.js";
23
+ import { specs as tierSpecs } from "../../domains/tier/mcp/index.js";
24
+ import { specs as tokenSpecs } from "../../domains/token/mcp/index.js";
25
+ import registerFromSpec from "./registerFromSpec.js";
26
+
27
+ const allSpecs: readonly ToolSpec[] = [
28
+ ...blockSpecs,
29
+ ...standardSpecs,
30
+ ...modifierSpecs,
31
+ ...tokenSpecs,
32
+ ...tierSpecs,
33
+ ...configSpecs,
34
+ ...ontologySpecs,
35
+ ...graphSpecs,
36
+ ...skillSpecs,
37
+ ...diagnosticSpecs,
38
+ ...orientationSpecs,
39
+ ...createSpecs,
40
+ ];
41
+
42
+ /**
43
+ * Register all MCP tools on the server.
44
+ *
45
+ * @param server - The MCP server to register tools on.
46
+ * @param runtime - The pragma runtime providing store and config.
47
+ */
48
+ export default function registerAllTools(
49
+ server: McpServer,
50
+ runtime: PragmaRuntime,
51
+ ): void {
52
+ for (const spec of allSpecs) {
53
+ registerFromSpec(server, runtime, spec);
54
+ }
55
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Adapter: ToolSpec → server.registerTool().
3
+ *
4
+ * Converts declarative domain-owned ToolSpecs into registered MCP tools.
5
+ * This is the single point where ToolSpec meets MCP infrastructure —
6
+ * zod schema generation, wrapTool envelope, and server registration.
7
+ */
8
+
9
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import { z } from "zod";
11
+ import type { PragmaRuntime } from "../../domains/shared/runtime.js";
12
+ import type { ToolParamDef, ToolSpec } from "../../domains/shared/ToolSpec.js";
13
+ import type { ToolPayload } from "../types.js";
14
+ import { wrapTool } from "../utils/index.js";
15
+
16
+ /**
17
+ * Convert a ToolParamDef record to a zod object schema.
18
+ */
19
+ function buildZodSchema(
20
+ params: Readonly<Record<string, ToolParamDef>>,
21
+ ): z.ZodObject<Record<string, z.ZodTypeAny>> {
22
+ const shape: Record<string, z.ZodTypeAny> = {};
23
+
24
+ for (const [name, def] of Object.entries(params)) {
25
+ let field: z.ZodTypeAny;
26
+
27
+ switch (def.type) {
28
+ case "boolean":
29
+ field = z.boolean();
30
+ break;
31
+ case "string[]":
32
+ field = z.array(z.string());
33
+ break;
34
+ case "string":
35
+ field = def.enum
36
+ ? z.enum(def.enum as [string, ...string[]])
37
+ : z.string();
38
+ break;
39
+ }
40
+
41
+ if (def.description) {
42
+ field = field.describe(def.description);
43
+ }
44
+ if (def.optional !== false) {
45
+ field = field.optional();
46
+ }
47
+
48
+ shape[name] = field;
49
+ }
50
+
51
+ return z.object(shape);
52
+ }
53
+
54
+ /**
55
+ * Register a single ToolSpec on the MCP server.
56
+ */
57
+ export default function registerFromSpec(
58
+ server: McpServer,
59
+ runtime: PragmaRuntime,
60
+ spec: ToolSpec,
61
+ ): void {
62
+ const toolConfig: {
63
+ description: string;
64
+ inputSchema?: z.ZodObject<Record<string, z.ZodTypeAny>>;
65
+ annotations: {
66
+ readOnlyHint: boolean;
67
+ destructiveHint?: boolean;
68
+ openWorldHint: boolean;
69
+ };
70
+ } = {
71
+ description: spec.description,
72
+ annotations: {
73
+ readOnlyHint: spec.readOnly,
74
+ openWorldHint: false,
75
+ },
76
+ };
77
+
78
+ if (spec.params && Object.keys(spec.params).length > 0) {
79
+ toolConfig.inputSchema = buildZodSchema(spec.params);
80
+ }
81
+
82
+ if (spec.destructive !== undefined) {
83
+ toolConfig.annotations.destructiveHint = spec.destructive;
84
+ }
85
+
86
+ server.registerTool(
87
+ spec.name,
88
+ toolConfig,
89
+ wrapTool(
90
+ runtime,
91
+ spec.execute as (
92
+ rt: PragmaRuntime,
93
+ params: Record<string, unknown>,
94
+ ) => Promise<ToolPayload>,
95
+ ),
96
+ );
97
+ }