@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,2 @@
1
+ /** @module Ontology domain MCP barrel — ontology_list, ontology_show. */
2
+ export { default as specs } from "./specs.js";
@@ -0,0 +1,93 @@
1
+ /**
2
+ * MCP tool specs for the ontology domain.
3
+ */
4
+
5
+ import type { ToolSpec } from "../../shared/ToolSpec.js";
6
+ import { listOntologies, showOntology } from "../operations/index.js";
7
+
8
+ const specs: readonly ToolSpec[] = [
9
+ {
10
+ name: "ontology_list",
11
+ description:
12
+ "List all ontologies loaded in the knowledge graph with class and property counts.",
13
+ params: {
14
+ condensed: {
15
+ type: "boolean",
16
+ description: "Token-optimized output",
17
+ optional: true,
18
+ },
19
+ },
20
+ readOnly: true,
21
+ async execute(rt, { condensed }) {
22
+ const result = await listOntologies(rt.store);
23
+
24
+ if (condensed) {
25
+ const lines = ["## Ontologies", ""];
26
+ for (const o of result) {
27
+ lines.push(
28
+ `- **${o.prefix}:** (${o.namespace}) | classes: ${o.classCount} | properties: ${o.propertyCount}`,
29
+ );
30
+ }
31
+ const text = lines.join("\n");
32
+ return {
33
+ condensed: true,
34
+ text,
35
+ tokens: `~${Math.ceil(text.length / 4)}`,
36
+ };
37
+ }
38
+
39
+ return { data: result, meta: { count: result.length } };
40
+ },
41
+ },
42
+ {
43
+ name: "ontology_show",
44
+ description:
45
+ "Show detailed schema for an ontology including classes and properties.",
46
+ params: {
47
+ prefix: {
48
+ type: "string",
49
+ description: "Ontology prefix (e.g. 'ds', 'cs')",
50
+ optional: false,
51
+ },
52
+ condensed: {
53
+ type: "boolean",
54
+ description: "Token-optimized output",
55
+ optional: true,
56
+ },
57
+ },
58
+ readOnly: true,
59
+ async execute(rt, { prefix, condensed }) {
60
+ const result = await showOntology(rt.store, prefix as string);
61
+
62
+ if (condensed) {
63
+ const lines = [`## ${result.prefix}: (${result.namespace})`, ""];
64
+ if (result.classes.length > 0) {
65
+ lines.push("### Classes");
66
+ for (const c of result.classes) {
67
+ const sup = c.superclass ? ` extends ${c.superclass}` : "";
68
+ lines.push(`- **${c.label}**${sup}`);
69
+ }
70
+ lines.push("");
71
+ }
72
+ if (result.properties.length > 0) {
73
+ lines.push("### Properties");
74
+ for (const p of result.properties) {
75
+ const domain = p.domain ? ` domain: ${p.domain}` : "";
76
+ const range = p.range ? ` range: ${p.range}` : "";
77
+ lines.push(`- **${p.label}** (${p.type})${domain}${range}`);
78
+ }
79
+ }
80
+ const text = lines.join("\n");
81
+ return {
82
+ condensed: true,
83
+ text,
84
+ tokens: `~${Math.ceil(text.length / 4)}`,
85
+ };
86
+ }
87
+
88
+ return { data: result };
89
+ },
90
+ },
91
+ ];
92
+
93
+ export default specs;
@@ -0,0 +1,5 @@
1
+ /** @module Barrel for ontology operations. */
2
+
3
+ export { default as listOntologies } from "./listOntologies.js";
4
+ export { default as showOntology } from "./showOntology.js";
5
+ export { default as showOntologyRaw } from "./showOntologyRaw.js";
@@ -0,0 +1,45 @@
1
+ import type { Store } from "@canonical/ke";
2
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
3
+ import { createTestStore, DS_ALL_TTL } from "#testing";
4
+ import { PREFIX_MAP } from "../../shared/prefixes.js";
5
+ import listOntologies from "./listOntologies.js";
6
+
7
+ let store: Store;
8
+ let cleanup: () => void;
9
+
10
+ beforeAll(async () => {
11
+ const result = await createTestStore({ ttl: DS_ALL_TTL });
12
+ store = result.store;
13
+ cleanup = result.cleanup;
14
+ });
15
+
16
+ afterAll(() => cleanup());
17
+
18
+ describe("listOntologies", () => {
19
+ it("returns loaded namespaces with counts", async () => {
20
+ const result = await listOntologies(store);
21
+ expect(result.length).toBeGreaterThan(0);
22
+
23
+ const ds = result.find((o) => o.prefix === "ds");
24
+ expect(ds).toBeDefined();
25
+ expect(ds?.namespace).toBe(PREFIX_MAP.ds);
26
+ expect(ds?.classCount).toBeGreaterThan(0);
27
+ expect(ds?.propertyCount).toBeGreaterThan(0);
28
+ expect(ds?.anatomyCount).toBeGreaterThan(0);
29
+ });
30
+
31
+ it("includes cs namespace", async () => {
32
+ const result = await listOntologies(store);
33
+ const cs = result.find((o) => o.prefix === "cs");
34
+ expect(cs).toBeDefined();
35
+ expect(cs?.classCount).toBeGreaterThan(0);
36
+ expect(cs?.anatomyCount).toBe(0);
37
+ });
38
+
39
+ it("returns sorted by prefix", async () => {
40
+ const result = await listOntologies(store);
41
+ const prefixes = result.map((o) => o.prefix);
42
+ const sorted = [...prefixes].sort();
43
+ expect(prefixes).toEqual(sorted);
44
+ });
45
+ });
@@ -0,0 +1,101 @@
1
+ import type { Store } from "@canonical/ke";
2
+ import { buildQuery } from "../../shared/buildQuery.js";
3
+ import { P } from "../../shared/prefixes.js";
4
+ import type { OntologySummary } from "../../shared/types.js";
5
+ import findNamespace from "../helpers/findNamespace.js";
6
+
7
+ /** Check whether a URI belongs to the anatomy namespace. */
8
+ function isAnatomyTerm(uri: string): boolean {
9
+ return uri.toLowerCase().includes("anatomy");
10
+ }
11
+
12
+ /**
13
+ * List all loaded ontology namespaces with their class, property, and anatomy counts.
14
+ *
15
+ * Discovers namespaces by querying for `owl:Class` and
16
+ * `owl:ObjectProperty`/`owl:DatatypeProperty` definitions, then maps
17
+ * namespace URIs back to prefixes via `store.prefixes`.
18
+ *
19
+ * @param store - The ke store to query.
20
+ * @returns An array of {@link OntologySummary} sorted alphabetically by prefix.
21
+ *
22
+ * @note Queries ke store
23
+ */
24
+ export default async function listOntologies(
25
+ store: Store,
26
+ ): Promise<OntologySummary[]> {
27
+ const classResult = await store.query(
28
+ buildQuery(`
29
+ SELECT ?class
30
+ WHERE { ?class a ${P.owl}Class }
31
+ `),
32
+ );
33
+
34
+ const propResult = await store.query(
35
+ buildQuery(`
36
+ SELECT ?prop ?propType
37
+ WHERE {
38
+ ?prop a ?propType .
39
+ VALUES ?propType { ${P.owl}ObjectProperty ${P.owl}DatatypeProperty }
40
+ }
41
+ `),
42
+ );
43
+
44
+ const prefixEntries = Object.entries(store.prefixes);
45
+ const classCounts = new Map<string, Set<string>>();
46
+ const propCounts = new Map<string, Set<string>>();
47
+ const anatomyCounts = new Map<string, Set<string>>();
48
+
49
+ if (classResult.type === "select") {
50
+ for (const b of classResult.bindings) {
51
+ const uri = b.class ?? "";
52
+ const ns = findNamespace(uri, prefixEntries);
53
+ if (ns) {
54
+ const set = classCounts.get(ns.prefix) ?? new Set();
55
+ set.add(uri);
56
+ classCounts.set(ns.prefix, set);
57
+
58
+ if (isAnatomyTerm(uri)) {
59
+ const anatomySet = anatomyCounts.get(ns.prefix) ?? new Set();
60
+ anatomySet.add(uri);
61
+ anatomyCounts.set(ns.prefix, anatomySet);
62
+ }
63
+ }
64
+ }
65
+ }
66
+
67
+ if (propResult.type === "select") {
68
+ for (const b of propResult.bindings) {
69
+ const uri = b.prop ?? "";
70
+ const ns = findNamespace(uri, prefixEntries);
71
+ if (ns) {
72
+ const set = propCounts.get(ns.prefix) ?? new Set();
73
+ set.add(uri);
74
+ propCounts.set(ns.prefix, set);
75
+
76
+ if (isAnatomyTerm(uri)) {
77
+ const anatomySet = anatomyCounts.get(ns.prefix) ?? new Set();
78
+ anatomySet.add(uri);
79
+ anatomyCounts.set(ns.prefix, anatomySet);
80
+ }
81
+ }
82
+ }
83
+ }
84
+
85
+ const allPrefixes = new Set([
86
+ ...classCounts.keys(),
87
+ ...propCounts.keys(),
88
+ ...anatomyCounts.keys(),
89
+ ]);
90
+
91
+ return [...allPrefixes].sort().map((prefix) => {
92
+ const namespace = prefixEntries.find(([p]) => p === prefix)?.[1] ?? "";
93
+ return {
94
+ prefix,
95
+ namespace,
96
+ classCount: classCounts.get(prefix)?.size ?? 0,
97
+ propertyCount: propCounts.get(prefix)?.size ?? 0,
98
+ anatomyCount: anatomyCounts.get(prefix)?.size ?? 0,
99
+ };
100
+ });
101
+ }
@@ -0,0 +1,65 @@
1
+ import type { Store } from "@canonical/ke";
2
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
3
+ import { PragmaError } from "#error";
4
+ import { createTestStore, DS_ALL_TTL } from "#testing";
5
+ import { PREFIX_MAP } from "../../shared/prefixes.js";
6
+ import showOntology from "./showOntology.js";
7
+
8
+ let store: Store;
9
+ let cleanup: () => void;
10
+
11
+ beforeAll(async () => {
12
+ const result = await createTestStore({ ttl: DS_ALL_TTL });
13
+ store = result.store;
14
+ cleanup = result.cleanup;
15
+ });
16
+
17
+ afterAll(() => cleanup());
18
+
19
+ describe("showOntology", () => {
20
+ it("returns classes and properties for a prefix", async () => {
21
+ const result = await showOntology(store, "ds");
22
+ expect(result.prefix).toBe("ds");
23
+ expect(result.namespace).toBe(PREFIX_MAP.ds);
24
+ expect(result.classes.length).toBeGreaterThan(0);
25
+ expect(result.properties.length).toBeGreaterThan(0);
26
+ });
27
+
28
+ it("includes class labels and superclass relationships", async () => {
29
+ const result = await showOntology(store, "ds");
30
+ const component = result.classes.find((c) => c.label === "Component");
31
+ expect(component).toBeDefined();
32
+ expect(component?.superclass).toContain("UIBlock");
33
+ });
34
+
35
+ it("includes property domain and range", async () => {
36
+ const result = await showOntology(store, "ds");
37
+ const nameProp = result.properties.find((p) => p.uri.endsWith("name"));
38
+ expect(nameProp).toBeDefined();
39
+ expect(nameProp?.domain).toContain("UIBlock");
40
+ expect(nameProp?.type).toBe("datatype");
41
+ });
42
+
43
+ it("resolves full namespace URI", async () => {
44
+ const result = await showOntology(store, PREFIX_MAP.ds);
45
+ expect(result.prefix).toBe("ds");
46
+ expect(result.classes.length).toBeGreaterThan(0);
47
+ });
48
+
49
+ it("throws PragmaError.invalidInput for unknown prefix", async () => {
50
+ await expect(showOntology(store, "unknown")).rejects.toThrow(PragmaError);
51
+
52
+ try {
53
+ await showOntology(store, "unknown");
54
+ } catch (e) {
55
+ expect((e as PragmaError).code).toBe("INVALID_INPUT");
56
+ }
57
+ });
58
+
59
+ it("returns cs ontology with standard classes", async () => {
60
+ const result = await showOntology(store, "cs");
61
+ expect(result.prefix).toBe("cs");
62
+ const standard = result.classes.find((c) => c.uri.includes("CodeStandard"));
63
+ expect(standard).toBeDefined();
64
+ });
65
+ });
@@ -0,0 +1,41 @@
1
+ import type { Store } from "@canonical/ke";
2
+ import { PragmaError } from "#error";
3
+ import type { OntologyDetailed } from "../../shared/types.js";
4
+ import queryClasses from "../helpers/queryClasses.js";
5
+ import queryProperties from "../helpers/queryProperties.js";
6
+ import resolvePrefix from "../helpers/resolvePrefix.js";
7
+
8
+ /**
9
+ * Returns detailed schema for a namespace, including its classes and properties.
10
+ *
11
+ * Accepts a short prefix (e.g. `ds`) or a full namespace URI.
12
+ *
13
+ * @note Queries ke store
14
+ *
15
+ * @param store - The ke store to query.
16
+ * @param prefixOrUri - A short prefix or full namespace URI.
17
+ * @returns An {@link OntologyDetailed} with classes and properties.
18
+ * @throws PragmaError.invalidInput if the prefix or namespace is unknown.
19
+ * @throws PragmaError.notFound if the namespace has no classes or properties.
20
+ */
21
+ export default async function showOntology(
22
+ store: Store,
23
+ prefixOrUri: string,
24
+ ): Promise<OntologyDetailed> {
25
+ const { prefix, namespace } = resolvePrefix(prefixOrUri, store.prefixes);
26
+
27
+ const classes = await queryClasses(store, namespace);
28
+ const properties = await queryProperties(store, namespace);
29
+
30
+ if (classes.length === 0 && properties.length === 0) {
31
+ throw PragmaError.notFound("ontology", prefixOrUri, {
32
+ recovery: {
33
+ message: "List loaded ontologies.",
34
+ cli: "pragma ontology list",
35
+ mcp: { tool: "ontology_list" },
36
+ },
37
+ });
38
+ }
39
+
40
+ return { prefix, namespace, classes, properties };
41
+ }
@@ -0,0 +1,39 @@
1
+ import type { Store } from "@canonical/ke";
2
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
3
+ import { PragmaError } from "#error";
4
+ import { createTestStore, DS_ALL_TTL } from "#testing";
5
+ import { PREFIX_MAP } from "../../shared/prefixes.js";
6
+ import showOntologyRaw from "./showOntologyRaw.js";
7
+
8
+ let store: Store;
9
+ let cleanup: () => void;
10
+
11
+ beforeAll(async () => {
12
+ const result = await createTestStore({ ttl: DS_ALL_TTL });
13
+ store = result.store;
14
+ cleanup = result.cleanup;
15
+ });
16
+
17
+ afterAll(() => cleanup());
18
+
19
+ describe("showOntologyRaw", () => {
20
+ it("returns triples for a known namespace", async () => {
21
+ const triples = await showOntologyRaw(store, "ds");
22
+ expect(triples.length).toBeGreaterThan(0);
23
+
24
+ const hasDs = triples.some((t) => t.subject.startsWith(PREFIX_MAP.ds));
25
+ expect(hasDs).toBe(true);
26
+ });
27
+
28
+ it("throws PragmaError.invalidInput for unknown prefix", async () => {
29
+ await expect(showOntologyRaw(store, "unknown")).rejects.toThrow(
30
+ PragmaError,
31
+ );
32
+
33
+ try {
34
+ await showOntologyRaw(store, "unknown");
35
+ } catch (e) {
36
+ expect((e as PragmaError).code).toBe("INVALID_INPUT");
37
+ }
38
+ });
39
+ });
@@ -0,0 +1,50 @@
1
+ import type { Store, Triple } from "@canonical/ke";
2
+ import { PragmaError } from "#error";
3
+ import { buildQuery } from "../../shared/buildQuery.js";
4
+ import resolvePrefix from "../helpers/resolvePrefix.js";
5
+
6
+ /**
7
+ * Retrieves raw triples for a namespace via a SPARQL CONSTRUCT query.
8
+ *
9
+ * Returns all triples where the subject or predicate starts with the
10
+ * resolved namespace URI.
11
+ *
12
+ * @note Queries ke store
13
+ *
14
+ * @param store - The ke store to query.
15
+ * @param prefixOrUri - A short prefix or full namespace URI.
16
+ * @returns An array of raw {@link Triple} objects.
17
+ * @throws PragmaError.invalidInput if the prefix or namespace is unknown.
18
+ * @throws PragmaError.notFound if the namespace yields no triples.
19
+ */
20
+ export default async function showOntologyRaw(
21
+ store: Store,
22
+ prefixOrUri: string,
23
+ ): Promise<Triple[]> {
24
+ const { namespace } = resolvePrefix(prefixOrUri, store.prefixes);
25
+
26
+ const result = await store.query(
27
+ buildQuery(`
28
+ CONSTRUCT { ?s ?p ?o }
29
+ WHERE {
30
+ ?s ?p ?o .
31
+ FILTER(
32
+ STRSTARTS(STR(?s), "${namespace}") ||
33
+ STRSTARTS(STR(?p), "${namespace}")
34
+ )
35
+ }
36
+ `),
37
+ );
38
+
39
+ if (result.type !== "construct" || result.triples.length === 0) {
40
+ throw PragmaError.notFound("ontology", prefixOrUri, {
41
+ recovery: {
42
+ message: "List loaded ontologies.",
43
+ cli: "pragma ontology list",
44
+ mcp: { tool: "ontology_list" },
45
+ },
46
+ });
47
+ }
48
+
49
+ return result.triples;
50
+ }
@@ -0,0 +1,58 @@
1
+ import type { CommandDefinition, CommandResult } from "@canonical/cli-core";
2
+ import runSetupTask from "../helpers/runSetupTask.js";
3
+ import setupAll from "../operations/setupAll.js";
4
+
5
+ /**
6
+ * `pragma setup all` command definition.
7
+ *
8
+ * Runs all setup steps (completions, lsp, mcp) as a single
9
+ * composed Task with confirmation gates.
10
+ *
11
+ * @note Impure
12
+ */
13
+ const allCommand: CommandDefinition = {
14
+ path: ["setup", "all"],
15
+ description: "Run all setup steps (completions, lsp, mcp)",
16
+ parameters: [
17
+ {
18
+ name: "dryRun",
19
+ description: "Preview changes without writing",
20
+ type: "boolean",
21
+ default: false,
22
+ },
23
+ {
24
+ name: "undo",
25
+ description: "Reverse a previous setup",
26
+ type: "boolean",
27
+ default: false,
28
+ },
29
+ {
30
+ name: "yes",
31
+ description: "Skip all confirmation prompts",
32
+ type: "boolean",
33
+ default: false,
34
+ },
35
+ ],
36
+ meta: {
37
+ examples: [
38
+ "pragma setup all",
39
+ "pragma setup all --yes",
40
+ "pragma setup all --dry-run",
41
+ "pragma setup all --undo",
42
+ ],
43
+ },
44
+ execute: async (
45
+ params: Record<string, unknown>,
46
+ ctx,
47
+ ): Promise<CommandResult> =>
48
+ runSetupTask(setupAll(ctx.cwd), {
49
+ dryRun: params.dryRun === true,
50
+ undo: params.undo === true,
51
+ yes: params.yes === true,
52
+ verbose: ctx.globalFlags.verbose,
53
+ llm: ctx.globalFlags.llm,
54
+ format: ctx.globalFlags.format,
55
+ }),
56
+ };
57
+
58
+ export default allCommand;
@@ -0,0 +1,85 @@
1
+ import type { CommandDefinition, CommandResult } from "@canonical/cli-core";
2
+ import type { ShellId } from "../helpers/detectShell.js";
3
+ import runSetupTask from "../helpers/runSetupTask.js";
4
+ import setupCompletions from "../operations/setupCompletions.js";
5
+
6
+ /**
7
+ * Map boolean shell flags to a ShellId.
8
+ *
9
+ * @param params - Command parameters containing optional shell flags.
10
+ * @returns The forced ShellId, or undefined to auto-detect.
11
+ */
12
+ function resolveForceShell(
13
+ params: Record<string, unknown>,
14
+ ): ShellId | undefined {
15
+ if (params.zsh === true) return "zsh";
16
+ if (params.bash === true) return "bash";
17
+ if (params.fish === true) return "fish";
18
+ return undefined;
19
+ }
20
+
21
+ /**
22
+ * `pragma setup completions` command definition.
23
+ *
24
+ * Installs shell completion scripts for bash, zsh, or fish.
25
+ * Auto-detects the shell unless overridden with --zsh, --bash, or --fish.
26
+ *
27
+ * @note Impure
28
+ */
29
+ const completionsCommand: CommandDefinition = {
30
+ path: ["setup", "completions"],
31
+ description: "Install shell completion scripts",
32
+ parameters: [
33
+ {
34
+ name: "dryRun",
35
+ description: "Preview changes without writing",
36
+ type: "boolean",
37
+ default: false,
38
+ },
39
+ {
40
+ name: "undo",
41
+ description: "Reverse a previous setup",
42
+ type: "boolean",
43
+ default: false,
44
+ },
45
+ {
46
+ name: "zsh",
47
+ description: "Force zsh completions",
48
+ type: "boolean",
49
+ default: false,
50
+ },
51
+ {
52
+ name: "bash",
53
+ description: "Force bash completions",
54
+ type: "boolean",
55
+ default: false,
56
+ },
57
+ {
58
+ name: "fish",
59
+ description: "Force fish completions",
60
+ type: "boolean",
61
+ default: false,
62
+ },
63
+ ],
64
+ meta: {
65
+ examples: [
66
+ "pragma setup completions",
67
+ "pragma setup completions --zsh",
68
+ "pragma setup completions --dry-run",
69
+ "pragma setup completions --undo",
70
+ ],
71
+ },
72
+ execute: async (
73
+ params: Record<string, unknown>,
74
+ ctx,
75
+ ): Promise<CommandResult> =>
76
+ runSetupTask(setupCompletions(resolveForceShell(params)), {
77
+ dryRun: params.dryRun === true,
78
+ undo: params.undo === true,
79
+ verbose: ctx.globalFlags.verbose,
80
+ llm: ctx.globalFlags.llm,
81
+ format: ctx.globalFlags.format,
82
+ }),
83
+ };
84
+
85
+ export default completionsCommand;