@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,265 @@
1
+ /**
2
+ * Curated root `--help` for `pragma`.
3
+ *
4
+ * cli-core's generic `formatHelp` derives a description per top-level noun from
5
+ * its commands, but noun groups that only have verbs (e.g. `block list`) have
6
+ * no command to carry one — so it emits placeholder text like "block commands".
7
+ * The root help is also the CLI's front door, so its content and grouping are
8
+ * worth hand-curating here rather than auto-generating.
9
+ *
10
+ * This renderer:
11
+ * - groups nouns into task-oriented sections with real one-line summaries,
12
+ * - derives each section's live nouns from the registered commands (so a noun
13
+ * that disappears is dropped, and a new, uncatalogued one still shows up
14
+ * under "Other" instead of vanishing),
15
+ * - expands `create` to show its scaffolding subtypes, including the component
16
+ * frameworks pulled straight from the command's parameter choices.
17
+ */
18
+
19
+ import type { CommandDefinition } from "@canonical/cli-core";
20
+ import chalk from "chalk";
21
+
22
+ interface NounSummary {
23
+ readonly noun: string;
24
+ readonly summary: string;
25
+ }
26
+
27
+ interface HelpGroup {
28
+ readonly title: string;
29
+ readonly nouns: readonly NounSummary[];
30
+ }
31
+
32
+ /**
33
+ * Task-oriented grouping with curated summaries. Order is intentional: the
34
+ * things people reach for most (exploring the system, generating code) come
35
+ * first; agent/integration tooling comes last.
36
+ */
37
+ const HELP_GROUPS: readonly HelpGroup[] = [
38
+ {
39
+ title: "Explore the design system",
40
+ nouns: [
41
+ {
42
+ noun: "block",
43
+ summary: "Inspect components & patterns and their anatomy",
44
+ },
45
+ { noun: "token", summary: "Look up design tokens and their values" },
46
+ { noun: "modifier", summary: "Inspect modifiers and modifier families" },
47
+ { noun: "standard", summary: "Browse code standards and categories" },
48
+ {
49
+ noun: "ontology",
50
+ summary: "Explore the loaded ontologies (classes, properties)",
51
+ },
52
+ { noun: "tier", summary: "List the design-system tiers" },
53
+ ],
54
+ },
55
+ {
56
+ title: "Generate code",
57
+ nouns: [
58
+ { noun: "create", summary: "Scaffold components, packages, and apps" },
59
+ ],
60
+ },
61
+ {
62
+ title: "Query & serve the graph",
63
+ nouns: [
64
+ {
65
+ noun: "graph",
66
+ summary: "Run SPARQL queries or inspect a URI directly",
67
+ },
68
+ {
69
+ noun: "graphql",
70
+ summary: "Compile and serve a GraphQL API over the ontologies",
71
+ },
72
+ ],
73
+ },
74
+ {
75
+ title: "Set up & maintain",
76
+ nouns: [
77
+ { noun: "doctor", summary: "Check environment health" },
78
+ {
79
+ noun: "setup",
80
+ summary: "Configure MCP, skills, completions, and the LSP",
81
+ },
82
+ { noun: "config", summary: "Read and write pragma.config.json" },
83
+ { noun: "tokens", summary: "Generate a Terrazzo tokens config" },
84
+ {
85
+ noun: "info",
86
+ summary: "Show version, config, update status, and store summary",
87
+ },
88
+ {
89
+ noun: "upgrade",
90
+ summary: "Upgrade the pragma CLI to the latest version",
91
+ },
92
+ ],
93
+ },
94
+ {
95
+ title: "For AI agents",
96
+ nouns: [
97
+ {
98
+ noun: "capabilities",
99
+ summary: "Discover conventions, tools, and the discovery sequence",
100
+ },
101
+ {
102
+ noun: "llm",
103
+ summary: "LLM orientation: context, decision trees, command reference",
104
+ },
105
+ { noun: "mcp", summary: "Start the MCP server over stdio" },
106
+ {
107
+ noun: "skill",
108
+ summary: "Browse agent skills from design-system packages",
109
+ },
110
+ ],
111
+ },
112
+ ];
113
+
114
+ /** All distinct top-level nouns present in the registered commands. */
115
+ function nounsFrom(commands: readonly CommandDefinition[]): Set<string> {
116
+ const nouns = new Set<string>();
117
+ for (const cmd of commands) {
118
+ const noun = cmd.path[0];
119
+ if (noun) nouns.add(noun);
120
+ }
121
+ return nouns;
122
+ }
123
+
124
+ /** The verbs (second path segment) registered under a noun, in order. */
125
+ function verbsOf(
126
+ noun: string,
127
+ commands: readonly CommandDefinition[],
128
+ ): CommandDefinition[] {
129
+ return commands.filter((c) => c.path[0] === noun && c.path.length > 1);
130
+ }
131
+
132
+ /**
133
+ * The framework values offered by `create component`, e.g. `react · svelte ·
134
+ * lit`, read from the command's `framework` parameter choices so the help
135
+ * can never drift from what the generator actually accepts.
136
+ */
137
+ function componentFrameworks(
138
+ commands: readonly CommandDefinition[],
139
+ ): string | undefined {
140
+ const component = commands.find(
141
+ (c) => c.path[0] === "create" && c.path[1] === "component",
142
+ );
143
+ const choices = component?.parameters.find(
144
+ (p) => p.name === "framework",
145
+ )?.choices;
146
+ if (!choices || choices.length === 0) return undefined;
147
+ return choices.map((c) => c.label).join(" · ");
148
+ }
149
+
150
+ /** Render the `create` subtypes as indented sub-lines. */
151
+ function createSubtypes(
152
+ commands: readonly CommandDefinition[],
153
+ subWidth: number,
154
+ ): string[] {
155
+ const lines: string[] = [];
156
+ const frameworks = componentFrameworks(commands);
157
+ for (const verb of verbsOf("create", commands)) {
158
+ const name = verb.path[1] as string;
159
+ const note =
160
+ name === "component" && frameworks
161
+ ? frameworks
162
+ : name === "package"
163
+ ? "a new package for the monorepo"
164
+ : verb.description;
165
+ lines.push(
166
+ ` ${chalk.dim("·")} ${chalk.cyan(name.padEnd(subWidth))} ${chalk.dim(note)}`,
167
+ );
168
+ }
169
+ return lines;
170
+ }
171
+
172
+ /**
173
+ * Build the curated root help string.
174
+ *
175
+ * @param programName - The CLI binary name (`pragma`).
176
+ * @param description - The program description shown in the header.
177
+ * @param commands - All registered command definitions.
178
+ * @returns The formatted, colorized help text.
179
+ */
180
+ export default function formatRootHelp(
181
+ programName: string,
182
+ description: string,
183
+ commands: readonly CommandDefinition[],
184
+ ): string {
185
+ const present = nounsFrom(commands);
186
+ // `mcp` is attached to Commander directly (not via the command list), but is
187
+ // always available — surface it so the front door is complete.
188
+ present.add("mcp");
189
+ const catalogued = new Set(
190
+ HELP_GROUPS.flatMap((g) => g.nouns.map((n) => n.noun)),
191
+ );
192
+
193
+ // Any live noun we didn't curate is surfaced so nothing silently disappears.
194
+ const uncatalogued = [...present].filter((n) => !catalogued.has(n)).sort();
195
+ const groups: HelpGroup[] = [
196
+ ...HELP_GROUPS.map((g) => ({
197
+ ...g,
198
+ nouns: g.nouns.filter((n) => present.has(n.noun)),
199
+ })),
200
+ ...(uncatalogued.length > 0
201
+ ? [
202
+ {
203
+ title: "Other",
204
+ nouns: uncatalogued.map((noun) => ({
205
+ noun,
206
+ summary:
207
+ verbsOf(noun, commands)[0]?.description ?? `${noun} commands`,
208
+ })),
209
+ },
210
+ ]
211
+ : []),
212
+ ].filter((g) => g.nouns.length > 0);
213
+
214
+ // One shared column width so summaries line up across every group.
215
+ const nounWidth = Math.max(
216
+ ...groups.flatMap((g) => g.nouns.map((n) => n.noun.length)),
217
+ 0,
218
+ );
219
+ const subWidth = Math.max(
220
+ ...verbsOf("create", commands).map((v) => (v.path[1] as string).length),
221
+ 0,
222
+ );
223
+
224
+ const lines: string[] = [
225
+ `${chalk.bold(programName)} — ${description}`,
226
+ "",
227
+ `${chalk.dim("Usage:")} ${programName} ${chalk.cyan("<command>")} ${chalk.dim("[subcommand] [flags]")}`,
228
+ "",
229
+ ];
230
+
231
+ for (const group of groups) {
232
+ lines.push(chalk.bold(group.title));
233
+ for (const { noun, summary } of group.nouns) {
234
+ lines.push(
235
+ ` ${chalk.cyan(noun.padEnd(nounWidth))} ${chalk.dim(summary)}`,
236
+ );
237
+ if (noun === "create") {
238
+ lines.push(...createSubtypes(commands, subWidth));
239
+ }
240
+ }
241
+ lines.push("");
242
+ }
243
+
244
+ lines.push(chalk.bold("Global flags"));
245
+ const flags: [string, string][] = [
246
+ ["--llm", "Condensed Markdown output for agents"],
247
+ ["--format json", "Machine-readable JSON output"],
248
+ ["--verbose", "Diagnostic output on stderr"],
249
+ ["--help", "Show help (works on any command)"],
250
+ ["--version", "Show the CLI version"],
251
+ ];
252
+ const flagWidth = Math.max(...flags.map(([f]) => f.length));
253
+ for (const [flag, desc] of flags) {
254
+ lines.push(` ${chalk.cyan(flag.padEnd(flagWidth))} ${chalk.dim(desc)}`);
255
+ }
256
+ lines.push("");
257
+
258
+ lines.push(
259
+ chalk.dim(
260
+ `Run \`${programName} <command> --help\` for details, or \`${programName} capabilities\` to get oriented.`,
261
+ ),
262
+ );
263
+
264
+ return lines.join("\n");
265
+ }
@@ -33,6 +33,7 @@ vi.mock("./mapExitCode.js", () => ({
33
33
  vi.mock("./parseGlobalFlags.js", () => ({
34
34
  default: parseGlobalFlagsMock,
35
35
  stripGlobalFlags: (argv: readonly string[]) => [...argv],
36
+ readRawFormat: () => undefined,
36
37
  }));
37
38
 
38
39
  vi.mock("./resolveCommandKind.js", () => ({
@@ -109,10 +110,14 @@ describe("runCli orchestration", () => {
109
110
  collectCommandsMock.mockReturnValue([] as CommandDefinition[]);
110
111
  createProgramMock.mockReturnValue({ parseAsync });
111
112
 
113
+ // Completion queries are classified before the root-help shortcut, so
114
+ // resolveCommandKind runs first; a non-completion result still falls
115
+ // through to root help without booting the store.
116
+ resolveCommandKindMock.mockReturnValue({ kind: "store-required" });
117
+
112
118
  const { default: runCli } = await import("./runCli.js");
113
119
  await runCli(["node", "pragma", "--verbose"]);
114
120
 
115
- expect(resolveCommandKindMock).not.toHaveBeenCalled();
116
121
  expect(bootPragmaMock).not.toHaveBeenCalled();
117
122
  expect(parseAsync).toHaveBeenCalledWith(["node", "pragma", "--help"]);
118
123
  });
@@ -257,19 +262,30 @@ describe("runCli orchestration", () => {
257
262
  expect(dispose).toHaveBeenCalledTimes(1);
258
263
  });
259
264
 
260
- it("treats version commander errors as success", async () => {
261
- const parseAsync = vi.fn(async () => {
262
- throw new CommanderError(0, "commander.version", "version");
263
- });
265
+ it("prints the version directly and never reaches the program", async () => {
266
+ // --version is a global flag handled before command dispatch, so it neither
267
+ // boots the store nor builds a Commander program.
268
+ const stdout: string[] = [];
269
+ const stdoutSpy = vi
270
+ .spyOn(process.stdout, "write")
271
+ .mockImplementation((chunk) => {
272
+ stdout.push(String(chunk));
273
+ return true;
274
+ });
264
275
 
265
276
  resolveCommandKindMock.mockReturnValue({ kind: "store-skip" });
266
- setupCommandsMock.mockReturnValue([{ path: ["setup", "skills"] }]);
267
- createProgramMock.mockReturnValue({ parseAsync });
268
-
269
- const { default: runCli } = await import("./runCli.js");
270
- await runCli(["node", "pragma", "--version"]);
271
-
272
- expect(process.exitCode).toBe(0);
277
+ createProgramMock.mockClear();
278
+
279
+ try {
280
+ const { default: runCli } = await import("./runCli.js");
281
+ await runCli(["node", "pragma", "--version"]);
282
+ } finally {
283
+ stdoutSpy.mockRestore();
284
+ }
285
+
286
+ expect(stdout.join("")).toContain(".");
287
+ expect(createProgramMock).not.toHaveBeenCalled();
288
+ expect(process.exitCode).toBeUndefined();
273
289
  });
274
290
 
275
291
  it("renders pragma errors from the program using mapped exit codes", async () => {
@@ -4,9 +4,17 @@ import createProgram from "./createProgram.js";
4
4
  import parseGlobalFlags from "./parseGlobalFlags.js";
5
5
 
6
6
  describe("parseGlobalFlags", () => {
7
- it("parses defaults", () => {
8
- const flags = parseGlobalFlags(["node", "pragma"]);
9
- expect(flags).toEqual({ llm: false, format: "text", verbose: false });
7
+ it("parses defaults on an interactive terminal", () => {
8
+ const flags = parseGlobalFlags(["node", "pragma"], {
9
+ isTty: true,
10
+ noAutoLlm: false,
11
+ });
12
+ expect(flags).toEqual({
13
+ llm: false,
14
+ autoLlm: false,
15
+ format: "text",
16
+ verbose: false,
17
+ });
10
18
  });
11
19
 
12
20
  it("parses --llm", () => {
@@ -33,7 +41,12 @@ describe("parseGlobalFlags", () => {
33
41
  "json",
34
42
  "--verbose",
35
43
  ]);
36
- expect(flags).toEqual({ llm: true, format: "json", verbose: true });
44
+ expect(flags).toEqual({
45
+ llm: true,
46
+ autoLlm: false,
47
+ format: "json",
48
+ verbose: true,
49
+ });
37
50
  });
38
51
  });
39
52