@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,184 +0,0 @@
1
- import type { Formatters } from "../../shared/formatters.js";
2
- import type { CodeBlock, StandardDetailed } from "../../shared/types/index.js";
3
- import type { StandardListOutput } from "./types.js";
4
-
5
- // ---------------------------------------------------------------------------
6
- // Helpers
7
- // ---------------------------------------------------------------------------
8
-
9
- const DEFAULT_MAX_EXAMPLE_LENGTH = 120;
10
-
11
- interface StandardListRow {
12
- readonly uri: StandardDetailed["uri"];
13
- readonly name: StandardDetailed["name"];
14
- readonly category: StandardDetailed["category"];
15
- readonly description: StandardDetailed["description"];
16
- readonly extends?: StandardDetailed["extends"];
17
- readonly example?: string;
18
- readonly dos?: StandardDetailed["dos"];
19
- readonly donts?: StandardDetailed["donts"];
20
- }
21
-
22
- function truncate(text: string, max: number): string {
23
- const oneLine = text.replace(/\n/g, " ").trim();
24
- return oneLine.length <= max ? oneLine : `${oneLine.slice(0, max - 1)}…`;
25
- }
26
-
27
- function firstDoExample(
28
- detail: StandardDetailed | null | undefined,
29
- maxLen: number,
30
- ): string | undefined {
31
- if (!detail || detail.dos.length === 0) return undefined;
32
- // Safe — length check above guarantees dos[0] exists
33
- return truncate((detail.dos[0] as CodeBlock).code, maxLen);
34
- }
35
-
36
- // ---------------------------------------------------------------------------
37
- // Plain
38
- // ---------------------------------------------------------------------------
39
-
40
- function plain(output: StandardListOutput): string {
41
- return buildRows(output)
42
- .map((row) => formatPlainRow(row, output.disclosure.level))
43
- .join("\n\n");
44
- }
45
-
46
- // ---------------------------------------------------------------------------
47
- // LLM
48
- // ---------------------------------------------------------------------------
49
-
50
- function llm(output: StandardListOutput): string {
51
- const lines = ["## Standards", ""];
52
-
53
- for (const row of buildRows(output)) {
54
- lines.push(formatLlmRow(row, output.disclosure.level));
55
- }
56
-
57
- return lines.join("\n");
58
- }
59
-
60
- // ---------------------------------------------------------------------------
61
- // JSON
62
- // ---------------------------------------------------------------------------
63
-
64
- function json({ items, details, disclosure }: StandardListOutput): string {
65
- if (disclosure.level === "summary" || !details) {
66
- return JSON.stringify(items, null, 2);
67
- }
68
-
69
- if (disclosure.level === "digest") {
70
- const maxLen = disclosure.maxExampleLength ?? DEFAULT_MAX_EXAMPLE_LENGTH;
71
- const enriched = items.map((s, i) => {
72
- const example = firstDoExample(details[i], maxLen);
73
- return example ? { ...s, example } : s;
74
- });
75
- return JSON.stringify(enriched, null, 2);
76
- }
77
-
78
- // detailed — merge full detail into each item
79
- const enriched = items.map((s, i) => {
80
- const detail = details[i];
81
- return detail ? { ...s, dos: detail.dos, donts: detail.donts } : s;
82
- });
83
- return JSON.stringify(enriched, null, 2);
84
- }
85
-
86
- // ---------------------------------------------------------------------------
87
- // Export
88
- // ---------------------------------------------------------------------------
89
-
90
- /** Three-mode formatter for `pragma standard list` output. */
91
- const formatters: Formatters<StandardListOutput> = { plain, llm, json };
92
-
93
- export default formatters;
94
-
95
- function buildRows({
96
- items,
97
- details,
98
- disclosure,
99
- }: StandardListOutput): readonly StandardListRow[] {
100
- if (disclosure.level === "summary") {
101
- return items;
102
- }
103
-
104
- if (disclosure.level === "digest") {
105
- const maxLen = disclosure.maxExampleLength ?? DEFAULT_MAX_EXAMPLE_LENGTH;
106
- return items.map((item, index) => ({
107
- ...item,
108
- extends: details?.[index]?.extends,
109
- example: firstDoExample(details?.[index], maxLen),
110
- }));
111
- }
112
-
113
- return items.map((item, index) => ({
114
- ...item,
115
- extends: details?.[index]?.extends,
116
- dos: details?.[index]?.dos,
117
- donts: details?.[index]?.donts,
118
- }));
119
- }
120
-
121
- function formatPlainRow(
122
- row: StandardListRow,
123
- level: StandardListOutput["disclosure"]["level"],
124
- ): string {
125
- const lines = [formatHeading(row), ` ${row.description}`];
126
-
127
- if (row.extends) {
128
- lines.push(` Extends: ${row.extends}`);
129
- }
130
-
131
- if (level === "digest" && row.example) {
132
- lines.push(` Example: ${row.example}`);
133
- }
134
-
135
- if (level === "detailed") {
136
- if (row.dos && row.dos.length > 0) {
137
- lines.push(" Do:");
138
- lines.push(...row.dos.map((item) => ` ${item.code}`));
139
- }
140
-
141
- if (row.donts && row.donts.length > 0) {
142
- lines.push(" Don't:");
143
- lines.push(...row.donts.map((item) => ` ${item.code}`));
144
- }
145
- }
146
-
147
- return lines.join("\n");
148
- }
149
-
150
- function formatLlmRow(
151
- row: StandardListRow,
152
- level: StandardListOutput["disclosure"]["level"],
153
- ): string {
154
- const lines = [
155
- `- **${row.name}**${row.category ? ` [${row.category}]` : ""}`,
156
- ];
157
- lines.push(` ${row.description}`);
158
-
159
- if (row.extends) {
160
- lines.push(` Extends: ${row.extends}`);
161
- }
162
-
163
- if (level === "digest" && row.example) {
164
- lines.push(` Example: \`${row.example}\``);
165
- }
166
-
167
- if (level === "detailed") {
168
- if (row.dos && row.dos.length > 0) {
169
- lines.push(" **Do**:");
170
- lines.push(...row.dos.map((item) => ` - ${item.code}`));
171
- }
172
-
173
- if (row.donts && row.donts.length > 0) {
174
- lines.push(" **Don't**:");
175
- lines.push(...row.donts.map((item) => ` - ${item.code}`));
176
- }
177
- }
178
-
179
- return lines.join("\n");
180
- }
181
-
182
- function formatHeading(row: StandardListRow): string {
183
- return row.category ? `${row.name} [${row.category}]` : row.name;
184
- }
@@ -1,95 +0,0 @@
1
- import type { URI } from "@canonical/ke";
2
- import { describe, expect, it } from "vitest";
3
- import type { StandardDetailed } from "../../shared/types/index.js";
4
- import formatters from "./lookup.js";
5
-
6
- const DETAILED: StandardDetailed = {
7
- uri: "http://example.com/s1" as URI,
8
- name: "react/component/folder-structure",
9
- category: "react",
10
- description: "Components must follow the standard folder layout",
11
- dos: [
12
- { language: "typescript", code: "Place files in src/lib/" },
13
- { language: "typescript", code: "Include index.ts barrel" },
14
- ],
15
- donts: [{ language: "typescript", code: "Use flat directory" }],
16
- };
17
-
18
- describe("formatters.plain", () => {
19
- it("renders summary without dos/donts by default", () => {
20
- const text = formatters.plain({ standard: DETAILED, detailed: false });
21
- expect(text).toContain("react/component/folder-structure");
22
- expect(text).toContain("URI: http://example.com/s1");
23
- expect(text).toContain("Category: react");
24
- expect(text).toContain("Description:");
25
- expect(text).not.toContain("Do:");
26
- expect(text).not.toContain("Don't:");
27
- });
28
-
29
- it("renders dos and donts when detailed", () => {
30
- const text = formatters.plain({ standard: DETAILED, detailed: true });
31
- expect(text).toContain("Do:");
32
- expect(text).toContain(" Place files in src/lib/");
33
- expect(text).toContain("Don't:");
34
- expect(text).toContain(" Use flat directory");
35
- });
36
-
37
- it("renders dash for empty category", () => {
38
- const text = formatters.plain({
39
- standard: { ...DETAILED, category: "" },
40
- detailed: false,
41
- });
42
- expect(text).toContain("Category: —");
43
- });
44
-
45
- it("renders extends when present", () => {
46
- const text = formatters.plain({
47
- standard: { ...DETAILED, extends: "react/component/base" },
48
- detailed: false,
49
- });
50
- expect(text).toContain("Extends: react/component/base");
51
- });
52
- });
53
-
54
- describe("formatters.llm", () => {
55
- it("renders markdown heading", () => {
56
- const text = formatters.llm({ standard: DETAILED, detailed: false });
57
- expect(text).toContain("## react/component/folder-structure");
58
- expect(text).toContain("URI: http://example.com/s1");
59
- expect(text).not.toContain("### Do");
60
- });
61
-
62
- it("renders extends in llm output when present", () => {
63
- const text = formatters.llm({
64
- standard: { ...DETAILED, extends: "cs:react_base" },
65
- detailed: false,
66
- });
67
- expect(text).toContain("Extends: cs:react_base");
68
- });
69
-
70
- it("renders do/dont sections when detailed", () => {
71
- const text = formatters.llm({ standard: DETAILED, detailed: true });
72
- expect(text).toContain("### Do");
73
- expect(text).toContain("### Don't");
74
- expect(text).toContain("- Place files in src/lib/");
75
- });
76
- });
77
-
78
- describe("formatters.json", () => {
79
- it("includes dos/donts when detailed", () => {
80
- const parsed = JSON.parse(
81
- formatters.json({ standard: DETAILED, detailed: true }),
82
- );
83
- expect(parsed.dos).toHaveLength(2);
84
- expect(parsed.donts).toHaveLength(1);
85
- });
86
-
87
- it("omits dos/donts when not detailed", () => {
88
- const parsed = JSON.parse(
89
- formatters.json({ standard: DETAILED, detailed: false }),
90
- );
91
- expect(parsed.dos).toBeUndefined();
92
- expect(parsed.donts).toBeUndefined();
93
- expect(parsed.name).toBe("react/component/folder-structure");
94
- });
95
- });
@@ -1,101 +0,0 @@
1
- import type { RenderLookupOptions } from "../../shared/contracts.js";
2
- import type { Formatters } from "../../shared/formatters.js";
3
- import { renderLookupLlm, renderLookupPlain } from "../../shared/renderers.js";
4
- import type { StandardDetailed } from "../../shared/types/index.js";
5
- import { standardConfig } from "../standardConfig.js";
6
- import type { StandardLookupInput } from "./types.js";
7
-
8
- /** Three-mode formatter for `pragma standard lookup` output. */
9
- const formatters: Formatters<StandardLookupInput> = {
10
- plain: ({ standard, detailed }) =>
11
- renderLookupPlain(standard, {
12
- title: (entry) => entry.name,
13
- fields: [
14
- { label: "URI", value: (entry) => entry.uri },
15
- { label: "Category", value: (entry) => entry.category || "—" },
16
- { label: "Description", value: (entry) => entry.description },
17
- { label: "Extends", value: (entry) => entry.extends },
18
- ],
19
- sections: detailed
20
- ? standardConfig.lookupSections.filter(
21
- (section) => section.key === "dos" || section.key === "donts",
22
- )
23
- : [],
24
- sectionOverrides: standardSectionOverrides,
25
- }),
26
-
27
- llm: ({ standard, detailed }) =>
28
- renderLookupLlm(standard, {
29
- title: (entry) => entry.name,
30
- fields: [
31
- { label: "URI", value: (entry) => entry.uri },
32
- { label: "Category", value: (entry) => entry.category || "—" },
33
- { label: "Description", value: (entry) => entry.description },
34
- { label: "Extends", value: (entry) => entry.extends },
35
- ],
36
- sections: detailed
37
- ? standardConfig.lookupSections.filter(
38
- (section) => section.key === "dos" || section.key === "donts",
39
- )
40
- : [],
41
- sectionOverrides: standardSectionOverrides,
42
- }),
43
-
44
- json({ standard, detailed }) {
45
- if (detailed) {
46
- return JSON.stringify(standard, null, 2);
47
- }
48
- const { dos: _dos, donts: _donts, ...summary } = standard;
49
- return JSON.stringify(summary, null, 2);
50
- },
51
- };
52
-
53
- export default formatters;
54
-
55
- /**
56
- * Build lookup rendering options for the Ink TUI view.
57
- *
58
- * @param detailed - whether to include dos/donts sections
59
- * @returns Options compatible with the LookupView component.
60
- */
61
- export function createInkLookupOptions(
62
- detailed: boolean,
63
- ): RenderLookupOptions<StandardDetailed> {
64
- return {
65
- title: (entry) => entry.name,
66
- fields: [
67
- { label: "URI", value: (entry) => entry.uri },
68
- { label: "Category", value: (entry) => entry.category || "—" },
69
- { label: "Description", value: (entry) => entry.description },
70
- { label: "Extends", value: (entry) => entry.extends },
71
- ],
72
- sections: detailed
73
- ? standardConfig.lookupSections.filter(
74
- (section) => section.key === "dos" || section.key === "donts",
75
- )
76
- : [],
77
- };
78
- }
79
-
80
- const standardSectionOverrides = {
81
- dos: {
82
- plain: (entry: StandardLookupInput["standard"]) =>
83
- entry.dos.length > 0
84
- ? entry.dos.map((item) => ` ${item.code}`).join("\n")
85
- : null,
86
- llm: (entry: StandardLookupInput["standard"]) =>
87
- entry.dos.length > 0
88
- ? entry.dos.map((item) => `- ${item.code}`).join("\n")
89
- : null,
90
- },
91
- donts: {
92
- plain: (entry: StandardLookupInput["standard"]) =>
93
- entry.donts.length > 0
94
- ? entry.donts.map((item) => ` ${item.code}`).join("\n")
95
- : null,
96
- llm: (entry: StandardLookupInput["standard"]) =>
97
- entry.donts.length > 0
98
- ? entry.donts.map((item) => `- ${item.code}`).join("\n")
99
- : null,
100
- },
101
- };
@@ -1,15 +0,0 @@
1
- /**
2
- * Sample formatter for the standard domain.
3
- *
4
- * Delegates to the shared factory, rendering each item via the
5
- * existing standard lookup formatter.
6
- */
7
-
8
- import createSampleFormatters from "../../shared/sampleFormatters.js";
9
- import type { StandardDetailed } from "../../shared/types/index.js";
10
- import lookupFormatters from "./lookup.js";
11
-
12
- export default createSampleFormatters<StandardDetailed>(
13
- "standards",
14
- (standard, mode) => lookupFormatters[mode]({ standard, detailed: true }),
15
- );
@@ -1,31 +0,0 @@
1
- /**
2
- * Formatter input types for standard commands.
3
- *
4
- * Composite types that bundle the data with display options,
5
- * so formatters conform to the `Formatters<T>` contract.
6
- */
7
-
8
- import type {
9
- Disclosure,
10
- StandardDetailed,
11
- StandardSummary,
12
- } from "../../shared/types/index.js";
13
-
14
- /** Input payload for the standard-lookup formatter, pairing data with a detail flag. */
15
- export interface StandardLookupInput {
16
- readonly standard: StandardDetailed;
17
- readonly detailed: boolean;
18
- }
19
-
20
- /**
21
- * Input for the list formatter with progressive disclosure.
22
- *
23
- * - summary: items only (name + category + description)
24
- * - digest: items enriched with first do example
25
- * - detailed: items enriched with full dos/donts
26
- */
27
- export interface StandardListOutput {
28
- readonly items: readonly StandardSummary[];
29
- readonly details?: readonly (StandardDetailed | null)[];
30
- readonly disclosure: Disclosure;
31
- }
@@ -1,40 +0,0 @@
1
- /**
2
- * @module Standard domain — CLI commands and operations.
3
- *
4
- * Commands: `pragma standard list`, `pragma standard lookup <name>`,
5
- * `pragma standard categories`.
6
- * Operations: {@link lookupStandard}, {@link listStandards}, {@link listCategories}.
7
- */
8
-
9
- import type { CommandDefinition } from "@canonical/cli-core";
10
- import type { PragmaContext } from "../shared/context.js";
11
- import {
12
- categoriesCommand,
13
- listCommand,
14
- lookupCommand,
15
- sampleCommand,
16
- } from "./commands/index.js";
17
-
18
- export function commands(ctx: PragmaContext): CommandDefinition[] {
19
- return [
20
- listCommand(ctx),
21
- lookupCommand(ctx),
22
- categoriesCommand(ctx),
23
- sampleCommand(ctx),
24
- ];
25
- }
26
-
27
- export { specs as mcpSpecs } from "./mcp/index.js";
28
- export {
29
- listCategories,
30
- listStandards,
31
- lookupStandard,
32
- sampleStandards,
33
- } from "./operations/index.js";
34
- export {
35
- buildStandardFilters,
36
- resolveStandardList,
37
- resolveStandardLookup,
38
- standardEmptyError,
39
- } from "./orchestration/index.js";
40
- export { standardConfig } from "./standardConfig.js";
@@ -1,2 +0,0 @@
1
- /** @module Standard domain MCP barrel — standard_list, standard_lookup, standard_categories. */
2
- export { default as specs } from "./specs.js";