@canonical/pragma-cli 0.31.0 → 0.32.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 (1064) hide show
  1. package/dist/pragma +0 -0
  2. package/package.json +27 -42
  3. package/src/bin.ts +292 -11
  4. package/src/capabilities/block/blockList.verb.ts +150 -0
  5. package/src/capabilities/block/index.ts +25 -0
  6. package/src/capabilities/block/pack.ts +155 -0
  7. package/src/capabilities/block/parity.test.ts +180 -0
  8. package/src/capabilities/block/tierChain.ts +78 -0
  9. package/src/capabilities/capabilities/capabilities.render.ts +89 -0
  10. package/src/capabilities/capabilities/capabilities.test.ts +131 -0
  11. package/src/capabilities/capabilities/capabilities.verb.ts +48 -0
  12. package/src/capabilities/capabilities/catalog.ts +144 -0
  13. package/src/capabilities/capabilities/hints.ts +221 -0
  14. package/src/capabilities/capabilities/index.ts +13 -0
  15. package/src/capabilities/capabilities/types.ts +58 -0
  16. package/src/capabilities/colophon/collectColophon.ts +68 -0
  17. package/src/capabilities/colophon/colophon.render.test.ts +87 -0
  18. package/src/capabilities/colophon/colophon.render.ts +38 -0
  19. package/src/capabilities/colophon/colophon.test.ts +241 -0
  20. package/src/capabilities/colophon/colophon.verb.ts +41 -0
  21. package/src/capabilities/colophon/index.ts +6 -0
  22. package/src/capabilities/colophon/markdownTerminal.test.ts +50 -0
  23. package/src/capabilities/colophon/markdownTerminal.ts +85 -0
  24. package/src/capabilities/colophon/pragmaColophon.ts +66 -0
  25. package/src/capabilities/colophon/types.ts +29 -0
  26. package/src/capabilities/config/collectConfigShow.ts +32 -0
  27. package/src/capabilities/config/field.render.ts +28 -0
  28. package/src/capabilities/config/field.test.ts +188 -0
  29. package/src/capabilities/config/fields.ts +152 -0
  30. package/src/capabilities/config/index.ts +6 -0
  31. package/src/capabilities/config/runField.ts +59 -0
  32. package/src/capabilities/config/runSet.ts +38 -0
  33. package/src/capabilities/config/set.test.ts +207 -0
  34. package/src/capabilities/config/set.verb.ts +70 -0
  35. package/src/capabilities/config/show.render.ts +61 -0
  36. package/src/capabilities/config/show.verb.ts +45 -0
  37. package/src/capabilities/config/types.ts +27 -0
  38. package/src/capabilities/create/byteEquality.subprocess.test.ts +88 -0
  39. package/src/capabilities/create/byteEquality.test.ts +222 -0
  40. package/src/capabilities/create/compiledCreate.subprocess.test.ts +152 -0
  41. package/src/capabilities/create/create.mcp.test.ts +139 -0
  42. package/src/capabilities/create/create.render.ts +50 -0
  43. package/src/capabilities/create/create.test.ts +403 -0
  44. package/src/capabilities/create/create.verb.ts +435 -0
  45. package/src/capabilities/create/cwdJail.test.ts +129 -0
  46. package/src/capabilities/create/generatorToVerbSpec.ts +111 -0
  47. package/src/capabilities/create/index.ts +25 -0
  48. package/src/capabilities/create/pathJail.ts +73 -0
  49. package/src/capabilities/create/pickGenerator.ts +63 -0
  50. package/src/capabilities/create/templates.embedded.generated.ts +53 -0
  51. package/src/capabilities/create/types.ts +8 -0
  52. package/src/capabilities/doctor/checks/checkConfigFile.ts +41 -0
  53. package/src/capabilities/doctor/checks/checkKeStore.ts +39 -0
  54. package/src/capabilities/doctor/checks/checkMcpCommands.ts +108 -0
  55. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +61 -0
  56. package/src/capabilities/doctor/checks/checkNodeVersion.ts +25 -0
  57. package/src/capabilities/doctor/checks/checkPackageRefs.ts +73 -0
  58. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +22 -0
  59. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +111 -0
  60. package/src/capabilities/doctor/checks/checkShellCompletions.ts +131 -0
  61. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +60 -0
  62. package/src/capabilities/doctor/doctor.render.ts +116 -0
  63. package/src/capabilities/doctor/doctor.test.ts +179 -0
  64. package/src/capabilities/doctor/doctor.verb.ts +46 -0
  65. package/src/capabilities/doctor/index.ts +6 -0
  66. package/src/capabilities/doctor/runChecks.ts +76 -0
  67. package/src/capabilities/doctor/types.ts +41 -0
  68. package/src/capabilities/emptyRecovery.test.ts +112 -0
  69. package/src/capabilities/graph/index.ts +21 -0
  70. package/src/capabilities/graph/inspect.render.ts +38 -0
  71. package/src/capabilities/graph/inspect.test.ts +80 -0
  72. package/src/capabilities/graph/inspect.verb.ts +51 -0
  73. package/src/capabilities/graph/query.render.ts +77 -0
  74. package/src/capabilities/graph/query.test.ts +156 -0
  75. package/src/capabilities/graph/query.verb.ts +58 -0
  76. package/src/capabilities/graph/runQuery.ts +49 -0
  77. package/src/capabilities/index.ts +54 -0
  78. package/src/capabilities/info/collectInfo.ts +76 -0
  79. package/src/capabilities/info/index.ts +6 -0
  80. package/src/capabilities/info/info.render.ts +72 -0
  81. package/src/capabilities/info/info.test.ts +127 -0
  82. package/src/capabilities/info/info.verb.ts +46 -0
  83. package/src/capabilities/info/types.ts +42 -0
  84. package/src/capabilities/lazy.test.ts +89 -0
  85. package/src/capabilities/meta/complete.verb.ts +52 -0
  86. package/src/capabilities/meta/index.ts +15 -0
  87. package/src/capabilities/meta/mcp.verb.ts +35 -0
  88. package/src/capabilities/modifier/index.ts +15 -0
  89. package/src/capabilities/modifier/pack.ts +64 -0
  90. package/src/capabilities/ontology/index.ts +12 -0
  91. package/src/capabilities/ontology/ontology.test.ts +94 -0
  92. package/src/capabilities/ontology/queries.ts +197 -0
  93. package/src/capabilities/ontology/render.ts +87 -0
  94. package/src/capabilities/ontology/verbs.ts +170 -0
  95. package/src/capabilities/prompt/index.ts +18 -0
  96. package/src/capabilities/prompt/prompt.render.ts +70 -0
  97. package/src/capabilities/prompt/prompt.test.ts +119 -0
  98. package/src/capabilities/prompt/types.ts +30 -0
  99. package/src/capabilities/prompt/verbs.ts +93 -0
  100. package/src/capabilities/resources/index.ts +15 -0
  101. package/src/capabilities/resources/provider.ts +231 -0
  102. package/src/capabilities/resources/resources.test.ts +114 -0
  103. package/src/capabilities/roundtrip.test.ts +107 -0
  104. package/src/capabilities/setup/index.ts +6 -0
  105. package/src/capabilities/setup/operations/setupCompletions.ts +108 -0
  106. package/src/capabilities/setup/operations/setupGenerator.ts +307 -0
  107. package/src/capabilities/setup/operations/setupLsp.ts +61 -0
  108. package/src/capabilities/setup/operations/setupMcp.ts +85 -0
  109. package/src/capabilities/setup/operations/setupSkills.ts +199 -0
  110. package/src/capabilities/setup/setup.render.ts +49 -0
  111. package/src/capabilities/setup/setup.test.ts +351 -0
  112. package/src/capabilities/setup/setup.verb.ts +209 -0
  113. package/src/capabilities/setup/shell.ts +85 -0
  114. package/src/capabilities/setup/types.ts +42 -0
  115. package/src/capabilities/shared/assertExecOk.ts +106 -0
  116. package/src/capabilities/shared/packageManager.ts +62 -0
  117. package/src/capabilities/shared/registry.ts +70 -0
  118. package/src/capabilities/skill/discover.ts +178 -0
  119. package/src/capabilities/skill/index.ts +12 -0
  120. package/src/capabilities/skill/render.ts +60 -0
  121. package/src/capabilities/skill/skill.test.ts +142 -0
  122. package/src/capabilities/skill/verbs.ts +100 -0
  123. package/src/capabilities/sources/collectStatus.ts +87 -0
  124. package/src/capabilities/sources/index.ts +15 -0
  125. package/src/capabilities/sources/installSkills.ts +124 -0
  126. package/src/capabilities/sources/runUpdate.ts +407 -0
  127. package/src/capabilities/sources/sources.test.ts +642 -0
  128. package/src/capabilities/sources/status.render.ts +56 -0
  129. package/src/capabilities/sources/status.verb.ts +42 -0
  130. package/src/capabilities/sources/types.ts +51 -0
  131. package/src/capabilities/sources/update.render.ts +35 -0
  132. package/src/capabilities/sources/update.verb.ts +76 -0
  133. package/src/capabilities/standard/index.ts +18 -0
  134. package/src/capabilities/standard/pack.ts +128 -0
  135. package/src/capabilities/standard/parity.test.ts +208 -0
  136. package/src/capabilities/surface.test.ts +208 -0
  137. package/src/capabilities/tier/index.ts +19 -0
  138. package/src/capabilities/tier/lookup.render.ts +34 -0
  139. package/src/capabilities/tier/lookup.test.ts +68 -0
  140. package/src/capabilities/tier/lookup.verb.ts +44 -0
  141. package/src/capabilities/tier/pack.ts +28 -0
  142. package/src/capabilities/tier/runLookup.ts +59 -0
  143. package/src/capabilities/token/addConfig.render.ts +27 -0
  144. package/src/capabilities/token/addConfig.test.ts +62 -0
  145. package/src/capabilities/token/addConfig.verb.ts +40 -0
  146. package/src/capabilities/token/index.ts +19 -0
  147. package/src/capabilities/token/pack.ts +58 -0
  148. package/src/capabilities/token/runAddConfig.ts +95 -0
  149. package/src/capabilities/upgrade/index.ts +6 -0
  150. package/src/capabilities/upgrade/runUpgrade.ts +119 -0
  151. package/src/capabilities/upgrade/types.ts +21 -0
  152. package/src/capabilities/upgrade/upgrade.render.ts +55 -0
  153. package/src/capabilities/upgrade/upgrade.test.ts +372 -0
  154. package/src/capabilities/upgrade/upgrade.verb.ts +56 -0
  155. package/src/constants.test.ts +33 -0
  156. package/src/constants.ts +38 -70
  157. package/src/index.ts +27 -122
  158. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +340 -0
  159. package/src/kernel/completion/bashDrive.test.ts +73 -0
  160. package/src/kernel/completion/complete.test.ts +101 -0
  161. package/src/kernel/completion/complete.ts +77 -0
  162. package/src/kernel/completion/emitScripts.test.ts +173 -0
  163. package/src/kernel/completion/emitScripts.ts +122 -0
  164. package/src/kernel/completion/entitySource.test.ts +198 -0
  165. package/src/kernel/completion/entitySource.ts +269 -0
  166. package/src/kernel/completion/index.ts +42 -0
  167. package/src/kernel/completion/model.test.ts +405 -0
  168. package/src/kernel/completion/model.ts +259 -0
  169. package/src/kernel/completion/parse.test.ts +338 -0
  170. package/src/kernel/completion/parse.ts +294 -0
  171. package/src/kernel/completion/rank.test.ts +100 -0
  172. package/src/kernel/completion/rank.ts +118 -0
  173. package/src/kernel/completion/resolve.test.ts +204 -0
  174. package/src/kernel/completion/resolve.ts +133 -0
  175. package/src/kernel/completion/safety.test.ts +374 -0
  176. package/src/kernel/completion/templates/bash.ts +249 -0
  177. package/src/kernel/completion/templates/fish.ts +245 -0
  178. package/src/kernel/completion/templates/shared.ts +134 -0
  179. package/src/kernel/completion/templates/zsh.ts +246 -0
  180. package/src/kernel/completion/types.ts +153 -0
  181. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +11 -0
  182. package/src/kernel/config/defaults.ts +28 -0
  183. package/src/kernel/config/evaluateProjectConfig.ts +119 -0
  184. package/src/kernel/config/findProjectConfig.ts +45 -0
  185. package/src/kernel/config/firstRun.test.ts +60 -0
  186. package/src/kernel/config/firstRun.ts +91 -0
  187. package/src/kernel/config/globalConfig.ts +94 -0
  188. package/src/kernel/config/index.ts +35 -0
  189. package/src/kernel/config/paths.ts +39 -0
  190. package/src/kernel/config/readConfig.test.ts +245 -0
  191. package/src/kernel/config/readConfig.ts +94 -0
  192. package/src/kernel/config/schema.ts +56 -0
  193. package/src/kernel/config/types.ts +106 -0
  194. package/src/kernel/config/writeConfigField.ts +82 -0
  195. package/src/kernel/error/PragmaError.test.ts +119 -0
  196. package/src/kernel/error/PragmaError.ts +182 -0
  197. package/src/kernel/error/constants.ts +38 -0
  198. package/src/kernel/error/fromTaskError.test.ts +83 -0
  199. package/src/kernel/error/fromTaskError.ts +80 -0
  200. package/src/kernel/error/index.ts +23 -0
  201. package/src/kernel/error/recovery.test.ts +60 -0
  202. package/src/kernel/error/recovery.ts +49 -0
  203. package/src/kernel/error/renderError.ts +101 -0
  204. package/src/kernel/error/serialize.ts +28 -0
  205. package/src/kernel/error/types.ts +62 -0
  206. package/src/kernel/packs/collect.test.ts +138 -0
  207. package/src/kernel/packs/collect.ts +108 -0
  208. package/src/kernel/packs/compile.test.ts +229 -0
  209. package/src/kernel/packs/compile.ts +315 -0
  210. package/src/kernel/packs/disclosure.test.ts +200 -0
  211. package/src/kernel/packs/disclosure.ts +98 -0
  212. package/src/kernel/packs/glob.ts +39 -0
  213. package/src/kernel/packs/graphql/buildLookupDocument.ts +397 -0
  214. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +217 -0
  215. package/src/kernel/packs/graphql/nameMap.ts +67 -0
  216. package/src/kernel/packs/graphqlSource.test.ts +383 -0
  217. package/src/kernel/packs/iri.ts +78 -0
  218. package/src/kernel/packs/renderPack.ts +196 -0
  219. package/src/kernel/packs/resolveEntity.ts +232 -0
  220. package/src/kernel/packs/runBodies.ts +157 -0
  221. package/src/kernel/packs/sample.ts +60 -0
  222. package/src/kernel/packs/schema.ts +328 -0
  223. package/src/kernel/packs/sparql/applyFilters.ts +83 -0
  224. package/src/kernel/packs/sparql/applySearch.ts +33 -0
  225. package/src/kernel/packs/sparql/buildLookupQuery.ts +180 -0
  226. package/src/kernel/packs/sparql/escape.ts +22 -0
  227. package/src/kernel/packs/sparql/runSelect.test.ts +80 -0
  228. package/src/kernel/packs/sparql/runSelect.ts +84 -0
  229. package/src/kernel/packs/toolDescription.test.ts +81 -0
  230. package/src/kernel/packs/types.ts +337 -0
  231. package/src/kernel/packs/uniqueness.ts +35 -0
  232. package/src/kernel/project/cli/buildProgram.test.ts +387 -0
  233. package/src/kernel/project/cli/buildProgram.ts +280 -0
  234. package/src/kernel/project/cli/dispatch.test.ts +288 -0
  235. package/src/kernel/project/cli/dispatch.ts +334 -0
  236. package/src/kernel/project/cli/exitCodes.test.ts +59 -0
  237. package/src/kernel/project/cli/exitCodes.ts +68 -0
  238. package/src/kernel/project/cli/globalFlags.test.ts +99 -0
  239. package/src/kernel/project/cli/globalFlags.ts +149 -0
  240. package/src/kernel/project/cli/helpFormat.ts +58 -0
  241. package/src/kernel/project/cli/index.ts +21 -0
  242. package/src/kernel/project/cli/interactionSeam.test.ts +99 -0
  243. package/src/kernel/project/cli/rootHelp.ts +218 -0
  244. package/src/kernel/project/cli/suggest.test.ts +54 -0
  245. package/src/kernel/project/cli/suggest.ts +67 -0
  246. package/src/kernel/project/cli/suggestNames.ts +122 -0
  247. package/src/kernel/project/cli/verbHelp.test.ts +138 -0
  248. package/src/kernel/project/cli/verbHelp.ts +144 -0
  249. package/src/kernel/project/mcp/buildServer.ts +70 -0
  250. package/src/kernel/project/mcp/envelope.ts +44 -0
  251. package/src/kernel/project/mcp/index.ts +8 -0
  252. package/src/kernel/project/mcp/instructions.ts +48 -0
  253. package/src/kernel/project/mcp/parity.test.ts +72 -0
  254. package/src/kernel/project/mcp/prompts/prompts.test.ts +96 -0
  255. package/src/kernel/project/mcp/prompts/provider.ts +74 -0
  256. package/src/kernel/project/mcp/prompts/source.ts +194 -0
  257. package/src/kernel/project/mcp/registerVerb.test.ts +238 -0
  258. package/src/kernel/project/mcp/registerVerb.ts +296 -0
  259. package/src/kernel/project/mcp/serve.ts +34 -0
  260. package/src/kernel/project/mcp/toolDescriptions.test.ts +80 -0
  261. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +127 -0
  262. package/src/kernel/render/compactUri.ts +25 -0
  263. package/src/kernel/render/contracts.ts +72 -0
  264. package/src/kernel/render/disclosure.ts +44 -0
  265. package/src/kernel/render/envelope.ts +50 -0
  266. package/src/kernel/render/formatters.ts +30 -0
  267. package/src/kernel/render/index.ts +30 -0
  268. package/src/kernel/render/prefixes.ts +21 -0
  269. package/src/kernel/render/renderers.test.ts +171 -0
  270. package/src/kernel/render/renderers.ts +429 -0
  271. package/src/kernel/render/writeStdout.test.ts +43 -0
  272. package/src/kernel/render/writeStdout.ts +49 -0
  273. package/src/kernel/runtime/boot.test.ts +69 -0
  274. package/src/kernel/runtime/boot.ts +59 -0
  275. package/src/kernel/runtime/facade.test.ts +125 -0
  276. package/src/kernel/runtime/facade.ts +47 -0
  277. package/src/kernel/runtime/graphpack/build.ts +148 -0
  278. package/src/kernel/runtime/graphpack/buildIndex.ts +229 -0
  279. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +8 -0
  280. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +4 -0
  281. package/src/kernel/runtime/graphpack/embedded/sample.ttl +39 -0
  282. package/src/kernel/runtime/graphpack/embedded.ts +70 -0
  283. package/src/kernel/runtime/graphpack/graphpack.test.ts +153 -0
  284. package/src/kernel/runtime/graphpack/hash.ts +46 -0
  285. package/src/kernel/runtime/graphpack/index.ts +21 -0
  286. package/src/kernel/runtime/graphpack/manifest.ts +55 -0
  287. package/src/kernel/runtime/graphpack/read.ts +102 -0
  288. package/src/kernel/runtime/graphpack/types.ts +111 -0
  289. package/src/kernel/runtime/index.ts +15 -0
  290. package/src/kernel/runtime/loadSession.ts +56 -0
  291. package/src/kernel/runtime/lock.ts +90 -0
  292. package/src/kernel/runtime/paths.ts +37 -0
  293. package/src/kernel/runtime/probe.test.ts +16 -0
  294. package/src/kernel/runtime/probe.ts +39 -0
  295. package/src/kernel/runtime/readEntity.ts +83 -0
  296. package/src/kernel/runtime/refs/gitOps.ts +88 -0
  297. package/src/kernel/runtime/refs/parseRef.test.ts +34 -0
  298. package/src/kernel/runtime/refs/parseRef.ts +103 -0
  299. package/src/kernel/runtime/refs/resolve.ts +320 -0
  300. package/src/kernel/runtime/resolveSources.test.ts +154 -0
  301. package/src/kernel/runtime/resolveSources.ts +66 -0
  302. package/src/kernel/runtime/store.test.ts +94 -0
  303. package/src/kernel/runtime/store.ts +90 -0
  304. package/src/kernel/runtime/storeless.test.ts +86 -0
  305. package/src/kernel/runtime/types.ts +210 -0
  306. package/src/kernel/runtime/wasmEmbed.test.ts +142 -0
  307. package/src/kernel/spec/asVerb.ts +23 -0
  308. package/src/kernel/spec/emitSurface.test.ts +65 -0
  309. package/src/kernel/spec/emitSurface.ts +223 -0
  310. package/src/kernel/spec/index.ts +34 -0
  311. package/src/kernel/spec/surfaceConformance.test.ts +94 -0
  312. package/src/kernel/spec/surfaceConformance.ts +135 -0
  313. package/src/kernel/spec/types.ts +233 -0
  314. package/src/kernel/spec/validate.test.ts +81 -0
  315. package/src/kernel/spec/validate.ts +125 -0
  316. package/src/testing/PARITY_GAPS.test.ts +32 -0
  317. package/src/testing/PARITY_GAPS.ts +179 -0
  318. package/src/testing/behavioral/README.md +164 -0
  319. package/src/testing/behavioral/agentSession.mcp.test.ts +160 -0
  320. package/src/testing/behavioral/autoLlm.e2e.test.ts +44 -0
  321. package/src/testing/behavioral/completion.test.ts +132 -0
  322. package/src/testing/behavioral/disclosure.test.ts +103 -0
  323. package/src/testing/behavioral/errorMatrix.mcp.test.ts +120 -0
  324. package/src/testing/behavioral/errorMatrix.storeless.test.ts +123 -0
  325. package/src/testing/behavioral/exitCodes.e2e.test.ts +53 -0
  326. package/src/testing/behavioral/firstRun.e2e.test.ts +40 -0
  327. package/src/testing/behavioral/harness.foundation.test.ts +136 -0
  328. package/src/testing/behavioral/journeys.cli.test.ts +129 -0
  329. package/src/testing/behavioral/liveReadSurface.ts +80 -0
  330. package/src/testing/behavioral/mcpServe.e2e.test.ts +21 -0
  331. package/src/testing/behavioral/mcpSurface.test.ts +139 -0
  332. package/src/testing/behavioral/parity.test.ts +224 -0
  333. package/src/testing/behavioral/rootCli.e2e.test.ts +62 -0
  334. package/src/testing/eval/__snapshots__/eval.test.ts.snap +201 -0
  335. package/src/testing/eval/cases/assembly.ts +195 -0
  336. package/src/testing/eval/cases/effectful.ts +245 -0
  337. package/src/testing/eval/cases/readNouns.ts +232 -0
  338. package/src/testing/eval/cases/stable.ts +163 -0
  339. package/src/testing/eval/eval.test.ts +74 -0
  340. package/src/testing/eval/harness.ts +91 -0
  341. package/src/testing/eval/report.ts +58 -0
  342. package/src/testing/fixtures/blockGraph.ts +112 -0
  343. package/src/testing/fixtures/completionFixture.ts +239 -0
  344. package/src/testing/fixtures/fixtureCapability.ts +175 -0
  345. package/src/testing/fixtures/graph/canonical.ts +184 -0
  346. package/src/testing/fixtures/packs/recipe.ts +78 -0
  347. package/src/testing/helpers/fixtureGraph.ts +148 -0
  348. package/src/testing/helpers/golden.ts +45 -0
  349. package/src/testing/helpers/packRuntime.ts +118 -0
  350. package/src/testing/helpers/parity.ts +86 -0
  351. package/src/testing/helpers/projectCli.ts +35 -0
  352. package/src/testing/helpers/projectMcp.ts +145 -0
  353. package/src/testing/helpers/runCli.ts +128 -0
  354. package/src/testing/perf/budgets.test.ts +164 -0
  355. package/src/testing/perf/budgets.ts +37 -0
  356. package/src/testing/perf/globalSetup.ts +30 -0
  357. package/src/testing/perf/measure.ts +97 -0
  358. package/src/testing/setupXdgIsolation.ts +13 -12
  359. package/src/types.ts +42 -0
  360. package/README.md +0 -458
  361. package/src/bin.test.ts +0 -54
  362. package/src/compile-validation.runner.ts +0 -137
  363. package/src/compile-validation.ts +0 -191
  364. package/src/completions/computeSocketPath.test.ts +0 -26
  365. package/src/completions/computeSocketPath.ts +0 -16
  366. package/src/completions/constants.ts +0 -25
  367. package/src/completions/handleQuery.test.ts +0 -125
  368. package/src/completions/handleQuery.ts +0 -49
  369. package/src/completions/index.ts +0 -14
  370. package/src/completions/queryCompletions.test.ts +0 -105
  371. package/src/completions/queryCompletions.ts +0 -75
  372. package/src/completions/querySocket.test.ts +0 -101
  373. package/src/completions/querySocket.ts +0 -71
  374. package/src/completions/startCompletionsServer.test.ts +0 -74
  375. package/src/completions/startCompletionsServer.ts +0 -75
  376. package/src/completions/startCompletionsServer.unit.test.ts +0 -131
  377. package/src/completions/waitForSocket.test.ts +0 -27
  378. package/src/completions/waitForSocket.ts +0 -27
  379. package/src/config/configExists.ts +0 -14
  380. package/src/config/defaultConfig.test.ts +0 -33
  381. package/src/config/defaultConfig.ts +0 -59
  382. package/src/config/defaults.json +0 -17
  383. package/src/config/findProjectConfigPath.test.ts +0 -53
  384. package/src/config/findProjectConfigPath.ts +0 -36
  385. package/src/config/index.ts +0 -21
  386. package/src/config/mergeConfigFileUpdate.ts +0 -58
  387. package/src/config/parseConfigValues.ts +0 -217
  388. package/src/config/readConfig.test.ts +0 -395
  389. package/src/config/readConfig.ts +0 -21
  390. package/src/config/readConfigLayers.test.ts +0 -109
  391. package/src/config/readConfigLayers.ts +0 -118
  392. package/src/config/resolveConfigPath.test.ts +0 -20
  393. package/src/config/resolveConfigPath.ts +0 -11
  394. package/src/config/resolveGlobalConfigPath.ts +0 -13
  395. package/src/config/resolveWriteConfigPath.test.ts +0 -53
  396. package/src/config/resolveWriteConfigPath.ts +0 -31
  397. package/src/config/types.ts +0 -128
  398. package/src/config/writeConfig.ts +0 -37
  399. package/src/domains/block/blockConfig.ts +0 -97
  400. package/src/domains/block/commands/index.ts +0 -5
  401. package/src/domains/block/commands/list.test.ts +0 -111
  402. package/src/domains/block/commands/list.ts +0 -11
  403. package/src/domains/block/commands/lookup.test.ts +0 -187
  404. package/src/domains/block/commands/lookup.ts +0 -14
  405. package/src/domains/block/commands/sample.ts +0 -56
  406. package/src/domains/block/formatters/index.ts +0 -5
  407. package/src/domains/block/formatters/list.test.ts +0 -107
  408. package/src/domains/block/formatters/list.ts +0 -50
  409. package/src/domains/block/formatters/lookup.test.ts +0 -318
  410. package/src/domains/block/formatters/lookup.ts +0 -149
  411. package/src/domains/block/formatters/sample.ts +0 -21
  412. package/src/domains/block/formatters/types.ts +0 -16
  413. package/src/domains/block/helpers/index.ts +0 -4
  414. package/src/domains/block/helpers/resolveAspects.test.ts +0 -64
  415. package/src/domains/block/helpers/resolveAspects.ts +0 -35
  416. package/src/domains/block/index.ts +0 -25
  417. package/src/domains/block/mcp/index.ts +0 -2
  418. package/src/domains/block/mcp/specs.ts +0 -67
  419. package/src/domains/block/operations/index.ts +0 -5
  420. package/src/domains/block/operations/list.test.ts +0 -80
  421. package/src/domains/block/operations/list.ts +0 -72
  422. package/src/domains/block/operations/lookup.test.ts +0 -129
  423. package/src/domains/block/operations/lookup.ts +0 -446
  424. package/src/domains/block/operations/sample.ts +0 -41
  425. package/src/domains/block/orchestration/blockEmptyError.test.ts +0 -26
  426. package/src/domains/block/orchestration/blockEmptyError.ts +0 -19
  427. package/src/domains/block/orchestration/buildBlockFilters.ts +0 -12
  428. package/src/domains/block/orchestration/enrichBlocks.ts +0 -44
  429. package/src/domains/block/orchestration/index.ts +0 -5
  430. package/src/domains/block/orchestration/resolveBlockList.ts +0 -39
  431. package/src/domains/block/orchestration/resolveBlockLookup.ts +0 -35
  432. package/src/domains/block/stories.test.ts +0 -28
  433. package/src/domains/block/stories.ts +0 -260
  434. package/src/domains/block/types.ts +0 -30
  435. package/src/domains/config/commands/channel.test.ts +0 -128
  436. package/src/domains/config/commands/channel.ts +0 -99
  437. package/src/domains/config/commands/configScope.ts +0 -46
  438. package/src/domains/config/commands/framework.test.ts +0 -119
  439. package/src/domains/config/commands/framework.ts +0 -103
  440. package/src/domains/config/commands/index.ts +0 -6
  441. package/src/domains/config/commands/show.test.ts +0 -61
  442. package/src/domains/config/commands/show.ts +0 -11
  443. package/src/domains/config/commands/tier.test.ts +0 -102
  444. package/src/domains/config/commands/tier.ts +0 -97
  445. package/src/domains/config/commands/trace.test.ts +0 -165
  446. package/src/domains/config/commands/trace.ts +0 -83
  447. package/src/domains/config/formatters/channel.test.ts +0 -70
  448. package/src/domains/config/formatters/channel.ts +0 -37
  449. package/src/domains/config/formatters/framework.ts +0 -37
  450. package/src/domains/config/formatters/index.ts +0 -6
  451. package/src/domains/config/formatters/show.test.ts +0 -153
  452. package/src/domains/config/formatters/show.ts +0 -89
  453. package/src/domains/config/formatters/tier.test.ts +0 -86
  454. package/src/domains/config/formatters/tier.ts +0 -48
  455. package/src/domains/config/formatters/trace.ts +0 -28
  456. package/src/domains/config/index.ts +0 -36
  457. package/src/domains/config/mcp/index.ts +0 -2
  458. package/src/domains/config/mcp/specs.ts +0 -100
  459. package/src/domains/config/operations/index.ts +0 -6
  460. package/src/domains/config/operations/show.test.ts +0 -78
  461. package/src/domains/config/operations/show.ts +0 -48
  462. package/src/domains/config/operations/types.ts +0 -20
  463. package/src/domains/config/operations/validateChannel.test.ts +0 -36
  464. package/src/domains/config/operations/validateChannel.ts +0 -24
  465. package/src/domains/config/operations/validateFramework.ts +0 -24
  466. package/src/domains/config/operations/validateTier.test.ts +0 -65
  467. package/src/domains/config/operations/validateTier.ts +0 -43
  468. package/src/domains/config/stories.ts +0 -42
  469. package/src/domains/config/tasks/index.ts +0 -6
  470. package/src/domains/config/tasks/setChannel.ts +0 -21
  471. package/src/domains/config/tasks/setFramework.ts +0 -21
  472. package/src/domains/config/tasks/setTier.ts +0 -20
  473. package/src/domains/config/tasks/setTrace.ts +0 -20
  474. package/src/domains/config/tasks/writeConfigField.ts +0 -41
  475. package/src/domains/create/generatorPack/bundled.ts +0 -49
  476. package/src/domains/create/generatorPack/compileGeneratorPack.test.ts +0 -159
  477. package/src/domains/create/generatorPack/compileGeneratorPack.ts +0 -312
  478. package/src/domains/create/index.ts +0 -21
  479. package/src/domains/create/mcp/index.ts +0 -2
  480. package/src/domains/create/mcp/specs.ts +0 -13
  481. package/src/domains/create/renderGeneratorUi.test.ts +0 -103
  482. package/src/domains/create/renderGeneratorUi.ts +0 -65
  483. package/src/domains/doctor/commands/doctor.test.ts +0 -75
  484. package/src/domains/doctor/commands/doctor.ts +0 -43
  485. package/src/domains/doctor/commands/index.ts +0 -2
  486. package/src/domains/doctor/formatters/doctor.test.ts +0 -165
  487. package/src/domains/doctor/formatters/doctor.ts +0 -136
  488. package/src/domains/doctor/formatters/index.ts +0 -2
  489. package/src/domains/doctor/index.ts +0 -9
  490. package/src/domains/doctor/mcp/index.ts +0 -2
  491. package/src/domains/doctor/mcp/specs.ts +0 -41
  492. package/src/domains/doctor/operations/checks/checkConfigFile.ts +0 -42
  493. package/src/domains/doctor/operations/checks/checkKeStore.ts +0 -38
  494. package/src/domains/doctor/operations/checks/checkMcpCommands.ts +0 -133
  495. package/src/domains/doctor/operations/checks/checkMcpConfigured.ts +0 -65
  496. package/src/domains/doctor/operations/checks/checkNodeVersion.ts +0 -25
  497. package/src/domains/doctor/operations/checks/checkPackageRefs.ts +0 -76
  498. package/src/domains/doctor/operations/checks/checkPragmaVersion.ts +0 -20
  499. package/src/domains/doctor/operations/checks/checkShellCompletions.ts +0 -42
  500. package/src/domains/doctor/operations/checks/checkSkillsSymlinked.ts +0 -64
  501. package/src/domains/doctor/operations/checks/index.ts +0 -10
  502. package/src/domains/doctor/operations/checks.test.ts +0 -307
  503. package/src/domains/doctor/operations/index.ts +0 -3
  504. package/src/domains/doctor/operations/runChecks.test.ts +0 -176
  505. package/src/domains/doctor/operations/runChecks.ts +0 -78
  506. package/src/domains/doctor/operations/types.ts +0 -42
  507. package/src/domains/graph/commands/index.ts +0 -4
  508. package/src/domains/graph/commands/inspect.test.ts +0 -94
  509. package/src/domains/graph/commands/inspect.ts +0 -63
  510. package/src/domains/graph/commands/query.test.ts +0 -94
  511. package/src/domains/graph/commands/query.ts +0 -60
  512. package/src/domains/graph/formatters/index.ts +0 -4
  513. package/src/domains/graph/formatters/inspect.ts +0 -50
  514. package/src/domains/graph/formatters/query.test.ts +0 -87
  515. package/src/domains/graph/formatters/query.ts +0 -74
  516. package/src/domains/graph/helpers/index.ts +0 -3
  517. package/src/domains/graph/helpers/resolveUri.test.ts +0 -50
  518. package/src/domains/graph/helpers/resolveUri.ts +0 -77
  519. package/src/domains/graph/index.ts +0 -22
  520. package/src/domains/graph/mcp/index.ts +0 -2
  521. package/src/domains/graph/mcp/specs.ts +0 -82
  522. package/src/domains/graph/operations/executeQuery.test.ts +0 -68
  523. package/src/domains/graph/operations/executeQuery.ts +0 -32
  524. package/src/domains/graph/operations/index.ts +0 -4
  525. package/src/domains/graph/operations/inspectUri.test.ts +0 -101
  526. package/src/domains/graph/operations/inspectUri.ts +0 -64
  527. package/src/domains/graphql/commands/build.test.ts +0 -196
  528. package/src/domains/graphql/commands/build.ts +0 -117
  529. package/src/domains/graphql/commands/check.test.ts +0 -141
  530. package/src/domains/graphql/commands/check.ts +0 -81
  531. package/src/domains/graphql/commands/index.ts +0 -5
  532. package/src/domains/graphql/commands/serve.test.ts +0 -46
  533. package/src/domains/graphql/commands/serve.ts +0 -141
  534. package/src/domains/graphql/constants.ts +0 -10
  535. package/src/domains/graphql/formatters/index.ts +0 -3
  536. package/src/domains/graphql/formatters/report.ts +0 -78
  537. package/src/domains/graphql/helpers/gatherSources.test.ts +0 -92
  538. package/src/domains/graphql/helpers/gatherSources.ts +0 -58
  539. package/src/domains/graphql/helpers/index.ts +0 -6
  540. package/src/domains/graphql/helpers/parsePrefixes.test.ts +0 -44
  541. package/src/domains/graphql/helpers/parsePrefixes.ts +0 -38
  542. package/src/domains/graphql/helpers/resolveSourceFiles.test.ts +0 -65
  543. package/src/domains/graphql/helpers/resolveSourceFiles.ts +0 -66
  544. package/src/domains/graphql/helpers/routeGraphql.test.ts +0 -43
  545. package/src/domains/graphql/helpers/routeGraphql.ts +0 -28
  546. package/src/domains/graphql/index.ts +0 -24
  547. package/src/domains/graphql/operations/compileSchema.test.ts +0 -95
  548. package/src/domains/graphql/operations/compileSchema.ts +0 -107
  549. package/src/domains/graphql/operations/createSchemaServer.test.ts +0 -50
  550. package/src/domains/graphql/operations/createSchemaServer.ts +0 -75
  551. package/src/domains/graphql/operations/ensureSchemaArtifact.test.ts +0 -167
  552. package/src/domains/graphql/operations/ensureSchemaArtifact.ts +0 -178
  553. package/src/domains/graphql/operations/index.ts +0 -17
  554. package/src/domains/graphql/types.ts +0 -29
  555. package/src/domains/info/commands/index.ts +0 -4
  556. package/src/domains/info/commands/info.test.ts +0 -88
  557. package/src/domains/info/commands/info.ts +0 -47
  558. package/src/domains/info/commands/upgrade.test.ts +0 -183
  559. package/src/domains/info/commands/upgrade.ts +0 -153
  560. package/src/domains/info/constants.test.ts +0 -22
  561. package/src/domains/info/constants.ts +0 -15
  562. package/src/domains/info/formatters/index.ts +0 -8
  563. package/src/domains/info/formatters/info.test.ts +0 -207
  564. package/src/domains/info/formatters/info.ts +0 -131
  565. package/src/domains/info/formatters/upgrade.test.ts +0 -136
  566. package/src/domains/info/formatters/upgrade.ts +0 -70
  567. package/src/domains/info/index.ts +0 -9
  568. package/src/domains/info/mcp/index.ts +0 -2
  569. package/src/domains/info/mcp/specs.ts +0 -65
  570. package/src/domains/info/operations/checkRegistryVersion.test.ts +0 -124
  571. package/src/domains/info/operations/checkRegistryVersion.ts +0 -45
  572. package/src/domains/info/operations/collectEntityCounts.test.ts +0 -156
  573. package/src/domains/info/operations/collectEntityCounts.ts +0 -123
  574. package/src/domains/info/operations/collectInfo.test.ts +0 -122
  575. package/src/domains/info/operations/collectInfo.ts +0 -94
  576. package/src/domains/info/operations/collectStoreSummary.test.ts +0 -61
  577. package/src/domains/info/operations/collectStoreSummary.ts +0 -42
  578. package/src/domains/info/operations/index.ts +0 -6
  579. package/src/domains/info/types.test-d.ts +0 -35
  580. package/src/domains/info/types.ts +0 -67
  581. package/src/domains/llm/capabilities.test.ts +0 -111
  582. package/src/domains/llm/commands/capabilities.ts +0 -37
  583. package/src/domains/llm/commands/index.ts +0 -4
  584. package/src/domains/llm/commands/llm.ts +0 -41
  585. package/src/domains/llm/data/commandReference.ts +0 -106
  586. package/src/domains/llm/data/decisionTrees.ts +0 -55
  587. package/src/domains/llm/data/index.ts +0 -6
  588. package/src/domains/llm/data/toolCatalog.ts +0 -221
  589. package/src/domains/llm/formatters/capabilities.ts +0 -50
  590. package/src/domains/llm/formatters/index.ts +0 -4
  591. package/src/domains/llm/formatters/orientation.ts +0 -57
  592. package/src/domains/llm/index.ts +0 -9
  593. package/src/domains/llm/llmCommand.test.ts +0 -101
  594. package/src/domains/llm/mcp/index.ts +0 -2
  595. package/src/domains/llm/mcp/specs.ts +0 -93
  596. package/src/domains/llm/operations/collectContext.test.ts +0 -64
  597. package/src/domains/llm/operations/collectContext.ts +0 -37
  598. package/src/domains/llm/operations/index.ts +0 -3
  599. package/src/domains/llm/types.ts +0 -72
  600. package/src/domains/modifier/commands/index.ts +0 -5
  601. package/src/domains/modifier/commands/list.test.ts +0 -57
  602. package/src/domains/modifier/commands/list.ts +0 -9
  603. package/src/domains/modifier/commands/lookup.test.ts +0 -91
  604. package/src/domains/modifier/commands/lookup.ts +0 -14
  605. package/src/domains/modifier/commands/sample.ts +0 -54
  606. package/src/domains/modifier/formatters/index.ts +0 -8
  607. package/src/domains/modifier/formatters/list.test.ts +0 -38
  608. package/src/domains/modifier/formatters/list.ts +0 -22
  609. package/src/domains/modifier/formatters/lookup.test.ts +0 -33
  610. package/src/domains/modifier/formatters/lookup.ts +0 -50
  611. package/src/domains/modifier/formatters/sample.ts +0 -15
  612. package/src/domains/modifier/index.ts +0 -27
  613. package/src/domains/modifier/mcp/index.ts +0 -2
  614. package/src/domains/modifier/mcp/specs.ts +0 -65
  615. package/src/domains/modifier/modifierConfig.ts +0 -36
  616. package/src/domains/modifier/operations/index.ts +0 -5
  617. package/src/domains/modifier/operations/list.test.ts +0 -39
  618. package/src/domains/modifier/operations/list.ts +0 -41
  619. package/src/domains/modifier/operations/lookup.test.ts +0 -37
  620. package/src/domains/modifier/operations/lookup.ts +0 -69
  621. package/src/domains/modifier/operations/sample.ts +0 -32
  622. package/src/domains/modifier/orchestration/index.ts +0 -3
  623. package/src/domains/modifier/orchestration/modifierEmptyError.test.ts +0 -26
  624. package/src/domains/modifier/orchestration/modifierEmptyError.ts +0 -15
  625. package/src/domains/modifier/orchestration/resolveModifierList.ts +0 -16
  626. package/src/domains/modifier/orchestration/resolveModifierLookup.ts +0 -33
  627. package/src/domains/modifier/stories.test.ts +0 -20
  628. package/src/domains/modifier/stories.ts +0 -86
  629. package/src/domains/modifier/types.ts +0 -5
  630. package/src/domains/ontology/commands/index.ts +0 -4
  631. package/src/domains/ontology/commands/list.test.ts +0 -84
  632. package/src/domains/ontology/commands/list.ts +0 -11
  633. package/src/domains/ontology/commands/show.test.ts +0 -179
  634. package/src/domains/ontology/commands/show.ts +0 -14
  635. package/src/domains/ontology/formatters/index.ts +0 -5
  636. package/src/domains/ontology/formatters/list.ts +0 -64
  637. package/src/domains/ontology/formatters/show.ts +0 -396
  638. package/src/domains/ontology/helpers/buildClassTree.ts +0 -89
  639. package/src/domains/ontology/helpers/completeClassNames.ts +0 -43
  640. package/src/domains/ontology/helpers/expandOntologyIris.ts +0 -79
  641. package/src/domains/ontology/helpers/findNamespace.ts +0 -23
  642. package/src/domains/ontology/helpers/index.ts +0 -21
  643. package/src/domains/ontology/helpers/queryClasses.ts +0 -66
  644. package/src/domains/ontology/helpers/queryProperties.ts +0 -90
  645. package/src/domains/ontology/helpers/queryTboxFacts.ts +0 -160
  646. package/src/domains/ontology/helpers/resolvePrefix.ts +0 -45
  647. package/src/domains/ontology/index.ts +0 -26
  648. package/src/domains/ontology/mcp/index.ts +0 -2
  649. package/src/domains/ontology/mcp/specs.ts +0 -16
  650. package/src/domains/ontology/operations/index.ts +0 -5
  651. package/src/domains/ontology/operations/listOntologies.test.ts +0 -122
  652. package/src/domains/ontology/operations/listOntologies.ts +0 -197
  653. package/src/domains/ontology/operations/showOntology.test.ts +0 -184
  654. package/src/domains/ontology/operations/showOntology.ts +0 -323
  655. package/src/domains/ontology/operations/showOntologyRaw.test.ts +0 -41
  656. package/src/domains/ontology/operations/showOntologyRaw.ts +0 -50
  657. package/src/domains/ontology/stories.test.ts +0 -36
  658. package/src/domains/ontology/stories.ts +0 -153
  659. package/src/domains/refs/commands/updateRefs.ts +0 -52
  660. package/src/domains/refs/formatters/updateRefs.ts +0 -27
  661. package/src/domains/refs/index.ts +0 -27
  662. package/src/domains/refs/operations/gitOps.test.ts +0 -155
  663. package/src/domains/refs/operations/gitOps.ts +0 -92
  664. package/src/domains/refs/operations/index.ts +0 -10
  665. package/src/domains/refs/operations/parseRef.test.ts +0 -157
  666. package/src/domains/refs/operations/parseRef.ts +0 -114
  667. package/src/domains/refs/operations/paths.test.ts +0 -98
  668. package/src/domains/refs/operations/paths.ts +0 -91
  669. package/src/domains/refs/operations/readGlobalRefs.test.ts +0 -63
  670. package/src/domains/refs/operations/readGlobalRefs.ts +0 -37
  671. package/src/domains/refs/operations/updateRefs.test.ts +0 -167
  672. package/src/domains/refs/operations/updateRefs.ts +0 -180
  673. package/src/domains/setup/commands/all.ts +0 -58
  674. package/src/domains/setup/commands/completions.ts +0 -85
  675. package/src/domains/setup/commands/entrypoints.test.ts +0 -170
  676. package/src/domains/setup/commands/index.ts +0 -7
  677. package/src/domains/setup/commands/lsp.ts +0 -49
  678. package/src/domains/setup/commands/mcp.ts +0 -119
  679. package/src/domains/setup/commands/setup.ts +0 -70
  680. package/src/domains/setup/commands/skills.test.ts +0 -68
  681. package/src/domains/setup/commands/skills.ts +0 -110
  682. package/src/domains/setup/formatters/index.ts +0 -2
  683. package/src/domains/setup/formatters/skills.test.ts +0 -103
  684. package/src/domains/setup/formatters/skills.ts +0 -112
  685. package/src/domains/setup/formatters/types.ts +0 -7
  686. package/src/domains/setup/helpers/completionScripts.test.ts +0 -58
  687. package/src/domains/setup/helpers/completionScripts.ts +0 -92
  688. package/src/domains/setup/helpers/constants.ts +0 -2
  689. package/src/domains/setup/helpers/detectShell.test.ts +0 -48
  690. package/src/domains/setup/helpers/detectShell.ts +0 -20
  691. package/src/domains/setup/helpers/index.ts +0 -12
  692. package/src/domains/setup/helpers/runSetupTask.test.ts +0 -277
  693. package/src/domains/setup/helpers/runSetupTask.ts +0 -221
  694. package/src/domains/setup/index.ts +0 -37
  695. package/src/domains/setup/operations/index.ts +0 -6
  696. package/src/domains/setup/operations/setupAll.test.ts +0 -48
  697. package/src/domains/setup/operations/setupAll.ts +0 -41
  698. package/src/domains/setup/operations/setupCompletions.test.ts +0 -94
  699. package/src/domains/setup/operations/setupCompletions.ts +0 -54
  700. package/src/domains/setup/operations/setupLsp.test.ts +0 -30
  701. package/src/domains/setup/operations/setupLsp.ts +0 -22
  702. package/src/domains/setup/operations/setupMcp.test.ts +0 -120
  703. package/src/domains/setup/operations/setupMcp.ts +0 -108
  704. package/src/domains/setup/operations/setupSkills.test.ts +0 -191
  705. package/src/domains/setup/operations/setupSkills.ts +0 -160
  706. package/src/domains/setup/types.ts +0 -18
  707. package/src/domains/shared/ToolSpec.ts +0 -49
  708. package/src/domains/shared/bootStore.bareCore.test.ts +0 -63
  709. package/src/domains/shared/bootStore.test.ts +0 -82
  710. package/src/domains/shared/bootStore.ts +0 -171
  711. package/src/domains/shared/buildQuery.ts +0 -18
  712. package/src/domains/shared/compactUri.test.ts +0 -32
  713. package/src/domains/shared/compactUri.ts +0 -21
  714. package/src/domains/shared/context.ts +0 -16
  715. package/src/domains/shared/contracts.ts +0 -164
  716. package/src/domains/shared/createInteractivePromptSession.test.ts +0 -439
  717. package/src/domains/shared/createInteractivePromptSession.ts +0 -236
  718. package/src/domains/shared/emptyErrorRecovery.test.ts +0 -106
  719. package/src/domains/shared/extractLocalName.test.ts +0 -21
  720. package/src/domains/shared/extractLocalName.ts +0 -14
  721. package/src/domains/shared/filters/buildChannelFilter.test.ts +0 -52
  722. package/src/domains/shared/filters/buildChannelFilter.ts +0 -41
  723. package/src/domains/shared/filters/buildFilterConfig.ts +0 -15
  724. package/src/domains/shared/filters/buildFilters.test.ts +0 -33
  725. package/src/domains/shared/filters/buildFilters.ts +0 -30
  726. package/src/domains/shared/filters/buildTierFilter.test.ts +0 -78
  727. package/src/domains/shared/filters/buildTierFilter.ts +0 -69
  728. package/src/domains/shared/filters/describeFilters.ts +0 -14
  729. package/src/domains/shared/filters/index.ts +0 -10
  730. package/src/domains/shared/formatters.ts +0 -103
  731. package/src/domains/shared/listTiers.ts +0 -40
  732. package/src/domains/shared/loaders/bundledLoader.test.ts +0 -248
  733. package/src/domains/shared/loaders/bundledLoader.ts +0 -254
  734. package/src/domains/shared/loaders/gitLoader.ts +0 -30
  735. package/src/domains/shared/loaders/index.ts +0 -9
  736. package/src/domains/shared/loaders/localLoader.ts +0 -71
  737. package/src/domains/shared/loaders/readPackageDir.test.ts +0 -58
  738. package/src/domains/shared/loaders/readPackageDir.ts +0 -185
  739. package/src/domains/shared/loaders/storyAssetsPlugin.test.ts +0 -84
  740. package/src/domains/shared/loaders/storyAssetsPlugin.ts +0 -46
  741. package/src/domains/shared/lookupMany.test.ts +0 -135
  742. package/src/domains/shared/lookupMany.ts +0 -101
  743. package/src/domains/shared/mergeAndParseRefs.test.ts +0 -89
  744. package/src/domains/shared/mergeAndParseRefs.ts +0 -44
  745. package/src/domains/shared/namespaces.ts +0 -26
  746. package/src/domains/shared/packages.ts +0 -20
  747. package/src/domains/shared/parseSampleCount.test.ts +0 -47
  748. package/src/domains/shared/parseSampleCount.ts +0 -45
  749. package/src/domains/shared/pickRandom.ts +0 -22
  750. package/src/domains/shared/prefixes.test.ts +0 -211
  751. package/src/domains/shared/prefixes.ts +0 -204
  752. package/src/domains/shared/renderers.ts +0 -410
  753. package/src/domains/shared/resolveConfiguredGraphs.test.ts +0 -27
  754. package/src/domains/shared/resolveConfiguredGraphs.ts +0 -41
  755. package/src/domains/shared/resolveLookupExitCode.test.ts +0 -48
  756. package/src/domains/shared/resolveLookupExitCode.ts +0 -42
  757. package/src/domains/shared/runtime.ts +0 -61
  758. package/src/domains/shared/sampleFormatters.ts +0 -47
  759. package/src/domains/shared/semanticPackage.test.ts +0 -89
  760. package/src/domains/shared/semanticPackage.ts +0 -127
  761. package/src/domains/shared/stories/compileLookupCommand.test.ts +0 -145
  762. package/src/domains/shared/stories/compileLookupCommand.ts +0 -102
  763. package/src/domains/shared/stories/compileLookupTool.test.ts +0 -105
  764. package/src/domains/shared/stories/compileLookupTool.ts +0 -96
  765. package/src/domains/shared/stories/compileReadCommand.test.ts +0 -121
  766. package/src/domains/shared/stories/compileReadCommand.ts +0 -48
  767. package/src/domains/shared/stories/compileReadTool.test.ts +0 -64
  768. package/src/domains/shared/stories/compileReadTool.ts +0 -38
  769. package/src/domains/shared/stories/condense.test.ts +0 -18
  770. package/src/domains/shared/stories/condense.ts +0 -15
  771. package/src/domains/shared/stories/index.ts +0 -20
  772. package/src/domains/shared/stories/normalizeNames.test.ts +0 -20
  773. package/src/domains/shared/stories/normalizeNames.ts +0 -22
  774. package/src/domains/shared/stories/pack/applyPackFilters.test.ts +0 -151
  775. package/src/domains/shared/stories/pack/applyPackFilters.ts +0 -111
  776. package/src/domains/shared/stories/pack/applyPackSearch.test.ts +0 -57
  777. package/src/domains/shared/stories/pack/applyPackSearch.ts +0 -41
  778. package/src/domains/shared/stories/pack/buildLookupQuery.test.ts +0 -81
  779. package/src/domains/shared/stories/pack/buildLookupQuery.ts +0 -154
  780. package/src/domains/shared/stories/pack/bundled/index.ts +0 -23
  781. package/src/domains/shared/stories/pack/bundled/standardPack.ts +0 -164
  782. package/src/domains/shared/stories/pack/bundled/tierPack.ts +0 -50
  783. package/src/domains/shared/stories/pack/collectPackStories.test.ts +0 -406
  784. package/src/domains/shared/stories/pack/collectPackStories.ts +0 -158
  785. package/src/domains/shared/stories/pack/compilePackCommands.ts +0 -50
  786. package/src/domains/shared/stories/pack/compilePackStories.test.ts +0 -751
  787. package/src/domains/shared/stories/pack/compilePackStories.ts +0 -724
  788. package/src/domains/shared/stories/pack/compilePackToolSpecs.ts +0 -55
  789. package/src/domains/shared/stories/pack/index.ts +0 -42
  790. package/src/domains/shared/stories/pack/reservedVerbs.test.ts +0 -213
  791. package/src/domains/shared/stories/pack/reservedVerbs.ts +0 -170
  792. package/src/domains/shared/stories/pack/runSelectQuery.ts +0 -31
  793. package/src/domains/shared/stories/pack/standardParity.test.ts +0 -381
  794. package/src/domains/shared/stories/pack/types.ts +0 -224
  795. package/src/domains/shared/stories/pack/validateStoryPackDefinition.test.ts +0 -742
  796. package/src/domains/shared/stories/pack/validateStoryPackDefinition.ts +0 -859
  797. package/src/domains/shared/stories/projectCliParameters.test.ts +0 -59
  798. package/src/domains/shared/stories/projectCliParameters.ts +0 -57
  799. package/src/domains/shared/stories/projectToolParams.test.ts +0 -50
  800. package/src/domains/shared/stories/projectToolParams.ts +0 -32
  801. package/src/domains/shared/stories/requirePragmaContext.test.ts +0 -23
  802. package/src/domains/shared/stories/requirePragmaContext.ts +0 -23
  803. package/src/domains/shared/stories/resolveLookupDetailed.test.ts +0 -57
  804. package/src/domains/shared/stories/resolveLookupDetailed.ts +0 -27
  805. package/src/domains/shared/stories/types.ts +0 -179
  806. package/src/domains/shared/suggestions/detectCrossDomain.test.ts +0 -43
  807. package/src/domains/shared/suggestions/detectCrossDomain.ts +0 -116
  808. package/src/domains/shared/suggestions/expandGlob.test.ts +0 -92
  809. package/src/domains/shared/suggestions/expandGlob.ts +0 -52
  810. package/src/domains/shared/suggestions/expandLookupQueries.ts +0 -57
  811. package/src/domains/shared/suggestions/index.ts +0 -7
  812. package/src/domains/shared/suggestions/listDomainNames.ts +0 -61
  813. package/src/domains/shared/suggestions/suggestNames.test.ts +0 -70
  814. package/src/domains/shared/suggestions/suggestNames.ts +0 -130
  815. package/src/domains/shared/types/block.ts +0 -107
  816. package/src/domains/shared/types/common.ts +0 -33
  817. package/src/domains/shared/types/graph.ts +0 -17
  818. package/src/domains/shared/types/index.ts +0 -46
  819. package/src/domains/shared/types/modifier.ts +0 -22
  820. package/src/domains/shared/types/ontology.ts +0 -145
  821. package/src/domains/shared/types/runtime.ts +0 -24
  822. package/src/domains/shared/types/sample.ts +0 -17
  823. package/src/domains/shared/types/standard.ts +0 -21
  824. package/src/domains/shared/types/tier.ts +0 -15
  825. package/src/domains/shared/types/token.ts +0 -30
  826. package/src/domains/skill/commands/index.ts +0 -4
  827. package/src/domains/skill/commands/list.test.ts +0 -115
  828. package/src/domains/skill/commands/list.ts +0 -11
  829. package/src/domains/skill/commands/lookup.test.ts +0 -118
  830. package/src/domains/skill/commands/lookup.ts +0 -14
  831. package/src/domains/skill/formatters/index.ts +0 -3
  832. package/src/domains/skill/formatters/list.test.ts +0 -140
  833. package/src/domains/skill/formatters/list.ts +0 -119
  834. package/src/domains/skill/formatters/lookup.test.ts +0 -46
  835. package/src/domains/skill/formatters/lookup.ts +0 -57
  836. package/src/domains/skill/formatters/types.ts +0 -8
  837. package/src/domains/skill/helpers/index.ts +0 -6
  838. package/src/domains/skill/helpers/parseFrontmatter.test.ts +0 -122
  839. package/src/domains/skill/helpers/parseFrontmatter.ts +0 -112
  840. package/src/domains/skill/helpers/resolveSkillSources.ts +0 -70
  841. package/src/domains/skill/index.ts +0 -23
  842. package/src/domains/skill/mcp/index.ts +0 -2
  843. package/src/domains/skill/mcp/specs.ts +0 -19
  844. package/src/domains/skill/operations/discover.test.ts +0 -176
  845. package/src/domains/skill/operations/discover.ts +0 -59
  846. package/src/domains/skill/operations/index.ts +0 -5
  847. package/src/domains/skill/operations/list.test.ts +0 -76
  848. package/src/domains/skill/operations/list.ts +0 -47
  849. package/src/domains/skill/operations/lookup.test.ts +0 -91
  850. package/src/domains/skill/operations/lookup.ts +0 -70
  851. package/src/domains/skill/stories.test.ts +0 -43
  852. package/src/domains/skill/stories.ts +0 -103
  853. package/src/domains/skill/types.ts +0 -33
  854. package/src/domains/token/commands/add-config.test.ts +0 -68
  855. package/src/domains/token/commands/add-config.ts +0 -62
  856. package/src/domains/token/commands/index.ts +0 -6
  857. package/src/domains/token/commands/list.test.ts +0 -82
  858. package/src/domains/token/commands/list.ts +0 -54
  859. package/src/domains/token/commands/lookup.test.ts +0 -133
  860. package/src/domains/token/commands/lookup.ts +0 -107
  861. package/src/domains/token/commands/sample.ts +0 -54
  862. package/src/domains/token/featureFlag.ts +0 -17
  863. package/src/domains/token/formatters/index.ts +0 -8
  864. package/src/domains/token/formatters/list.test.ts +0 -37
  865. package/src/domains/token/formatters/list.ts +0 -24
  866. package/src/domains/token/formatters/lookup.test.ts +0 -61
  867. package/src/domains/token/formatters/lookup.ts +0 -107
  868. package/src/domains/token/formatters/sample.ts +0 -16
  869. package/src/domains/token/index.ts +0 -45
  870. package/src/domains/token/mcp/index.ts +0 -2
  871. package/src/domains/token/mcp/specs.ts +0 -207
  872. package/src/domains/token/operations/add-config.test.ts +0 -68
  873. package/src/domains/token/operations/add-config.ts +0 -61
  874. package/src/domains/token/operations/index.ts +0 -8
  875. package/src/domains/token/operations/list.test.ts +0 -50
  876. package/src/domains/token/operations/list.ts +0 -52
  877. package/src/domains/token/operations/lookup.test.ts +0 -42
  878. package/src/domains/token/operations/lookup.ts +0 -75
  879. package/src/domains/token/operations/sample.ts +0 -32
  880. package/src/domains/token/orchestration/index.ts +0 -3
  881. package/src/domains/token/orchestration/resolveTokenList.ts +0 -17
  882. package/src/domains/token/orchestration/resolveTokenLookup.ts +0 -33
  883. package/src/domains/token/orchestration/tokenEmptyError.test.ts +0 -33
  884. package/src/domains/token/orchestration/tokenEmptyError.ts +0 -20
  885. package/src/domains/token/tokenConfig.ts +0 -38
  886. package/src/domains/token/types.ts +0 -6
  887. package/src/domains/trace/commands/clear.ts +0 -71
  888. package/src/domains/trace/commands/index.ts +0 -5
  889. package/src/domains/trace/commands/resolveTraceLimit.test.ts +0 -31
  890. package/src/domains/trace/commands/sessions.ts +0 -32
  891. package/src/domains/trace/commands/show.ts +0 -171
  892. package/src/domains/trace/formatters/index.ts +0 -9
  893. package/src/domains/trace/formatters/sessions.ts +0 -80
  894. package/src/domains/trace/formatters/show.ts +0 -122
  895. package/src/domains/trace/index.ts +0 -17
  896. package/src/domains/trace/operations/index.ts +0 -8
  897. package/src/domains/trace/operations/listSessions.test.ts +0 -55
  898. package/src/domains/trace/operations/listSessions.ts +0 -52
  899. package/src/domains/trace/operations/readTraceLog.test.ts +0 -100
  900. package/src/domains/trace/operations/readTraceLog.ts +0 -104
  901. package/src/domains/trace/tracePlugin.test.ts +0 -171
  902. package/src/domains/trace/tracePlugin.ts +0 -159
  903. package/src/domains/trace/types.ts +0 -65
  904. package/src/embedWasm.ts +0 -42
  905. package/src/error/PragmaError.test.ts +0 -121
  906. package/src/error/PragmaError.ts +0 -177
  907. package/src/error/constants.ts +0 -12
  908. package/src/error/index.ts +0 -4
  909. package/src/error/types.ts +0 -55
  910. package/src/mcp/createMcpServer.test.ts +0 -41
  911. package/src/mcp/createMcpServer.ts +0 -53
  912. package/src/mcp/error/buildRecovery.test.ts +0 -37
  913. package/src/mcp/error/buildRecovery.ts +0 -17
  914. package/src/mcp/error/index.ts +0 -12
  915. package/src/mcp/error/serializeError.test.ts +0 -121
  916. package/src/mcp/error/serializeError.ts +0 -31
  917. package/src/mcp/error/serializeErrorPayload.test.ts +0 -38
  918. package/src/mcp/error/serializeErrorPayload.ts +0 -34
  919. package/src/mcp/error/types.ts +0 -59
  920. package/src/mcp/index.ts +0 -15
  921. package/src/mcp/registerResources.test.ts +0 -566
  922. package/src/mcp/registerResources.ts +0 -9
  923. package/src/mcp/resources/buildGraphIndex.ts +0 -167
  924. package/src/mcp/resources/buildResourceList.test.ts +0 -97
  925. package/src/mcp/resources/buildResourceList.ts +0 -176
  926. package/src/mcp/resources/classifyEntity.test.ts +0 -40
  927. package/src/mcp/resources/classifyEntity.ts +0 -27
  928. package/src/mcp/resources/constants.ts +0 -105
  929. package/src/mcp/resources/displayPredicates.ts +0 -62
  930. package/src/mcp/resources/pickFirstValue.test.ts +0 -29
  931. package/src/mcp/resources/pickFirstValue.ts +0 -26
  932. package/src/mcp/resources/pickPrimaryType.test.ts +0 -41
  933. package/src/mcp/resources/pickPrimaryType.ts +0 -26
  934. package/src/mcp/resources/rankUriCompletions.test.ts +0 -52
  935. package/src/mcp/resources/rankUriCompletions.ts +0 -64
  936. package/src/mcp/resources/readEntity.ts +0 -169
  937. package/src/mcp/resources/registerResources.ts +0 -126
  938. package/src/mcp/resources/types.ts +0 -128
  939. package/src/mcp/runMcpServer.test.ts +0 -66
  940. package/src/mcp/runMcpServer.ts +0 -24
  941. package/src/mcp/tools/index.ts +0 -74
  942. package/src/mcp/tools/registerFromSpec.ts +0 -97
  943. package/src/mcp/tools/registerTools.test.ts +0 -1277
  944. package/src/mcp/types.ts +0 -66
  945. package/src/mcp/utils/estimateTokens.test.ts +0 -14
  946. package/src/mcp/utils/estimateTokens.ts +0 -9
  947. package/src/mcp/utils/index.ts +0 -11
  948. package/src/mcp/utils/wrapTool.test.ts +0 -109
  949. package/src/mcp/utils/wrapTool.ts +0 -81
  950. package/src/package-manager/constants.ts +0 -29
  951. package/src/package-manager/detectInstallSource.test.ts +0 -23
  952. package/src/package-manager/detectInstallSource.ts +0 -111
  953. package/src/package-manager/detectLocalInstall.test.ts +0 -16
  954. package/src/package-manager/detectLocalInstall.ts +0 -43
  955. package/src/package-manager/detectPackageManager.test.ts +0 -81
  956. package/src/package-manager/detectPackageManager.ts +0 -30
  957. package/src/package-manager/index.ts +0 -6
  958. package/src/package-manager/types.ts +0 -10
  959. package/src/pipeline/collectCommands.test.ts +0 -187
  960. package/src/pipeline/collectCommands.ts +0 -75
  961. package/src/pipeline/constants.ts +0 -14
  962. package/src/pipeline/createProgram.test.ts +0 -116
  963. package/src/pipeline/createProgram.ts +0 -89
  964. package/src/pipeline/firstRun.test.ts +0 -80
  965. package/src/pipeline/firstRun.ts +0 -99
  966. package/src/pipeline/formatTerminal.test.ts +0 -43
  967. package/src/pipeline/formatTerminal.ts +0 -53
  968. package/src/pipeline/index.ts +0 -22
  969. package/src/pipeline/mapExitCode.test.ts +0 -41
  970. package/src/pipeline/mapExitCode.ts +0 -12
  971. package/src/pipeline/parseGlobalFlags.test.ts +0 -193
  972. package/src/pipeline/parseGlobalFlags.ts +0 -135
  973. package/src/pipeline/renderError.test.ts +0 -151
  974. package/src/pipeline/renderError.ts +0 -129
  975. package/src/pipeline/resolveCommandKind.test.ts +0 -80
  976. package/src/pipeline/resolveCommandKind.ts +0 -82
  977. package/src/pipeline/rootHelp.test.ts +0 -87
  978. package/src/pipeline/rootHelp.ts +0 -265
  979. package/src/pipeline/runCli.orchestration.test.ts +0 -435
  980. package/src/pipeline/runCli.test.ts +0 -83
  981. package/src/pipeline/runCli.ts +0 -411
  982. package/src/pipeline/types.ts +0 -17
  983. package/src/testing/cli.ts +0 -71
  984. package/src/testing/createTestMcpClient.ts +0 -68
  985. package/src/testing/dsFixtures.ts +0 -523
  986. package/src/testing/fixtures/canonical-config.json +0 -4
  987. package/src/testing/fixtures/canonical.ttl +0 -437
  988. package/src/testing/fixtures/filtered-config.json +0 -4
  989. package/src/testing/fixtures.ts +0 -34
  990. package/src/testing/graphqlFixtures.ts +0 -72
  991. package/src/testing/helpers/assertParity.ts +0 -28
  992. package/src/testing/helpers/createTestMcpClient.ts +0 -40
  993. package/src/testing/helpers/createTestRuntime.ts +0 -67
  994. package/src/testing/index.ts +0 -22
  995. package/src/testing/integration/__snapshots__/executor-golden.test.ts.snap +0 -1207
  996. package/src/testing/integration/agent-session.test.ts +0 -148
  997. package/src/testing/integration/boot.test.ts +0 -105
  998. package/src/testing/integration/cli-user-stories.test.ts +0 -261
  999. package/src/testing/integration/cross-binary-byte-equality.test.ts +0 -129
  1000. package/src/testing/integration/edge-cases.test.ts +0 -275
  1001. package/src/testing/integration/executor-execution.test.ts +0 -103
  1002. package/src/testing/integration/executor-golden.test.ts +0 -145
  1003. package/src/testing/integration/mcp-surface.test.ts +0 -605
  1004. package/src/testing/integration/parity.test.ts +0 -596
  1005. package/src/testing/regression/0001-skill-discovery-granularity.test.ts +0 -71
  1006. package/src/testing/standardParityFixtures.ts +0 -35
  1007. package/src/testing/store.ts +0 -39
  1008. package/src/testing/storyFixtures.ts +0 -63
  1009. package/src/testing/types.ts +0 -20
  1010. package/src/tui/components/BulletList/BulletList.tsx +0 -46
  1011. package/src/tui/components/BulletList/index.ts +0 -2
  1012. package/src/tui/components/BulletList/types.ts +0 -6
  1013. package/src/tui/components/Card/Card.tsx +0 -73
  1014. package/src/tui/components/Card/index.ts +0 -1
  1015. package/src/tui/components/Card/types.ts +0 -12
  1016. package/src/tui/components/CodeBlock/CodeBlock.tsx +0 -37
  1017. package/src/tui/components/CodeBlock/index.ts +0 -2
  1018. package/src/tui/components/CodeBlock/types.ts +0 -6
  1019. package/src/tui/components/DataRow/DataRow.tsx +0 -80
  1020. package/src/tui/components/DataRow/index.ts +0 -2
  1021. package/src/tui/components/DataRow/types.ts +0 -14
  1022. package/src/tui/components/FieldRow/FieldRow.tsx +0 -24
  1023. package/src/tui/components/FieldRow/index.ts +0 -2
  1024. package/src/tui/components/FieldRow/types.ts +0 -10
  1025. package/src/tui/components/HeaderRow/HeaderRow.tsx +0 -32
  1026. package/src/tui/components/HeaderRow/index.ts +0 -2
  1027. package/src/tui/components/HeaderRow/types.ts +0 -8
  1028. package/src/tui/components/MarkdownText/MarkdownText.tsx +0 -19
  1029. package/src/tui/components/MarkdownText/index.ts +0 -2
  1030. package/src/tui/components/MarkdownText/types.ts +0 -4
  1031. package/src/tui/components/MiniTable/MiniTable.tsx +0 -82
  1032. package/src/tui/components/MiniTable/index.ts +0 -2
  1033. package/src/tui/components/MiniTable/types.ts +0 -6
  1034. package/src/tui/components/SectionRenderer/SectionRenderer.tsx +0 -91
  1035. package/src/tui/components/SectionRenderer/index.ts +0 -2
  1036. package/src/tui/components/SectionRenderer/types.ts +0 -15
  1037. package/src/tui/components/TreeView/TreeView.tsx +0 -84
  1038. package/src/tui/components/TreeView/index.ts +0 -2
  1039. package/src/tui/components/TreeView/types.ts +0 -6
  1040. package/src/tui/components/index.ts +0 -19
  1041. package/src/tui/constants.ts +0 -39
  1042. package/src/tui/createListView.ts +0 -23
  1043. package/src/tui/createLookupView.ts +0 -26
  1044. package/src/tui/helpers/computeWidths.ts +0 -53
  1045. package/src/tui/helpers/fitColumns.ts +0 -33
  1046. package/src/tui/helpers/formatMarkdown.ts +0 -19
  1047. package/src/tui/helpers/getTerminalSize.ts +0 -16
  1048. package/src/tui/helpers/index.ts +0 -6
  1049. package/src/tui/helpers/syntaxColor.ts +0 -67
  1050. package/src/tui/helpers/truncateText.ts +0 -12
  1051. package/src/tui/hooks/index.ts +0 -3
  1052. package/src/tui/hooks/types.ts +0 -7
  1053. package/src/tui/hooks/useAutoExit.ts +0 -17
  1054. package/src/tui/hooks/useTerminalSize.ts +0 -19
  1055. package/src/tui/index.ts +0 -15
  1056. package/src/tui/renderInk.tsx +0 -18
  1057. package/src/tui/types.ts +0 -12
  1058. package/src/tui/views/ListView/ListView.tsx +0 -104
  1059. package/src/tui/views/ListView/index.ts +0 -2
  1060. package/src/tui/views/ListView/types.ts +0 -14
  1061. package/src/tui/views/LookupView/LookupView.tsx +0 -244
  1062. package/src/tui/views/LookupView/index.ts +0 -2
  1063. package/src/tui/views/LookupView/types.ts +0 -16
  1064. package/src/tui/views/index.ts +0 -4
@@ -1,1277 +0,0 @@
1
- import {
2
- existsSync,
3
- mkdtempSync,
4
- readFileSync,
5
- rmSync,
6
- writeFileSync,
7
- } from "node:fs";
8
- import { tmpdir } from "node:os";
9
- import { join } from "node:path";
10
- import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
11
- import { afterAll, beforeAll, describe, expect, it } from "vitest";
12
- import {
13
- createTestMcpClient,
14
- RECIPE_PREFIXES,
15
- RECIPE_STORY,
16
- RECIPE_TTL,
17
- } from "#testing";
18
- import { TOKEN_READ_SURFACE_ENABLED } from "../../domains/token/featureFlag.js";
19
- import type { McpErrorPayload } from "../types.js";
20
-
21
- // token_list, token_lookup, and token_sample are gated behind the token
22
- // read-surface feature flag.
23
- const EXPECTED_TOOL_COUNT = TOKEN_READ_SURFACE_ENABLED ? 34 : 31;
24
-
25
- let client: Client;
26
- let cleanup: () => Promise<void>;
27
-
28
- beforeAll(async () => {
29
- const result = await createTestMcpClient();
30
- client = result.client;
31
- cleanup = result.cleanup;
32
- });
33
-
34
- afterAll(async () => {
35
- await cleanup();
36
- });
37
-
38
- /**
39
- * Parse the envelope from a tool response.
40
- * Returns the full envelope object (with `ok`, `data`, `meta`, etc.).
41
- */
42
- function parseEnvelope(
43
- result: Record<string, unknown>,
44
- ): Record<string, unknown> {
45
- const content = result.content as unknown[];
46
- const first = content[0] as { type: string; text: string };
47
- expect(first.type).toBe("text");
48
- return JSON.parse(first.text) as Record<string, unknown>;
49
- }
50
-
51
- /**
52
- * Extract the `data` field from a success envelope.
53
- */
54
- function parseData(result: Record<string, unknown>): unknown {
55
- const envelope = parseEnvelope(result);
56
- expect(envelope.ok).toBe(true);
57
- return envelope.data;
58
- }
59
-
60
- // =============================================================================
61
- // Tool listing
62
- // =============================================================================
63
-
64
- describe("tool listing", () => {
65
- it("registers the expected number of tools", async () => {
66
- const { tools } = await client.listTools();
67
- expect(tools).toHaveLength(EXPECTED_TOOL_COUNT);
68
- });
69
-
70
- it("all tools have descriptions", async () => {
71
- const { tools } = await client.listTools();
72
- for (const tool of tools) {
73
- expect(tool.description).toBeTruthy();
74
- }
75
- });
76
-
77
- it("includes expected tool names", async () => {
78
- const { tools } = await client.listTools();
79
- const names = tools.map((t) => t.name);
80
- // Existing tools
81
- expect(names).toContain("block_list");
82
- expect(names).toContain("block_lookup");
83
- expect(names).toContain("standard_list");
84
- expect(names).toContain("standard_lookup");
85
- expect(names).toContain("standard_categories");
86
- expect(names).toContain("modifier_list");
87
- expect(names).toContain("modifier_lookup");
88
- if (TOKEN_READ_SURFACE_ENABLED) {
89
- expect(names).toContain("token_list");
90
- expect(names).toContain("token_lookup");
91
- }
92
- expect(names).toContain("tier_list");
93
- expect(names).toContain("config_show");
94
- expect(names).toContain("config_tier");
95
- expect(names).toContain("config_channel");
96
- expect(names).toContain("tokens_add_config");
97
- expect(names).toContain("create_component");
98
- expect(names).toContain("create_package");
99
- expect(names).toContain("llm");
100
- // New tools (Group C)
101
- expect(names).toContain("ontology_list");
102
- expect(names).toContain("ontology_show");
103
- expect(names).toContain("graph_query");
104
- expect(names).toContain("graph_inspect");
105
- expect(names).toContain("skill_list");
106
- expect(names).toContain("doctor");
107
- expect(names).toContain("info");
108
- expect(names).toContain("capabilities");
109
- // Sample tools
110
- expect(names).toContain("block_sample");
111
- expect(names).toContain("standard_sample");
112
- if (TOKEN_READ_SURFACE_ENABLED) {
113
- expect(names).toContain("token_sample");
114
- }
115
- expect(names).toContain("modifier_sample");
116
- });
117
-
118
- it("no tool names contain pragma_ prefix", async () => {
119
- const { tools } = await client.listTools();
120
- for (const tool of tools) {
121
- expect(tool.name).not.toMatch(/^pragma_/);
122
- }
123
- });
124
-
125
- // Golden surface: the full built-in tool set plus bundled packs, in
126
- // registration order. The per-(noun, verb) reserved-guard flip must leave
127
- // this byte-identical AND order-identical — registration order is the tool
128
- // surface a client sees.
129
- it("has a stable built-in tool surface", async () => {
130
- const names = (await client.listTools()).tools.map((tool) => tool.name);
131
-
132
- expect(names).toEqual([
133
- "block_list",
134
- "block_lookup",
135
- "block_sample",
136
- "modifier_list",
137
- "modifier_lookup",
138
- "modifier_sample",
139
- ...(TOKEN_READ_SURFACE_ENABLED ? ["token_list", "token_lookup"] : []),
140
- "tokens_add_config",
141
- ...(TOKEN_READ_SURFACE_ENABLED ? ["token_sample"] : []),
142
- "config_show",
143
- "config_tier",
144
- "config_channel",
145
- "ontology_list",
146
- "ontology_show",
147
- "graph_query",
148
- "graph_inspect",
149
- "skill_list",
150
- "skill_lookup",
151
- "doctor",
152
- "info",
153
- "capabilities",
154
- "llm",
155
- "create_component",
156
- "create_package",
157
- "create_application",
158
- "create_domain",
159
- "create_route",
160
- "create_wrapper",
161
- // Bundled packs register after the built-in tools: `tier_list` and the
162
- // whole `standard` noun are served by bundled story packs — the
163
- // hand-written tier and standard domains were deleted.
164
- "tier_list",
165
- "standard_list",
166
- "standard_lookup",
167
- "standard_categories",
168
- "standard_sample",
169
- ]);
170
- });
171
-
172
- it("serves the standard tools from the bundled pack, not built-ins", async () => {
173
- const { tools } = await client.listTools();
174
- const standardList = tools.find((tool) => tool.name === "standard_list");
175
- // Pack-compiled tool descriptions carry no story-pack suffix here only
176
- // because the bundled pack curates them; the giveaway is the derived
177
- // `search`/`category` params on the pack projection.
178
- const params = Object.keys(
179
- (standardList?.inputSchema as { properties?: object })?.properties ?? {},
180
- );
181
- expect(params).toContain("category");
182
- expect(params).toContain("search");
183
- expect(params).toContain("condensed");
184
- });
185
- });
186
-
187
- // =============================================================================
188
- // Envelope shape
189
- // =============================================================================
190
-
191
- describe("envelope shape", () => {
192
- it("success response has ok: true, data, and meta", async () => {
193
- const result = await client.callTool({
194
- name: "block_list",
195
- arguments: {},
196
- });
197
- const envelope = parseEnvelope(result);
198
- expect(envelope.ok).toBe(true);
199
- expect(envelope).toHaveProperty("data");
200
- expect(envelope).toHaveProperty("meta");
201
- });
202
-
203
- it("error response has ok: false and error object", async () => {
204
- const result = await client.callTool({
205
- name: "config_channel",
206
- arguments: { value: "beta" },
207
- });
208
- expect(result.isError).toBe(true);
209
- const envelope = parseEnvelope(result);
210
- expect(envelope.ok).toBe(false);
211
- expect(envelope).toHaveProperty("error");
212
- const error = envelope.error as Record<string, unknown>;
213
- expect(error).toHaveProperty("code");
214
- expect(error).toHaveProperty("message");
215
- });
216
-
217
- it("list operations include count in meta", async () => {
218
- const result = await client.callTool({
219
- name: "block_list",
220
- arguments: {},
221
- });
222
- const envelope = parseEnvelope(result);
223
- const meta = envelope.meta as Record<string, unknown>;
224
- expect(typeof meta.count).toBe("number");
225
- });
226
-
227
- it("list operations include filters in meta", async () => {
228
- const result = await client.callTool({
229
- name: "block_list",
230
- arguments: {},
231
- });
232
- const envelope = parseEnvelope(result);
233
- const meta = envelope.meta as Record<string, unknown>;
234
- expect(meta.filters).toBeDefined();
235
- const filters = meta.filters as Record<string, string>;
236
- expect(filters.channel).toBe("normal");
237
- });
238
- });
239
-
240
- // =============================================================================
241
- // Block tools
242
- // =============================================================================
243
-
244
- describe("block_list", () => {
245
- it("returns blocks", async () => {
246
- const result = await client.callTool({
247
- name: "block_list",
248
- arguments: {},
249
- });
250
- const data = parseData(result) as unknown[];
251
- expect(data.length).toBeGreaterThan(0);
252
- const names = data.map((c) => (c as { name: string }).name);
253
- expect(names).toContain("Button");
254
- expect(names).toContain("Card");
255
- });
256
-
257
- it("allTiers widens tier filter without changing channel", async () => {
258
- const restricted = await createTestMcpClient({
259
- config: { tier: "global", channel: "normal" },
260
- });
261
- try {
262
- const without = await restricted.client.callTool({
263
- name: "block_list",
264
- arguments: {},
265
- });
266
- const withoutNames = (parseData(without) as { name: string }[]).map(
267
- (c) => c.name,
268
- );
269
- expect(withoutNames).not.toContain("LXD Panel");
270
-
271
- const withAll = await restricted.client.callTool({
272
- name: "block_list",
273
- arguments: { allTiers: true },
274
- });
275
- const withAllNames = (parseData(withAll) as { name: string }[]).map(
276
- (c) => c.name,
277
- );
278
- expect(withAllNames).toContain("LXD Panel");
279
- expect(withAllNames).not.toContain("Beta Widget");
280
- } finally {
281
- await restricted.cleanup();
282
- }
283
- });
284
- });
285
-
286
- describe("block_lookup", () => {
287
- it("returns detailed block data by default", async () => {
288
- const result = await client.callTool({
289
- name: "block_lookup",
290
- arguments: { names: ["Button"] },
291
- });
292
- const data = parseData(result) as {
293
- results: Record<string, unknown>[];
294
- };
295
- expect(data.results[0]?.name).toBe("Button");
296
- expect(data.results[0]).toHaveProperty("modifierValues");
297
- expect(data.results[0]).toHaveProperty("implementationPaths");
298
- expect(data.results[0]).toHaveProperty("tokens");
299
- });
300
-
301
- it("returns summary when detailed=false", async () => {
302
- const result = await client.callTool({
303
- name: "block_lookup",
304
- arguments: { names: ["Button"], detailed: false },
305
- });
306
- const data = parseData(result) as {
307
- results: Record<string, unknown>[];
308
- };
309
- expect(data.results[0]?.name).toBe("Button");
310
- expect(data.results[0]).not.toHaveProperty("modifierValues");
311
- expect(data.results[0]).not.toHaveProperty("implementationPaths");
312
- });
313
-
314
- it("returns structured per-query errors for unknown blocks", async () => {
315
- const result = await client.callTool({
316
- name: "block_lookup",
317
- arguments: { names: ["NonExistent"] },
318
- });
319
- const data = parseData(result) as {
320
- results: unknown[];
321
- errors: { code: string; query: string }[];
322
- };
323
- expect(data.results).toHaveLength(0);
324
- expect(data.errors[0]?.code).toBe("ENTITY_NOT_FOUND");
325
- expect(data.errors[0]?.query).toBe("NonExistent");
326
- });
327
- });
328
-
329
- // =============================================================================
330
- // Standard tools
331
- // =============================================================================
332
-
333
- describe("standard_list", () => {
334
- it("returns standards", async () => {
335
- const result = await client.callTool({
336
- name: "standard_list",
337
- arguments: {},
338
- });
339
- const data = parseData(result) as unknown[];
340
- expect(data.length).toBeGreaterThan(0);
341
- });
342
-
343
- it("filters by category", async () => {
344
- const all = await client.callTool({
345
- name: "standard_list",
346
- arguments: {},
347
- });
348
- const allData = parseData(all) as { category: string }[];
349
- const categories = [...new Set(allData.map((s) => s.category))];
350
-
351
- const firstCategory = categories[0];
352
- if (firstCategory) {
353
- const filtered = await client.callTool({
354
- name: "standard_list",
355
- arguments: { category: firstCategory },
356
- });
357
- const filteredData = parseData(filtered) as { category: string }[];
358
- expect(filteredData.length).toBeGreaterThan(0);
359
- expect(
360
- filteredData.every(
361
- (s) => s.category.toLowerCase() === firstCategory.toLowerCase(),
362
- ),
363
- ).toBe(true);
364
- }
365
- });
366
-
367
- it("filters by search term", async () => {
368
- const result = await client.callTool({
369
- name: "standard_list",
370
- arguments: { search: "function" },
371
- });
372
- const data = parseData(result) as { name: string; description: string }[];
373
- for (const item of data) {
374
- const matches =
375
- item.name.toLowerCase().includes("function") ||
376
- item.description.toLowerCase().includes("function");
377
- expect(matches).toBe(true);
378
- }
379
- });
380
- });
381
-
382
- describe("standard_lookup", () => {
383
- it("returns detailed standard by default", async () => {
384
- const list = await client.callTool({
385
- name: "standard_list",
386
- arguments: {},
387
- });
388
- const standards = parseData(list) as { name: string }[];
389
- expect(standards.length).toBeGreaterThan(0);
390
- const standardName = standards[0]?.name ?? "";
391
-
392
- const result = await client.callTool({
393
- name: "standard_lookup",
394
- arguments: { names: [standardName] },
395
- });
396
- const data = parseData(result) as {
397
- results: Record<string, unknown>[];
398
- };
399
- expect(data.results[0]?.name).toBe(standardName);
400
- expect(data.results[0]).toHaveProperty("dos");
401
- expect(data.results[0]).toHaveProperty("donts");
402
- });
403
-
404
- it("returns summary when detailed=false", async () => {
405
- const list = await client.callTool({
406
- name: "standard_list",
407
- arguments: {},
408
- });
409
- const standards = parseData(list) as { name: string }[];
410
- const standardName = standards[0]?.name ?? "";
411
-
412
- const result = await client.callTool({
413
- name: "standard_lookup",
414
- arguments: { names: [standardName], detailed: false },
415
- });
416
- const data = parseData(result) as {
417
- results: Record<string, unknown>[];
418
- };
419
- expect(data.results[0]).not.toHaveProperty("dos");
420
- expect(data.results[0]).not.toHaveProperty("donts");
421
- });
422
-
423
- it("returns per-query errors for unknown standard", async () => {
424
- const result = await client.callTool({
425
- name: "standard_lookup",
426
- arguments: { names: ["nonexistent/standard"] },
427
- });
428
- const data = parseData(result) as {
429
- errors: { code: string }[];
430
- };
431
- expect(data.errors[0]?.code).toBe("ENTITY_NOT_FOUND");
432
- });
433
- });
434
-
435
- describe("standard_categories", () => {
436
- it("returns categories", async () => {
437
- const result = await client.callTool({
438
- name: "standard_categories",
439
- arguments: {},
440
- });
441
- const data = parseData(result) as string[];
442
- expect(data.length).toBeGreaterThan(0);
443
- });
444
- });
445
-
446
- // =============================================================================
447
- // Modifier tools
448
- // =============================================================================
449
-
450
- describe("modifier_list", () => {
451
- it("returns modifier families", async () => {
452
- const result = await client.callTool({
453
- name: "modifier_list",
454
- arguments: {},
455
- });
456
- const data = parseData(result) as { name: string; values: string[] }[];
457
- expect(data.length).toBeGreaterThan(0);
458
- const names = data.map((m) => m.name);
459
- expect(names).toContain("importance");
460
- });
461
- });
462
-
463
- describe("modifier_lookup", () => {
464
- it("returns modifier values", async () => {
465
- const result = await client.callTool({
466
- name: "modifier_lookup",
467
- arguments: { names: ["importance"] },
468
- });
469
- const data = parseData(result) as {
470
- results: { name: string; values: string[] }[];
471
- };
472
- expect(data.results[0]?.name).toBe("importance");
473
- expect(data.results[0]?.values).toContain("primary");
474
- });
475
-
476
- it("returns per-query errors for unknown modifier", async () => {
477
- const result = await client.callTool({
478
- name: "modifier_lookup",
479
- arguments: { names: ["nonexistent"] },
480
- });
481
- const data = parseData(result) as {
482
- errors: { code: string }[];
483
- };
484
- expect(data.errors[0]?.code).toBe("ENTITY_NOT_FOUND");
485
- });
486
- });
487
-
488
- // =============================================================================
489
- // Token tools
490
- // =============================================================================
491
-
492
- describe.skipIf(!TOKEN_READ_SURFACE_ENABLED)("token_list", () => {
493
- it("returns tokens", async () => {
494
- const result = await client.callTool({
495
- name: "token_list",
496
- arguments: {},
497
- });
498
- const data = parseData(result) as { name: string }[];
499
- expect(data.length).toBeGreaterThan(0);
500
- });
501
- });
502
-
503
- describe.skipIf(!TOKEN_READ_SURFACE_ENABLED)("token_lookup", () => {
504
- it("returns token with theme values", async () => {
505
- const result = await client.callTool({
506
- name: "token_lookup",
507
- arguments: { names: ["color.primary"] },
508
- });
509
- const data = parseData(result) as {
510
- results: {
511
- name: string;
512
- values: { theme: string; value: string }[];
513
- }[];
514
- };
515
- expect(data.results[0]?.name).toBe("color.primary");
516
- expect((data.results[0]?.values ?? []).length).toBeGreaterThan(0);
517
- });
518
-
519
- it("returns per-query errors for unknown token", async () => {
520
- const result = await client.callTool({
521
- name: "token_lookup",
522
- arguments: { names: ["nonexistent.token"] },
523
- });
524
- const data = parseData(result) as {
525
- errors: { code: string }[];
526
- };
527
- expect(data.errors[0]?.code).toBe("ENTITY_NOT_FOUND");
528
- });
529
- });
530
-
531
- // =============================================================================
532
- // Tier tools
533
- // =============================================================================
534
-
535
- describe("tier_list", () => {
536
- it("returns tiers", async () => {
537
- const result = await client.callTool({
538
- name: "tier_list",
539
- arguments: {},
540
- });
541
- // The bundled tier pack names the field `name` (its `ds:name` value).
542
- const data = parseData(result) as { name: string }[];
543
- expect(data.length).toBeGreaterThan(0);
544
- const names = data.map((t) => t.name);
545
- expect(names).toContain("global");
546
- });
547
- });
548
-
549
- // =============================================================================
550
- // Config tools
551
- // =============================================================================
552
-
553
- describe("config_show", () => {
554
- it("returns config", async () => {
555
- const result = await client.callTool({
556
- name: "config_show",
557
- arguments: {},
558
- });
559
- const data = parseData(result) as {
560
- tier: string | undefined;
561
- channel: string;
562
- tierChain: string[];
563
- includedReleases: string[];
564
- };
565
- expect(data.channel).toBe("normal");
566
- expect(data.tier).toBeUndefined();
567
- expect(data.tierChain).toEqual([]);
568
- expect(data.includedReleases).toContain("stable");
569
- });
570
-
571
- it("returns condensed config text", async () => {
572
- const result = await client.callTool({
573
- name: "config_show",
574
- arguments: { condensed: true },
575
- });
576
- const envelope = parseEnvelope(result);
577
- expect(envelope.ok).toBe(true);
578
- expect(envelope.condensed).toBe(true);
579
- expect(typeof envelope.text).toBe("string");
580
- expect(envelope.text as string).toContain("Configuration");
581
- });
582
- });
583
-
584
- describe("config_tier", () => {
585
- it("sets, queries, and resets tier in workspace config", async () => {
586
- const dir = mkdtempSync(join(tmpdir(), "pragma-mcp-tier-"));
587
- // Seed a project file so global-first writes stay in this workspace.
588
- writeFileSync(join(dir, "pragma.config.json"), "{}");
589
-
590
- try {
591
- const scoped = await createTestMcpClient({ cwd: dir });
592
-
593
- try {
594
- const setResult = await scoped.client.callTool({
595
- name: "config_tier",
596
- arguments: { path: "global" },
597
- });
598
- expect(parseData(setResult)).toMatchObject({
599
- tier: "global",
600
- action: "set",
601
- });
602
-
603
- const queryResult = await scoped.client.callTool({
604
- name: "config_tier",
605
- arguments: {},
606
- });
607
- expect(parseData(queryResult)).toEqual({
608
- tier: "global",
609
- action: "query",
610
- });
611
-
612
- const resetResult = await scoped.client.callTool({
613
- name: "config_tier",
614
- arguments: { reset: true },
615
- });
616
- expect(parseData(resetResult)).toMatchObject({
617
- tier: null,
618
- action: "reset",
619
- });
620
-
621
- const queriedAfterReset = await scoped.client.callTool({
622
- name: "config_tier",
623
- arguments: {},
624
- });
625
- expect(parseData(queriedAfterReset)).toEqual({
626
- tier: null,
627
- action: "query",
628
- });
629
- } finally {
630
- await scoped.cleanup();
631
- }
632
- } finally {
633
- rmSync(dir, { recursive: true, force: true });
634
- }
635
- });
636
- });
637
-
638
- describe("config_channel", () => {
639
- it("sets, queries, and resets channel in workspace config", async () => {
640
- const dir = mkdtempSync(join(tmpdir(), "pragma-mcp-channel-"));
641
- // Seed a project file so global-first writes stay in this workspace.
642
- writeFileSync(join(dir, "pragma.config.json"), "{}");
643
-
644
- try {
645
- const scoped = await createTestMcpClient({ cwd: dir });
646
-
647
- try {
648
- const setResult = await scoped.client.callTool({
649
- name: "config_channel",
650
- arguments: { value: "experimental" },
651
- });
652
- expect(parseData(setResult)).toMatchObject({
653
- channel: "experimental",
654
- action: "set",
655
- });
656
-
657
- const queryResult = await scoped.client.callTool({
658
- name: "config_channel",
659
- arguments: {},
660
- });
661
- expect(parseData(queryResult)).toEqual({
662
- channel: "experimental",
663
- action: "query",
664
- });
665
-
666
- const resetResult = await scoped.client.callTool({
667
- name: "config_channel",
668
- arguments: { reset: true },
669
- });
670
- expect(parseData(resetResult)).toMatchObject({
671
- channel: "normal",
672
- action: "reset",
673
- });
674
- } finally {
675
- await scoped.cleanup();
676
- }
677
- } finally {
678
- rmSync(dir, { recursive: true, force: true });
679
- }
680
- });
681
-
682
- it("returns an error for invalid channel input", async () => {
683
- const result = await client.callTool({
684
- name: "config_channel",
685
- arguments: { value: "beta" },
686
- });
687
- expect(result.isError).toBe(true);
688
- const envelope = parseEnvelope(result);
689
- const error = envelope.error as McpErrorPayload;
690
- expect(error.code).toBe("INVALID_INPUT");
691
- });
692
- });
693
-
694
- describe("tokens_add_config", () => {
695
- it("writes a token config file and reports its path", async () => {
696
- const dir = mkdtempSync(join(tmpdir(), "pragma-mcp-token-config-"));
697
-
698
- try {
699
- const scoped = await createTestMcpClient({ cwd: dir });
700
-
701
- try {
702
- const result = await scoped.client.callTool({
703
- name: "tokens_add_config",
704
- arguments: {},
705
- });
706
- const data = parseData(result) as {
707
- configPath: string;
708
- tokenSources: string[];
709
- installHint: string;
710
- };
711
- expect(data.configPath).toBe(join(dir, "tokens.config.mjs"));
712
- expect(data.tokenSources).toContain(
713
- "node_modules/@canonical/ds-global/tokens/**/*.json",
714
- );
715
- expect(data.installHint).toContain("@canonical/terrazzo-lsp");
716
- expect(existsSync(data.configPath)).toBe(true);
717
- } finally {
718
- await scoped.cleanup();
719
- }
720
- } finally {
721
- rmSync(dir, { recursive: true, force: true });
722
- }
723
- });
724
-
725
- it("returns recovery metadata when config already exists", async () => {
726
- const dir = mkdtempSync(join(tmpdir(), "pragma-mcp-token-existing-"));
727
- const configPath = join(dir, "tokens.config.mjs");
728
-
729
- try {
730
- writeFileSync(configPath, "// existing\n", "utf-8");
731
- const scoped = await createTestMcpClient({ cwd: dir });
732
-
733
- try {
734
- const result = await scoped.client.callTool({
735
- name: "tokens_add_config",
736
- arguments: {},
737
- });
738
- expect(result.isError).toBe(true);
739
- const envelope = parseEnvelope(result);
740
- const error = envelope.error as McpErrorPayload;
741
- expect(error.code).toBe("INVALID_INPUT");
742
- expect(error.recovery?.tool).toBe("tokens_add_config");
743
- expect(error.recovery?.params).toEqual({ force: true });
744
- } finally {
745
- await scoped.cleanup();
746
- }
747
- } finally {
748
- rmSync(dir, { recursive: true, force: true });
749
- }
750
- });
751
-
752
- it("overwrites an existing config when force=true", async () => {
753
- const dir = mkdtempSync(join(tmpdir(), "pragma-mcp-token-force-"));
754
- const configPath = join(dir, "tokens.config.mjs");
755
-
756
- try {
757
- writeFileSync(configPath, "// existing\n", "utf-8");
758
- const scoped = await createTestMcpClient({ cwd: dir });
759
-
760
- try {
761
- const result = await scoped.client.callTool({
762
- name: "tokens_add_config",
763
- arguments: { force: true },
764
- });
765
- const data = parseData(result) as { configPath: string };
766
- expect(data.configPath).toBe(configPath);
767
- expect(readFileSync(configPath, "utf-8")).toContain(
768
- 'import { defineConfig } from "@canonical/terrazzo";',
769
- );
770
- } finally {
771
- await scoped.cleanup();
772
- }
773
- } finally {
774
- rmSync(dir, { recursive: true, force: true });
775
- }
776
- });
777
- });
778
-
779
- // =============================================================================
780
- // Generator tools (D14 — mutating)
781
- // =============================================================================
782
-
783
- describe("create_component", () => {
784
- it("returns JSON generation plan for react", async () => {
785
- const result = await client.callTool({
786
- name: "create_component",
787
- arguments: {
788
- variant: "react",
789
- componentPath: "src/components/Button",
790
- },
791
- });
792
- expect(result.isError).toBeFalsy();
793
- const data = parseData(result) as Record<string, unknown>;
794
- expect(data.generator).toBeDefined();
795
- expect((data.generator as { name: string }).name).toBe("component/react");
796
- expect(Array.isArray(data.plan)).toBe(true);
797
- });
798
-
799
- it("returns JSON generation plan for svelte", async () => {
800
- const result = await client.callTool({
801
- name: "create_component",
802
- arguments: {
803
- variant: "svelte",
804
- componentPath: "src/lib/components/Toggle",
805
- },
806
- });
807
- expect(result.isError).toBeFalsy();
808
- const data = parseData(result) as Record<string, unknown>;
809
- expect((data.generator as { name: string }).name).toBe("component/svelte");
810
- });
811
-
812
- it("returns error for invalid variant", async () => {
813
- const result = await client.callTool({
814
- name: "create_component",
815
- arguments: {
816
- variant: "angular",
817
- componentPath: "src/components/Button",
818
- },
819
- });
820
- expect(result.isError).toBe(true);
821
- });
822
- });
823
-
824
- describe("create_package", () => {
825
- it("returns JSON generation plan", async () => {
826
- const result = await client.callTool({
827
- name: "create_package",
828
- arguments: {
829
- name: "@canonical/test-pkg",
830
- type: "tool-ts",
831
- },
832
- });
833
- expect(result.isError).toBeFalsy();
834
- const data = parseData(result) as Record<string, unknown>;
835
- expect((data.generator as { name: string }).name).toBe("package");
836
- expect(Array.isArray(data.plan)).toBe(true);
837
- });
838
- });
839
-
840
- // =============================================================================
841
- // LLM Orientation
842
- // =============================================================================
843
-
844
- describe("llm", () => {
845
- it("returns orientation data with context, trees, and commands", async () => {
846
- const result = await client.callTool({
847
- name: "llm",
848
- arguments: {},
849
- });
850
- const data = parseData(result) as {
851
- context: { counts: Record<string, number>; namespaces: string[] };
852
- decisionTrees: { intent: string }[];
853
- commandReference: { command: string }[];
854
- };
855
- expect(data.context.counts.blocks).toBeGreaterThan(0);
856
- expect(data.context.counts.standards).toBeGreaterThan(0);
857
- expect(data.context.namespaces.length).toBeGreaterThan(0);
858
- expect(data.decisionTrees).toHaveLength(TOKEN_READ_SURFACE_ENABLED ? 5 : 4);
859
- expect(data.commandReference.length).toBeGreaterThan(0);
860
- });
861
- });
862
-
863
- // =============================================================================
864
- // Error handling
865
- // =============================================================================
866
-
867
- describe("error handling", () => {
868
- it("all entity-not-found errors include recovery objects", async () => {
869
- const notFoundCalls = [
870
- { name: "block_lookup", arguments: { names: ["X"] } },
871
- { name: "modifier_lookup", arguments: { names: ["X"] } },
872
- ...(TOKEN_READ_SURFACE_ENABLED
873
- ? [{ name: "token_lookup", arguments: { names: ["X"] } }]
874
- : []),
875
- { name: "standard_lookup", arguments: { names: ["X"] } },
876
- ] as const;
877
-
878
- for (const call of notFoundCalls) {
879
- const result = await client.callTool(call);
880
- const data = parseData(result) as {
881
- errors: { code: string }[];
882
- };
883
- expect(data.errors[0]?.code).toBe("ENTITY_NOT_FOUND");
884
- }
885
- });
886
- });
887
-
888
- // =============================================================================
889
- // Ontology tools
890
- // =============================================================================
891
-
892
- describe("ontology_list", () => {
893
- it("returns ontologies", async () => {
894
- const result = await client.callTool({
895
- name: "ontology_list",
896
- arguments: {},
897
- });
898
- const data = parseData(result) as { prefix: string }[];
899
- expect(data.length).toBeGreaterThan(0);
900
- });
901
-
902
- it("returns error envelope shape on failure", async () => {
903
- // ontology_list should always succeed with loaded data,
904
- // so we just verify the success shape has meta.count
905
- const result = await client.callTool({
906
- name: "ontology_list",
907
- arguments: {},
908
- });
909
- const envelope = parseEnvelope(result);
910
- const meta = envelope.meta as Record<string, unknown>;
911
- expect(typeof meta.count).toBe("number");
912
- });
913
- });
914
-
915
- describe("ontology_show", () => {
916
- it("returns ontology details for a valid prefix", async () => {
917
- const result = await client.callTool({
918
- name: "ontology_show",
919
- arguments: { prefix: "ds" },
920
- });
921
- const data = parseData(result) as {
922
- prefix: string;
923
- classes: unknown[];
924
- properties: unknown[];
925
- };
926
- expect(data.prefix).toBe("ds");
927
- expect(data.classes.length).toBeGreaterThan(0);
928
- });
929
-
930
- it("returns error for unknown prefix", async () => {
931
- const result = await client.callTool({
932
- name: "ontology_show",
933
- arguments: { prefix: "nonexistent" },
934
- });
935
- expect(result.isError).toBe(true);
936
- const envelope = parseEnvelope(result);
937
- expect(envelope.ok).toBe(false);
938
- });
939
-
940
- it("returns condensed ontology details", async () => {
941
- const result = await client.callTool({
942
- name: "ontology_show",
943
- arguments: { prefix: "ds", condensed: true },
944
- });
945
- const envelope = parseEnvelope(result);
946
- expect(envelope.ok).toBe(true);
947
- expect(envelope.condensed).toBe(true);
948
- expect(envelope.text).toEqual(expect.stringContaining("## Ontology ds:"));
949
- });
950
- });
951
-
952
- // =============================================================================
953
- // Graph tools
954
- // =============================================================================
955
-
956
- describe("graph_query", () => {
957
- it("executes a SPARQL query", async () => {
958
- const result = await client.callTool({
959
- name: "graph_query",
960
- arguments: { sparql: "SELECT ?s WHERE { ?s ?p ?o } LIMIT 1" },
961
- });
962
- const data = parseData(result) as Record<string, unknown>;
963
- expect(data).toBeDefined();
964
- });
965
-
966
- it("returns error for invalid SPARQL", async () => {
967
- const result = await client.callTool({
968
- name: "graph_query",
969
- arguments: { sparql: "NOT VALID SPARQL" },
970
- });
971
- expect(result.isError).toBe(true);
972
- });
973
-
974
- it("returns condensed graph query output", async () => {
975
- const result = await client.callTool({
976
- name: "graph_query",
977
- arguments: {
978
- sparql: "SELECT ?s WHERE { ?s ?p ?o } LIMIT 1",
979
- condensed: true,
980
- },
981
- });
982
- const envelope = parseEnvelope(result);
983
- expect(envelope.ok).toBe(true);
984
- expect(envelope.condensed).toBe(true);
985
- expect(envelope.text).toEqual(expect.stringContaining("bindings"));
986
- });
987
- });
988
-
989
- describe("graph_inspect", () => {
990
- it("inspects a valid URI", async () => {
991
- // First get a valid URI from the graph
992
- const queryResult = await client.callTool({
993
- name: "graph_query",
994
- arguments: { sparql: "SELECT ?s WHERE { ?s ?p ?o } LIMIT 1" },
995
- });
996
- const queryData = parseData(queryResult) as {
997
- type: string;
998
- bindings: { s?: string }[];
999
- };
1000
- const validUri = queryData.bindings[0]?.s;
1001
- expect(validUri).toBeDefined();
1002
- if (!validUri) {
1003
- throw new Error("Expected a valid URI");
1004
- }
1005
-
1006
- const result = await client.callTool({
1007
- name: "graph_inspect",
1008
- arguments: { uri: validUri },
1009
- });
1010
- const data = parseData(result) as {
1011
- uri: string;
1012
- groups: { predicate: string; objects: string[] }[];
1013
- };
1014
- expect(data.uri).toBeDefined();
1015
- expect(data.groups.length).toBeGreaterThan(0);
1016
- });
1017
-
1018
- it("returns error for unknown URI", async () => {
1019
- const result = await client.callTool({
1020
- name: "graph_inspect",
1021
- arguments: { uri: "https://example.com/nonexistent" },
1022
- });
1023
- expect(result.isError).toBe(true);
1024
- });
1025
-
1026
- it("returns condensed graph inspection output", async () => {
1027
- const queryResult = await client.callTool({
1028
- name: "graph_query",
1029
- arguments: { sparql: "SELECT ?s WHERE { ?s ?p ?o } LIMIT 1" },
1030
- });
1031
- const queryData = parseData(queryResult) as {
1032
- bindings: { s?: string }[];
1033
- };
1034
- const validUri = queryData.bindings[0]?.s;
1035
- expect(validUri).toBeDefined();
1036
- if (!validUri) {
1037
- throw new Error("Expected a valid URI");
1038
- }
1039
-
1040
- const result = await client.callTool({
1041
- name: "graph_inspect",
1042
- arguments: { uri: validUri, condensed: true },
1043
- });
1044
- const envelope = parseEnvelope(result);
1045
- expect(envelope.ok).toBe(true);
1046
- expect(envelope.condensed).toBe(true);
1047
- expect(envelope.text).toEqual(expect.stringContaining("## "));
1048
- });
1049
- });
1050
-
1051
- // =============================================================================
1052
- // Skill tools
1053
- // =============================================================================
1054
-
1055
- describe("story-pack tools", () => {
1056
- it("registers <noun>_list and <noun>_lookup from a stories config", async () => {
1057
- const scoped = await createTestMcpClient({
1058
- ttl: RECIPE_TTL,
1059
- config: {
1060
- tier: undefined,
1061
- channel: "normal",
1062
- stories: [RECIPE_STORY],
1063
- prefixes: RECIPE_PREFIXES,
1064
- },
1065
- });
1066
-
1067
- try {
1068
- const tools = (await scoped.client.listTools()).tools.map(
1069
- (tool) => tool.name,
1070
- );
1071
- expect(tools).toHaveLength(EXPECTED_TOOL_COUNT + 2);
1072
- expect(tools).toContain("recipe_list");
1073
- expect(tools).toContain("recipe_lookup");
1074
-
1075
- const listResult = await scoped.client.callTool({
1076
- name: "recipe_list",
1077
- arguments: {},
1078
- });
1079
- const rows = parseData(listResult) as { name: string }[];
1080
- expect(rows.map((row) => row.name)).toEqual(["Gazpacho", "Pancakes"]);
1081
-
1082
- const lookupResult = await scoped.client.callTool({
1083
- name: "recipe_lookup",
1084
- arguments: { names: ["pancakes"] },
1085
- });
1086
- const data = parseData(lookupResult) as {
1087
- results: { name: string; instructions: string }[];
1088
- };
1089
- expect(data.results.at(0)?.name).toBe("Pancakes");
1090
- expect(data.results.at(0)?.instructions).toBe("Mix, fry, flip.");
1091
- } finally {
1092
- await scoped.cleanup();
1093
- }
1094
- });
1095
- });
1096
-
1097
- describe("skill_list", () => {
1098
- it("returns skills data", async () => {
1099
- const result = await client.callTool({
1100
- name: "skill_list",
1101
- arguments: {},
1102
- });
1103
- const data = parseData(result) as {
1104
- skills: unknown[];
1105
- sources: unknown[];
1106
- };
1107
- expect(data).toHaveProperty("skills");
1108
- expect(data).toHaveProperty("sources");
1109
- });
1110
- });
1111
-
1112
- // =============================================================================
1113
- // Doctor tool
1114
- // =============================================================================
1115
-
1116
- describe("doctor", () => {
1117
- it("returns health check results", async () => {
1118
- const result = await client.callTool({
1119
- name: "doctor",
1120
- arguments: {},
1121
- });
1122
- const data = parseData(result) as {
1123
- checks: { name: string; status: string }[];
1124
- passed: number;
1125
- failed: number;
1126
- };
1127
- expect(data.checks.length).toBeGreaterThan(0);
1128
- expect(typeof data.passed).toBe("number");
1129
- });
1130
- });
1131
-
1132
- // =============================================================================
1133
- // Info tool
1134
- // =============================================================================
1135
-
1136
- describe("info", () => {
1137
- it("returns pragma info", async () => {
1138
- const result = await client.callTool({
1139
- name: "info",
1140
- arguments: {},
1141
- });
1142
- const data = parseData(result) as {
1143
- version: string;
1144
- channel: string;
1145
- store: { tripleCount: number } | null;
1146
- };
1147
- expect(data.version).toBeDefined();
1148
- expect(data.store).toBeDefined();
1149
- expect(data.store?.tripleCount).toBeGreaterThan(0);
1150
- });
1151
- });
1152
-
1153
- // =============================================================================
1154
- // Capabilities tool
1155
- // =============================================================================
1156
-
1157
- describe("capabilities", () => {
1158
- it("returns enriched tool catalog with counts", async () => {
1159
- const result = await client.callTool({
1160
- name: "capabilities",
1161
- arguments: {},
1162
- });
1163
- const data = parseData(result) as {
1164
- version: string;
1165
- conventions: Record<string, string>;
1166
- discovery_sequence: { stage: number; tool: string; purpose: string }[];
1167
- tools: { name: string; category: string; use_when: string }[];
1168
- counts: {
1169
- total: number;
1170
- read: number;
1171
- write: number;
1172
- orientation: number;
1173
- diagnostic: number;
1174
- };
1175
- limits: Record<string, unknown>;
1176
- };
1177
- const toolNames = data.tools.map((t) => t.name);
1178
- expect(toolNames).toContain("block_list");
1179
- expect(toolNames).toContain("capabilities");
1180
- expect(data.tools.every((t) => t.use_when.length > 0)).toBe(true);
1181
- expect(data.counts.total).toBe(EXPECTED_TOOL_COUNT);
1182
- expect(data.counts.read).toBeGreaterThan(0);
1183
- expect(data.counts.write).toBe(9);
1184
- expect(data.counts.orientation).toBe(2);
1185
- expect(data.counts.diagnostic).toBe(2);
1186
- expect(data.version).toBeDefined();
1187
- expect(data.conventions).toBeDefined();
1188
- expect(data.discovery_sequence.length).toBe(3);
1189
- expect(data.limits).toBeDefined();
1190
- });
1191
- });
1192
-
1193
- // =============================================================================
1194
- // Condensed responses
1195
- // =============================================================================
1196
-
1197
- describe("condensed parameter", () => {
1198
- it("block_list returns condensed text", async () => {
1199
- const result = await client.callTool({
1200
- name: "block_list",
1201
- arguments: { condensed: true },
1202
- });
1203
- const envelope = parseEnvelope(result);
1204
- expect(envelope.ok).toBe(true);
1205
- expect(envelope.condensed).toBe(true);
1206
- expect(typeof envelope.text).toBe("string");
1207
- expect(typeof envelope.tokens).toBe("string");
1208
- expect(envelope).not.toHaveProperty("data");
1209
- });
1210
-
1211
- it("standard_list returns condensed text", async () => {
1212
- const result = await client.callTool({
1213
- name: "standard_list",
1214
- arguments: { condensed: true },
1215
- });
1216
- const envelope = parseEnvelope(result);
1217
- expect(envelope.ok).toBe(true);
1218
- expect(envelope.condensed).toBe(true);
1219
- expect(typeof envelope.text).toBe("string");
1220
- });
1221
-
1222
- it("tier_list returns condensed text", async () => {
1223
- const result = await client.callTool({
1224
- name: "tier_list",
1225
- arguments: { condensed: true },
1226
- });
1227
- const envelope = parseEnvelope(result);
1228
- expect(envelope.ok).toBe(true);
1229
- expect(envelope.condensed).toBe(true);
1230
- });
1231
-
1232
- it("doctor returns condensed text", async () => {
1233
- const result = await client.callTool({
1234
- name: "doctor",
1235
- arguments: { condensed: true },
1236
- });
1237
- const envelope = parseEnvelope(result);
1238
- expect(envelope.ok).toBe(true);
1239
- expect(envelope.condensed).toBe(true);
1240
- expect(typeof envelope.text).toBe("string");
1241
- });
1242
-
1243
- it("info returns condensed text", async () => {
1244
- const result = await client.callTool({
1245
- name: "info",
1246
- arguments: { condensed: true },
1247
- });
1248
- const envelope = parseEnvelope(result);
1249
- expect(envelope.ok).toBe(true);
1250
- expect(envelope.condensed).toBe(true);
1251
- });
1252
-
1253
- it("ontology_list returns condensed text", async () => {
1254
- const result = await client.callTool({
1255
- name: "ontology_list",
1256
- arguments: { condensed: true },
1257
- });
1258
- const envelope = parseEnvelope(result);
1259
- expect(envelope.ok).toBe(true);
1260
- expect(envelope.condensed).toBe(true);
1261
- expect((envelope.text as string).length).toBeGreaterThan(0);
1262
- });
1263
-
1264
- it.skipIf(!TOKEN_READ_SURFACE_ENABLED)(
1265
- "token_lookup returns condensed text",
1266
- async () => {
1267
- const result = await client.callTool({
1268
- name: "token_lookup",
1269
- arguments: { names: ["color.primary"], condensed: true },
1270
- });
1271
- const envelope = parseEnvelope(result);
1272
- expect(envelope.ok).toBe(true);
1273
- expect(envelope.condensed).toBe(true);
1274
- expect(typeof envelope.text).toBe("string");
1275
- },
1276
- );
1277
- });