@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,135 +0,0 @@
1
- import type { CommandDefinition } from "@canonical/cli-core";
2
- import type { Store } from "@canonical/ke";
3
- import { afterAll, beforeAll, describe, expect, it } from "vitest";
4
- import { createTestStore, DS_ALL_TTL } from "#testing";
5
- import type { PragmaContext } from "../../shared/context.js";
6
- import buildLookupCommand from "./lookup.js";
7
-
8
- let store: Store;
9
- let cleanup: () => void;
10
-
11
- beforeAll(async () => {
12
- const result = await createTestStore({ ttl: DS_ALL_TTL });
13
- store = result.store;
14
- cleanup = result.cleanup;
15
- });
16
-
17
- afterAll(() => cleanup());
18
-
19
- function makeCtx(overrides: Partial<PragmaContext> = {}): PragmaContext {
20
- return {
21
- cwd: "/tmp",
22
- globalFlags: { llm: false, format: "text" as const, verbose: false },
23
- store,
24
- config: { tier: undefined, channel: "prerelease" },
25
- ...overrides,
26
- };
27
- }
28
-
29
- async function executeOutput(
30
- cmd: CommandDefinition,
31
- params: Record<string, unknown>,
32
- ctx: PragmaContext,
33
- ): Promise<{ value: unknown; text: string }> {
34
- const result = await cmd.execute(params, ctx);
35
- expect(result.tag).toBe("output");
36
- if (result.tag !== "output") throw new Error("Expected output result");
37
- const text = result.render.plain(result.value);
38
- return { value: result.value, text };
39
- }
40
-
41
- describe("buildLookupCommand", () => {
42
- it("returns summary by default", async () => {
43
- const ctx = makeCtx();
44
- const cmd = buildLookupCommand(ctx);
45
- const { text } = await executeOutput(
46
- cmd,
47
- { names: ["react/component/folder-structure"] },
48
- ctx,
49
- );
50
- expect(text).toContain("react/component/folder-structure");
51
- expect(text).toContain("Category: react");
52
- expect(text).not.toContain("Do:");
53
- });
54
-
55
- it("returns dos and donts with --detailed", async () => {
56
- const ctx = makeCtx();
57
- const cmd = buildLookupCommand(ctx);
58
- const { text } = await executeOutput(
59
- cmd,
60
- { names: ["react/component/folder-structure"], detailed: true },
61
- ctx,
62
- );
63
- expect(text).toContain("Do:");
64
- expect(text).toContain("Don't:");
65
- });
66
-
67
- it("throws ENTITY_NOT_FOUND for unknown standard", async () => {
68
- const ctx = makeCtx();
69
- const cmd = buildLookupCommand(ctx);
70
- const result = await cmd.execute({ names: ["nonexistent"] }, ctx);
71
- expect(result.tag).toBe("output");
72
- if (result.tag !== "output") {
73
- expect.fail("Expected output result");
74
- }
75
- expect(result.render.plain(result.value)).toContain("Errors:");
76
- });
77
-
78
- it("renders LLM format with --llm", async () => {
79
- const ctx = makeCtx({
80
- globalFlags: { llm: true, format: "text" as const, verbose: false },
81
- });
82
- const cmd = buildLookupCommand(ctx);
83
- const { text } = await executeOutput(
84
- cmd,
85
- { names: ["react/component/folder-structure"], detailed: true },
86
- ctx,
87
- );
88
- expect(text).toContain("## react/component/folder-structure");
89
- expect(text).toContain("### Do");
90
- });
91
-
92
- it("renders JSON with --detailed", async () => {
93
- const ctx = makeCtx({
94
- globalFlags: { llm: false, format: "json" as const, verbose: false },
95
- });
96
- const cmd = buildLookupCommand(ctx);
97
- const { text } = await executeOutput(
98
- cmd,
99
- { names: ["react/component/folder-structure"], detailed: true },
100
- ctx,
101
- );
102
- const parsed = JSON.parse(text);
103
- expect(parsed.name).toBe("react/component/folder-structure");
104
- expect(parsed.dos).toBeDefined();
105
- expect(parsed.donts).toBeDefined();
106
- });
107
-
108
- it("renders JSON without --detailed (omits dos/donts)", async () => {
109
- const ctx = makeCtx({
110
- globalFlags: { llm: false, format: "json" as const, verbose: false },
111
- });
112
- const cmd = buildLookupCommand(ctx);
113
- const { text } = await executeOutput(
114
- cmd,
115
- { names: ["react/component/folder-structure"] },
116
- ctx,
117
- );
118
- const parsed = JSON.parse(text);
119
- expect(parsed.name).toBe("react/component/folder-structure");
120
- expect(parsed.dos).toBeUndefined();
121
- expect(parsed.donts).toBeUndefined();
122
- });
123
-
124
- it("renders multiple standards together", async () => {
125
- const ctx = makeCtx();
126
- const cmd = buildLookupCommand(ctx);
127
- const { text } = await executeOutput(
128
- cmd,
129
- { names: ["react/component/folder-structure", "react/component/props"] },
130
- ctx,
131
- );
132
- expect(text).toContain("react/component/folder-structure");
133
- expect(text).toContain("react/component/props");
134
- });
135
- });
@@ -1,99 +0,0 @@
1
- /**
2
- * Wires the `pragma standard lookup <name-or-uri...>` CLI command.
3
- *
4
- * Retrieves detailed information for a single code standard, including
5
- * optional dos/donts code blocks when `--detailed` is passed.
6
- */
7
-
8
- import {
9
- type CommandDefinition,
10
- type CommandResult,
11
- createOutputResult,
12
- } from "@canonical/cli-core";
13
- import { createLookupView } from "#tui";
14
- import type { PragmaContext } from "../../shared/context.js";
15
- import type { LookupResult } from "../../shared/contracts.js";
16
- import { renderLookupResults } from "../../shared/formatters.js";
17
- import {
18
- createInkLookupOptions,
19
- lookupFormatters,
20
- } from "../formatters/index.js";
21
- import type { lookupStandard } from "../operations/index.js";
22
- import { resolveStandardLookup } from "../orchestration/index.js";
23
-
24
- interface StandardLookupOutput {
25
- readonly result: LookupResult<Awaited<ReturnType<typeof lookupStandard>>>;
26
- readonly detailed: boolean;
27
- }
28
-
29
- export default function buildLookupCommand(
30
- ctx: PragmaContext,
31
- ): CommandDefinition {
32
- return {
33
- path: ["standard", "lookup"],
34
- description: "Look up detailed information for a standard by name or IRI",
35
- parameters: [
36
- {
37
- name: "names",
38
- description: "Standard names or IRIs",
39
- type: "multiselect",
40
- positional: true,
41
- required: true,
42
- },
43
- {
44
- name: "detailed",
45
- description: "Include dos and donts with code blocks",
46
- type: "boolean",
47
- default: false,
48
- },
49
- ],
50
- meta: {
51
- examples: [
52
- "pragma standard lookup react/component/folder-structure",
53
- "pragma standard lookup react/component/folder-structure react/component/props",
54
- "pragma standard lookup react/component/folder-structure --detailed",
55
- "pragma standard lookup react/component/folder-structure --llm",
56
- "pragma standard lookup cs:react_props",
57
- ],
58
- },
59
- execute: async (
60
- params: Record<string, unknown>,
61
- ): Promise<CommandResult> => {
62
- const names = normalizeNames(params.names, params.name);
63
- const detailed = (params.detailed as boolean) ?? false;
64
- const contract = await resolveStandardLookup(ctx.store, names);
65
-
66
- return createOutputResult<StandardLookupOutput>(
67
- { result: contract.result, detailed },
68
- {
69
- plain: ({ result, detailed: isDetailed }) =>
70
- renderLookupResults({
71
- ctx,
72
- result,
73
- formatters: lookupFormatters,
74
- mapResult: (standard) => ({ standard, detailed: isDetailed }),
75
- }),
76
- ink: ({ result, detailed: isDetailed }) =>
77
- createLookupView({
78
- results: result.results,
79
- errors: result.errors,
80
- domain: "standard",
81
- options: createInkLookupOptions(isDetailed),
82
- }),
83
- },
84
- );
85
- },
86
- };
87
- }
88
-
89
- function normalizeNames(names: unknown, legacyName?: unknown): string[] {
90
- if (Array.isArray(names)) {
91
- return names.filter(
92
- (name): name is string => typeof name === "string" && name.length > 0,
93
- );
94
- }
95
- if (typeof legacyName === "string" && legacyName.length > 0) {
96
- return [legacyName];
97
- }
98
- return [];
99
- }
@@ -1,57 +0,0 @@
1
- /**
2
- * Wires the `pragma standard sample` CLI command.
3
- *
4
- * Returns 1–5 complete standard instances as exemplars so agents
5
- * can learn the data shape before writing queries.
6
- */
7
-
8
- import {
9
- type CommandDefinition,
10
- createOutputResult,
11
- } from "@canonical/cli-core";
12
- import type { PragmaContext } from "../../shared/context.js";
13
- import { selectFormatter } from "../../shared/formatters.js";
14
- import type {
15
- SampleOutput,
16
- StandardDetailed,
17
- } from "../../shared/types/index.js";
18
- import { sampleFormatters } from "../formatters/index.js";
19
- import { sampleStandards } from "../operations/index.js";
20
-
21
- const NEXT_STEPS = [
22
- "Use standard_lookup to inspect specific standards by name.",
23
- "Use standard_list with --category to filter by category.",
24
- "Use standard_categories to see all available categories.",
25
- ];
26
-
27
- export default function sampleCommand(ctx: PragmaContext): CommandDefinition {
28
- return {
29
- path: ["standard", "sample"],
30
- description:
31
- "Return randomly selected complete standard instances as exemplars for shape discovery",
32
- parameters: [
33
- {
34
- name: "count",
35
- type: "string",
36
- description: "Number of samples to return (1–5, default 2)",
37
- required: false,
38
- },
39
- ],
40
- meta: {
41
- examples: ["pragma standard sample", "pragma standard sample --count 3"],
42
- },
43
- async execute(params) {
44
- const count = Number(params.count ?? 2);
45
- const result = await sampleStandards(ctx.store, count);
46
-
47
- const output: SampleOutput<StandardDetailed> = {
48
- ...result,
49
- nextSteps: NEXT_STEPS,
50
- };
51
-
52
- return createOutputResult(output, {
53
- plain: selectFormatter(ctx, sampleFormatters),
54
- });
55
- },
56
- };
57
- }
@@ -1,44 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import type { CategorySummary } from "../../shared/types/index.js";
3
- import formatters from "./categories.js";
4
-
5
- const CATEGORIES: CategorySummary[] = [
6
- { name: "code", standardCount: 1 },
7
- { name: "react", standardCount: 2 },
8
- ];
9
-
10
- describe("formatters.plain", () => {
11
- it("renders singular for count 1", () => {
12
- const text = formatters.plain(CATEGORIES);
13
- expect(text).toContain("code (1 standard)");
14
- });
15
-
16
- it("renders plural for count > 1", () => {
17
- const text = formatters.plain(CATEGORIES);
18
- expect(text).toContain("react (2 standards)");
19
- });
20
- });
21
-
22
- describe("formatters.llm", () => {
23
- it("renders markdown heading and bold names", () => {
24
- const text = formatters.llm(CATEGORIES);
25
- expect(text).toContain("## Standard Categories");
26
- expect(text).toContain("**react** (2)");
27
- });
28
- });
29
-
30
- describe("formatters.json", () => {
31
- it("returns valid JSON array", () => {
32
- const text = formatters.json(CATEGORIES);
33
- const parsed = JSON.parse(text);
34
- expect(Array.isArray(parsed)).toBe(true);
35
- expect(parsed).toHaveLength(2);
36
- expect(parsed[0].name).toBe("code");
37
- expect(parsed[0].standardCount).toBe(1);
38
- });
39
-
40
- it("returns empty array for empty list", () => {
41
- const text = formatters.json([]);
42
- expect(JSON.parse(text)).toEqual([]);
43
- });
44
- });
@@ -1,38 +0,0 @@
1
- /**
2
- * Three-mode formatter for `pragma standard categories` output.
3
- *
4
- * - **plain** — one line per category with standard count.
5
- * - **llm** — condensed Markdown consumed by LLM agents and reused
6
- * by the MCP adapter when `condensed: true`.
7
- * - **json** — structured JSON array for programmatic consumption.
8
- */
9
-
10
- import type { Formatters } from "../../shared/formatters.js";
11
- import type { CategorySummary } from "../../shared/types/index.js";
12
-
13
- const formatters: Formatters<readonly CategorySummary[]> = {
14
- plain(categories) {
15
- const lines: string[] = [];
16
- for (const c of categories) {
17
- const plural = c.standardCount === 1 ? "standard" : "standards";
18
- lines.push(`${c.name} (${c.standardCount} ${plural})`);
19
- }
20
- return lines.join("\n");
21
- },
22
-
23
- llm(categories) {
24
- const lines: string[] = [];
25
- lines.push("## Standard Categories");
26
- lines.push("");
27
- for (const c of categories) {
28
- lines.push(`- **${c.name}** (${c.standardCount})`);
29
- }
30
- return lines.join("\n");
31
- },
32
-
33
- json(data) {
34
- return JSON.stringify(data, null, 2);
35
- },
36
- };
37
-
38
- export default formatters;
@@ -1,10 +0,0 @@
1
- /** @module Re-exports standard formatters (`categoriesFormatters`, `listFormatters`, `lookupFormatters`, `sampleFormatters`). */
2
-
3
- export { default as categoriesFormatters } from "./categories.js";
4
- export { default as listFormatters } from "./list.js";
5
- export {
6
- createInkLookupOptions,
7
- default as lookupFormatters,
8
- } from "./lookup.js";
9
- export { default as sampleFormatters } from "./sample.js";
10
- export type { StandardListOutput, StandardLookupInput } from "./types.js";
@@ -1,169 +0,0 @@
1
- import type { URI } from "@canonical/ke";
2
- import { describe, expect, it } from "vitest";
3
- import type {
4
- StandardDetailed,
5
- StandardSummary,
6
- } from "../../shared/types/index.js";
7
- import formatters from "./list.js";
8
- import type { StandardListOutput } from "./types.js";
9
-
10
- const SUMMARY: StandardSummary = {
11
- uri: "http://example.com/s1" as URI,
12
- name: "react/component/folder-structure",
13
- category: "react",
14
- description: "Components must follow the standard folder layout",
15
- };
16
-
17
- const DETAIL: StandardDetailed = {
18
- ...SUMMARY,
19
- dos: [
20
- { language: "typescript", code: "export function Button() { ... }" },
21
- { language: "typescript", code: "export function Input() { ... }" },
22
- ],
23
- donts: [
24
- { language: "typescript", code: "export default class Button { ... }" },
25
- ],
26
- };
27
-
28
- function summaryOutput(items: readonly StandardSummary[]): StandardListOutput {
29
- return { items, disclosure: { level: "summary" } };
30
- }
31
-
32
- function digestOutput(
33
- items: readonly StandardSummary[],
34
- details: readonly (StandardDetailed | null)[],
35
- maxExampleLength?: number,
36
- ): StandardListOutput {
37
- return {
38
- items,
39
- details,
40
- disclosure: { level: "digest", maxExampleLength },
41
- };
42
- }
43
-
44
- function detailedOutput(
45
- items: readonly StandardSummary[],
46
- details: readonly (StandardDetailed | null)[],
47
- ): StandardListOutput {
48
- return { items, details, disclosure: { level: "detailed" } };
49
- }
50
-
51
- // ---------------------------------------------------------------------------
52
- // Summary (default)
53
- // ---------------------------------------------------------------------------
54
-
55
- describe("formatters.plain — summary", () => {
56
- it("renders name with category and description", () => {
57
- const text = formatters.plain(summaryOutput([SUMMARY]));
58
- expect(text).toContain("react/component/folder-structure [react]");
59
- expect(text).toContain(" Components must follow");
60
- });
61
-
62
- it("omits category brackets when empty", () => {
63
- const text = formatters.plain(
64
- summaryOutput([{ ...SUMMARY, category: "" }]),
65
- );
66
- expect(text).not.toContain("[");
67
- });
68
- });
69
-
70
- describe("formatters.llm — summary", () => {
71
- it("renders markdown heading and bold names", () => {
72
- const text = formatters.llm(summaryOutput([SUMMARY]));
73
- expect(text).toContain("## Standards");
74
- expect(text).toContain("**react/component/folder-structure**");
75
- });
76
- });
77
-
78
- describe("formatters.json — summary", () => {
79
- it("returns valid JSON array", () => {
80
- const text = formatters.json(summaryOutput([SUMMARY]));
81
- const parsed = JSON.parse(text);
82
- expect(Array.isArray(parsed)).toBe(true);
83
- expect(parsed).toHaveLength(1);
84
- expect(parsed[0].name).toBe("react/component/folder-structure");
85
- });
86
-
87
- it("returns empty array for empty list", () => {
88
- const text = formatters.json(summaryOutput([]));
89
- expect(JSON.parse(text)).toEqual([]);
90
- });
91
- });
92
-
93
- // ---------------------------------------------------------------------------
94
- // Digest
95
- // ---------------------------------------------------------------------------
96
-
97
- describe("formatters.plain — digest", () => {
98
- it("includes first do example", () => {
99
- const text = formatters.plain(digestOutput([SUMMARY], [DETAIL]));
100
- expect(text).toContain("Example: export function Button()");
101
- });
102
-
103
- it("truncates long examples", () => {
104
- const text = formatters.plain(digestOutput([SUMMARY], [DETAIL], 20));
105
- expect(text).toContain("Example: ");
106
- // Truncated to 20 chars (19 + ellipsis)
107
- const exampleLine = text.split("\n").find((l) => l.includes("Example:"));
108
- expect(exampleLine).toBeDefined();
109
- if (!exampleLine) {
110
- throw new Error("Expected example line");
111
- }
112
- // 20 char max means the example text portion is at most 20 chars
113
- const exampleText = exampleLine.replace(/.*Example: /, "");
114
- expect(exampleText.length).toBeLessThanOrEqual(20);
115
- });
116
-
117
- it("omits example when detail is null", () => {
118
- const text = formatters.plain(digestOutput([SUMMARY], [null]));
119
- expect(text).not.toContain("Example:");
120
- });
121
- });
122
-
123
- describe("formatters.llm — digest", () => {
124
- it("includes first do example in backticks", () => {
125
- const text = formatters.llm(digestOutput([SUMMARY], [DETAIL]));
126
- expect(text).toContain("Example: `export function Button()");
127
- });
128
- });
129
-
130
- describe("formatters.json — digest", () => {
131
- it("includes example field in enriched items", () => {
132
- const text = formatters.json(digestOutput([SUMMARY], [DETAIL]));
133
- const parsed = JSON.parse(text);
134
- expect(parsed[0].example).toBeDefined();
135
- expect(parsed[0].example).toContain("export function Button()");
136
- });
137
- });
138
-
139
- // ---------------------------------------------------------------------------
140
- // Detailed
141
- // ---------------------------------------------------------------------------
142
-
143
- describe("formatters.plain — detailed", () => {
144
- it("includes full dos and donts", () => {
145
- const text = formatters.plain(detailedOutput([SUMMARY], [DETAIL]));
146
- expect(text).toContain("Do:");
147
- expect(text).toContain("export function Button()");
148
- expect(text).toContain("export function Input()");
149
- expect(text).toContain("Don't:");
150
- expect(text).toContain("export default class Button");
151
- });
152
- });
153
-
154
- describe("formatters.llm — detailed", () => {
155
- it("includes dos and donts in markdown", () => {
156
- const text = formatters.llm(detailedOutput([SUMMARY], [DETAIL]));
157
- expect(text).toContain("**Do**:");
158
- expect(text).toContain("**Don't**:");
159
- });
160
- });
161
-
162
- describe("formatters.json — detailed", () => {
163
- it("includes dos and donts arrays", () => {
164
- const text = formatters.json(detailedOutput([SUMMARY], [DETAIL]));
165
- const parsed = JSON.parse(text);
166
- expect(parsed[0].dos).toHaveLength(2);
167
- expect(parsed[0].donts).toHaveLength(1);
168
- });
169
- });