@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
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Modifier read stories — the single declaration of `modifier list` and
3
+ * `modifier lookup` for both surfaces.
4
+ *
5
+ * The story kernel compiles these into the CLI commands and MCP tools,
6
+ * so descriptions, parameters, resolution, and rendering live here once.
7
+ */
8
+
9
+ import { createListView, createLookupView } from "#tui";
10
+ import { PragmaError } from "../../error/index.js";
11
+ import type { LookupStory, ReadStory } from "../shared/stories/index.js";
12
+ import type { ModifierFamily } from "../shared/types/index.js";
13
+ import {
14
+ createInkLookupOptions,
15
+ listFormatters,
16
+ lookupFormatters,
17
+ } from "./formatters/index.js";
18
+ import { modifierConfig } from "./modifierConfig.js";
19
+ import {
20
+ resolveModifierList,
21
+ resolveModifierLookup,
22
+ } from "./orchestration/index.js";
23
+ import type { ModifierListResolution } from "./types.js";
24
+
25
+ /** The `modifier list` / `modifier_list` read story. */
26
+ export const modifierListStory: ReadStory<
27
+ ModifierListResolution,
28
+ ModifierFamily[]
29
+ > = {
30
+ noun: "modifier",
31
+ verb: "list",
32
+ description: "List all modifier families",
33
+ toolDescription: "List all modifier families with their values.",
34
+ params: [],
35
+ examples: ["pragma modifier list", "pragma modifier list --llm"],
36
+ resolve: (rt) => resolveModifierList(rt),
37
+ toOutput: (resolution) => [...resolution.items],
38
+ formatters: listFormatters,
39
+ toEnvelope: (resolution) => ({
40
+ data: resolution.items,
41
+ meta: { count: resolution.items.length },
42
+ }),
43
+ renderInk: (items) =>
44
+ createListView({
45
+ heading: "Modifiers",
46
+ domain: "modifier",
47
+ items,
48
+ columns: modifierConfig.listColumns,
49
+ }),
50
+ };
51
+
52
+ /** The `modifier lookup` / `modifier_lookup` read story. */
53
+ export const modifierLookupStory: LookupStory<ModifierFamily, ModifierFamily> =
54
+ {
55
+ noun: "modifier",
56
+ description: "Look up a modifier family and its values",
57
+ toolDescription: "Get one or more modifier families and their values.",
58
+ namesDescription: "Modifier family names or IRIs",
59
+ namesToolDescription: "Modifier family names or IRIs to look up",
60
+ examples: [
61
+ "pragma modifier lookup importance",
62
+ "pragma modifier lookup importance density",
63
+ "pragma modifier lookup importance --llm",
64
+ ],
65
+ resolve: async (rt, names) => {
66
+ const contract = await resolveModifierLookup(rt.store, names);
67
+ return contract.result;
68
+ },
69
+ toFmtInput: (family) => family,
70
+ formatters: lookupFormatters,
71
+ emptyNamesError: () =>
72
+ PragmaError.invalidInput("names", "(empty)", {
73
+ recovery: {
74
+ message: "List available modifier families.",
75
+ cli: "pragma modifier list",
76
+ mcp: { tool: "modifier_list" },
77
+ },
78
+ }),
79
+ renderInk: (result) =>
80
+ createLookupView({
81
+ results: result.results,
82
+ errors: result.errors,
83
+ domain: "modifier",
84
+ options: createInkLookupOptions(),
85
+ }),
86
+ };
@@ -52,8 +52,10 @@ describe("ontology list command", () => {
52
52
  const { text } = await executeOutput(cmd, {}, ctx);
53
53
 
54
54
  expect(text).toContain("ds");
55
- expect(text).toContain("classes:");
56
- expect(text).toContain("anatomy:");
55
+ expect(text).toContain("classes");
56
+ expect(text).toContain("relations");
57
+ expect(text).toContain("attributes");
58
+ expect(text).toContain("Next: pragma ontology show <prefix>");
57
59
  });
58
60
 
59
61
  it("renders llm output", async () => {
@@ -65,7 +67,7 @@ describe("ontology list command", () => {
65
67
 
66
68
  expect(text).toContain("## Ontologies");
67
69
  expect(text).toContain("**ds:**");
68
- expect(text).toContain("anatomy:");
70
+ expect(text).toContain("relations");
69
71
  });
70
72
 
71
73
  it("renders json output", async () => {
@@ -1,64 +1,11 @@
1
- import {
2
- type CommandDefinition,
3
- type CommandResult,
4
- createOutputResult,
5
- } from "@canonical/cli-core";
6
- import { PragmaError } from "#error";
7
- import { createListView } from "#tui";
1
+ import type { CommandDefinition } from "@canonical/cli-core";
8
2
  import type { PragmaContext } from "../../shared/context.js";
9
- import type { ColumnDef } from "../../shared/contracts.js";
10
- import { selectFormatter } from "../../shared/formatters.js";
11
- import type { OntologySummary } from "../../shared/types/ontology.js";
12
- import { listFormatters } from "../formatters/index.js";
13
- import { listOntologies } from "../operations/index.js";
3
+ import { compileReadCommand } from "../../shared/stories/index.js";
4
+ import { ontologyListStory } from "../stories.js";
14
5
 
15
- const ontologyListColumns: readonly ColumnDef<OntologySummary>[] = [
16
- { key: "prefix", label: "Prefix" },
17
- { key: "namespace", label: "Namespace" },
18
- { key: "classCount", label: "Classes" },
19
- { key: "propertyCount", label: "Properties" },
20
- { key: "anatomyCount", label: "Anatomies" },
21
- ];
22
-
23
- /**
24
- * Builds the `pragma ontology list` command definition.
25
- *
26
- * Lists all loaded ontology namespaces with class and property counts.
27
- *
28
- * @param ctx - Pragma runtime context providing the ke store and config.
29
- * @returns A command definition for `ontology list`.
30
- */
6
+ /** Wire the `pragma ontology list` CLI command from the ontology list story. */
31
7
  export default function buildListCommand(
32
8
  ctx: PragmaContext,
33
9
  ): CommandDefinition {
34
- return {
35
- path: ["ontology", "list"],
36
- description: "List loaded ontologies",
37
- parameters: [],
38
- meta: {
39
- examples: ["pragma ontology list", "pragma ontology list --llm"],
40
- },
41
- execute: async (): Promise<CommandResult> => {
42
- const ontologies = await listOntologies(ctx.store);
43
-
44
- if (ontologies.length === 0) {
45
- throw PragmaError.emptyResults("ontology", {
46
- recovery: {
47
- message: "Ensure design system packages are installed.",
48
- },
49
- });
50
- }
51
-
52
- return createOutputResult(ontologies, {
53
- plain: selectFormatter(ctx, listFormatters),
54
- ink: (data) =>
55
- createListView({
56
- heading: "Ontologies",
57
- domain: "ontology",
58
- items: data,
59
- columns: ontologyListColumns,
60
- }),
61
- });
62
- },
63
- };
10
+ return compileReadCommand(ctx, ontologyListStory);
64
11
  }
@@ -3,7 +3,7 @@ import { afterAll, beforeAll, describe, expect, it } from "vitest";
3
3
  import createTestRuntime from "../../../testing/helpers/createTestRuntime.js";
4
4
  import type { PragmaContext } from "../../shared/context.js";
5
5
  import type { PragmaRuntime } from "../../shared/runtime.js";
6
- import type { OntologyDetailed } from "../../shared/types/index.js";
6
+ import type { OntologyShowInput } from "../formatters/index.js";
7
7
  import buildShowCommand from "./show.js";
8
8
 
9
9
  let runtime: PragmaRuntime;
@@ -41,10 +41,69 @@ describe("ontology show command", () => {
41
41
  const cmd = buildShowCommand(ctx);
42
42
  const { value } = await executeOutput(cmd, { prefix: "ds" }, ctx);
43
43
 
44
- const result = value as OntologyDetailed;
45
- expect(result.prefix).toBe("ds");
46
- expect(result.classes.length).toBeGreaterThan(0);
47
- expect(result.properties.length).toBeGreaterThan(0);
44
+ const { ontology } = value as OntologyShowInput;
45
+ expect(ontology.prefix).toBe("ds");
46
+ expect(ontology.classes.length).toBeGreaterThan(0);
47
+ const propertyCount =
48
+ ontology.classes.reduce((n, c) => n + c.properties.length, 0) +
49
+ ontology.unattached.length;
50
+ expect(propertyCount).toBeGreaterThan(0);
51
+ });
52
+
53
+ it("deep-dives into a class via the class param", async () => {
54
+ const ctx = makeCtx();
55
+ const cmd = buildShowCommand(ctx);
56
+ const { value, text } = await executeOutput(
57
+ cmd,
58
+ { prefix: "ds", class: "Component" },
59
+ ctx,
60
+ );
61
+
62
+ const { ontology } = value as OntologyShowInput;
63
+ expect(ontology.focus?.iri).toBe("ds:Component");
64
+ expect(text).toContain("Component");
65
+ expect(text).toContain("extends:");
66
+ // Follow-up querying: the deep dive hands over runnable SPARQL.
67
+ expect(text).toContain(
68
+ "SELECT ?instance WHERE { ?instance a ds:Component }",
69
+ );
70
+ });
71
+
72
+ it("hides attributes by default and shows them with --properties", async () => {
73
+ const ctx = makeCtx();
74
+ const cmd = buildShowCommand(ctx);
75
+
76
+ const bare = await executeOutput(cmd, { prefix: "ds" }, ctx);
77
+ // Attributes render as `label: range` — absent by default.
78
+ expect(bare.text).not.toContain(": xsd:");
79
+ // hasModifierFamily is an object property (relation) — always shown.
80
+ expect(bare.text).toContain("hasModifierFamily");
81
+
82
+ const withProps = await executeOutput(
83
+ cmd,
84
+ { prefix: "ds", properties: true },
85
+ ctx,
86
+ );
87
+ expect(withProps.text).toContain(": xsd:");
88
+ });
89
+
90
+ it("expands IRIs with --full-uris", async () => {
91
+ const ctx = makeCtx({
92
+ globalFlags: { llm: true, format: "text" as const, verbose: false },
93
+ });
94
+ const cmd = buildShowCommand(ctx);
95
+ const { value, text } = await executeOutput(
96
+ cmd,
97
+ { prefix: "ds", fullUris: true },
98
+ ctx,
99
+ );
100
+
101
+ const { ontology } = value as OntologyShowInput;
102
+ const component = ontology.classes.find((c) => c.label === "Component");
103
+ expect(component?.iri).toBe("https://ds.canonical.com/Component");
104
+ expect(text).toContain("https://ds.canonical.com/Component");
105
+ // The seeded footer query must stay valid SPARQL: full URIs need <...>.
106
+ expect(text).toMatch(/\?s a <https:\/\/ds\.canonical\.com\//);
48
107
  });
49
108
 
50
109
  it("completes ontology prefixes", async () => {
@@ -57,13 +116,30 @@ describe("ontology show command", () => {
57
116
  expect(matches).toContain("ds");
58
117
  });
59
118
 
119
+ it("completes class names for --class", async () => {
120
+ const ctx = makeCtx();
121
+ const cmd = buildShowCommand(ctx);
122
+ const classParam = cmd.parameters.find((p) => p.name === "class");
123
+ const complete = classParam?.complete;
124
+
125
+ expect(complete).toBeTypeOf("function");
126
+ const matches = await complete?.("comp", ctx);
127
+ expect(matches).toContain("Component");
128
+ // Case-insensitive prefix match, sorted, no non-matches.
129
+ expect(matches?.every((m) => m.toLowerCase().startsWith("comp"))).toBe(
130
+ true,
131
+ );
132
+ });
133
+
60
134
  it("renders plain output", async () => {
61
135
  const ctx = makeCtx();
62
136
  const cmd = buildShowCommand(ctx);
63
137
  const { text } = await executeOutput(cmd, { prefix: "ds" }, ctx);
64
138
 
65
- expect(text).toContain("Classes");
66
- expect(text).toContain("Properties");
139
+ expect(text).toContain("Ontology ds:");
140
+ expect(text).toContain("classes");
141
+ // Hierarchy: children render beneath their parent with tree branches.
142
+ expect(text).toContain("└─");
67
143
  });
68
144
 
69
145
  it("renders llm output", async () => {
@@ -73,7 +149,7 @@ describe("ontology show command", () => {
73
149
  const cmd = buildShowCommand(ctx);
74
150
  const { text } = await executeOutput(cmd, { prefix: "ds" }, ctx);
75
151
 
76
- expect(text).toContain("## ds:");
152
+ expect(text).toContain("## Ontology ds:");
77
153
  expect(text).toContain("### Classes");
78
154
  });
79
155
 
@@ -84,7 +160,7 @@ describe("ontology show command", () => {
84
160
  const cmd = buildShowCommand(ctx);
85
161
  const { text } = await executeOutput(cmd, { prefix: "ds" }, ctx);
86
162
 
87
- const parsed = JSON.parse(text) as OntologyDetailed;
163
+ const parsed = JSON.parse(text) as { prefix: string };
88
164
  expect(parsed.prefix).toBe("ds");
89
165
  });
90
166
 
@@ -1,66 +1,14 @@
1
- import {
2
- type CommandDefinition,
3
- type CommandResult,
4
- createOutputResult,
5
- } from "@canonical/cli-core";
6
- import { PragmaError } from "#error";
1
+ import type { CommandDefinition } from "@canonical/cli-core";
7
2
  import type { PragmaContext } from "../../shared/context.js";
8
- import { selectFormatter } from "../../shared/formatters.js";
9
- import { showFormatters } from "../formatters/index.js";
10
- import { listOntologies, showOntology } from "../operations/index.js";
3
+ import { compileReadCommand } from "../../shared/stories/index.js";
4
+ import { ontologyShowStory } from "../stories.js";
11
5
 
12
6
  /**
13
- * Builds the `pragma ontology show` command definition.
14
- *
15
- * Displays detailed schema (classes and properties) for a given ontology
16
- * prefix. Provides tab-completion for the prefix parameter.
17
- *
18
- * @param ctx - Pragma runtime context providing the ke store and config.
19
- * @returns A command definition for `ontology show`.
7
+ * Wire the `pragma ontology show <prefix>` CLI command from the ontology
8
+ * show story.
20
9
  */
21
10
  export default function buildShowCommand(
22
11
  ctx: PragmaContext,
23
12
  ): CommandDefinition {
24
- return {
25
- path: ["ontology", "show"],
26
- description: "Show ontology schema details",
27
- parameters: [
28
- {
29
- name: "prefix",
30
- description: "Ontology prefix (e.g. 'ds', 'cs')",
31
- type: "string",
32
- positional: true,
33
- required: true,
34
- complete: async (partial: string) => {
35
- const all = await listOntologies(ctx.store);
36
- return all
37
- .map((o) => o.prefix)
38
- .filter((p) => p.toLowerCase().startsWith(partial.toLowerCase()));
39
- },
40
- },
41
- ],
42
- meta: {
43
- examples: ["pragma ontology show ds", "pragma ontology show cs --llm"],
44
- },
45
- execute: async (
46
- params: Record<string, unknown>,
47
- ): Promise<CommandResult> => {
48
- const prefix = params.prefix as string;
49
- if (!prefix) {
50
- throw PragmaError.invalidInput("prefix", "(empty)", {
51
- recovery: {
52
- message: "List loaded ontologies to find valid prefixes.",
53
- cli: "pragma ontology list",
54
- mcp: { tool: "ontology_list" },
55
- },
56
- });
57
- }
58
-
59
- const result = await showOntology(ctx.store, prefix);
60
-
61
- return createOutputResult(result, {
62
- plain: selectFormatter(ctx, showFormatters),
63
- });
64
- },
65
- };
13
+ return compileReadCommand(ctx, ontologyShowStory);
66
14
  }
@@ -1,4 +1,5 @@
1
1
  /** @module Barrel for ontology formatters. */
2
2
 
3
3
  export { default as listFormatters } from "./list.js";
4
+ export type { OntologyShowInput } from "./show.js";
4
5
  export { default as showFormatters } from "./show.js";
@@ -1,33 +1,39 @@
1
1
  import chalk from "chalk";
2
- import compactUri from "../../shared/compactUri.js";
3
2
  import type { Formatters } from "../../shared/formatters.js";
4
- import { PREFIX_MAP } from "../../shared/prefixes.js";
5
3
  import type { OntologySummary } from "../../shared/types/index.js";
6
4
 
7
5
  /**
8
6
  * Formatters for `pragma ontology list` output.
9
7
  *
10
- * - **plain**: one line per ontology with chalk-styled prefix, namespace, and counts.
11
- * - **llm**: condensed Markdown bullet list under an `## Ontologies` heading.
12
- * - **json**: serialized ontology summary array as indented JSON.
8
+ * One line per namespace mirroring the `ontology show` summary line —
9
+ * name, metadata, and split counts — plus a next-command footer, so the
10
+ * list is the entry point of the same drill-down path
11
+ * (`list → show <prefix> → show <prefix> --class <Class>`).
12
+ *
13
+ * - **plain**: chalk-styled lines with counts and a dimmed footer.
14
+ * - **llm**: the same content as condensed Markdown bullets.
15
+ * - **json**: the {@link OntologySummary} array itself.
13
16
  */
14
17
  const formatters: Formatters<readonly OntologySummary[]> = {
15
18
  plain(ontologies) {
16
- return ontologies
17
- .map(
18
- (o) =>
19
- `${chalk.bold(`${o.prefix}:`)} ${compactUri(o.namespace, PREFIX_MAP)} classes: ${o.classCount} properties: ${o.propertyCount} anatomy: ${o.anatomyCount}`,
20
- )
21
- .join("\n");
19
+ const lines = ontologies.map(
20
+ (o) =>
21
+ `${chalk.bold(prefixLabel(o))} ${o.namespace} ${chalk.dim(`— ${summaryLine(o)}`)}`,
22
+ );
23
+ lines.push("");
24
+ lines.push(chalk.dim("Next: pragma ontology show <prefix>"));
25
+ return lines.join("\n");
22
26
  },
23
27
 
24
28
  llm(ontologies) {
25
29
  const lines = ["## Ontologies", ""];
26
30
  for (const o of ontologies) {
27
31
  lines.push(
28
- `- **${o.prefix}:** \`${compactUri(o.namespace, PREFIX_MAP)}\` | classes: ${o.classCount} | properties: ${o.propertyCount} | anatomy: ${o.anatomyCount}`,
32
+ `- **${prefixLabel(o)}** \`${o.namespace}\` — ${summaryLine(o)}`,
29
33
  );
30
34
  }
35
+ lines.push("");
36
+ lines.push("Next: `ontology show <prefix>` for the class hierarchy.");
31
37
  return lines.join("\n");
32
38
  },
33
39
 
@@ -37,3 +43,22 @@ const formatters: Formatters<readonly OntologySummary[]> = {
37
43
  };
38
44
 
39
45
  export default formatters;
46
+
47
+ /** `ds:` for prefixed namespaces, a placeholder for unprefixed ones. */
48
+ function prefixLabel(o: OntologySummary): string {
49
+ return o.prefix ? `${o.prefix}:` : "(no prefix)";
50
+ }
51
+
52
+ /** The same counts-and-metadata line `ontology show` leads with. */
53
+ function summaryLine(o: OntologySummary): string {
54
+ const parts = [
55
+ `${o.classCount} classes`,
56
+ `${o.relationCount} relations`,
57
+ `${o.attributeCount} attributes`,
58
+ ];
59
+ if (o.shapeCount > 0) parts.push(`${o.shapeCount} shapes`);
60
+ if (o.anatomyCount > 0) parts.push(`${o.anatomyCount} anatomies`);
61
+ if (o.version) parts.push(`v${o.version}`);
62
+ if (o.title) parts.push(o.title);
63
+ return parts.join(" · ");
64
+ }