@canonical/pragma-cli 0.27.1-experimental.0 → 0.30.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 (344) hide show
  1. package/README.md +67 -15
  2. package/dist/pragma +0 -0
  3. package/package.json +16 -17
  4. package/src/config/defaultConfig.test.ts +33 -0
  5. package/src/config/defaultConfig.ts +59 -0
  6. package/src/config/defaults.json +17 -0
  7. package/src/config/findProjectConfigPath.test.ts +53 -0
  8. package/src/config/findProjectConfigPath.ts +36 -0
  9. package/src/config/index.ts +17 -2
  10. package/src/config/mergeConfigFileUpdate.ts +58 -0
  11. package/src/config/parseConfigValues.ts +215 -0
  12. package/src/config/readConfig.test.ts +104 -13
  13. package/src/config/readConfig.ts +12 -117
  14. package/src/config/readConfigLayers.test.ts +107 -0
  15. package/src/config/readConfigLayers.ts +115 -0
  16. package/src/config/resolveGlobalConfigPath.ts +13 -0
  17. package/src/config/resolveWriteConfigPath.test.ts +53 -0
  18. package/src/config/resolveWriteConfigPath.ts +31 -0
  19. package/src/config/types.ts +88 -2
  20. package/src/config/writeConfig.ts +25 -43
  21. package/src/constants.ts +12 -1
  22. package/src/domains/block/commands/index.ts +2 -1
  23. package/src/domains/block/commands/list.ts +5 -90
  24. package/src/domains/block/commands/lookup.ts +8 -167
  25. package/src/domains/block/commands/sample.ts +55 -0
  26. package/src/domains/block/formatters/index.ts +2 -1
  27. package/src/domains/block/formatters/sample.ts +21 -0
  28. package/src/domains/block/index.ts +3 -3
  29. package/src/domains/block/mcp/specs.ts +36 -168
  30. package/src/domains/block/operations/index.ts +2 -1
  31. package/src/domains/block/operations/lookup.ts +9 -0
  32. package/src/domains/block/operations/sample.ts +41 -0
  33. package/src/domains/block/orchestration/blockEmptyError.test.ts +26 -0
  34. package/src/domains/block/orchestration/resolveBlockLookup.ts +11 -3
  35. package/src/domains/block/stories.test.ts +28 -0
  36. package/src/domains/block/stories.ts +254 -0
  37. package/src/domains/config/commands/channel.test.ts +14 -3
  38. package/src/domains/config/commands/channel.ts +11 -7
  39. package/src/domains/config/commands/configScope.ts +46 -0
  40. package/src/domains/config/commands/framework.test.ts +105 -0
  41. package/src/domains/config/commands/framework.ts +91 -0
  42. package/src/domains/config/commands/index.ts +2 -0
  43. package/src/domains/config/commands/show.ts +5 -45
  44. package/src/domains/config/commands/tier.test.ts +13 -2
  45. package/src/domains/config/commands/tier.ts +11 -7
  46. package/src/domains/config/commands/trace.test.ts +165 -0
  47. package/src/domains/config/commands/trace.ts +83 -0
  48. package/src/domains/config/formatters/channel.test.ts +20 -6
  49. package/src/domains/config/formatters/channel.ts +14 -11
  50. package/src/domains/config/formatters/framework.ts +37 -0
  51. package/src/domains/config/formatters/index.ts +2 -0
  52. package/src/domains/config/formatters/show.test.ts +27 -0
  53. package/src/domains/config/formatters/show.ts +27 -4
  54. package/src/domains/config/formatters/tier.test.ts +26 -10
  55. package/src/domains/config/formatters/tier.ts +19 -11
  56. package/src/domains/config/formatters/trace.ts +28 -0
  57. package/src/domains/config/index.ts +15 -2
  58. package/src/domains/config/mcp/specs.ts +33 -53
  59. package/src/domains/config/operations/index.ts +1 -0
  60. package/src/domains/config/operations/show.test.ts +18 -0
  61. package/src/domains/config/operations/show.ts +7 -1
  62. package/src/domains/config/operations/types.ts +7 -0
  63. package/src/domains/config/operations/validateFramework.ts +24 -0
  64. package/src/domains/config/stories.ts +42 -0
  65. package/src/domains/config/tasks/index.ts +3 -0
  66. package/src/domains/config/tasks/setChannel.ts +13 -22
  67. package/src/domains/config/tasks/setFramework.ts +21 -0
  68. package/src/domains/config/tasks/setTier.ts +10 -23
  69. package/src/domains/config/tasks/setTrace.ts +20 -0
  70. package/src/domains/config/tasks/writeConfigField.ts +41 -0
  71. package/src/domains/create/commands/component.ts +5 -5
  72. package/src/domains/doctor/operations/checks/checkConfigFile.ts +19 -5
  73. package/src/domains/doctor/operations/checks/checkKeStore.ts +5 -5
  74. package/src/domains/doctor/operations/checks/checkMcpCommands.ts +130 -0
  75. package/src/domains/doctor/operations/checks/checkMcpConfigured.ts +1 -1
  76. package/src/domains/doctor/operations/checks/checkPackageRefs.ts +30 -48
  77. package/src/domains/doctor/operations/checks/checkSkillsSymlinked.ts +1 -1
  78. package/src/domains/doctor/operations/checks/index.ts +1 -0
  79. package/src/domains/doctor/operations/checks.test.ts +162 -8
  80. package/src/domains/doctor/operations/runChecks.test.ts +85 -4
  81. package/src/domains/doctor/operations/runChecks.ts +50 -12
  82. package/src/domains/graph/helpers/resolveUri.test.ts +50 -0
  83. package/src/domains/graph/helpers/resolveUri.ts +28 -21
  84. package/src/domains/graphql/commands/build.test.ts +196 -0
  85. package/src/domains/graphql/commands/build.ts +117 -0
  86. package/src/domains/graphql/commands/check.test.ts +141 -0
  87. package/src/domains/graphql/commands/check.ts +81 -0
  88. package/src/domains/graphql/commands/index.ts +5 -0
  89. package/src/domains/graphql/commands/serve.test.ts +40 -0
  90. package/src/domains/graphql/commands/serve.ts +131 -0
  91. package/src/domains/graphql/constants.ts +10 -0
  92. package/src/domains/graphql/formatters/index.ts +3 -0
  93. package/src/domains/graphql/formatters/report.ts +78 -0
  94. package/src/domains/graphql/helpers/gatherSources.test.ts +92 -0
  95. package/src/domains/graphql/helpers/gatherSources.ts +58 -0
  96. package/src/domains/graphql/helpers/index.ts +6 -0
  97. package/src/domains/graphql/helpers/parsePrefixes.test.ts +44 -0
  98. package/src/domains/graphql/helpers/parsePrefixes.ts +38 -0
  99. package/src/domains/graphql/helpers/resolveSourceFiles.test.ts +56 -0
  100. package/src/domains/graphql/helpers/resolveSourceFiles.ts +45 -0
  101. package/src/domains/graphql/helpers/routeGraphql.test.ts +43 -0
  102. package/src/domains/graphql/helpers/routeGraphql.ts +28 -0
  103. package/src/domains/graphql/index.ts +24 -0
  104. package/src/domains/graphql/operations/compileSchema.test.ts +95 -0
  105. package/src/domains/graphql/operations/compileSchema.ts +107 -0
  106. package/src/domains/graphql/operations/createSchemaServer.test.ts +50 -0
  107. package/src/domains/graphql/operations/createSchemaServer.ts +75 -0
  108. package/src/domains/graphql/operations/index.ts +12 -0
  109. package/src/domains/graphql/types.ts +29 -0
  110. package/src/domains/info/operations/collectInfo.test.ts +16 -5
  111. package/src/domains/info/operations/collectInfo.ts +16 -19
  112. package/src/domains/llm/capabilities.test.ts +91 -0
  113. package/src/domains/llm/commands/capabilities.ts +28 -0
  114. package/src/domains/llm/commands/index.ts +1 -0
  115. package/src/domains/llm/data/commandReference.ts +90 -18
  116. package/src/domains/llm/data/decisionTrees.ts +15 -13
  117. package/src/domains/llm/data/index.ts +2 -0
  118. package/src/domains/llm/data/toolCatalog.ts +190 -0
  119. package/src/domains/llm/formatters/capabilities.ts +50 -0
  120. package/src/domains/llm/formatters/index.ts +1 -0
  121. package/src/domains/llm/index.ts +3 -2
  122. package/src/domains/llm/mcp/index.ts +1 -1
  123. package/src/domains/llm/mcp/specs.ts +59 -52
  124. package/src/domains/llm/types.ts +40 -0
  125. package/src/domains/modifier/commands/index.ts +2 -1
  126. package/src/domains/modifier/commands/list.ts +5 -38
  127. package/src/domains/modifier/commands/lookup.ts +8 -79
  128. package/src/domains/modifier/commands/sample.ts +53 -0
  129. package/src/domains/modifier/formatters/index.ts +2 -1
  130. package/src/domains/modifier/formatters/sample.ts +15 -0
  131. package/src/domains/modifier/index.ts +7 -3
  132. package/src/domains/modifier/mcp/specs.ts +38 -70
  133. package/src/domains/modifier/operations/index.ts +2 -1
  134. package/src/domains/modifier/operations/lookup.ts +9 -0
  135. package/src/domains/modifier/operations/sample.ts +32 -0
  136. package/src/domains/modifier/orchestration/modifierEmptyError.test.ts +26 -0
  137. package/src/domains/modifier/orchestration/modifierEmptyError.ts +7 -2
  138. package/src/domains/modifier/orchestration/resolveModifierLookup.ts +15 -2
  139. package/src/domains/modifier/stories.test.ts +20 -0
  140. package/src/domains/modifier/stories.ts +77 -0
  141. package/src/domains/ontology/commands/list.ts +5 -58
  142. package/src/domains/ontology/commands/show.ts +6 -58
  143. package/src/domains/ontology/formatters/show.ts +7 -1
  144. package/src/domains/ontology/mcp/specs.ts +7 -84
  145. package/src/domains/ontology/stories.test.ts +36 -0
  146. package/src/domains/ontology/stories.ts +108 -0
  147. package/src/domains/refs/operations/index.ts +1 -1
  148. package/src/domains/refs/operations/paths.ts +29 -1
  149. package/src/domains/refs/operations/updateRefs.test.ts +6 -3
  150. package/src/domains/refs/operations/updateRefs.ts +2 -36
  151. package/src/domains/setup/commands/skills.test.ts +6 -2
  152. package/src/domains/setup/commands/skills.ts +6 -2
  153. package/src/domains/setup/helpers/runSetupTask.test.ts +148 -150
  154. package/src/domains/setup/helpers/runSetupTask.ts +62 -70
  155. package/src/domains/setup/operations/setupMcp.test.ts +6 -1
  156. package/src/domains/shared/bootStore.ts +92 -50
  157. package/src/domains/shared/compactUri.test.ts +11 -0
  158. package/src/domains/shared/compactUri.ts +10 -5
  159. package/src/domains/shared/context.ts +2 -2
  160. package/src/domains/shared/contracts.ts +12 -0
  161. package/src/domains/shared/createInteractivePromptSession.test.ts +439 -0
  162. package/src/domains/shared/createInteractivePromptSession.ts +236 -0
  163. package/src/domains/shared/emptyErrorRecovery.test.ts +109 -0
  164. package/src/domains/shared/loaders/bundledLoader.test.ts +248 -0
  165. package/src/domains/shared/loaders/bundledLoader.ts +206 -0
  166. package/src/domains/shared/loaders/gitLoader.ts +31 -0
  167. package/src/domains/shared/loaders/index.ts +9 -0
  168. package/src/domains/shared/loaders/localLoader.ts +87 -0
  169. package/src/domains/shared/loaders/readPackageDir.ts +147 -0
  170. package/src/domains/shared/loaders/storyAssetsPlugin.test.ts +84 -0
  171. package/src/domains/shared/loaders/storyAssetsPlugin.ts +46 -0
  172. package/src/domains/shared/lookupMany.test.ts +120 -0
  173. package/src/domains/shared/lookupMany.ts +43 -3
  174. package/src/domains/shared/mergeAndParseRefs.test.ts +89 -0
  175. package/src/domains/shared/mergeAndParseRefs.ts +44 -0
  176. package/src/domains/shared/packages.ts +14 -120
  177. package/src/domains/shared/pickRandom.ts +22 -0
  178. package/src/domains/shared/resolveConfiguredGraphs.test.ts +27 -0
  179. package/src/domains/shared/resolveConfiguredGraphs.ts +41 -0
  180. package/src/domains/shared/runtime.ts +7 -63
  181. package/src/domains/shared/sampleFormatters.ts +47 -0
  182. package/src/domains/shared/semanticPackage.ts +112 -0
  183. package/src/domains/shared/stories/compileLookupCommand.test.ts +145 -0
  184. package/src/domains/shared/stories/compileLookupCommand.ts +100 -0
  185. package/src/domains/shared/stories/compileLookupTool.test.ts +105 -0
  186. package/src/domains/shared/stories/compileLookupTool.ts +96 -0
  187. package/src/domains/shared/stories/compileReadCommand.test.ts +121 -0
  188. package/src/domains/shared/stories/compileReadCommand.ts +48 -0
  189. package/src/domains/shared/stories/compileReadTool.test.ts +64 -0
  190. package/src/domains/shared/stories/compileReadTool.ts +38 -0
  191. package/src/domains/shared/stories/condense.test.ts +18 -0
  192. package/src/domains/shared/stories/condense.ts +15 -0
  193. package/src/domains/shared/stories/index.ts +20 -0
  194. package/src/domains/shared/stories/normalizeNames.test.ts +20 -0
  195. package/src/domains/shared/stories/normalizeNames.ts +22 -0
  196. package/src/domains/shared/stories/pack/applyPackFilters.test.ts +102 -0
  197. package/src/domains/shared/stories/pack/applyPackFilters.ts +76 -0
  198. package/src/domains/shared/stories/pack/buildLookupQuery.test.ts +51 -0
  199. package/src/domains/shared/stories/pack/buildLookupQuery.ts +80 -0
  200. package/src/domains/shared/stories/pack/collectPackStories.test.ts +108 -0
  201. package/src/domains/shared/stories/pack/collectPackStories.ts +76 -0
  202. package/src/domains/shared/stories/pack/compilePackCommands.ts +40 -0
  203. package/src/domains/shared/stories/pack/compilePackStories.test.ts +146 -0
  204. package/src/domains/shared/stories/pack/compilePackStories.ts +253 -0
  205. package/src/domains/shared/stories/pack/compilePackToolSpecs.ts +43 -0
  206. package/src/domains/shared/stories/pack/index.ts +28 -0
  207. package/src/domains/shared/stories/pack/runSelectQuery.ts +31 -0
  208. package/src/domains/shared/stories/pack/standardParity.test.ts +308 -0
  209. package/src/domains/shared/stories/pack/types.ts +104 -0
  210. package/src/domains/shared/stories/pack/validateStoryPackDefinition.test.ts +240 -0
  211. package/src/domains/shared/stories/pack/validateStoryPackDefinition.ts +408 -0
  212. package/src/domains/shared/stories/projectCliParameters.test.ts +59 -0
  213. package/src/domains/shared/stories/projectCliParameters.ts +57 -0
  214. package/src/domains/shared/stories/projectToolParams.test.ts +50 -0
  215. package/src/domains/shared/stories/projectToolParams.ts +32 -0
  216. package/src/domains/shared/stories/requirePragmaContext.test.ts +23 -0
  217. package/src/domains/shared/stories/requirePragmaContext.ts +23 -0
  218. package/src/domains/shared/stories/resolveLookupDetailed.test.ts +57 -0
  219. package/src/domains/shared/stories/resolveLookupDetailed.ts +27 -0
  220. package/src/domains/shared/stories/types.ts +171 -0
  221. package/src/domains/shared/suggestions/detectCrossDomain.test.ts +43 -0
  222. package/src/domains/shared/suggestions/detectCrossDomain.ts +116 -0
  223. package/src/domains/shared/suggestions/expandGlob.test.ts +92 -0
  224. package/src/domains/shared/suggestions/expandGlob.ts +52 -0
  225. package/src/domains/shared/suggestions/expandLookupQueries.ts +57 -0
  226. package/src/domains/shared/suggestions/index.ts +7 -0
  227. package/src/domains/shared/suggestions/listDomainNames.ts +61 -0
  228. package/src/domains/shared/suggestions/suggestNames.test.ts +70 -0
  229. package/src/domains/shared/suggestions/suggestNames.ts +130 -0
  230. package/src/domains/shared/types/index.ts +1 -0
  231. package/src/domains/shared/types/runtime.ts +4 -1
  232. package/src/domains/shared/types/sample.ts +17 -0
  233. package/src/domains/skill/commands/index.ts +3 -1
  234. package/src/domains/skill/commands/list.test.ts +6 -2
  235. package/src/domains/skill/commands/list.ts +5 -63
  236. package/src/domains/skill/commands/lookup.test.ts +118 -0
  237. package/src/domains/skill/commands/lookup.ts +14 -0
  238. package/src/domains/skill/formatters/index.ts +1 -0
  239. package/src/domains/skill/formatters/lookup.test.ts +46 -0
  240. package/src/domains/skill/formatters/lookup.ts +57 -0
  241. package/src/domains/skill/helpers/resolveSkillSources.ts +48 -16
  242. package/src/domains/skill/index.ts +7 -3
  243. package/src/domains/skill/mcp/specs.ts +10 -29
  244. package/src/domains/skill/operations/discover.test.ts +61 -30
  245. package/src/domains/skill/operations/discover.ts +28 -37
  246. package/src/domains/skill/operations/index.ts +2 -1
  247. package/src/domains/skill/operations/list.test.ts +15 -7
  248. package/src/domains/skill/operations/lookup.test.ts +91 -0
  249. package/src/domains/skill/operations/lookup.ts +70 -0
  250. package/src/domains/skill/stories.test.ts +43 -0
  251. package/src/domains/skill/stories.ts +103 -0
  252. package/src/domains/skill/types.ts +8 -0
  253. package/src/domains/standard/commands/index.ts +2 -1
  254. package/src/domains/standard/commands/list.ts +5 -84
  255. package/src/domains/standard/commands/lookup.ts +8 -93
  256. package/src/domains/standard/commands/sample.ts +57 -0
  257. package/src/domains/standard/formatters/index.ts +2 -1
  258. package/src/domains/standard/formatters/sample.ts +15 -0
  259. package/src/domains/standard/index.ts +8 -1
  260. package/src/domains/standard/mcp/specs.ts +44 -152
  261. package/src/domains/standard/operations/index.ts +2 -1
  262. package/src/domains/standard/operations/lookup.ts +9 -0
  263. package/src/domains/standard/operations/sample.ts +35 -0
  264. package/src/domains/standard/orchestration/resolveStandardLookup.ts +15 -2
  265. package/src/domains/standard/orchestration/standardEmptyError.test.ts +33 -0
  266. package/src/domains/standard/orchestration/standardEmptyError.ts +16 -6
  267. package/src/domains/standard/stories.test.ts +24 -0
  268. package/src/domains/standard/stories.ts +151 -0
  269. package/src/domains/tier/commands/list.ts +5 -55
  270. package/src/domains/tier/mcp/specs.ts +5 -31
  271. package/src/domains/tier/stories.test.ts +22 -0
  272. package/src/domains/tier/stories.ts +52 -0
  273. package/src/domains/token/commands/index.ts +2 -1
  274. package/src/domains/token/commands/sample.ts +53 -0
  275. package/src/domains/token/formatters/index.ts +2 -1
  276. package/src/domains/token/formatters/sample.ts +16 -0
  277. package/src/domains/token/index.ts +8 -1
  278. package/src/domains/token/mcp/specs.ts +52 -2
  279. package/src/domains/token/operations/index.ts +2 -1
  280. package/src/domains/token/operations/lookup.ts +9 -0
  281. package/src/domains/token/operations/sample.ts +32 -0
  282. package/src/domains/token/orchestration/resolveTokenLookup.ts +15 -2
  283. package/src/domains/token/orchestration/tokenEmptyError.test.ts +33 -0
  284. package/src/domains/token/orchestration/tokenEmptyError.ts +5 -2
  285. package/src/domains/trace/commands/clear.ts +71 -0
  286. package/src/domains/trace/commands/index.ts +5 -0
  287. package/src/domains/trace/commands/sessions.ts +32 -0
  288. package/src/domains/trace/commands/show.ts +145 -0
  289. package/src/domains/trace/formatters/index.ts +9 -0
  290. package/src/domains/trace/formatters/sessions.ts +80 -0
  291. package/src/domains/trace/formatters/show.ts +122 -0
  292. package/src/domains/trace/index.ts +17 -0
  293. package/src/domains/trace/operations/index.ts +8 -0
  294. package/src/domains/trace/operations/listSessions.test.ts +55 -0
  295. package/src/domains/trace/operations/listSessions.ts +52 -0
  296. package/src/domains/trace/operations/readTraceLog.test.ts +100 -0
  297. package/src/domains/trace/operations/readTraceLog.ts +104 -0
  298. package/src/domains/trace/tracePlugin.test.ts +171 -0
  299. package/src/domains/trace/tracePlugin.ts +159 -0
  300. package/src/domains/trace/types.ts +65 -0
  301. package/src/error/PragmaError.ts +15 -2
  302. package/src/error/types.ts +15 -1
  303. package/src/mcp/error/serializeErrorPayload.ts +7 -0
  304. package/src/mcp/error/types.ts +8 -0
  305. package/src/mcp/registerResources.test.ts +405 -75
  306. package/src/mcp/registerResources.ts +5 -299
  307. package/src/mcp/resources/buildGraphIndex.ts +167 -0
  308. package/src/mcp/resources/buildResourceList.test.ts +97 -0
  309. package/src/mcp/resources/buildResourceList.ts +176 -0
  310. package/src/mcp/resources/classifyEntity.test.ts +40 -0
  311. package/src/mcp/resources/classifyEntity.ts +27 -0
  312. package/src/mcp/resources/constants.ts +105 -0
  313. package/src/mcp/resources/displayPredicates.ts +62 -0
  314. package/src/mcp/resources/pickFirstValue.test.ts +29 -0
  315. package/src/mcp/resources/pickFirstValue.ts +26 -0
  316. package/src/mcp/resources/pickPrimaryType.test.ts +41 -0
  317. package/src/mcp/resources/pickPrimaryType.ts +26 -0
  318. package/src/mcp/resources/rankUriCompletions.test.ts +52 -0
  319. package/src/mcp/resources/rankUriCompletions.ts +64 -0
  320. package/src/mcp/resources/readEntity.ts +169 -0
  321. package/src/mcp/resources/registerResources.ts +126 -0
  322. package/src/mcp/resources/types.ts +128 -0
  323. package/src/mcp/tools/index.ts +9 -0
  324. package/src/mcp/tools/registerTools.test.ts +84 -12
  325. package/src/mcp/types.ts +4 -0
  326. package/src/mcp/utils/wrapTool.test.ts +1 -0
  327. package/src/pipeline/collectCommands.ts +15 -2
  328. package/src/pipeline/renderError.ts +15 -0
  329. package/src/pipeline/resolveCommandKind.ts +8 -1
  330. package/src/pipeline/runCli.ts +51 -6
  331. package/src/testing/createTestMcpClient.ts +5 -1
  332. package/src/testing/graphqlFixtures.ts +72 -0
  333. package/src/testing/index.ts +17 -0
  334. package/src/testing/integration/__snapshots__/executor-golden.test.ts.snap +1207 -0
  335. package/src/testing/integration/cross-binary-byte-equality.test.ts +129 -0
  336. package/src/testing/integration/executor-execution.test.ts +101 -0
  337. package/src/testing/integration/executor-golden.test.ts +145 -0
  338. package/src/testing/integration/mcp-surface.test.ts +11 -5
  339. package/src/testing/integration/parity.test.ts +17 -12
  340. package/src/testing/regression/0001-skill-discovery-granularity.test.ts +71 -0
  341. package/src/testing/setupXdgIsolation.ts +15 -0
  342. package/src/testing/standardParityFixtures.ts +92 -0
  343. package/src/testing/storyFixtures.ts +63 -0
  344. package/src/pipeline/runInteractiveCommand.ts +0 -198
@@ -4,12 +4,17 @@ import { commands as configCommands } from "../domains/config/index.js";
4
4
  import { commands as createCommands } from "../domains/create/index.js";
5
5
  import { doctorCommand } from "../domains/doctor/commands/index.js";
6
6
  import { commands as graphCommands } from "../domains/graph/index.js";
7
+ import { commands as graphqlCommands } from "../domains/graphql/index.js";
7
8
  import { infoCommand, upgradeCommand } from "../domains/info/index.js";
8
- import { buildLlmCommand } from "../domains/llm/index.js";
9
+ import {
10
+ buildCapabilitiesCommand,
11
+ buildLlmCommand,
12
+ } from "../domains/llm/index.js";
9
13
  import { commands as modifierCommands } from "../domains/modifier/index.js";
10
14
  import { commands as ontologyCommands } from "../domains/ontology/index.js";
11
15
  import { commands as setupCommands } from "../domains/setup/index.js";
12
16
  import type { PragmaContext } from "../domains/shared/context.js";
17
+ import { compilePackCommands } from "../domains/shared/stories/pack/index.js";
13
18
  import { commands as skillCommands } from "../domains/skill/index.js";
14
19
  import { commands as standardCommands } from "../domains/standard/index.js";
15
20
  import { commands as tierCommands } from "../domains/tier/index.js";
@@ -27,7 +32,7 @@ import { commands as tokenCommands } from "../domains/token/index.js";
27
32
  export default function collectCommands(
28
33
  ctx: PragmaContext,
29
34
  ): CommandDefinition[] {
30
- return [
35
+ const builtIn: CommandDefinition[] = [
31
36
  ...configCommands(ctx),
32
37
  ...createCommands(),
33
38
  ...setupCommands(),
@@ -38,10 +43,18 @@ export default function collectCommands(
38
43
  ...blockCommands(ctx),
39
44
  ...ontologyCommands(ctx),
40
45
  ...graphCommands(ctx),
46
+ ...graphqlCommands(),
41
47
  ...skillCommands(ctx),
42
48
  doctorCommand,
43
49
  infoCommand,
44
50
  upgradeCommand,
45
51
  buildLlmCommand(ctx),
52
+ buildCapabilitiesCommand(),
46
53
  ];
54
+
55
+ // Story packs project onto the same surface; built-in nouns are reserved.
56
+ const reservedNouns = new Set(
57
+ builtIn.map((command) => command.path.at(0) ?? ""),
58
+ );
59
+ return [...builtIn, ...compilePackCommands(ctx, reservedNouns)];
47
60
  }
@@ -43,6 +43,14 @@ function renderErrorPlain(error: PragmaError): string {
43
43
  lines.push(`Valid options: ${error.validOptions.join(", ")}`);
44
44
  }
45
45
 
46
+ if (error.crossDomain) {
47
+ lines.push("");
48
+ lines.push(
49
+ `"${error.entity?.name ?? ""}" exists as a ${error.crossDomain.entityType}.`,
50
+ );
51
+ lines.push(`Run \`${error.crossDomain.cli}\``);
52
+ }
53
+
46
54
  if (error.recovery) {
47
55
  lines.push("");
48
56
  if (error.recovery.cli) {
@@ -82,6 +90,12 @@ function renderErrorLlm(error: PragmaError): string {
82
90
  lines.push(`Valid options: ${error.validOptions.join(", ")}`);
83
91
  }
84
92
 
93
+ if (error.crossDomain) {
94
+ lines.push(
95
+ `Cross-domain: "${error.entity?.name ?? ""}" exists as a ${error.crossDomain.entityType}. \`${error.crossDomain.cli}\``,
96
+ );
97
+ }
98
+
85
99
  if (error.recovery) {
86
100
  if (error.recovery.cli) {
87
101
  lines.push(`Recovery: \`${error.recovery.cli}\``);
@@ -106,6 +120,7 @@ function renderErrorJson(error: PragmaError): string {
106
120
  entity: error.entity,
107
121
  suggestions: error.suggestions,
108
122
  recovery: error.recovery,
123
+ crossDomain: error.crossDomain,
109
124
  filters: error.filters,
110
125
  validOptions: error.validOptions,
111
126
  });
@@ -8,7 +8,14 @@
8
8
  import type { CommandKind } from "./types.js";
9
9
 
10
10
  /** Commands that do not require the ke store to be booted. */
11
- const STORE_SKIP_COMMANDS = new Set(["setup", "mcp", "update-refs"]);
11
+ const STORE_SKIP_COMMANDS = new Set([
12
+ "setup",
13
+ "mcp",
14
+ "update-refs",
15
+ "capabilities",
16
+ "trace",
17
+ "graphql",
18
+ ]);
12
19
 
13
20
  function findCommandArg(argv: readonly string[]): string | undefined {
14
21
  const args = argv.slice(2);
@@ -1,10 +1,14 @@
1
1
  import type { GlobalFlags } from "@canonical/cli-core";
2
2
  import { CommanderError } from "commander";
3
+ import { commands as graphqlCommands } from "../domains/graphql/index.js";
4
+ import { buildCapabilitiesCommand } from "../domains/llm/index.js";
3
5
  import { commands as refsCommands } from "../domains/refs/index.js";
4
6
  import { commands as setupCommands } from "../domains/setup/index.js";
5
7
  import type { PragmaContext } from "../domains/shared/context.js";
8
+ import createInteractivePromptSession from "../domains/shared/createInteractivePromptSession.js";
6
9
  import type { PragmaRuntime } from "../domains/shared/runtime.js";
7
10
  import { bootPragma } from "../domains/shared/runtime.js";
11
+ import { commands as traceCommands } from "../domains/trace/index.js";
8
12
  import { PragmaError } from "../error/index.js";
9
13
  import collectCommands from "./collectCommands.js";
10
14
  import createProgram from "./createProgram.js";
@@ -16,7 +20,6 @@ import {
16
20
  renderErrorPlain,
17
21
  } from "./renderError.js";
18
22
  import resolveCommandKind from "./resolveCommandKind.js";
19
- import runInteractiveCommand from "./runInteractiveCommand.js";
20
23
 
21
24
  function hasCommandArg(argv: readonly string[]): boolean {
22
25
  const args = argv.slice(2);
@@ -76,11 +79,11 @@ async function handleDoctor(globalFlags: GlobalFlags): Promise<void> {
76
79
  async function handleRootHelp(globalFlags: GlobalFlags): Promise<void> {
77
80
  const stubCtx: PragmaContext = {
78
81
  store: {} as PragmaRuntime["store"],
79
- config: { tier: undefined, channel: "normal" },
82
+ ...(await resolveHelpConfig()),
80
83
  cwd: process.cwd(),
81
84
  dispose: () => {},
82
85
  globalFlags,
83
- interactive: runInteractiveCommand,
86
+ promptSession: createInteractivePromptSession,
84
87
  };
85
88
  const commands = collectCommands(stubCtx);
86
89
  const program = createProgram(commands, stubCtx);
@@ -92,6 +95,41 @@ async function handleRootHelp(globalFlags: GlobalFlags): Promise<void> {
92
95
  }
93
96
  }
94
97
 
98
+ /**
99
+ * Resolve config and packages for root help without booting the store.
100
+ *
101
+ * Story-pack nouns come from config and package files, so bare
102
+ * `pragma --help` reads them via the filesystem loaders only. Help must
103
+ * never fail on a broken config — errors fall back to the empty stub and
104
+ * surface on the next real command instead.
105
+ *
106
+ * @note Impure — reads config and resolves packages from disk.
107
+ */
108
+ async function resolveHelpConfig(): Promise<
109
+ Pick<PragmaRuntime, "config" | "packages">
110
+ > {
111
+ try {
112
+ const { readConfig } = await import("#config");
113
+ const config = readConfig(process.cwd());
114
+ const { resolveSemanticPackages } = await import(
115
+ "../domains/shared/semanticPackage.js"
116
+ );
117
+ const { createGitLoader, createLocalLoader } = await import(
118
+ "../domains/shared/loaders/index.js"
119
+ );
120
+ const { mergeAndParseRefs } = await import(
121
+ "../domains/shared/mergeAndParseRefs.js"
122
+ );
123
+ const packages = await resolveSemanticPackages(
124
+ mergeAndParseRefs(config.packages),
125
+ [createLocalLoader(), createGitLoader()],
126
+ );
127
+ return { config, packages };
128
+ } catch {
129
+ return { config: { tier: undefined, channel: "normal" }, packages: [] };
130
+ }
131
+ }
132
+
95
133
  // — Stage 4+5: Boot, build program, execute ——————————————————————————————————
96
134
 
97
135
  async function bootAndRun(
@@ -117,7 +155,7 @@ async function bootAndRun(
117
155
  const ctx: PragmaContext = {
118
156
  ...runtime,
119
157
  globalFlags,
120
- interactive: runInteractiveCommand,
158
+ promptSession: createInteractivePromptSession,
121
159
  };
122
160
  const commands = collectCommands(ctx);
123
161
  const program = createProgram(commands, ctx);
@@ -137,11 +175,18 @@ async function runStoreSkip(
137
175
  store: {} as PragmaRuntime["store"],
138
176
  config: { tier: undefined, channel: "normal" },
139
177
  cwd: process.cwd(),
178
+ packages: [],
140
179
  dispose: () => {},
141
180
  globalFlags,
142
- interactive: runInteractiveCommand,
181
+ promptSession: createInteractivePromptSession,
143
182
  };
144
- const commands = [...setupCommands(), ...refsCommands()];
183
+ const commands = [
184
+ ...setupCommands(),
185
+ ...refsCommands(),
186
+ ...traceCommands(),
187
+ ...graphqlCommands(),
188
+ buildCapabilitiesCommand(),
189
+ ];
145
190
  const program = createProgram(commands, stubCtx);
146
191
 
147
192
  try {
@@ -31,12 +31,16 @@ export default async function createTestMcpClient(options?: {
31
31
  };
32
32
  const cwd = options?.cwd ?? process.cwd();
33
33
 
34
- const { store, cleanup: cleanupStore } = await createTestStore({ ttl });
34
+ const { store, cleanup: cleanupStore } = await createTestStore({
35
+ ttl,
36
+ prefixes: config.prefixes,
37
+ });
35
38
 
36
39
  const runtime: PragmaRuntime = {
37
40
  store,
38
41
  config,
39
42
  cwd,
43
+ packages: [],
40
44
  dispose: () => cleanupStore(),
41
45
  };
42
46
 
@@ -0,0 +1,72 @@
1
+ /**
2
+ * TTL fixtures for graphql domain tests.
3
+ *
4
+ * Three compile outcomes: a clean ontology (no diagnostics), an ontology
5
+ * with an unresolvable field-name collision (M001 error diagnostic, schema
6
+ * still composes), and an ontology whose reserved `__` field name fails
7
+ * schema composition entirely (C003 → CompilationError).
8
+ */
9
+
10
+ /** Namespace used by all graphql fixtures. */
11
+ export const EX_NAMESPACE = "http://example.org/";
12
+
13
+ /** `--prefix` entry registering {@link EX_NAMESPACE}. */
14
+ export const EX_PREFIX_ENTRY = `ex=${EX_NAMESPACE}`;
15
+
16
+ const prefixBlock = `@prefix ex: <${EX_NAMESPACE}> .
17
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
18
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
19
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .`;
20
+
21
+ /** Compiles to `type Thing` with zero diagnostics. */
22
+ export const GRAPHQL_CLEAN_TTL = `${prefixBlock}
23
+
24
+ ex:Thing a owl:Class ;
25
+ rdfs:label "Thing" .
26
+
27
+ ex:name a owl:DatatypeProperty ;
28
+ rdfs:domain ex:Thing ;
29
+ rdfs:range xsd:string ;
30
+ rdfs:label "name" .
31
+
32
+ ex:widget a ex:Thing ;
33
+ ex:name "Widget" .
34
+ `;
35
+
36
+ /**
37
+ * Produces an M001 error diagnostic (three properties collapse to
38
+ * `Thing.name` and the namespace-prefixed rename collides too), but the
39
+ * schema still composes — no CompilationError.
40
+ */
41
+ export const GRAPHQL_ERROR_TTL = `${prefixBlock}
42
+
43
+ ex:Thing a owl:Class ;
44
+ rdfs:label "Thing" .
45
+
46
+ ex:name a owl:DatatypeProperty ;
47
+ rdfs:domain ex:Thing ;
48
+ rdfs:range xsd:string .
49
+
50
+ ex:hasName a owl:DatatypeProperty ;
51
+ rdfs:domain ex:Thing ;
52
+ rdfs:range xsd:string .
53
+
54
+ ex:isName a owl:DatatypeProperty ;
55
+ rdfs:domain ex:Thing ;
56
+ rdfs:range xsd:string .
57
+ `;
58
+
59
+ /**
60
+ * Fails schema composition (C003): `__bad` survives name sanitization but
61
+ * `__` is reserved by GraphQL introspection, so compile() throws
62
+ * CompilationError.
63
+ */
64
+ export const GRAPHQL_FATAL_TTL = `${prefixBlock}
65
+
66
+ ex:Thing a owl:Class ;
67
+ rdfs:label "Thing" .
68
+
69
+ ex:__bad a owl:DatatypeProperty ;
70
+ rdfs:domain ex:Thing ;
71
+ rdfs:range xsd:string .
72
+ `;
@@ -3,6 +3,23 @@ export type { CommandResult } from "./cli.js";
3
3
  export { runCommand } from "./cli.js";
4
4
  export { default as createTestMcpClient } from "./createTestMcpClient.js";
5
5
  export { DS_ALL_TTL, DS_ONTOLOGY_TTL, DS_TIERS_TTL } from "./dsFixtures.js";
6
+ export {
7
+ EX_NAMESPACE,
8
+ EX_PREFIX_ENTRY,
9
+ GRAPHQL_CLEAN_TTL,
10
+ GRAPHQL_ERROR_TTL,
11
+ GRAPHQL_FATAL_TTL,
12
+ } from "./graphqlFixtures.js";
13
+ export {
14
+ PARITY_GAPS,
15
+ STANDARD_PACK_STORY,
16
+ } from "./standardParityFixtures.js";
6
17
  export type { PragmaTestStoreOptions } from "./store.js";
7
18
  export { createTestStore } from "./store.js";
19
+ export {
20
+ RECIPE_NAMESPACE,
21
+ RECIPE_PREFIXES,
22
+ RECIPE_STORY,
23
+ RECIPE_TTL,
24
+ } from "./storyFixtures.js";
8
25
  export type { TestMcpClientResult } from "./types.js";