@canonical/pragma-cli 0.29.0 → 0.31.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 (410) hide show
  1. package/README.md +128 -47
  2. package/dist/pragma +0 -0
  3. package/package.json +15 -13
  4. package/src/completions/constants.ts +7 -0
  5. package/src/completions/handleQuery.test.ts +32 -0
  6. package/src/completions/handleQuery.ts +20 -1
  7. package/src/completions/queryCompletions.test.ts +5 -0
  8. package/src/completions/queryCompletions.ts +17 -3
  9. package/src/completions/querySocket.test.ts +31 -0
  10. package/src/completions/querySocket.ts +36 -9
  11. package/src/config/defaultConfig.test.ts +33 -0
  12. package/src/config/defaultConfig.ts +59 -0
  13. package/src/config/defaults.json +17 -0
  14. package/src/config/findProjectConfigPath.test.ts +53 -0
  15. package/src/config/findProjectConfigPath.ts +36 -0
  16. package/src/config/index.ts +17 -2
  17. package/src/config/mergeConfigFileUpdate.ts +58 -0
  18. package/src/config/parseConfigValues.ts +217 -0
  19. package/src/config/readConfig.test.ts +104 -13
  20. package/src/config/readConfig.ts +12 -153
  21. package/src/config/readConfigLayers.test.ts +109 -0
  22. package/src/config/readConfigLayers.ts +118 -0
  23. package/src/config/resolveGlobalConfigPath.ts +13 -0
  24. package/src/config/resolveWriteConfigPath.test.ts +53 -0
  25. package/src/config/resolveWriteConfigPath.ts +31 -0
  26. package/src/config/types.ts +83 -1
  27. package/src/config/writeConfig.ts +25 -55
  28. package/src/constants.ts +3 -1
  29. package/src/domains/block/commands/list.ts +5 -90
  30. package/src/domains/block/commands/lookup.ts +8 -167
  31. package/src/domains/block/commands/sample.ts +2 -1
  32. package/src/domains/block/formatters/list.test.ts +3 -3
  33. package/src/domains/block/formatters/lookup.test.ts +5 -5
  34. package/src/domains/block/mcp/specs.ts +16 -196
  35. package/src/domains/block/orchestration/enrichBlocks.ts +6 -3
  36. package/src/domains/block/orchestration/resolveBlockLookup.ts +2 -1
  37. package/src/domains/block/stories.test.ts +28 -0
  38. package/src/domains/block/stories.ts +260 -0
  39. package/src/domains/config/commands/channel.test.ts +30 -3
  40. package/src/domains/config/commands/channel.ts +25 -8
  41. package/src/domains/config/commands/configScope.ts +46 -0
  42. package/src/domains/config/commands/framework.test.ts +32 -1
  43. package/src/domains/config/commands/framework.ts +26 -8
  44. package/src/domains/config/commands/show.ts +5 -45
  45. package/src/domains/config/commands/tier.test.ts +20 -2
  46. package/src/domains/config/commands/tier.ts +25 -8
  47. package/src/domains/config/commands/trace.test.ts +19 -2
  48. package/src/domains/config/commands/trace.ts +6 -3
  49. package/src/domains/config/formatters/channel.test.ts +20 -6
  50. package/src/domains/config/formatters/channel.ts +14 -11
  51. package/src/domains/config/formatters/framework.ts +14 -11
  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 +7 -7
  57. package/src/domains/config/mcp/specs.ts +33 -53
  58. package/src/domains/config/operations/show.test.ts +18 -0
  59. package/src/domains/config/operations/show.ts +7 -1
  60. package/src/domains/config/operations/types.ts +7 -0
  61. package/src/domains/config/operations/validateTier.test.ts +9 -0
  62. package/src/domains/config/operations/validateTier.ts +10 -2
  63. package/src/domains/config/stories.ts +42 -0
  64. package/src/domains/config/tasks/index.ts +1 -0
  65. package/src/domains/config/tasks/setChannel.ts +13 -28
  66. package/src/domains/config/tasks/setFramework.ts +11 -30
  67. package/src/domains/config/tasks/setTier.ts +10 -29
  68. package/src/domains/config/tasks/setTrace.ts +10 -28
  69. package/src/domains/config/tasks/writeConfigField.ts +41 -0
  70. package/src/domains/create/generatorPack/bundled.ts +49 -0
  71. package/src/domains/create/generatorPack/compileGeneratorPack.test.ts +159 -0
  72. package/src/domains/create/generatorPack/compileGeneratorPack.ts +312 -0
  73. package/src/domains/create/index.ts +13 -7
  74. package/src/domains/create/mcp/specs.ts +6 -161
  75. package/src/domains/create/renderGeneratorUi.test.ts +103 -0
  76. package/src/domains/create/renderGeneratorUi.ts +65 -0
  77. package/src/domains/doctor/formatters/doctor.test.ts +50 -2
  78. package/src/domains/doctor/formatters/doctor.ts +90 -38
  79. package/src/domains/doctor/operations/checks/checkConfigFile.ts +19 -5
  80. package/src/domains/doctor/operations/checks/checkMcpCommands.ts +133 -0
  81. package/src/domains/doctor/operations/checks/checkMcpConfigured.ts +1 -1
  82. package/src/domains/doctor/operations/checks/checkPackageRefs.ts +32 -26
  83. package/src/domains/doctor/operations/checks/checkSkillsSymlinked.ts +1 -1
  84. package/src/domains/doctor/operations/checks/index.ts +1 -0
  85. package/src/domains/doctor/operations/checks.test.ts +160 -7
  86. package/src/domains/doctor/operations/runChecks.test.ts +15 -6
  87. package/src/domains/doctor/operations/runChecks.ts +2 -0
  88. package/src/domains/doctor/operations/types.ts +23 -1
  89. package/src/domains/graph/commands/inspect.test.ts +2 -2
  90. package/src/domains/graph/commands/query.test.ts +5 -3
  91. package/src/domains/graph/formatters/inspect.ts +7 -7
  92. package/src/domains/graph/formatters/query.test.ts +87 -0
  93. package/src/domains/graph/formatters/query.ts +42 -5
  94. package/src/domains/graph/helpers/resolveUri.test.ts +50 -0
  95. package/src/domains/graph/helpers/resolveUri.ts +28 -21
  96. package/src/domains/graph/operations/inspectUri.test.ts +5 -5
  97. package/src/domains/graphql/commands/build.test.ts +5 -3
  98. package/src/domains/graphql/commands/build.ts +8 -16
  99. package/src/domains/graphql/commands/check.test.ts +5 -3
  100. package/src/domains/graphql/commands/check.ts +7 -13
  101. package/src/domains/graphql/commands/index.ts +1 -0
  102. package/src/domains/graphql/commands/serve.test.ts +46 -0
  103. package/src/domains/graphql/commands/serve.ts +141 -0
  104. package/src/domains/graphql/constants.ts +10 -0
  105. package/src/domains/graphql/helpers/gatherSources.test.ts +92 -0
  106. package/src/domains/graphql/helpers/gatherSources.ts +58 -0
  107. package/src/domains/graphql/helpers/index.ts +2 -0
  108. package/src/domains/graphql/helpers/parsePrefixes.test.ts +3 -3
  109. package/src/domains/graphql/helpers/parsePrefixes.ts +3 -3
  110. package/src/domains/graphql/helpers/resolveSourceFiles.test.ts +9 -0
  111. package/src/domains/graphql/helpers/resolveSourceFiles.ts +24 -3
  112. package/src/domains/graphql/helpers/routeGraphql.test.ts +43 -0
  113. package/src/domains/graphql/helpers/routeGraphql.ts +28 -0
  114. package/src/domains/graphql/index.ts +9 -6
  115. package/src/domains/graphql/operations/compileSchema.test.ts +23 -47
  116. package/src/domains/graphql/operations/compileSchema.ts +23 -25
  117. package/src/domains/graphql/operations/createSchemaServer.test.ts +50 -0
  118. package/src/domains/graphql/operations/createSchemaServer.ts +75 -0
  119. package/src/domains/graphql/operations/ensureSchemaArtifact.test.ts +167 -0
  120. package/src/domains/graphql/operations/ensureSchemaArtifact.ts +178 -0
  121. package/src/domains/graphql/operations/index.ts +10 -0
  122. package/src/domains/info/formatters/upgrade.test.ts +7 -4
  123. package/src/domains/info/formatters/upgrade.ts +3 -1
  124. package/src/domains/info/operations/collectEntityCounts.test.ts +156 -0
  125. package/src/domains/info/operations/collectEntityCounts.ts +123 -0
  126. package/src/domains/info/operations/collectInfo.test.ts +14 -3
  127. package/src/domains/info/operations/collectInfo.ts +12 -15
  128. package/src/domains/info/operations/index.ts +1 -0
  129. package/src/domains/info/types.ts +13 -0
  130. package/src/domains/llm/capabilities.test.ts +24 -4
  131. package/src/domains/llm/commands/capabilities.ts +12 -3
  132. package/src/domains/llm/commands/llm.ts +5 -1
  133. package/src/domains/llm/data/commandReference.ts +20 -11
  134. package/src/domains/llm/data/decisionTrees.ts +10 -5
  135. package/src/domains/llm/data/toolCatalog.ts +55 -18
  136. package/src/domains/llm/formatters/orientation.ts +5 -1
  137. package/src/domains/llm/llmCommand.test.ts +11 -3
  138. package/src/domains/llm/mcp/specs.ts +3 -4
  139. package/src/domains/llm/operations/collectContext.test.ts +64 -0
  140. package/src/domains/llm/operations/collectContext.ts +7 -17
  141. package/src/domains/modifier/commands/list.ts +5 -38
  142. package/src/domains/modifier/commands/lookup.ts +8 -79
  143. package/src/domains/modifier/commands/sample.ts +2 -1
  144. package/src/domains/modifier/mcp/specs.ts +15 -94
  145. package/src/domains/modifier/operations/lookup.ts +5 -3
  146. package/src/domains/modifier/orchestration/resolveModifierLookup.ts +2 -1
  147. package/src/domains/modifier/stories.test.ts +20 -0
  148. package/src/domains/modifier/stories.ts +86 -0
  149. package/src/domains/ontology/commands/list.test.ts +5 -3
  150. package/src/domains/ontology/commands/list.ts +5 -58
  151. package/src/domains/ontology/commands/show.test.ts +85 -9
  152. package/src/domains/ontology/commands/show.ts +6 -58
  153. package/src/domains/ontology/formatters/index.ts +1 -0
  154. package/src/domains/ontology/formatters/list.ts +37 -12
  155. package/src/domains/ontology/formatters/show.ts +361 -64
  156. package/src/domains/ontology/helpers/buildClassTree.ts +89 -0
  157. package/src/domains/ontology/helpers/completeClassNames.ts +43 -0
  158. package/src/domains/ontology/helpers/expandOntologyIris.ts +79 -0
  159. package/src/domains/ontology/helpers/index.ts +14 -0
  160. package/src/domains/ontology/helpers/queryClasses.ts +32 -16
  161. package/src/domains/ontology/helpers/queryProperties.ts +39 -6
  162. package/src/domains/ontology/helpers/queryTboxFacts.ts +160 -0
  163. package/src/domains/ontology/mcp/specs.ts +7 -84
  164. package/src/domains/ontology/operations/listOntologies.test.ts +80 -3
  165. package/src/domains/ontology/operations/listOntologies.ts +126 -30
  166. package/src/domains/ontology/operations/showOntology.test.ts +131 -12
  167. package/src/domains/ontology/operations/showOntology.ts +289 -7
  168. package/src/domains/ontology/operations/showOntologyRaw.test.ts +4 -2
  169. package/src/domains/ontology/stories.test.ts +36 -0
  170. package/src/domains/ontology/stories.ts +153 -0
  171. package/src/domains/refs/operations/updateRefs.ts +2 -38
  172. package/src/domains/setup/commands/index.ts +1 -0
  173. package/src/domains/setup/commands/setup.ts +70 -0
  174. package/src/domains/setup/commands/skills.test.ts +6 -2
  175. package/src/domains/setup/commands/skills.ts +6 -2
  176. package/src/domains/setup/helpers/runSetupTask.test.ts +148 -150
  177. package/src/domains/setup/helpers/runSetupTask.ts +62 -70
  178. package/src/domains/setup/index.ts +7 -3
  179. package/src/domains/setup/operations/setupLsp.test.ts +3 -2
  180. package/src/domains/setup/operations/setupLsp.ts +7 -2
  181. package/src/domains/setup/operations/setupMcp.test.ts +6 -1
  182. package/src/domains/shared/bootStore.bareCore.test.ts +63 -0
  183. package/src/domains/shared/bootStore.test.ts +82 -0
  184. package/src/domains/shared/bootStore.ts +57 -18
  185. package/src/domains/shared/compactUri.test.ts +11 -0
  186. package/src/domains/shared/compactUri.ts +10 -5
  187. package/src/domains/shared/context.ts +2 -2
  188. package/src/domains/shared/contracts.ts +11 -0
  189. package/src/domains/shared/createInteractivePromptSession.test.ts +439 -0
  190. package/src/domains/shared/createInteractivePromptSession.ts +236 -0
  191. package/src/domains/shared/emptyErrorRecovery.test.ts +23 -26
  192. package/src/domains/shared/extractLocalName.test.ts +3 -3
  193. package/src/domains/shared/formatters.ts +23 -2
  194. package/src/domains/shared/listTiers.ts +40 -0
  195. package/src/domains/shared/loaders/bundledLoader.test.ts +248 -0
  196. package/src/domains/shared/loaders/bundledLoader.ts +158 -12
  197. package/src/domains/shared/loaders/gitLoader.ts +1 -2
  198. package/src/domains/shared/loaders/index.ts +4 -1
  199. package/src/domains/shared/loaders/localLoader.ts +2 -4
  200. package/src/domains/shared/loaders/readPackageDir.test.ts +58 -0
  201. package/src/domains/shared/loaders/readPackageDir.ts +82 -9
  202. package/src/domains/shared/loaders/storyAssetsPlugin.test.ts +84 -0
  203. package/src/domains/shared/loaders/storyAssetsPlugin.ts +46 -0
  204. package/src/domains/shared/lookupMany.test.ts +135 -0
  205. package/src/domains/shared/lookupMany.ts +50 -2
  206. package/src/domains/shared/mergeAndParseRefs.test.ts +89 -0
  207. package/src/domains/shared/mergeAndParseRefs.ts +44 -0
  208. package/src/domains/shared/namespaces.ts +13 -5
  209. package/src/domains/shared/packages.ts +10 -17
  210. package/src/domains/shared/parseSampleCount.test.ts +47 -0
  211. package/src/domains/shared/parseSampleCount.ts +45 -0
  212. package/src/domains/shared/prefixes.test.ts +211 -0
  213. package/src/domains/shared/prefixes.ts +182 -15
  214. package/src/domains/shared/renderers.ts +5 -5
  215. package/src/domains/shared/resolveConfiguredGraphs.test.ts +27 -0
  216. package/src/domains/shared/resolveConfiguredGraphs.ts +41 -0
  217. package/src/domains/shared/resolveLookupExitCode.test.ts +48 -0
  218. package/src/domains/shared/resolveLookupExitCode.ts +42 -0
  219. package/src/domains/shared/runtime.ts +4 -63
  220. package/src/domains/shared/semanticPackage.test.ts +89 -0
  221. package/src/domains/shared/semanticPackage.ts +34 -3
  222. package/src/domains/shared/stories/compileLookupCommand.test.ts +145 -0
  223. package/src/domains/shared/stories/compileLookupCommand.ts +102 -0
  224. package/src/domains/shared/stories/compileLookupTool.test.ts +105 -0
  225. package/src/domains/shared/stories/compileLookupTool.ts +96 -0
  226. package/src/domains/shared/stories/compileReadCommand.test.ts +121 -0
  227. package/src/domains/shared/stories/compileReadCommand.ts +48 -0
  228. package/src/domains/shared/stories/compileReadTool.test.ts +64 -0
  229. package/src/domains/shared/stories/compileReadTool.ts +38 -0
  230. package/src/domains/shared/stories/condense.test.ts +18 -0
  231. package/src/domains/shared/stories/condense.ts +15 -0
  232. package/src/domains/shared/stories/index.ts +20 -0
  233. package/src/domains/shared/stories/normalizeNames.test.ts +20 -0
  234. package/src/domains/shared/stories/normalizeNames.ts +22 -0
  235. package/src/domains/shared/stories/pack/applyPackFilters.test.ts +151 -0
  236. package/src/domains/shared/stories/pack/applyPackFilters.ts +111 -0
  237. package/src/domains/shared/stories/pack/applyPackSearch.test.ts +57 -0
  238. package/src/domains/shared/stories/pack/applyPackSearch.ts +41 -0
  239. package/src/domains/shared/stories/pack/buildLookupQuery.test.ts +81 -0
  240. package/src/domains/shared/stories/pack/buildLookupQuery.ts +154 -0
  241. package/src/domains/shared/stories/pack/bundled/index.ts +23 -0
  242. package/src/domains/shared/stories/pack/bundled/standardPack.ts +164 -0
  243. package/src/domains/shared/stories/pack/bundled/tierPack.ts +50 -0
  244. package/src/domains/shared/stories/pack/collectPackStories.test.ts +406 -0
  245. package/src/domains/shared/stories/pack/collectPackStories.ts +158 -0
  246. package/src/domains/shared/stories/pack/compilePackCommands.ts +50 -0
  247. package/src/domains/shared/stories/pack/compilePackStories.test.ts +751 -0
  248. package/src/domains/shared/stories/pack/compilePackStories.ts +724 -0
  249. package/src/domains/shared/stories/pack/compilePackToolSpecs.ts +55 -0
  250. package/src/domains/shared/stories/pack/index.ts +42 -0
  251. package/src/domains/shared/stories/pack/reservedVerbs.test.ts +213 -0
  252. package/src/domains/shared/stories/pack/reservedVerbs.ts +170 -0
  253. package/src/domains/shared/stories/pack/runSelectQuery.ts +31 -0
  254. package/src/domains/shared/stories/pack/standardParity.test.ts +381 -0
  255. package/src/domains/shared/stories/pack/types.ts +224 -0
  256. package/src/domains/shared/stories/pack/validateStoryPackDefinition.test.ts +742 -0
  257. package/src/domains/shared/stories/pack/validateStoryPackDefinition.ts +859 -0
  258. package/src/domains/shared/stories/projectCliParameters.test.ts +59 -0
  259. package/src/domains/shared/stories/projectCliParameters.ts +57 -0
  260. package/src/domains/shared/stories/projectToolParams.test.ts +50 -0
  261. package/src/domains/shared/stories/projectToolParams.ts +32 -0
  262. package/src/domains/shared/stories/requirePragmaContext.test.ts +23 -0
  263. package/src/domains/shared/stories/requirePragmaContext.ts +23 -0
  264. package/src/domains/shared/stories/resolveLookupDetailed.test.ts +57 -0
  265. package/src/domains/shared/stories/resolveLookupDetailed.ts +27 -0
  266. package/src/domains/shared/stories/types.ts +179 -0
  267. package/src/domains/shared/suggestions/expandGlob.ts +1 -0
  268. package/src/domains/shared/suggestions/suggestNames.ts +43 -10
  269. package/src/domains/shared/types/index.ts +5 -9
  270. package/src/domains/shared/types/ontology.ts +119 -24
  271. package/src/domains/shared/types/standard.ts +9 -52
  272. package/src/domains/skill/commands/index.ts +3 -1
  273. package/src/domains/skill/commands/list.test.ts +6 -2
  274. package/src/domains/skill/commands/list.ts +5 -63
  275. package/src/domains/skill/commands/lookup.test.ts +118 -0
  276. package/src/domains/skill/commands/lookup.ts +14 -0
  277. package/src/domains/skill/formatters/index.ts +1 -0
  278. package/src/domains/skill/formatters/lookup.test.ts +46 -0
  279. package/src/domains/skill/formatters/lookup.ts +57 -0
  280. package/src/domains/skill/helpers/resolveSkillSources.ts +0 -1
  281. package/src/domains/skill/index.ts +7 -3
  282. package/src/domains/skill/mcp/specs.ts +10 -29
  283. package/src/domains/skill/operations/discover.test.ts +61 -30
  284. package/src/domains/skill/operations/discover.ts +28 -37
  285. package/src/domains/skill/operations/index.ts +2 -1
  286. package/src/domains/skill/operations/list.test.ts +15 -7
  287. package/src/domains/skill/operations/lookup.test.ts +91 -0
  288. package/src/domains/skill/operations/lookup.ts +70 -0
  289. package/src/domains/skill/stories.test.ts +43 -0
  290. package/src/domains/skill/stories.ts +103 -0
  291. package/src/domains/skill/types.ts +8 -0
  292. package/src/domains/token/commands/lookup.test.ts +8 -0
  293. package/src/domains/token/commands/lookup.ts +12 -0
  294. package/src/domains/token/commands/sample.ts +2 -1
  295. package/src/domains/token/featureFlag.ts +17 -0
  296. package/src/domains/token/index.ts +5 -0
  297. package/src/domains/token/mcp/specs.ts +18 -2
  298. package/src/domains/token/orchestration/resolveTokenLookup.ts +2 -1
  299. package/src/domains/trace/commands/resolveTraceLimit.test.ts +31 -0
  300. package/src/domains/trace/commands/show.ts +30 -4
  301. package/src/domains/trace/tracePlugin.test.ts +1 -1
  302. package/src/index.ts +1 -13
  303. package/src/mcp/registerResources.test.ts +382 -74
  304. package/src/mcp/registerResources.ts +5 -348
  305. package/src/mcp/resources/buildGraphIndex.ts +167 -0
  306. package/src/mcp/resources/buildResourceList.test.ts +97 -0
  307. package/src/mcp/resources/buildResourceList.ts +176 -0
  308. package/src/mcp/resources/classifyEntity.test.ts +40 -0
  309. package/src/mcp/resources/classifyEntity.ts +27 -0
  310. package/src/mcp/resources/constants.ts +105 -0
  311. package/src/mcp/resources/displayPredicates.ts +62 -0
  312. package/src/mcp/resources/pickFirstValue.test.ts +29 -0
  313. package/src/mcp/resources/pickFirstValue.ts +26 -0
  314. package/src/mcp/resources/pickPrimaryType.test.ts +41 -0
  315. package/src/mcp/resources/pickPrimaryType.ts +26 -0
  316. package/src/mcp/resources/rankUriCompletions.test.ts +52 -0
  317. package/src/mcp/resources/rankUriCompletions.ts +64 -0
  318. package/src/mcp/resources/readEntity.ts +169 -0
  319. package/src/mcp/resources/registerResources.ts +126 -0
  320. package/src/mcp/resources/types.ts +128 -0
  321. package/src/mcp/tools/index.ts +22 -5
  322. package/src/mcp/tools/registerTools.test.ts +167 -34
  323. package/src/mcp/types.ts +4 -0
  324. package/src/pipeline/collectCommands.test.ts +151 -1
  325. package/src/pipeline/collectCommands.ts +35 -13
  326. package/src/pipeline/createProgram.test.ts +5 -1
  327. package/src/pipeline/createProgram.ts +2 -2
  328. package/src/pipeline/firstRun.test.ts +80 -0
  329. package/src/pipeline/firstRun.ts +99 -0
  330. package/src/pipeline/parseGlobalFlags.test.ts +102 -1
  331. package/src/pipeline/parseGlobalFlags.ts +98 -9
  332. package/src/pipeline/resolveCommandKind.test.ts +12 -0
  333. package/src/pipeline/resolveCommandKind.ts +4 -0
  334. package/src/pipeline/rootHelp.test.ts +87 -0
  335. package/src/pipeline/rootHelp.ts +265 -0
  336. package/src/pipeline/runCli.orchestration.test.ts +28 -12
  337. package/src/pipeline/runCli.test.ts +17 -4
  338. package/src/pipeline/runCli.ts +202 -25
  339. package/src/testing/cli.ts +30 -2
  340. package/src/testing/createTestMcpClient.ts +4 -1
  341. package/src/testing/dsFixtures.ts +21 -4
  342. package/src/testing/index.ts +7 -0
  343. package/src/testing/integration/__snapshots__/executor-golden.test.ts.snap +1207 -0
  344. package/src/testing/integration/cli-user-stories.test.ts +63 -0
  345. package/src/testing/integration/cross-binary-byte-equality.test.ts +129 -0
  346. package/src/testing/integration/edge-cases.test.ts +62 -50
  347. package/src/testing/integration/executor-execution.test.ts +103 -0
  348. package/src/testing/integration/executor-golden.test.ts +145 -0
  349. package/src/testing/integration/mcp-surface.test.ts +40 -15
  350. package/src/testing/integration/parity.test.ts +136 -82
  351. package/src/testing/regression/0001-skill-discovery-granularity.test.ts +71 -0
  352. package/src/testing/setupXdgIsolation.ts +26 -0
  353. package/src/testing/standardParityFixtures.ts +35 -0
  354. package/src/testing/store.ts +4 -4
  355. package/src/testing/storyFixtures.ts +63 -0
  356. package/src/domains/create/commands/component.test.ts +0 -166
  357. package/src/domains/create/commands/component.ts +0 -123
  358. package/src/domains/create/commands/index.ts +0 -3
  359. package/src/domains/create/commands/package.test.ts +0 -35
  360. package/src/domains/create/commands/package.ts +0 -21
  361. package/src/domains/create/generators.ts +0 -8
  362. package/src/domains/standard/commands/categories.test.ts +0 -70
  363. package/src/domains/standard/commands/categories.ts +0 -48
  364. package/src/domains/standard/commands/index.ts +0 -6
  365. package/src/domains/standard/commands/list.test.ts +0 -105
  366. package/src/domains/standard/commands/list.ts +0 -90
  367. package/src/domains/standard/commands/lookup.test.ts +0 -135
  368. package/src/domains/standard/commands/lookup.ts +0 -99
  369. package/src/domains/standard/commands/sample.ts +0 -57
  370. package/src/domains/standard/formatters/categories.test.ts +0 -44
  371. package/src/domains/standard/formatters/categories.ts +0 -38
  372. package/src/domains/standard/formatters/index.ts +0 -10
  373. package/src/domains/standard/formatters/list.test.ts +0 -169
  374. package/src/domains/standard/formatters/list.ts +0 -184
  375. package/src/domains/standard/formatters/lookup.test.ts +0 -95
  376. package/src/domains/standard/formatters/lookup.ts +0 -101
  377. package/src/domains/standard/formatters/sample.ts +0 -15
  378. package/src/domains/standard/formatters/types.ts +0 -31
  379. package/src/domains/standard/index.ts +0 -40
  380. package/src/domains/standard/mcp/index.ts +0 -2
  381. package/src/domains/standard/mcp/specs.ts +0 -244
  382. package/src/domains/standard/operations/categories.test.ts +0 -61
  383. package/src/domains/standard/operations/categories.ts +0 -38
  384. package/src/domains/standard/operations/index.ts +0 -6
  385. package/src/domains/standard/operations/list.test.ts +0 -75
  386. package/src/domains/standard/operations/list.ts +0 -64
  387. package/src/domains/standard/operations/lookup.test.ts +0 -58
  388. package/src/domains/standard/operations/lookup.ts +0 -151
  389. package/src/domains/standard/operations/sample.ts +0 -35
  390. package/src/domains/standard/orchestration/buildStandardFilters.ts +0 -11
  391. package/src/domains/standard/orchestration/index.ts +0 -4
  392. package/src/domains/standard/orchestration/resolveStandardList.ts +0 -45
  393. package/src/domains/standard/orchestration/resolveStandardLookup.ts +0 -32
  394. package/src/domains/standard/orchestration/standardEmptyError.test.ts +0 -33
  395. package/src/domains/standard/orchestration/standardEmptyError.ts +0 -29
  396. package/src/domains/standard/standardConfig.ts +0 -42
  397. package/src/domains/standard/types.ts +0 -15
  398. package/src/domains/tier/commands/index.ts +0 -3
  399. package/src/domains/tier/commands/list.test.ts +0 -67
  400. package/src/domains/tier/commands/list.ts +0 -59
  401. package/src/domains/tier/formatters/index.ts +0 -3
  402. package/src/domains/tier/formatters/list.test.ts +0 -33
  403. package/src/domains/tier/formatters/list.ts +0 -45
  404. package/src/domains/tier/index.ts +0 -17
  405. package/src/domains/tier/mcp/index.ts +0 -2
  406. package/src/domains/tier/mcp/specs.ts +0 -38
  407. package/src/domains/tier/operations/index.ts +0 -3
  408. package/src/domains/tier/operations/list.test.ts +0 -32
  409. package/src/domains/tier/operations/list.ts +0 -33
  410. package/src/pipeline/runInteractiveCommand.ts +0 -198
@@ -1,25 +1,31 @@
1
1
  import type { GlobalFlags } from "@canonical/cli-core";
2
2
  import { CommanderError } from "commander";
3
+ import { PROGRAM_NAME, VERSION } from "../constants.js";
4
+ import { commands as createCommands } from "../domains/create/index.js";
3
5
  import { commands as graphqlCommands } from "../domains/graphql/index.js";
4
6
  import { buildCapabilitiesCommand } from "../domains/llm/index.js";
5
7
  import { commands as refsCommands } from "../domains/refs/index.js";
6
8
  import { commands as setupCommands } from "../domains/setup/index.js";
7
9
  import type { PragmaContext } from "../domains/shared/context.js";
10
+ import createInteractivePromptSession from "../domains/shared/createInteractivePromptSession.js";
8
11
  import type { PragmaRuntime } from "../domains/shared/runtime.js";
9
12
  import { bootPragma } from "../domains/shared/runtime.js";
10
13
  import { commands as traceCommands } from "../domains/trace/index.js";
11
14
  import { PragmaError } from "../error/index.js";
12
15
  import collectCommands from "./collectCommands.js";
13
16
  import createProgram from "./createProgram.js";
17
+ import ensureFirstRun from "./firstRun.js";
14
18
  import mapExitCode from "./mapExitCode.js";
15
- import parseGlobalFlags, { stripGlobalFlags } from "./parseGlobalFlags.js";
19
+ import parseGlobalFlags, {
20
+ readRawFormat,
21
+ stripGlobalFlags,
22
+ } from "./parseGlobalFlags.js";
16
23
  import {
17
24
  renderErrorJson,
18
25
  renderErrorLlm,
19
26
  renderErrorPlain,
20
27
  } from "./renderError.js";
21
28
  import resolveCommandKind from "./resolveCommandKind.js";
22
- import runInteractiveCommand from "./runInteractiveCommand.js";
23
29
 
24
30
  function hasCommandArg(argv: readonly string[]): boolean {
25
31
  const args = argv.slice(2);
@@ -67,8 +73,23 @@ async function handleCompletionsServer(): Promise<void> {
67
73
  await startCompletionsServer();
68
74
  }
69
75
 
70
- async function handleDoctor(globalFlags: GlobalFlags): Promise<void> {
76
+ async function handleDoctor(
77
+ argv: readonly string[],
78
+ globalFlags: GlobalFlags,
79
+ ): Promise<void> {
71
80
  const { doctorCommand } = await import("../domains/doctor/commands/index.js");
81
+
82
+ // `doctor` runs before Commander, so honour --help/-h here rather than
83
+ // executing the health check when the user only asked for usage.
84
+ const wantsHelp = argv
85
+ .slice(2)
86
+ .some((arg) => arg === "--help" || arg === "-h");
87
+ if (wantsHelp) {
88
+ const { formatVerbHelp } = await import("@canonical/cli-core");
89
+ process.stdout.write(`${formatVerbHelp(PROGRAM_NAME, doctorCommand)}\n`);
90
+ return;
91
+ }
92
+
72
93
  const ctx = { cwd: process.cwd(), globalFlags };
73
94
  const result = await doctorCommand.execute({}, ctx);
74
95
  if (result.tag === "output") {
@@ -79,12 +100,11 @@ async function handleDoctor(globalFlags: GlobalFlags): Promise<void> {
79
100
  async function handleRootHelp(globalFlags: GlobalFlags): Promise<void> {
80
101
  const stubCtx: PragmaContext = {
81
102
  store: {} as PragmaRuntime["store"],
82
- config: { tier: undefined, channel: "normal" },
103
+ ...(await resolveHelpConfig()),
83
104
  cwd: process.cwd(),
84
- packages: [],
85
105
  dispose: () => {},
86
106
  globalFlags,
87
- interactive: runInteractiveCommand,
107
+ promptSession: createInteractivePromptSession,
88
108
  };
89
109
  const commands = collectCommands(stubCtx);
90
110
  const program = createProgram(commands, stubCtx);
@@ -92,7 +112,42 @@ async function handleRootHelp(globalFlags: GlobalFlags): Promise<void> {
92
112
  try {
93
113
  await program.parseAsync(["node", "pragma", "--help"]);
94
114
  } catch (err) {
95
- handleProgramError(err, globalFlags);
115
+ await handleProgramError(err, globalFlags, ["node", "pragma", "--help"]);
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Resolve config and packages for root help without booting the store.
121
+ *
122
+ * Story-pack nouns come from config and package files, so bare
123
+ * `pragma --help` reads them via the filesystem loaders only. Help must
124
+ * never fail on a broken config — errors fall back to the empty stub and
125
+ * surface on the next real command instead.
126
+ *
127
+ * @note Impure — reads config and resolves packages from disk.
128
+ */
129
+ async function resolveHelpConfig(): Promise<
130
+ Pick<PragmaRuntime, "config" | "packages">
131
+ > {
132
+ try {
133
+ const { readConfig } = await import("#config");
134
+ const config = readConfig(process.cwd());
135
+ const { resolveSemanticPackages } = await import(
136
+ "../domains/shared/semanticPackage.js"
137
+ );
138
+ const { createGitLoader, createLocalLoader } = await import(
139
+ "../domains/shared/loaders/index.js"
140
+ );
141
+ const { mergeAndParseRefs } = await import(
142
+ "../domains/shared/mergeAndParseRefs.js"
143
+ );
144
+ const packages = await resolveSemanticPackages(
145
+ mergeAndParseRefs(config.packages),
146
+ [createLocalLoader(), createGitLoader()],
147
+ );
148
+ return { config, packages };
149
+ } catch {
150
+ return { config: { tier: undefined, channel: "normal" }, packages: [] };
96
151
  }
97
152
  }
98
153
 
@@ -117,22 +172,60 @@ async function bootAndRun(
117
172
  return;
118
173
  }
119
174
 
175
+ await emitSchemaArtifact(runtime, globalFlags);
176
+
120
177
  try {
121
178
  const ctx: PragmaContext = {
122
179
  ...runtime,
123
180
  globalFlags,
124
- interactive: runInteractiveCommand,
181
+ promptSession: createInteractivePromptSession,
125
182
  };
126
183
  const commands = collectCommands(ctx);
127
184
  const program = createProgram(commands, ctx);
128
185
  await program.parseAsync(stripGlobalFlags(argv));
129
186
  } catch (err) {
130
- handleProgramError(err, globalFlags);
187
+ await handleProgramError(err, globalFlags, argv);
131
188
  } finally {
132
189
  runtime.dispose();
133
190
  }
134
191
  }
135
192
 
193
+ /**
194
+ * Keep the `schema.graphql` artifact current on every booted run.
195
+ *
196
+ * The freshness probe is a source hash against the artifact's header, so
197
+ * the common case costs one hash + one small read; compilation runs only
198
+ * when the resolved TTL sources actually changed (or on first use).
199
+ * Never fatal — a failed compile warns and the command proceeds.
200
+ */
201
+ async function emitSchemaArtifact(
202
+ runtime: PragmaRuntime,
203
+ globalFlags: GlobalFlags,
204
+ ): Promise<void> {
205
+ try {
206
+ const { ensureSchemaArtifact } = await import(
207
+ "../domains/graphql/operations/index.js"
208
+ );
209
+ const result = await ensureSchemaArtifact(runtime);
210
+ if (result.status === "written") {
211
+ process.stderr.write(
212
+ `Updated GraphQL schema artifact (sources changed): ${result.path}\n`,
213
+ );
214
+ } else if (result.status === "failed" && globalFlags.verbose) {
215
+ process.stderr.write(
216
+ `Warning: GraphQL schema compilation failed; ${result.path} not updated. Run \`pragma graphql check\` for diagnostics.\n`,
217
+ );
218
+ }
219
+ } catch (err) {
220
+ if (globalFlags.verbose) {
221
+ const reason = err instanceof Error ? err.message : String(err);
222
+ process.stderr.write(
223
+ `Warning: could not update GraphQL schema artifact: ${reason}\n`,
224
+ );
225
+ }
226
+ }
227
+ }
228
+
136
229
  async function runStoreSkip(
137
230
  argv: readonly string[],
138
231
  globalFlags: GlobalFlags,
@@ -144,13 +237,14 @@ async function runStoreSkip(
144
237
  packages: [],
145
238
  dispose: () => {},
146
239
  globalFlags,
147
- interactive: runInteractiveCommand,
240
+ promptSession: createInteractivePromptSession,
148
241
  };
149
242
  const commands = [
150
243
  ...setupCommands(),
151
244
  ...refsCommands(),
152
245
  ...traceCommands(),
153
246
  ...graphqlCommands(),
247
+ ...createCommands(),
154
248
  buildCapabilitiesCommand(),
155
249
  ];
156
250
  const program = createProgram(commands, stubCtx);
@@ -158,11 +252,53 @@ async function runStoreSkip(
158
252
  try {
159
253
  await program.parseAsync(stripGlobalFlags(argv));
160
254
  } catch (err) {
161
- handleProgramError(err, globalFlags);
255
+ await handleProgramError(err, globalFlags, argv);
162
256
  }
163
257
  }
164
258
 
165
- function handleProgramError(err: unknown, globalFlags: GlobalFlags): void {
259
+ /**
260
+ * First non-flag token in argv — the command noun, if any.
261
+ *
262
+ * Global flags are stripped first so a flag *value* (e.g. the `json` in
263
+ * `--format json`) is never mistaken for the noun; otherwise
264
+ * `pragma --format json standard frobnicate` would scan `json` and fail to
265
+ * suggest `standard`'s verbs.
266
+ */
267
+ function findNoun(argv: readonly string[]): string | undefined {
268
+ return stripGlobalFlags(argv)
269
+ .slice(2)
270
+ .find((arg) => !arg.startsWith("-"));
271
+ }
272
+
273
+ /**
274
+ * When an unknown command/verb is entered under a known noun, print that noun's
275
+ * valid verbs so the user can recover — "defer to the category that exists".
276
+ *
277
+ * @note Impure — writes the noun's verb list to stderr.
278
+ */
279
+ async function suggestNounVerbs(argv: readonly string[]): Promise<void> {
280
+ const noun = findNoun(argv);
281
+ if (!noun) return;
282
+ const stubCtx: PragmaContext = {
283
+ store: {} as PragmaRuntime["store"],
284
+ ...(await resolveHelpConfig()),
285
+ cwd: process.cwd(),
286
+ dispose: () => {},
287
+ globalFlags: { llm: false, autoLlm: false, format: "text", verbose: false },
288
+ promptSession: createInteractivePromptSession,
289
+ };
290
+ const commands = collectCommands(stubCtx);
291
+ const hasNoun = commands.some((cmd) => cmd.path.at(0) === noun);
292
+ if (!hasNoun) return;
293
+ const { formatNounHelp } = await import("@canonical/cli-core");
294
+ process.stderr.write(`\n${formatNounHelp(PROGRAM_NAME, noun, commands)}\n`);
295
+ }
296
+
297
+ async function handleProgramError(
298
+ err: unknown,
299
+ globalFlags: GlobalFlags,
300
+ argv: readonly string[],
301
+ ): Promise<void> {
166
302
  if (err instanceof CommanderError) {
167
303
  if (
168
304
  err.code === "commander.helpDisplayed" ||
@@ -171,6 +307,9 @@ function handleProgramError(err: unknown, globalFlags: GlobalFlags): void {
171
307
  process.exitCode = 0;
172
308
  return;
173
309
  }
310
+ if (err.code === "commander.unknownCommand") {
311
+ await suggestNounVerbs(argv);
312
+ }
174
313
  process.exitCode = err.exitCode;
175
314
  return;
176
315
  }
@@ -206,26 +345,64 @@ function handleProgramError(err: unknown, globalFlags: GlobalFlags): void {
206
345
  */
207
346
  export default async function runCli(argv: readonly string[]): Promise<void> {
208
347
  const globalFlags = parseGlobalFlags(argv);
209
- const explicitHelpOrVersion = argv
348
+
349
+ const commandKind = resolveCommandKind(argv);
350
+
351
+ // Completion queries must be handled before the root-help shortcut:
352
+ // `pragma --completions` (empty first-Tab partial) has no non-flag command
353
+ // arg, so it would otherwise fall through to root help and dump the help
354
+ // banner into the shell's completion buffer.
355
+ if (commandKind.kind === "completions-client") {
356
+ return handleCompletionsClient(commandKind.partial);
357
+ }
358
+ if (commandKind.kind === "completions-server") {
359
+ return handleCompletionsServer();
360
+ }
361
+
362
+ // First-run onboarding: when the global config does not exist yet, greet on
363
+ // stderr and create it with defaults. After the completions early-exits so
364
+ // the note can never leak into a shell completion buffer; stderr-only so
365
+ // stdout (command output, --format json, MCP stdio) stays untouched; and
366
+ // failure-tolerant — onboarding must never break an invocation.
367
+ await ensureFirstRun();
368
+
369
+ // `--version`/`-V` is a global flag: print the version and exit regardless
370
+ // of where it appears (root or after a command/verb), so `block list -V`
371
+ // behaves like the root `pragma --version` instead of erroring.
372
+ if (argv.slice(2).some((arg) => arg === "--version" || arg === "-V")) {
373
+ process.stdout.write(`${VERSION}\n`);
374
+ return;
375
+ }
376
+
377
+ const explicitHelp = argv
210
378
  .slice(2)
211
- .some(
212
- (arg) =>
213
- arg === "--help" || arg === "-h" || arg === "--version" || arg === "-V",
214
- );
379
+ .some((arg) => arg === "--help" || arg === "-h");
215
380
 
216
- if (!hasCommandArg(argv) && !explicitHelpOrVersion) {
217
- return handleRootHelp(globalFlags);
381
+ // Reject an unknown --format value early (completion queries and --version
382
+ // are handled above, so neither errors). Skip when the user asked for help —
383
+ // it should print regardless of a bad --format. Only text/json are supported.
384
+ const rawFormat = readRawFormat(argv);
385
+ if (
386
+ !explicitHelp &&
387
+ rawFormat !== undefined &&
388
+ rawFormat !== "text" &&
389
+ rawFormat !== "json"
390
+ ) {
391
+ const error = PragmaError.invalidInput("format", rawFormat, {
392
+ validOptions: ["text", "json"],
393
+ });
394
+ process.stderr.write(`${renderError(error, globalFlags)}\n`);
395
+ process.exitCode = mapExitCode(error.code);
396
+ return;
218
397
  }
219
398
 
220
- const commandKind = resolveCommandKind(argv);
399
+ if (!hasCommandArg(argv) && !explicitHelp) {
400
+ return handleRootHelp(globalFlags);
401
+ }
221
402
 
222
403
  switch (commandKind.kind) {
223
- case "completions-client":
224
- return handleCompletionsClient(commandKind.partial);
225
- case "completions-server":
226
- return handleCompletionsServer();
227
404
  case "doctor":
228
- return handleDoctor(globalFlags);
405
+ return handleDoctor(argv, globalFlags);
229
406
  case "store-skip":
230
407
  return runStoreSkip(argv, globalFlags);
231
408
  case "store-required":
@@ -6,7 +6,9 @@
6
6
  */
7
7
 
8
8
  import { spawnSync } from "node:child_process";
9
- import { resolve } from "node:path";
9
+ import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
10
+ import { tmpdir } from "node:os";
11
+ import { join, resolve } from "node:path";
10
12
 
11
13
  /** Captured output from a CLI subprocess invocation. */
12
14
  interface CommandResult {
@@ -15,21 +17,47 @@ interface CommandResult {
15
17
  exitCode: number;
16
18
  }
17
19
 
20
+ /**
21
+ * XDG home whose global config already exists, shared by all default
22
+ * invocations in this file's worker.
23
+ *
24
+ * Subprocesses would otherwise trigger the first-run greeting in whichever
25
+ * test happens to spawn first (the setup-file XDG is fresh per file), making
26
+ * stderr assertions ordering-dependent. Seeding the config keeps every
27
+ * default `runCommand` past first-run; tests that WANT the first-run path
28
+ * pass their own fresh XDG via `env`.
29
+ */
30
+ let seededXdg: string | undefined;
31
+ function seededXdgHome(): string {
32
+ if (!seededXdg) {
33
+ seededXdg = mkdtempSync(join(tmpdir(), "pragma-cli-xdg-"));
34
+ mkdirSync(join(seededXdg, "pragma"), { recursive: true });
35
+ writeFileSync(join(seededXdg, "pragma", "config.json"), "{}\n");
36
+ }
37
+ return seededXdg;
38
+ }
39
+
18
40
  /**
19
41
  * Spawn the pragma CLI binary synchronously and capture its output.
20
42
  *
21
43
  * @param args - CLI arguments to pass after the binary path.
22
44
  * @param cwd - Optional working directory for the subprocess.
45
+ * @param env - Extra environment overrides (merged over the seeded default).
23
46
  * @returns Captured stdout, stderr, and exit code.
24
47
  *
25
48
  * @note Impure
26
49
  */
27
- function runCommand(args: string[], cwd?: string): CommandResult {
50
+ function runCommand(
51
+ args: string[],
52
+ cwd?: string,
53
+ env?: Record<string, string>,
54
+ ): CommandResult {
28
55
  const binPath = resolve(import.meta.dirname, "../bin.ts");
29
56
  const result = spawnSync("bun", ["run", binPath, ...args], {
30
57
  cwd,
31
58
  encoding: "utf-8",
32
59
  timeout: 20_000,
60
+ env: { ...process.env, XDG_CONFIG_HOME: seededXdgHome(), ...env },
33
61
  });
34
62
 
35
63
  return {
@@ -31,7 +31,10 @@ 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,
@@ -5,16 +5,19 @@
5
5
  * that D3 operations query against.
6
6
  *
7
7
  * All @prefix declarations derived from {@link TTL_PREFIXES} so that
8
- * a namespace rename in PREFIX_MAP propagates here automatically.
8
+ * a namespace rename in DEFAULT_PREFIX_MAP propagates here automatically.
9
9
  */
10
10
 
11
- import { PREFIX_MAP, TTL_PREFIXES } from "../domains/shared/prefixes.js";
11
+ import {
12
+ DEFAULT_PREFIX_MAP,
13
+ TTL_PREFIXES,
14
+ } from "../domains/shared/prefixes.js";
12
15
 
13
16
  /** Turtle @prefix block for ds: only (most data fixtures). */
14
- const dsPrefix = `@prefix ds: <${PREFIX_MAP.ds}> .`;
17
+ const dsPrefix = `@prefix ds: <${DEFAULT_PREFIX_MAP.ds}> .`;
15
18
 
16
19
  /** Turtle @prefix block for cs: only (standards fixtures). */
17
- const csPrefix = `@prefix cs: <${PREFIX_MAP.cs}> .`;
20
+ const csPrefix = `@prefix cs: <${DEFAULT_PREFIX_MAP.cs}> .`;
18
21
 
19
22
  // =============================================================================
20
23
  // Ontology (TBox) — class and property definitions
@@ -225,6 +228,20 @@ cs:code a owl:DatatypeProperty ;
225
228
  cs:extends a owl:ObjectProperty ;
226
229
  rdfs:domain cs:CodeStandard ;
227
230
  rdfs:range cs:CodeStandard .
231
+
232
+ # ---- TBox extras (header, comments, functional typing, SHACL) ----
233
+
234
+ ds:ontology a owl:Ontology ;
235
+ rdfs:label "Design System Ontology" ;
236
+ owl:versionInfo "0.1.0-test" .
237
+
238
+ ds:Component rdfs:comment "A reusable UI building block." .
239
+
240
+ ds:tier a owl:FunctionalProperty .
241
+
242
+ ds:ComponentShape a <http://www.w3.org/ns/shacl#NodeShape> ;
243
+ <http://www.w3.org/ns/shacl#targetClass> ds:Component ;
244
+ <http://www.w3.org/ns/shacl#property> ds:shapeName, ds:shapeTier .
228
245
  `;
229
246
 
230
247
  // =============================================================================
@@ -10,6 +10,13 @@ export {
10
10
  GRAPHQL_ERROR_TTL,
11
11
  GRAPHQL_FATAL_TTL,
12
12
  } from "./graphqlFixtures.js";
13
+ export { PARITY_GAPS } from "./standardParityFixtures.js";
13
14
  export type { PragmaTestStoreOptions } from "./store.js";
14
15
  export { createTestStore } from "./store.js";
16
+ export {
17
+ RECIPE_NAMESPACE,
18
+ RECIPE_PREFIXES,
19
+ RECIPE_STORY,
20
+ RECIPE_TTL,
21
+ } from "./storyFixtures.js";
15
22
  export type { TestMcpClientResult } from "./types.js";