@canonical/pragma-cli 0.31.0 → 0.33.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 (1091) hide show
  1. package/README.md +35 -421
  2. package/dist/pragma +0 -0
  3. package/package.json +28 -42
  4. package/src/bin.ts +292 -11
  5. package/src/capabilities/block/blockList.test.ts +79 -0
  6. package/src/capabilities/block/blockList.verb.ts +163 -0
  7. package/src/capabilities/block/index.ts +25 -0
  8. package/src/capabilities/block/pack.ts +166 -0
  9. package/src/capabilities/block/parity.test.ts +187 -0
  10. package/src/capabilities/block/tierChain.ts +78 -0
  11. package/src/capabilities/capabilities/capabilities.render.ts +89 -0
  12. package/src/capabilities/capabilities/capabilities.test.ts +140 -0
  13. package/src/capabilities/capabilities/capabilities.verb.ts +48 -0
  14. package/src/capabilities/capabilities/catalog.ts +148 -0
  15. package/src/capabilities/capabilities/hints.ts +212 -0
  16. package/src/capabilities/capabilities/index.ts +13 -0
  17. package/src/capabilities/capabilities/types.ts +60 -0
  18. package/src/capabilities/colophon/collectColophon.ts +68 -0
  19. package/src/capabilities/colophon/colophon.render.test.ts +114 -0
  20. package/src/capabilities/colophon/colophon.render.ts +47 -0
  21. package/src/capabilities/colophon/colophon.test.ts +241 -0
  22. package/src/capabilities/colophon/colophon.verb.ts +44 -0
  23. package/src/capabilities/colophon/index.ts +6 -0
  24. package/src/capabilities/colophon/markdownTerminal.test.ts +50 -0
  25. package/src/capabilities/colophon/markdownTerminal.ts +104 -0
  26. package/src/capabilities/colophon/pragmaColophon.ts +66 -0
  27. package/src/capabilities/colophon/types.ts +29 -0
  28. package/src/capabilities/config/collectConfigShow.ts +32 -0
  29. package/src/capabilities/config/field.render.ts +28 -0
  30. package/src/capabilities/config/fields.ts +81 -0
  31. package/src/capabilities/config/index.ts +6 -0
  32. package/src/capabilities/config/runField.ts +59 -0
  33. package/src/capabilities/config/runSet.ts +38 -0
  34. package/src/capabilities/config/set.test.ts +207 -0
  35. package/src/capabilities/config/set.verb.ts +70 -0
  36. package/src/capabilities/config/show.render.test.ts +65 -0
  37. package/src/capabilities/config/show.render.ts +107 -0
  38. package/src/capabilities/config/show.verb.ts +45 -0
  39. package/src/capabilities/config/types.ts +27 -0
  40. package/src/capabilities/create/byteEquality.subprocess.test.ts +88 -0
  41. package/src/capabilities/create/byteEquality.test.ts +225 -0
  42. package/src/capabilities/create/compiledCreate.subprocess.test.ts +152 -0
  43. package/src/capabilities/create/create.mcp.test.ts +139 -0
  44. package/src/capabilities/create/create.render.ts +50 -0
  45. package/src/capabilities/create/create.test.ts +432 -0
  46. package/src/capabilities/create/create.verb.ts +493 -0
  47. package/src/capabilities/create/cwdJail.test.ts +129 -0
  48. package/src/capabilities/create/generatorToVerbSpec.ts +111 -0
  49. package/src/capabilities/create/index.ts +25 -0
  50. package/src/capabilities/create/pathJail.ts +73 -0
  51. package/src/capabilities/create/pickGenerator.ts +63 -0
  52. package/src/capabilities/create/templates.embedded.generated.ts +53 -0
  53. package/src/capabilities/create/types.ts +8 -0
  54. package/src/capabilities/doctor/checks/checkConfigFile.ts +41 -0
  55. package/src/capabilities/doctor/checks/checkKeStore.ts +39 -0
  56. package/src/capabilities/doctor/checks/checkMcpCommands.ts +114 -0
  57. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +67 -0
  58. package/src/capabilities/doctor/checks/checkNodeVersion.ts +25 -0
  59. package/src/capabilities/doctor/checks/checkPackageRefs.ts +73 -0
  60. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +22 -0
  61. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +111 -0
  62. package/src/capabilities/doctor/checks/checkShellCompletions.ts +131 -0
  63. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +60 -0
  64. package/src/capabilities/doctor/checks/deriveBand.test.ts +42 -0
  65. package/src/capabilities/doctor/checks/deriveBand.ts +28 -0
  66. package/src/capabilities/doctor/doctor.render.test.ts +170 -0
  67. package/src/capabilities/doctor/doctor.render.ts +198 -0
  68. package/src/capabilities/doctor/doctor.test.ts +209 -0
  69. package/src/capabilities/doctor/doctor.verb.ts +46 -0
  70. package/src/capabilities/doctor/index.ts +6 -0
  71. package/src/capabilities/doctor/runChecks.ts +100 -0
  72. package/src/capabilities/doctor/types.ts +56 -0
  73. package/src/capabilities/emptyRecovery.test.ts +112 -0
  74. package/src/capabilities/graph/index.ts +21 -0
  75. package/src/capabilities/graph/inspect.render.ts +38 -0
  76. package/src/capabilities/graph/inspect.test.ts +80 -0
  77. package/src/capabilities/graph/inspect.verb.ts +51 -0
  78. package/src/capabilities/graph/query.render.ts +77 -0
  79. package/src/capabilities/graph/query.test.ts +156 -0
  80. package/src/capabilities/graph/query.verb.ts +58 -0
  81. package/src/capabilities/graph/runQuery.ts +49 -0
  82. package/src/capabilities/index.ts +54 -0
  83. package/src/capabilities/info/collectInfo.ts +76 -0
  84. package/src/capabilities/info/index.ts +6 -0
  85. package/src/capabilities/info/info.render.ts +72 -0
  86. package/src/capabilities/info/info.test.ts +127 -0
  87. package/src/capabilities/info/info.verb.ts +46 -0
  88. package/src/capabilities/info/types.ts +42 -0
  89. package/src/capabilities/lazy.test.ts +89 -0
  90. package/src/capabilities/meta/complete.verb.ts +52 -0
  91. package/src/capabilities/meta/index.ts +15 -0
  92. package/src/capabilities/meta/mcp.verb.ts +35 -0
  93. package/src/capabilities/modifier/index.ts +15 -0
  94. package/src/capabilities/modifier/pack.ts +64 -0
  95. package/src/capabilities/ontology/index.ts +19 -0
  96. package/src/capabilities/ontology/ontology.test.ts +246 -0
  97. package/src/capabilities/ontology/queries.ts +197 -0
  98. package/src/capabilities/ontology/render.ts +87 -0
  99. package/src/capabilities/ontology/verbs.ts +269 -0
  100. package/src/capabilities/prompt/index.ts +18 -0
  101. package/src/capabilities/prompt/prompt.render.test.ts +94 -0
  102. package/src/capabilities/prompt/prompt.render.ts +87 -0
  103. package/src/capabilities/prompt/prompt.test.ts +180 -0
  104. package/src/capabilities/prompt/types.ts +30 -0
  105. package/src/capabilities/prompt/verbs.ts +93 -0
  106. package/src/capabilities/reference.test.ts +32 -0
  107. package/src/capabilities/resources/index.ts +15 -0
  108. package/src/capabilities/resources/provider.ts +245 -0
  109. package/src/capabilities/resources/resources.test.ts +213 -0
  110. package/src/capabilities/roundtrip.test.ts +107 -0
  111. package/src/capabilities/scopeTypeSync.test.ts +37 -0
  112. package/src/capabilities/setup/index.ts +12 -0
  113. package/src/capabilities/setup/operations/setupCompletions.ts +141 -0
  114. package/src/capabilities/setup/operations/setupGenerator.ts +403 -0
  115. package/src/capabilities/setup/operations/setupLsp.ts +105 -0
  116. package/src/capabilities/setup/operations/setupMcp.ts +262 -0
  117. package/src/capabilities/setup/operations/setupSkills.ts +205 -0
  118. package/src/capabilities/setup/setup.render.test.ts +109 -0
  119. package/src/capabilities/setup/setup.render.ts +96 -0
  120. package/src/capabilities/setup/setup.test.ts +702 -0
  121. package/src/capabilities/setup/setup.verb.ts +261 -0
  122. package/src/capabilities/setup/shell.ts +85 -0
  123. package/src/capabilities/setup/types.ts +99 -0
  124. package/src/capabilities/shared/assertExecOk.ts +106 -0
  125. package/src/capabilities/shared/bands.ts +16 -0
  126. package/src/capabilities/shared/packageManager.ts +62 -0
  127. package/src/capabilities/shared/registry.ts +70 -0
  128. package/src/capabilities/skill/discover.ts +178 -0
  129. package/src/capabilities/skill/index.ts +12 -0
  130. package/src/capabilities/skill/render.ts +60 -0
  131. package/src/capabilities/skill/skill.test.ts +142 -0
  132. package/src/capabilities/skill/verbs.ts +100 -0
  133. package/src/capabilities/sources/collectStatus.ts +102 -0
  134. package/src/capabilities/sources/index.ts +15 -0
  135. package/src/capabilities/sources/installSkills.ts +124 -0
  136. package/src/capabilities/sources/runUpdate.ts +464 -0
  137. package/src/capabilities/sources/sources.test.ts +828 -0
  138. package/src/capabilities/sources/status.render.test.ts +65 -0
  139. package/src/capabilities/sources/status.render.ts +83 -0
  140. package/src/capabilities/sources/status.verb.ts +42 -0
  141. package/src/capabilities/sources/types.ts +51 -0
  142. package/src/capabilities/sources/update.render.ts +35 -0
  143. package/src/capabilities/sources/update.verb.ts +76 -0
  144. package/src/capabilities/standard/index.ts +18 -0
  145. package/src/capabilities/standard/pack.ts +128 -0
  146. package/src/capabilities/standard/parity.test.ts +208 -0
  147. package/src/capabilities/surface.test.ts +233 -0
  148. package/src/capabilities/tier/index.ts +19 -0
  149. package/src/capabilities/tier/lookup.render.test.ts +72 -0
  150. package/src/capabilities/tier/lookup.render.ts +59 -0
  151. package/src/capabilities/tier/lookup.test.ts +83 -0
  152. package/src/capabilities/tier/lookup.verb.ts +44 -0
  153. package/src/capabilities/tier/pack.ts +28 -0
  154. package/src/capabilities/tier/runLookup.ts +87 -0
  155. package/src/capabilities/token/addConfig.render.ts +27 -0
  156. package/src/capabilities/token/addConfig.test.ts +62 -0
  157. package/src/capabilities/token/addConfig.verb.ts +40 -0
  158. package/src/capabilities/token/index.ts +19 -0
  159. package/src/capabilities/token/pack.ts +58 -0
  160. package/src/capabilities/token/runAddConfig.ts +95 -0
  161. package/src/capabilities/upgrade/index.ts +6 -0
  162. package/src/capabilities/upgrade/runUpgrade.ts +119 -0
  163. package/src/capabilities/upgrade/types.ts +21 -0
  164. package/src/capabilities/upgrade/upgrade.render.ts +55 -0
  165. package/src/capabilities/upgrade/upgrade.test.ts +372 -0
  166. package/src/capabilities/upgrade/upgrade.verb.ts +56 -0
  167. package/src/constants.test.ts +33 -0
  168. package/src/constants.ts +38 -70
  169. package/src/index.ts +27 -122
  170. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +339 -0
  171. package/src/kernel/completion/bashDrive.test.ts +73 -0
  172. package/src/kernel/completion/complete.test.ts +99 -0
  173. package/src/kernel/completion/complete.ts +77 -0
  174. package/src/kernel/completion/emitScripts.test.ts +173 -0
  175. package/src/kernel/completion/emitScripts.ts +122 -0
  176. package/src/kernel/completion/entitySource.test.ts +198 -0
  177. package/src/kernel/completion/entitySource.ts +277 -0
  178. package/src/kernel/completion/index.ts +42 -0
  179. package/src/kernel/completion/model.test.ts +405 -0
  180. package/src/kernel/completion/model.ts +258 -0
  181. package/src/kernel/completion/parse.test.ts +336 -0
  182. package/src/kernel/completion/parse.ts +294 -0
  183. package/src/kernel/completion/rank.test.ts +100 -0
  184. package/src/kernel/completion/rank.ts +118 -0
  185. package/src/kernel/completion/resolve.test.ts +204 -0
  186. package/src/kernel/completion/resolve.ts +133 -0
  187. package/src/kernel/completion/safety.test.ts +374 -0
  188. package/src/kernel/completion/templates/bash.ts +249 -0
  189. package/src/kernel/completion/templates/fish.ts +245 -0
  190. package/src/kernel/completion/templates/shared.ts +134 -0
  191. package/src/kernel/completion/templates/zsh.ts +246 -0
  192. package/src/kernel/completion/types.ts +153 -0
  193. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +11 -0
  194. package/src/kernel/config/defaults.ts +28 -0
  195. package/src/kernel/config/evaluateProjectConfig.ts +119 -0
  196. package/src/kernel/config/findProjectConfig.ts +45 -0
  197. package/src/kernel/config/firstRun.test.ts +60 -0
  198. package/src/kernel/config/firstRun.ts +91 -0
  199. package/src/kernel/config/globalConfig.ts +94 -0
  200. package/src/kernel/config/index.ts +35 -0
  201. package/src/kernel/config/paths.ts +39 -0
  202. package/src/kernel/config/readConfig.test.ts +245 -0
  203. package/src/kernel/config/readConfig.ts +94 -0
  204. package/src/kernel/config/schema.ts +56 -0
  205. package/src/kernel/config/types.ts +106 -0
  206. package/src/kernel/config/writeConfigField.ts +82 -0
  207. package/src/kernel/error/PragmaError.test.ts +119 -0
  208. package/src/kernel/error/PragmaError.ts +182 -0
  209. package/src/kernel/error/constants.ts +38 -0
  210. package/src/kernel/error/fromTaskError.test.ts +83 -0
  211. package/src/kernel/error/fromTaskError.ts +80 -0
  212. package/src/kernel/error/index.ts +23 -0
  213. package/src/kernel/error/recovery.test.ts +60 -0
  214. package/src/kernel/error/recovery.ts +49 -0
  215. package/src/kernel/error/renderError.ts +101 -0
  216. package/src/kernel/error/serialize.ts +28 -0
  217. package/src/kernel/error/types.ts +62 -0
  218. package/src/kernel/packs/collect.test.ts +138 -0
  219. package/src/kernel/packs/collect.ts +108 -0
  220. package/src/kernel/packs/compile.test.ts +229 -0
  221. package/src/kernel/packs/compile.ts +315 -0
  222. package/src/kernel/packs/disclosure.test.ts +200 -0
  223. package/src/kernel/packs/disclosure.ts +98 -0
  224. package/src/kernel/packs/glob.ts +39 -0
  225. package/src/kernel/packs/graphql/buildLookupDocument.ts +397 -0
  226. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +217 -0
  227. package/src/kernel/packs/graphql/nameMap.ts +67 -0
  228. package/src/kernel/packs/graphqlSource.test.ts +383 -0
  229. package/src/kernel/packs/iri.ts +78 -0
  230. package/src/kernel/packs/renderPack.ts +196 -0
  231. package/src/kernel/packs/resolveEntity.ts +232 -0
  232. package/src/kernel/packs/runBodies.ts +157 -0
  233. package/src/kernel/packs/sample.ts +60 -0
  234. package/src/kernel/packs/schema.ts +328 -0
  235. package/src/kernel/packs/sparql/applyFilters.ts +83 -0
  236. package/src/kernel/packs/sparql/applySearch.ts +33 -0
  237. package/src/kernel/packs/sparql/buildLookupQuery.ts +180 -0
  238. package/src/kernel/packs/sparql/escape.ts +22 -0
  239. package/src/kernel/packs/sparql/runSelect.test.ts +80 -0
  240. package/src/kernel/packs/sparql/runSelect.ts +84 -0
  241. package/src/kernel/packs/toolDescription.test.ts +81 -0
  242. package/src/kernel/packs/types.ts +337 -0
  243. package/src/kernel/packs/uniqueness.ts +35 -0
  244. package/src/kernel/project/cli/buildProgram.test.ts +431 -0
  245. package/src/kernel/project/cli/buildProgram.ts +291 -0
  246. package/src/kernel/project/cli/dispatch.test.ts +288 -0
  247. package/src/kernel/project/cli/dispatch.ts +334 -0
  248. package/src/kernel/project/cli/exitCodes.test.ts +59 -0
  249. package/src/kernel/project/cli/exitCodes.ts +68 -0
  250. package/src/kernel/project/cli/globalFlags.test.ts +107 -0
  251. package/src/kernel/project/cli/globalFlags.ts +149 -0
  252. package/src/kernel/project/cli/helpFormat.ts +58 -0
  253. package/src/kernel/project/cli/index.ts +21 -0
  254. package/src/kernel/project/cli/interactionSeam.test.ts +99 -0
  255. package/src/kernel/project/cli/rootHelp.ts +220 -0
  256. package/src/kernel/project/cli/suggest.test.ts +54 -0
  257. package/src/kernel/project/cli/suggest.ts +67 -0
  258. package/src/kernel/project/cli/suggestNames.ts +122 -0
  259. package/src/kernel/project/cli/verbHelp.test.ts +138 -0
  260. package/src/kernel/project/cli/verbHelp.ts +144 -0
  261. package/src/kernel/project/mcp/buildServer.ts +70 -0
  262. package/src/kernel/project/mcp/envelope.ts +44 -0
  263. package/src/kernel/project/mcp/index.ts +8 -0
  264. package/src/kernel/project/mcp/instructions.ts +48 -0
  265. package/src/kernel/project/mcp/mcpError.ts +52 -0
  266. package/src/kernel/project/mcp/parity.test.ts +72 -0
  267. package/src/kernel/project/mcp/prompts/prompts.test.ts +104 -0
  268. package/src/kernel/project/mcp/prompts/provider.ts +104 -0
  269. package/src/kernel/project/mcp/prompts/source.ts +194 -0
  270. package/src/kernel/project/mcp/registerVerb.test.ts +238 -0
  271. package/src/kernel/project/mcp/registerVerb.ts +296 -0
  272. package/src/kernel/project/mcp/serve.ts +34 -0
  273. package/src/kernel/project/mcp/toolDescriptions.test.ts +80 -0
  274. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +127 -0
  275. package/src/kernel/render/compactUri.ts +25 -0
  276. package/src/kernel/render/contracts.ts +72 -0
  277. package/src/kernel/render/disclosure.ts +44 -0
  278. package/src/kernel/render/envelope.ts +50 -0
  279. package/src/kernel/render/formatters.ts +31 -0
  280. package/src/kernel/render/index.ts +30 -0
  281. package/src/kernel/render/prefixes.ts +21 -0
  282. package/src/kernel/render/renderers.test.ts +205 -0
  283. package/src/kernel/render/renderers.ts +447 -0
  284. package/src/kernel/render/style.test.ts +31 -0
  285. package/src/kernel/render/style.ts +74 -0
  286. package/src/kernel/render/writeStdout.test.ts +43 -0
  287. package/src/kernel/render/writeStdout.ts +49 -0
  288. package/src/kernel/runtime/boot.test.ts +69 -0
  289. package/src/kernel/runtime/boot.ts +59 -0
  290. package/src/kernel/runtime/facade.test.ts +125 -0
  291. package/src/kernel/runtime/facade.ts +47 -0
  292. package/src/kernel/runtime/graphpack/build.ts +176 -0
  293. package/src/kernel/runtime/graphpack/buildIndex.test.ts +103 -0
  294. package/src/kernel/runtime/graphpack/buildIndex.ts +317 -0
  295. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -0
  296. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -0
  297. package/src/kernel/runtime/graphpack/embedded/sample.ttl +39 -0
  298. package/src/kernel/runtime/graphpack/embedded.ts +70 -0
  299. package/src/kernel/runtime/graphpack/graphpack.test.ts +221 -0
  300. package/src/kernel/runtime/graphpack/hash.ts +46 -0
  301. package/src/kernel/runtime/graphpack/index.ts +21 -0
  302. package/src/kernel/runtime/graphpack/manifest.ts +55 -0
  303. package/src/kernel/runtime/graphpack/read.ts +117 -0
  304. package/src/kernel/runtime/graphpack/types.ts +125 -0
  305. package/src/kernel/runtime/index.ts +15 -0
  306. package/src/kernel/runtime/loadSession.ts +48 -0
  307. package/src/kernel/runtime/lock.ts +90 -0
  308. package/src/kernel/runtime/paths.ts +37 -0
  309. package/src/kernel/runtime/probe.test.ts +16 -0
  310. package/src/kernel/runtime/probe.ts +39 -0
  311. package/src/kernel/runtime/readEntity.ts +83 -0
  312. package/src/kernel/runtime/refs/gitOps.ts +88 -0
  313. package/src/kernel/runtime/refs/parseRef.test.ts +34 -0
  314. package/src/kernel/runtime/refs/parseRef.ts +103 -0
  315. package/src/kernel/runtime/refs/resolve.ts +380 -0
  316. package/src/kernel/runtime/resolveSources.test.ts +154 -0
  317. package/src/kernel/runtime/resolveSources.ts +66 -0
  318. package/src/kernel/runtime/store.test.ts +94 -0
  319. package/src/kernel/runtime/store.ts +90 -0
  320. package/src/kernel/runtime/storeReadiness.ts +61 -0
  321. package/src/kernel/runtime/storeless.test.ts +86 -0
  322. package/src/kernel/runtime/types.ts +210 -0
  323. package/src/kernel/runtime/wasmEmbed.test.ts +144 -0
  324. package/src/kernel/spec/asVerb.ts +23 -0
  325. package/src/kernel/spec/emitReference.test.ts +196 -0
  326. package/src/kernel/spec/emitReference.ts +491 -0
  327. package/src/kernel/spec/emitSurface.test.ts +65 -0
  328. package/src/kernel/spec/emitSurface.ts +225 -0
  329. package/src/kernel/spec/index.ts +36 -0
  330. package/src/kernel/spec/surfaceConformance.test.ts +94 -0
  331. package/src/kernel/spec/surfaceConformance.ts +135 -0
  332. package/src/kernel/spec/types.ts +233 -0
  333. package/src/kernel/spec/validate.test.ts +81 -0
  334. package/src/kernel/spec/validate.ts +125 -0
  335. package/src/testing/PARITY_GAPS.test.ts +32 -0
  336. package/src/testing/PARITY_GAPS.ts +179 -0
  337. package/src/testing/behavioral/README.md +164 -0
  338. package/src/testing/behavioral/agentSession.mcp.test.ts +160 -0
  339. package/src/testing/behavioral/autoLlm.e2e.test.ts +54 -0
  340. package/src/testing/behavioral/completion.test.ts +132 -0
  341. package/src/testing/behavioral/disclosure.test.ts +115 -0
  342. package/src/testing/behavioral/docExamples.test.ts +283 -0
  343. package/src/testing/behavioral/errorMatrix.mcp.test.ts +120 -0
  344. package/src/testing/behavioral/errorMatrix.storeless.test.ts +124 -0
  345. package/src/testing/behavioral/exitCodes.e2e.test.ts +53 -0
  346. package/src/testing/behavioral/firstRun.e2e.test.ts +40 -0
  347. package/src/testing/behavioral/harness.foundation.test.ts +136 -0
  348. package/src/testing/behavioral/journeys.cli.test.ts +131 -0
  349. package/src/testing/behavioral/journeys.defaultPack.test.ts +571 -0
  350. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +66 -0
  351. package/src/testing/behavioral/journeys.livePack.e2e.test.ts +129 -0
  352. package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +176 -0
  353. package/src/testing/behavioral/liveReadSurface.ts +80 -0
  354. package/src/testing/behavioral/mcpServe.e2e.test.ts +21 -0
  355. package/src/testing/behavioral/mcpSurface.test.ts +139 -0
  356. package/src/testing/behavioral/parity.test.ts +224 -0
  357. package/src/testing/behavioral/rootCli.e2e.test.ts +62 -0
  358. package/src/testing/behavioral/staleCommands.test.ts +76 -0
  359. package/src/testing/eval/__snapshots__/eval.test.ts.snap +201 -0
  360. package/src/testing/eval/cases/assembly.ts +195 -0
  361. package/src/testing/eval/cases/effectful.ts +248 -0
  362. package/src/testing/eval/cases/readNouns.ts +235 -0
  363. package/src/testing/eval/cases/stable.ts +163 -0
  364. package/src/testing/eval/eval.test.ts +74 -0
  365. package/src/testing/eval/harness.ts +91 -0
  366. package/src/testing/eval/report.ts +58 -0
  367. package/src/testing/fixtures/blockGraph.ts +112 -0
  368. package/src/testing/fixtures/completionFixture.ts +239 -0
  369. package/src/testing/fixtures/fixtureCapability.ts +331 -0
  370. package/src/testing/fixtures/graph/canonical.ts +184 -0
  371. package/src/testing/fixtures/graph/defaultPack.ts +178 -0
  372. package/src/testing/fixtures/graph/owlExport.ts +95 -0
  373. package/src/testing/fixtures/packs/recipe.ts +78 -0
  374. package/src/testing/helpers/extractSnippets.ts +29 -0
  375. package/src/testing/helpers/fixtureGraph.ts +148 -0
  376. package/src/testing/helpers/golden.ts +45 -0
  377. package/src/testing/helpers/packRuntime.ts +118 -0
  378. package/src/testing/helpers/parity.ts +86 -0
  379. package/src/testing/helpers/projectCli.ts +35 -0
  380. package/src/testing/helpers/projectMcp.ts +145 -0
  381. package/src/testing/helpers/runCli.ts +128 -0
  382. package/src/testing/perf/budgets.test.ts +164 -0
  383. package/src/testing/perf/budgets.ts +37 -0
  384. package/src/testing/perf/globalSetup.ts +30 -0
  385. package/src/testing/perf/measure.ts +97 -0
  386. package/src/testing/setupXdgIsolation.ts +13 -12
  387. package/src/types.ts +42 -0
  388. package/src/bin.test.ts +0 -54
  389. package/src/compile-validation.runner.ts +0 -137
  390. package/src/compile-validation.ts +0 -191
  391. package/src/completions/computeSocketPath.test.ts +0 -26
  392. package/src/completions/computeSocketPath.ts +0 -16
  393. package/src/completions/constants.ts +0 -25
  394. package/src/completions/handleQuery.test.ts +0 -125
  395. package/src/completions/handleQuery.ts +0 -49
  396. package/src/completions/index.ts +0 -14
  397. package/src/completions/queryCompletions.test.ts +0 -105
  398. package/src/completions/queryCompletions.ts +0 -75
  399. package/src/completions/querySocket.test.ts +0 -101
  400. package/src/completions/querySocket.ts +0 -71
  401. package/src/completions/startCompletionsServer.test.ts +0 -74
  402. package/src/completions/startCompletionsServer.ts +0 -75
  403. package/src/completions/startCompletionsServer.unit.test.ts +0 -131
  404. package/src/completions/waitForSocket.test.ts +0 -27
  405. package/src/completions/waitForSocket.ts +0 -27
  406. package/src/config/configExists.ts +0 -14
  407. package/src/config/defaultConfig.test.ts +0 -33
  408. package/src/config/defaultConfig.ts +0 -59
  409. package/src/config/defaults.json +0 -17
  410. package/src/config/findProjectConfigPath.test.ts +0 -53
  411. package/src/config/findProjectConfigPath.ts +0 -36
  412. package/src/config/index.ts +0 -21
  413. package/src/config/mergeConfigFileUpdate.ts +0 -58
  414. package/src/config/parseConfigValues.ts +0 -217
  415. package/src/config/readConfig.test.ts +0 -395
  416. package/src/config/readConfig.ts +0 -21
  417. package/src/config/readConfigLayers.test.ts +0 -109
  418. package/src/config/readConfigLayers.ts +0 -118
  419. package/src/config/resolveConfigPath.test.ts +0 -20
  420. package/src/config/resolveConfigPath.ts +0 -11
  421. package/src/config/resolveGlobalConfigPath.ts +0 -13
  422. package/src/config/resolveWriteConfigPath.test.ts +0 -53
  423. package/src/config/resolveWriteConfigPath.ts +0 -31
  424. package/src/config/types.ts +0 -128
  425. package/src/config/writeConfig.ts +0 -37
  426. package/src/domains/block/blockConfig.ts +0 -97
  427. package/src/domains/block/commands/index.ts +0 -5
  428. package/src/domains/block/commands/list.test.ts +0 -111
  429. package/src/domains/block/commands/list.ts +0 -11
  430. package/src/domains/block/commands/lookup.test.ts +0 -187
  431. package/src/domains/block/commands/lookup.ts +0 -14
  432. package/src/domains/block/commands/sample.ts +0 -56
  433. package/src/domains/block/formatters/index.ts +0 -5
  434. package/src/domains/block/formatters/list.test.ts +0 -107
  435. package/src/domains/block/formatters/list.ts +0 -50
  436. package/src/domains/block/formatters/lookup.test.ts +0 -318
  437. package/src/domains/block/formatters/lookup.ts +0 -149
  438. package/src/domains/block/formatters/sample.ts +0 -21
  439. package/src/domains/block/formatters/types.ts +0 -16
  440. package/src/domains/block/helpers/index.ts +0 -4
  441. package/src/domains/block/helpers/resolveAspects.test.ts +0 -64
  442. package/src/domains/block/helpers/resolveAspects.ts +0 -35
  443. package/src/domains/block/index.ts +0 -25
  444. package/src/domains/block/mcp/index.ts +0 -2
  445. package/src/domains/block/mcp/specs.ts +0 -67
  446. package/src/domains/block/operations/index.ts +0 -5
  447. package/src/domains/block/operations/list.test.ts +0 -80
  448. package/src/domains/block/operations/list.ts +0 -72
  449. package/src/domains/block/operations/lookup.test.ts +0 -129
  450. package/src/domains/block/operations/lookup.ts +0 -446
  451. package/src/domains/block/operations/sample.ts +0 -41
  452. package/src/domains/block/orchestration/blockEmptyError.test.ts +0 -26
  453. package/src/domains/block/orchestration/blockEmptyError.ts +0 -19
  454. package/src/domains/block/orchestration/buildBlockFilters.ts +0 -12
  455. package/src/domains/block/orchestration/enrichBlocks.ts +0 -44
  456. package/src/domains/block/orchestration/index.ts +0 -5
  457. package/src/domains/block/orchestration/resolveBlockList.ts +0 -39
  458. package/src/domains/block/orchestration/resolveBlockLookup.ts +0 -35
  459. package/src/domains/block/stories.test.ts +0 -28
  460. package/src/domains/block/stories.ts +0 -260
  461. package/src/domains/block/types.ts +0 -30
  462. package/src/domains/config/commands/channel.test.ts +0 -128
  463. package/src/domains/config/commands/channel.ts +0 -99
  464. package/src/domains/config/commands/configScope.ts +0 -46
  465. package/src/domains/config/commands/framework.test.ts +0 -119
  466. package/src/domains/config/commands/framework.ts +0 -103
  467. package/src/domains/config/commands/index.ts +0 -6
  468. package/src/domains/config/commands/show.test.ts +0 -61
  469. package/src/domains/config/commands/show.ts +0 -11
  470. package/src/domains/config/commands/tier.test.ts +0 -102
  471. package/src/domains/config/commands/tier.ts +0 -97
  472. package/src/domains/config/commands/trace.test.ts +0 -165
  473. package/src/domains/config/commands/trace.ts +0 -83
  474. package/src/domains/config/formatters/channel.test.ts +0 -70
  475. package/src/domains/config/formatters/channel.ts +0 -37
  476. package/src/domains/config/formatters/framework.ts +0 -37
  477. package/src/domains/config/formatters/index.ts +0 -6
  478. package/src/domains/config/formatters/show.test.ts +0 -153
  479. package/src/domains/config/formatters/show.ts +0 -89
  480. package/src/domains/config/formatters/tier.test.ts +0 -86
  481. package/src/domains/config/formatters/tier.ts +0 -48
  482. package/src/domains/config/formatters/trace.ts +0 -28
  483. package/src/domains/config/index.ts +0 -36
  484. package/src/domains/config/mcp/index.ts +0 -2
  485. package/src/domains/config/mcp/specs.ts +0 -100
  486. package/src/domains/config/operations/index.ts +0 -6
  487. package/src/domains/config/operations/show.test.ts +0 -78
  488. package/src/domains/config/operations/show.ts +0 -48
  489. package/src/domains/config/operations/types.ts +0 -20
  490. package/src/domains/config/operations/validateChannel.test.ts +0 -36
  491. package/src/domains/config/operations/validateChannel.ts +0 -24
  492. package/src/domains/config/operations/validateFramework.ts +0 -24
  493. package/src/domains/config/operations/validateTier.test.ts +0 -65
  494. package/src/domains/config/operations/validateTier.ts +0 -43
  495. package/src/domains/config/stories.ts +0 -42
  496. package/src/domains/config/tasks/index.ts +0 -6
  497. package/src/domains/config/tasks/setChannel.ts +0 -21
  498. package/src/domains/config/tasks/setFramework.ts +0 -21
  499. package/src/domains/config/tasks/setTier.ts +0 -20
  500. package/src/domains/config/tasks/setTrace.ts +0 -20
  501. package/src/domains/config/tasks/writeConfigField.ts +0 -41
  502. package/src/domains/create/generatorPack/bundled.ts +0 -49
  503. package/src/domains/create/generatorPack/compileGeneratorPack.test.ts +0 -159
  504. package/src/domains/create/generatorPack/compileGeneratorPack.ts +0 -312
  505. package/src/domains/create/index.ts +0 -21
  506. package/src/domains/create/mcp/index.ts +0 -2
  507. package/src/domains/create/mcp/specs.ts +0 -13
  508. package/src/domains/create/renderGeneratorUi.test.ts +0 -103
  509. package/src/domains/create/renderGeneratorUi.ts +0 -65
  510. package/src/domains/doctor/commands/doctor.test.ts +0 -75
  511. package/src/domains/doctor/commands/doctor.ts +0 -43
  512. package/src/domains/doctor/commands/index.ts +0 -2
  513. package/src/domains/doctor/formatters/doctor.test.ts +0 -165
  514. package/src/domains/doctor/formatters/doctor.ts +0 -136
  515. package/src/domains/doctor/formatters/index.ts +0 -2
  516. package/src/domains/doctor/index.ts +0 -9
  517. package/src/domains/doctor/mcp/index.ts +0 -2
  518. package/src/domains/doctor/mcp/specs.ts +0 -41
  519. package/src/domains/doctor/operations/checks/checkConfigFile.ts +0 -42
  520. package/src/domains/doctor/operations/checks/checkKeStore.ts +0 -38
  521. package/src/domains/doctor/operations/checks/checkMcpCommands.ts +0 -133
  522. package/src/domains/doctor/operations/checks/checkMcpConfigured.ts +0 -65
  523. package/src/domains/doctor/operations/checks/checkNodeVersion.ts +0 -25
  524. package/src/domains/doctor/operations/checks/checkPackageRefs.ts +0 -76
  525. package/src/domains/doctor/operations/checks/checkPragmaVersion.ts +0 -20
  526. package/src/domains/doctor/operations/checks/checkShellCompletions.ts +0 -42
  527. package/src/domains/doctor/operations/checks/checkSkillsSymlinked.ts +0 -64
  528. package/src/domains/doctor/operations/checks/index.ts +0 -10
  529. package/src/domains/doctor/operations/checks.test.ts +0 -307
  530. package/src/domains/doctor/operations/index.ts +0 -3
  531. package/src/domains/doctor/operations/runChecks.test.ts +0 -176
  532. package/src/domains/doctor/operations/runChecks.ts +0 -78
  533. package/src/domains/doctor/operations/types.ts +0 -42
  534. package/src/domains/graph/commands/index.ts +0 -4
  535. package/src/domains/graph/commands/inspect.test.ts +0 -94
  536. package/src/domains/graph/commands/inspect.ts +0 -63
  537. package/src/domains/graph/commands/query.test.ts +0 -94
  538. package/src/domains/graph/commands/query.ts +0 -60
  539. package/src/domains/graph/formatters/index.ts +0 -4
  540. package/src/domains/graph/formatters/inspect.ts +0 -50
  541. package/src/domains/graph/formatters/query.test.ts +0 -87
  542. package/src/domains/graph/formatters/query.ts +0 -74
  543. package/src/domains/graph/helpers/index.ts +0 -3
  544. package/src/domains/graph/helpers/resolveUri.test.ts +0 -50
  545. package/src/domains/graph/helpers/resolveUri.ts +0 -77
  546. package/src/domains/graph/index.ts +0 -22
  547. package/src/domains/graph/mcp/index.ts +0 -2
  548. package/src/domains/graph/mcp/specs.ts +0 -82
  549. package/src/domains/graph/operations/executeQuery.test.ts +0 -68
  550. package/src/domains/graph/operations/executeQuery.ts +0 -32
  551. package/src/domains/graph/operations/index.ts +0 -4
  552. package/src/domains/graph/operations/inspectUri.test.ts +0 -101
  553. package/src/domains/graph/operations/inspectUri.ts +0 -64
  554. package/src/domains/graphql/commands/build.test.ts +0 -196
  555. package/src/domains/graphql/commands/build.ts +0 -117
  556. package/src/domains/graphql/commands/check.test.ts +0 -141
  557. package/src/domains/graphql/commands/check.ts +0 -81
  558. package/src/domains/graphql/commands/index.ts +0 -5
  559. package/src/domains/graphql/commands/serve.test.ts +0 -46
  560. package/src/domains/graphql/commands/serve.ts +0 -141
  561. package/src/domains/graphql/constants.ts +0 -10
  562. package/src/domains/graphql/formatters/index.ts +0 -3
  563. package/src/domains/graphql/formatters/report.ts +0 -78
  564. package/src/domains/graphql/helpers/gatherSources.test.ts +0 -92
  565. package/src/domains/graphql/helpers/gatherSources.ts +0 -58
  566. package/src/domains/graphql/helpers/index.ts +0 -6
  567. package/src/domains/graphql/helpers/parsePrefixes.test.ts +0 -44
  568. package/src/domains/graphql/helpers/parsePrefixes.ts +0 -38
  569. package/src/domains/graphql/helpers/resolveSourceFiles.test.ts +0 -65
  570. package/src/domains/graphql/helpers/resolveSourceFiles.ts +0 -66
  571. package/src/domains/graphql/helpers/routeGraphql.test.ts +0 -43
  572. package/src/domains/graphql/helpers/routeGraphql.ts +0 -28
  573. package/src/domains/graphql/index.ts +0 -24
  574. package/src/domains/graphql/operations/compileSchema.test.ts +0 -95
  575. package/src/domains/graphql/operations/compileSchema.ts +0 -107
  576. package/src/domains/graphql/operations/createSchemaServer.test.ts +0 -50
  577. package/src/domains/graphql/operations/createSchemaServer.ts +0 -75
  578. package/src/domains/graphql/operations/ensureSchemaArtifact.test.ts +0 -167
  579. package/src/domains/graphql/operations/ensureSchemaArtifact.ts +0 -178
  580. package/src/domains/graphql/operations/index.ts +0 -17
  581. package/src/domains/graphql/types.ts +0 -29
  582. package/src/domains/info/commands/index.ts +0 -4
  583. package/src/domains/info/commands/info.test.ts +0 -88
  584. package/src/domains/info/commands/info.ts +0 -47
  585. package/src/domains/info/commands/upgrade.test.ts +0 -183
  586. package/src/domains/info/commands/upgrade.ts +0 -153
  587. package/src/domains/info/constants.test.ts +0 -22
  588. package/src/domains/info/constants.ts +0 -15
  589. package/src/domains/info/formatters/index.ts +0 -8
  590. package/src/domains/info/formatters/info.test.ts +0 -207
  591. package/src/domains/info/formatters/info.ts +0 -131
  592. package/src/domains/info/formatters/upgrade.test.ts +0 -136
  593. package/src/domains/info/formatters/upgrade.ts +0 -70
  594. package/src/domains/info/index.ts +0 -9
  595. package/src/domains/info/mcp/index.ts +0 -2
  596. package/src/domains/info/mcp/specs.ts +0 -65
  597. package/src/domains/info/operations/checkRegistryVersion.test.ts +0 -124
  598. package/src/domains/info/operations/checkRegistryVersion.ts +0 -45
  599. package/src/domains/info/operations/collectEntityCounts.test.ts +0 -156
  600. package/src/domains/info/operations/collectEntityCounts.ts +0 -123
  601. package/src/domains/info/operations/collectInfo.test.ts +0 -122
  602. package/src/domains/info/operations/collectInfo.ts +0 -94
  603. package/src/domains/info/operations/collectStoreSummary.test.ts +0 -61
  604. package/src/domains/info/operations/collectStoreSummary.ts +0 -42
  605. package/src/domains/info/operations/index.ts +0 -6
  606. package/src/domains/info/types.test-d.ts +0 -35
  607. package/src/domains/info/types.ts +0 -67
  608. package/src/domains/llm/capabilities.test.ts +0 -111
  609. package/src/domains/llm/commands/capabilities.ts +0 -37
  610. package/src/domains/llm/commands/index.ts +0 -4
  611. package/src/domains/llm/commands/llm.ts +0 -41
  612. package/src/domains/llm/data/commandReference.ts +0 -106
  613. package/src/domains/llm/data/decisionTrees.ts +0 -55
  614. package/src/domains/llm/data/index.ts +0 -6
  615. package/src/domains/llm/data/toolCatalog.ts +0 -221
  616. package/src/domains/llm/formatters/capabilities.ts +0 -50
  617. package/src/domains/llm/formatters/index.ts +0 -4
  618. package/src/domains/llm/formatters/orientation.ts +0 -57
  619. package/src/domains/llm/index.ts +0 -9
  620. package/src/domains/llm/llmCommand.test.ts +0 -101
  621. package/src/domains/llm/mcp/index.ts +0 -2
  622. package/src/domains/llm/mcp/specs.ts +0 -93
  623. package/src/domains/llm/operations/collectContext.test.ts +0 -64
  624. package/src/domains/llm/operations/collectContext.ts +0 -37
  625. package/src/domains/llm/operations/index.ts +0 -3
  626. package/src/domains/llm/types.ts +0 -72
  627. package/src/domains/modifier/commands/index.ts +0 -5
  628. package/src/domains/modifier/commands/list.test.ts +0 -57
  629. package/src/domains/modifier/commands/list.ts +0 -9
  630. package/src/domains/modifier/commands/lookup.test.ts +0 -91
  631. package/src/domains/modifier/commands/lookup.ts +0 -14
  632. package/src/domains/modifier/commands/sample.ts +0 -54
  633. package/src/domains/modifier/formatters/index.ts +0 -8
  634. package/src/domains/modifier/formatters/list.test.ts +0 -38
  635. package/src/domains/modifier/formatters/list.ts +0 -22
  636. package/src/domains/modifier/formatters/lookup.test.ts +0 -33
  637. package/src/domains/modifier/formatters/lookup.ts +0 -50
  638. package/src/domains/modifier/formatters/sample.ts +0 -15
  639. package/src/domains/modifier/index.ts +0 -27
  640. package/src/domains/modifier/mcp/index.ts +0 -2
  641. package/src/domains/modifier/mcp/specs.ts +0 -65
  642. package/src/domains/modifier/modifierConfig.ts +0 -36
  643. package/src/domains/modifier/operations/index.ts +0 -5
  644. package/src/domains/modifier/operations/list.test.ts +0 -39
  645. package/src/domains/modifier/operations/list.ts +0 -41
  646. package/src/domains/modifier/operations/lookup.test.ts +0 -37
  647. package/src/domains/modifier/operations/lookup.ts +0 -69
  648. package/src/domains/modifier/operations/sample.ts +0 -32
  649. package/src/domains/modifier/orchestration/index.ts +0 -3
  650. package/src/domains/modifier/orchestration/modifierEmptyError.test.ts +0 -26
  651. package/src/domains/modifier/orchestration/modifierEmptyError.ts +0 -15
  652. package/src/domains/modifier/orchestration/resolveModifierList.ts +0 -16
  653. package/src/domains/modifier/orchestration/resolveModifierLookup.ts +0 -33
  654. package/src/domains/modifier/stories.test.ts +0 -20
  655. package/src/domains/modifier/stories.ts +0 -86
  656. package/src/domains/modifier/types.ts +0 -5
  657. package/src/domains/ontology/commands/index.ts +0 -4
  658. package/src/domains/ontology/commands/list.test.ts +0 -84
  659. package/src/domains/ontology/commands/list.ts +0 -11
  660. package/src/domains/ontology/commands/show.test.ts +0 -179
  661. package/src/domains/ontology/commands/show.ts +0 -14
  662. package/src/domains/ontology/formatters/index.ts +0 -5
  663. package/src/domains/ontology/formatters/list.ts +0 -64
  664. package/src/domains/ontology/formatters/show.ts +0 -396
  665. package/src/domains/ontology/helpers/buildClassTree.ts +0 -89
  666. package/src/domains/ontology/helpers/completeClassNames.ts +0 -43
  667. package/src/domains/ontology/helpers/expandOntologyIris.ts +0 -79
  668. package/src/domains/ontology/helpers/findNamespace.ts +0 -23
  669. package/src/domains/ontology/helpers/index.ts +0 -21
  670. package/src/domains/ontology/helpers/queryClasses.ts +0 -66
  671. package/src/domains/ontology/helpers/queryProperties.ts +0 -90
  672. package/src/domains/ontology/helpers/queryTboxFacts.ts +0 -160
  673. package/src/domains/ontology/helpers/resolvePrefix.ts +0 -45
  674. package/src/domains/ontology/index.ts +0 -26
  675. package/src/domains/ontology/mcp/index.ts +0 -2
  676. package/src/domains/ontology/mcp/specs.ts +0 -16
  677. package/src/domains/ontology/operations/index.ts +0 -5
  678. package/src/domains/ontology/operations/listOntologies.test.ts +0 -122
  679. package/src/domains/ontology/operations/listOntologies.ts +0 -197
  680. package/src/domains/ontology/operations/showOntology.test.ts +0 -184
  681. package/src/domains/ontology/operations/showOntology.ts +0 -323
  682. package/src/domains/ontology/operations/showOntologyRaw.test.ts +0 -41
  683. package/src/domains/ontology/operations/showOntologyRaw.ts +0 -50
  684. package/src/domains/ontology/stories.test.ts +0 -36
  685. package/src/domains/ontology/stories.ts +0 -153
  686. package/src/domains/refs/commands/updateRefs.ts +0 -52
  687. package/src/domains/refs/formatters/updateRefs.ts +0 -27
  688. package/src/domains/refs/index.ts +0 -27
  689. package/src/domains/refs/operations/gitOps.test.ts +0 -155
  690. package/src/domains/refs/operations/gitOps.ts +0 -92
  691. package/src/domains/refs/operations/index.ts +0 -10
  692. package/src/domains/refs/operations/parseRef.test.ts +0 -157
  693. package/src/domains/refs/operations/parseRef.ts +0 -114
  694. package/src/domains/refs/operations/paths.test.ts +0 -98
  695. package/src/domains/refs/operations/paths.ts +0 -91
  696. package/src/domains/refs/operations/readGlobalRefs.test.ts +0 -63
  697. package/src/domains/refs/operations/readGlobalRefs.ts +0 -37
  698. package/src/domains/refs/operations/updateRefs.test.ts +0 -167
  699. package/src/domains/refs/operations/updateRefs.ts +0 -180
  700. package/src/domains/setup/commands/all.ts +0 -58
  701. package/src/domains/setup/commands/completions.ts +0 -85
  702. package/src/domains/setup/commands/entrypoints.test.ts +0 -170
  703. package/src/domains/setup/commands/index.ts +0 -7
  704. package/src/domains/setup/commands/lsp.ts +0 -49
  705. package/src/domains/setup/commands/mcp.ts +0 -119
  706. package/src/domains/setup/commands/setup.ts +0 -70
  707. package/src/domains/setup/commands/skills.test.ts +0 -68
  708. package/src/domains/setup/commands/skills.ts +0 -110
  709. package/src/domains/setup/formatters/index.ts +0 -2
  710. package/src/domains/setup/formatters/skills.test.ts +0 -103
  711. package/src/domains/setup/formatters/skills.ts +0 -112
  712. package/src/domains/setup/formatters/types.ts +0 -7
  713. package/src/domains/setup/helpers/completionScripts.test.ts +0 -58
  714. package/src/domains/setup/helpers/completionScripts.ts +0 -92
  715. package/src/domains/setup/helpers/constants.ts +0 -2
  716. package/src/domains/setup/helpers/detectShell.test.ts +0 -48
  717. package/src/domains/setup/helpers/detectShell.ts +0 -20
  718. package/src/domains/setup/helpers/index.ts +0 -12
  719. package/src/domains/setup/helpers/runSetupTask.test.ts +0 -277
  720. package/src/domains/setup/helpers/runSetupTask.ts +0 -221
  721. package/src/domains/setup/index.ts +0 -37
  722. package/src/domains/setup/operations/index.ts +0 -6
  723. package/src/domains/setup/operations/setupAll.test.ts +0 -48
  724. package/src/domains/setup/operations/setupAll.ts +0 -41
  725. package/src/domains/setup/operations/setupCompletions.test.ts +0 -94
  726. package/src/domains/setup/operations/setupCompletions.ts +0 -54
  727. package/src/domains/setup/operations/setupLsp.test.ts +0 -30
  728. package/src/domains/setup/operations/setupLsp.ts +0 -22
  729. package/src/domains/setup/operations/setupMcp.test.ts +0 -120
  730. package/src/domains/setup/operations/setupMcp.ts +0 -108
  731. package/src/domains/setup/operations/setupSkills.test.ts +0 -191
  732. package/src/domains/setup/operations/setupSkills.ts +0 -160
  733. package/src/domains/setup/types.ts +0 -18
  734. package/src/domains/shared/ToolSpec.ts +0 -49
  735. package/src/domains/shared/bootStore.bareCore.test.ts +0 -63
  736. package/src/domains/shared/bootStore.test.ts +0 -82
  737. package/src/domains/shared/bootStore.ts +0 -171
  738. package/src/domains/shared/buildQuery.ts +0 -18
  739. package/src/domains/shared/compactUri.test.ts +0 -32
  740. package/src/domains/shared/compactUri.ts +0 -21
  741. package/src/domains/shared/context.ts +0 -16
  742. package/src/domains/shared/contracts.ts +0 -164
  743. package/src/domains/shared/createInteractivePromptSession.test.ts +0 -439
  744. package/src/domains/shared/createInteractivePromptSession.ts +0 -236
  745. package/src/domains/shared/emptyErrorRecovery.test.ts +0 -106
  746. package/src/domains/shared/extractLocalName.test.ts +0 -21
  747. package/src/domains/shared/extractLocalName.ts +0 -14
  748. package/src/domains/shared/filters/buildChannelFilter.test.ts +0 -52
  749. package/src/domains/shared/filters/buildChannelFilter.ts +0 -41
  750. package/src/domains/shared/filters/buildFilterConfig.ts +0 -15
  751. package/src/domains/shared/filters/buildFilters.test.ts +0 -33
  752. package/src/domains/shared/filters/buildFilters.ts +0 -30
  753. package/src/domains/shared/filters/buildTierFilter.test.ts +0 -78
  754. package/src/domains/shared/filters/buildTierFilter.ts +0 -69
  755. package/src/domains/shared/filters/describeFilters.ts +0 -14
  756. package/src/domains/shared/filters/index.ts +0 -10
  757. package/src/domains/shared/formatters.ts +0 -103
  758. package/src/domains/shared/listTiers.ts +0 -40
  759. package/src/domains/shared/loaders/bundledLoader.test.ts +0 -248
  760. package/src/domains/shared/loaders/bundledLoader.ts +0 -254
  761. package/src/domains/shared/loaders/gitLoader.ts +0 -30
  762. package/src/domains/shared/loaders/index.ts +0 -9
  763. package/src/domains/shared/loaders/localLoader.ts +0 -71
  764. package/src/domains/shared/loaders/readPackageDir.test.ts +0 -58
  765. package/src/domains/shared/loaders/readPackageDir.ts +0 -185
  766. package/src/domains/shared/loaders/storyAssetsPlugin.test.ts +0 -84
  767. package/src/domains/shared/loaders/storyAssetsPlugin.ts +0 -46
  768. package/src/domains/shared/lookupMany.test.ts +0 -135
  769. package/src/domains/shared/lookupMany.ts +0 -101
  770. package/src/domains/shared/mergeAndParseRefs.test.ts +0 -89
  771. package/src/domains/shared/mergeAndParseRefs.ts +0 -44
  772. package/src/domains/shared/namespaces.ts +0 -26
  773. package/src/domains/shared/packages.ts +0 -20
  774. package/src/domains/shared/parseSampleCount.test.ts +0 -47
  775. package/src/domains/shared/parseSampleCount.ts +0 -45
  776. package/src/domains/shared/pickRandom.ts +0 -22
  777. package/src/domains/shared/prefixes.test.ts +0 -211
  778. package/src/domains/shared/prefixes.ts +0 -204
  779. package/src/domains/shared/renderers.ts +0 -410
  780. package/src/domains/shared/resolveConfiguredGraphs.test.ts +0 -27
  781. package/src/domains/shared/resolveConfiguredGraphs.ts +0 -41
  782. package/src/domains/shared/resolveLookupExitCode.test.ts +0 -48
  783. package/src/domains/shared/resolveLookupExitCode.ts +0 -42
  784. package/src/domains/shared/runtime.ts +0 -61
  785. package/src/domains/shared/sampleFormatters.ts +0 -47
  786. package/src/domains/shared/semanticPackage.test.ts +0 -89
  787. package/src/domains/shared/semanticPackage.ts +0 -127
  788. package/src/domains/shared/stories/compileLookupCommand.test.ts +0 -145
  789. package/src/domains/shared/stories/compileLookupCommand.ts +0 -102
  790. package/src/domains/shared/stories/compileLookupTool.test.ts +0 -105
  791. package/src/domains/shared/stories/compileLookupTool.ts +0 -96
  792. package/src/domains/shared/stories/compileReadCommand.test.ts +0 -121
  793. package/src/domains/shared/stories/compileReadCommand.ts +0 -48
  794. package/src/domains/shared/stories/compileReadTool.test.ts +0 -64
  795. package/src/domains/shared/stories/compileReadTool.ts +0 -38
  796. package/src/domains/shared/stories/condense.test.ts +0 -18
  797. package/src/domains/shared/stories/condense.ts +0 -15
  798. package/src/domains/shared/stories/index.ts +0 -20
  799. package/src/domains/shared/stories/normalizeNames.test.ts +0 -20
  800. package/src/domains/shared/stories/normalizeNames.ts +0 -22
  801. package/src/domains/shared/stories/pack/applyPackFilters.test.ts +0 -151
  802. package/src/domains/shared/stories/pack/applyPackFilters.ts +0 -111
  803. package/src/domains/shared/stories/pack/applyPackSearch.test.ts +0 -57
  804. package/src/domains/shared/stories/pack/applyPackSearch.ts +0 -41
  805. package/src/domains/shared/stories/pack/buildLookupQuery.test.ts +0 -81
  806. package/src/domains/shared/stories/pack/buildLookupQuery.ts +0 -154
  807. package/src/domains/shared/stories/pack/bundled/index.ts +0 -23
  808. package/src/domains/shared/stories/pack/bundled/standardPack.ts +0 -164
  809. package/src/domains/shared/stories/pack/bundled/tierPack.ts +0 -50
  810. package/src/domains/shared/stories/pack/collectPackStories.test.ts +0 -406
  811. package/src/domains/shared/stories/pack/collectPackStories.ts +0 -158
  812. package/src/domains/shared/stories/pack/compilePackCommands.ts +0 -50
  813. package/src/domains/shared/stories/pack/compilePackStories.test.ts +0 -751
  814. package/src/domains/shared/stories/pack/compilePackStories.ts +0 -724
  815. package/src/domains/shared/stories/pack/compilePackToolSpecs.ts +0 -55
  816. package/src/domains/shared/stories/pack/index.ts +0 -42
  817. package/src/domains/shared/stories/pack/reservedVerbs.test.ts +0 -213
  818. package/src/domains/shared/stories/pack/reservedVerbs.ts +0 -170
  819. package/src/domains/shared/stories/pack/runSelectQuery.ts +0 -31
  820. package/src/domains/shared/stories/pack/standardParity.test.ts +0 -381
  821. package/src/domains/shared/stories/pack/types.ts +0 -224
  822. package/src/domains/shared/stories/pack/validateStoryPackDefinition.test.ts +0 -742
  823. package/src/domains/shared/stories/pack/validateStoryPackDefinition.ts +0 -859
  824. package/src/domains/shared/stories/projectCliParameters.test.ts +0 -59
  825. package/src/domains/shared/stories/projectCliParameters.ts +0 -57
  826. package/src/domains/shared/stories/projectToolParams.test.ts +0 -50
  827. package/src/domains/shared/stories/projectToolParams.ts +0 -32
  828. package/src/domains/shared/stories/requirePragmaContext.test.ts +0 -23
  829. package/src/domains/shared/stories/requirePragmaContext.ts +0 -23
  830. package/src/domains/shared/stories/resolveLookupDetailed.test.ts +0 -57
  831. package/src/domains/shared/stories/resolveLookupDetailed.ts +0 -27
  832. package/src/domains/shared/stories/types.ts +0 -179
  833. package/src/domains/shared/suggestions/detectCrossDomain.test.ts +0 -43
  834. package/src/domains/shared/suggestions/detectCrossDomain.ts +0 -116
  835. package/src/domains/shared/suggestions/expandGlob.test.ts +0 -92
  836. package/src/domains/shared/suggestions/expandGlob.ts +0 -52
  837. package/src/domains/shared/suggestions/expandLookupQueries.ts +0 -57
  838. package/src/domains/shared/suggestions/index.ts +0 -7
  839. package/src/domains/shared/suggestions/listDomainNames.ts +0 -61
  840. package/src/domains/shared/suggestions/suggestNames.test.ts +0 -70
  841. package/src/domains/shared/suggestions/suggestNames.ts +0 -130
  842. package/src/domains/shared/types/block.ts +0 -107
  843. package/src/domains/shared/types/common.ts +0 -33
  844. package/src/domains/shared/types/graph.ts +0 -17
  845. package/src/domains/shared/types/index.ts +0 -46
  846. package/src/domains/shared/types/modifier.ts +0 -22
  847. package/src/domains/shared/types/ontology.ts +0 -145
  848. package/src/domains/shared/types/runtime.ts +0 -24
  849. package/src/domains/shared/types/sample.ts +0 -17
  850. package/src/domains/shared/types/standard.ts +0 -21
  851. package/src/domains/shared/types/tier.ts +0 -15
  852. package/src/domains/shared/types/token.ts +0 -30
  853. package/src/domains/skill/commands/index.ts +0 -4
  854. package/src/domains/skill/commands/list.test.ts +0 -115
  855. package/src/domains/skill/commands/list.ts +0 -11
  856. package/src/domains/skill/commands/lookup.test.ts +0 -118
  857. package/src/domains/skill/commands/lookup.ts +0 -14
  858. package/src/domains/skill/formatters/index.ts +0 -3
  859. package/src/domains/skill/formatters/list.test.ts +0 -140
  860. package/src/domains/skill/formatters/list.ts +0 -119
  861. package/src/domains/skill/formatters/lookup.test.ts +0 -46
  862. package/src/domains/skill/formatters/lookup.ts +0 -57
  863. package/src/domains/skill/formatters/types.ts +0 -8
  864. package/src/domains/skill/helpers/index.ts +0 -6
  865. package/src/domains/skill/helpers/parseFrontmatter.test.ts +0 -122
  866. package/src/domains/skill/helpers/parseFrontmatter.ts +0 -112
  867. package/src/domains/skill/helpers/resolveSkillSources.ts +0 -70
  868. package/src/domains/skill/index.ts +0 -23
  869. package/src/domains/skill/mcp/index.ts +0 -2
  870. package/src/domains/skill/mcp/specs.ts +0 -19
  871. package/src/domains/skill/operations/discover.test.ts +0 -176
  872. package/src/domains/skill/operations/discover.ts +0 -59
  873. package/src/domains/skill/operations/index.ts +0 -5
  874. package/src/domains/skill/operations/list.test.ts +0 -76
  875. package/src/domains/skill/operations/list.ts +0 -47
  876. package/src/domains/skill/operations/lookup.test.ts +0 -91
  877. package/src/domains/skill/operations/lookup.ts +0 -70
  878. package/src/domains/skill/stories.test.ts +0 -43
  879. package/src/domains/skill/stories.ts +0 -103
  880. package/src/domains/skill/types.ts +0 -33
  881. package/src/domains/token/commands/add-config.test.ts +0 -68
  882. package/src/domains/token/commands/add-config.ts +0 -62
  883. package/src/domains/token/commands/index.ts +0 -6
  884. package/src/domains/token/commands/list.test.ts +0 -82
  885. package/src/domains/token/commands/list.ts +0 -54
  886. package/src/domains/token/commands/lookup.test.ts +0 -133
  887. package/src/domains/token/commands/lookup.ts +0 -107
  888. package/src/domains/token/commands/sample.ts +0 -54
  889. package/src/domains/token/featureFlag.ts +0 -17
  890. package/src/domains/token/formatters/index.ts +0 -8
  891. package/src/domains/token/formatters/list.test.ts +0 -37
  892. package/src/domains/token/formatters/list.ts +0 -24
  893. package/src/domains/token/formatters/lookup.test.ts +0 -61
  894. package/src/domains/token/formatters/lookup.ts +0 -107
  895. package/src/domains/token/formatters/sample.ts +0 -16
  896. package/src/domains/token/index.ts +0 -45
  897. package/src/domains/token/mcp/index.ts +0 -2
  898. package/src/domains/token/mcp/specs.ts +0 -207
  899. package/src/domains/token/operations/add-config.test.ts +0 -68
  900. package/src/domains/token/operations/add-config.ts +0 -61
  901. package/src/domains/token/operations/index.ts +0 -8
  902. package/src/domains/token/operations/list.test.ts +0 -50
  903. package/src/domains/token/operations/list.ts +0 -52
  904. package/src/domains/token/operations/lookup.test.ts +0 -42
  905. package/src/domains/token/operations/lookup.ts +0 -75
  906. package/src/domains/token/operations/sample.ts +0 -32
  907. package/src/domains/token/orchestration/index.ts +0 -3
  908. package/src/domains/token/orchestration/resolveTokenList.ts +0 -17
  909. package/src/domains/token/orchestration/resolveTokenLookup.ts +0 -33
  910. package/src/domains/token/orchestration/tokenEmptyError.test.ts +0 -33
  911. package/src/domains/token/orchestration/tokenEmptyError.ts +0 -20
  912. package/src/domains/token/tokenConfig.ts +0 -38
  913. package/src/domains/token/types.ts +0 -6
  914. package/src/domains/trace/commands/clear.ts +0 -71
  915. package/src/domains/trace/commands/index.ts +0 -5
  916. package/src/domains/trace/commands/resolveTraceLimit.test.ts +0 -31
  917. package/src/domains/trace/commands/sessions.ts +0 -32
  918. package/src/domains/trace/commands/show.ts +0 -171
  919. package/src/domains/trace/formatters/index.ts +0 -9
  920. package/src/domains/trace/formatters/sessions.ts +0 -80
  921. package/src/domains/trace/formatters/show.ts +0 -122
  922. package/src/domains/trace/index.ts +0 -17
  923. package/src/domains/trace/operations/index.ts +0 -8
  924. package/src/domains/trace/operations/listSessions.test.ts +0 -55
  925. package/src/domains/trace/operations/listSessions.ts +0 -52
  926. package/src/domains/trace/operations/readTraceLog.test.ts +0 -100
  927. package/src/domains/trace/operations/readTraceLog.ts +0 -104
  928. package/src/domains/trace/tracePlugin.test.ts +0 -171
  929. package/src/domains/trace/tracePlugin.ts +0 -159
  930. package/src/domains/trace/types.ts +0 -65
  931. package/src/embedWasm.ts +0 -42
  932. package/src/error/PragmaError.test.ts +0 -121
  933. package/src/error/PragmaError.ts +0 -177
  934. package/src/error/constants.ts +0 -12
  935. package/src/error/index.ts +0 -4
  936. package/src/error/types.ts +0 -55
  937. package/src/mcp/createMcpServer.test.ts +0 -41
  938. package/src/mcp/createMcpServer.ts +0 -53
  939. package/src/mcp/error/buildRecovery.test.ts +0 -37
  940. package/src/mcp/error/buildRecovery.ts +0 -17
  941. package/src/mcp/error/index.ts +0 -12
  942. package/src/mcp/error/serializeError.test.ts +0 -121
  943. package/src/mcp/error/serializeError.ts +0 -31
  944. package/src/mcp/error/serializeErrorPayload.test.ts +0 -38
  945. package/src/mcp/error/serializeErrorPayload.ts +0 -34
  946. package/src/mcp/error/types.ts +0 -59
  947. package/src/mcp/index.ts +0 -15
  948. package/src/mcp/registerResources.test.ts +0 -566
  949. package/src/mcp/registerResources.ts +0 -9
  950. package/src/mcp/resources/buildGraphIndex.ts +0 -167
  951. package/src/mcp/resources/buildResourceList.test.ts +0 -97
  952. package/src/mcp/resources/buildResourceList.ts +0 -176
  953. package/src/mcp/resources/classifyEntity.test.ts +0 -40
  954. package/src/mcp/resources/classifyEntity.ts +0 -27
  955. package/src/mcp/resources/constants.ts +0 -105
  956. package/src/mcp/resources/displayPredicates.ts +0 -62
  957. package/src/mcp/resources/pickFirstValue.test.ts +0 -29
  958. package/src/mcp/resources/pickFirstValue.ts +0 -26
  959. package/src/mcp/resources/pickPrimaryType.test.ts +0 -41
  960. package/src/mcp/resources/pickPrimaryType.ts +0 -26
  961. package/src/mcp/resources/rankUriCompletions.test.ts +0 -52
  962. package/src/mcp/resources/rankUriCompletions.ts +0 -64
  963. package/src/mcp/resources/readEntity.ts +0 -169
  964. package/src/mcp/resources/registerResources.ts +0 -126
  965. package/src/mcp/resources/types.ts +0 -128
  966. package/src/mcp/runMcpServer.test.ts +0 -66
  967. package/src/mcp/runMcpServer.ts +0 -24
  968. package/src/mcp/tools/index.ts +0 -74
  969. package/src/mcp/tools/registerFromSpec.ts +0 -97
  970. package/src/mcp/tools/registerTools.test.ts +0 -1277
  971. package/src/mcp/types.ts +0 -66
  972. package/src/mcp/utils/estimateTokens.test.ts +0 -14
  973. package/src/mcp/utils/estimateTokens.ts +0 -9
  974. package/src/mcp/utils/index.ts +0 -11
  975. package/src/mcp/utils/wrapTool.test.ts +0 -109
  976. package/src/mcp/utils/wrapTool.ts +0 -81
  977. package/src/package-manager/constants.ts +0 -29
  978. package/src/package-manager/detectInstallSource.test.ts +0 -23
  979. package/src/package-manager/detectInstallSource.ts +0 -111
  980. package/src/package-manager/detectLocalInstall.test.ts +0 -16
  981. package/src/package-manager/detectLocalInstall.ts +0 -43
  982. package/src/package-manager/detectPackageManager.test.ts +0 -81
  983. package/src/package-manager/detectPackageManager.ts +0 -30
  984. package/src/package-manager/index.ts +0 -6
  985. package/src/package-manager/types.ts +0 -10
  986. package/src/pipeline/collectCommands.test.ts +0 -187
  987. package/src/pipeline/collectCommands.ts +0 -75
  988. package/src/pipeline/constants.ts +0 -14
  989. package/src/pipeline/createProgram.test.ts +0 -116
  990. package/src/pipeline/createProgram.ts +0 -89
  991. package/src/pipeline/firstRun.test.ts +0 -80
  992. package/src/pipeline/firstRun.ts +0 -99
  993. package/src/pipeline/formatTerminal.test.ts +0 -43
  994. package/src/pipeline/formatTerminal.ts +0 -53
  995. package/src/pipeline/index.ts +0 -22
  996. package/src/pipeline/mapExitCode.test.ts +0 -41
  997. package/src/pipeline/mapExitCode.ts +0 -12
  998. package/src/pipeline/parseGlobalFlags.test.ts +0 -193
  999. package/src/pipeline/parseGlobalFlags.ts +0 -135
  1000. package/src/pipeline/renderError.test.ts +0 -151
  1001. package/src/pipeline/renderError.ts +0 -129
  1002. package/src/pipeline/resolveCommandKind.test.ts +0 -80
  1003. package/src/pipeline/resolveCommandKind.ts +0 -82
  1004. package/src/pipeline/rootHelp.test.ts +0 -87
  1005. package/src/pipeline/rootHelp.ts +0 -265
  1006. package/src/pipeline/runCli.orchestration.test.ts +0 -435
  1007. package/src/pipeline/runCli.test.ts +0 -83
  1008. package/src/pipeline/runCli.ts +0 -411
  1009. package/src/pipeline/types.ts +0 -17
  1010. package/src/testing/cli.ts +0 -71
  1011. package/src/testing/createTestMcpClient.ts +0 -68
  1012. package/src/testing/dsFixtures.ts +0 -523
  1013. package/src/testing/fixtures/canonical-config.json +0 -4
  1014. package/src/testing/fixtures/canonical.ttl +0 -437
  1015. package/src/testing/fixtures/filtered-config.json +0 -4
  1016. package/src/testing/fixtures.ts +0 -34
  1017. package/src/testing/graphqlFixtures.ts +0 -72
  1018. package/src/testing/helpers/assertParity.ts +0 -28
  1019. package/src/testing/helpers/createTestMcpClient.ts +0 -40
  1020. package/src/testing/helpers/createTestRuntime.ts +0 -67
  1021. package/src/testing/index.ts +0 -22
  1022. package/src/testing/integration/__snapshots__/executor-golden.test.ts.snap +0 -1207
  1023. package/src/testing/integration/agent-session.test.ts +0 -148
  1024. package/src/testing/integration/boot.test.ts +0 -105
  1025. package/src/testing/integration/cli-user-stories.test.ts +0 -261
  1026. package/src/testing/integration/cross-binary-byte-equality.test.ts +0 -129
  1027. package/src/testing/integration/edge-cases.test.ts +0 -275
  1028. package/src/testing/integration/executor-execution.test.ts +0 -103
  1029. package/src/testing/integration/executor-golden.test.ts +0 -145
  1030. package/src/testing/integration/mcp-surface.test.ts +0 -605
  1031. package/src/testing/integration/parity.test.ts +0 -596
  1032. package/src/testing/regression/0001-skill-discovery-granularity.test.ts +0 -71
  1033. package/src/testing/standardParityFixtures.ts +0 -35
  1034. package/src/testing/store.ts +0 -39
  1035. package/src/testing/storyFixtures.ts +0 -63
  1036. package/src/testing/types.ts +0 -20
  1037. package/src/tui/components/BulletList/BulletList.tsx +0 -46
  1038. package/src/tui/components/BulletList/index.ts +0 -2
  1039. package/src/tui/components/BulletList/types.ts +0 -6
  1040. package/src/tui/components/Card/Card.tsx +0 -73
  1041. package/src/tui/components/Card/index.ts +0 -1
  1042. package/src/tui/components/Card/types.ts +0 -12
  1043. package/src/tui/components/CodeBlock/CodeBlock.tsx +0 -37
  1044. package/src/tui/components/CodeBlock/index.ts +0 -2
  1045. package/src/tui/components/CodeBlock/types.ts +0 -6
  1046. package/src/tui/components/DataRow/DataRow.tsx +0 -80
  1047. package/src/tui/components/DataRow/index.ts +0 -2
  1048. package/src/tui/components/DataRow/types.ts +0 -14
  1049. package/src/tui/components/FieldRow/FieldRow.tsx +0 -24
  1050. package/src/tui/components/FieldRow/index.ts +0 -2
  1051. package/src/tui/components/FieldRow/types.ts +0 -10
  1052. package/src/tui/components/HeaderRow/HeaderRow.tsx +0 -32
  1053. package/src/tui/components/HeaderRow/index.ts +0 -2
  1054. package/src/tui/components/HeaderRow/types.ts +0 -8
  1055. package/src/tui/components/MarkdownText/MarkdownText.tsx +0 -19
  1056. package/src/tui/components/MarkdownText/index.ts +0 -2
  1057. package/src/tui/components/MarkdownText/types.ts +0 -4
  1058. package/src/tui/components/MiniTable/MiniTable.tsx +0 -82
  1059. package/src/tui/components/MiniTable/index.ts +0 -2
  1060. package/src/tui/components/MiniTable/types.ts +0 -6
  1061. package/src/tui/components/SectionRenderer/SectionRenderer.tsx +0 -91
  1062. package/src/tui/components/SectionRenderer/index.ts +0 -2
  1063. package/src/tui/components/SectionRenderer/types.ts +0 -15
  1064. package/src/tui/components/TreeView/TreeView.tsx +0 -84
  1065. package/src/tui/components/TreeView/index.ts +0 -2
  1066. package/src/tui/components/TreeView/types.ts +0 -6
  1067. package/src/tui/components/index.ts +0 -19
  1068. package/src/tui/constants.ts +0 -39
  1069. package/src/tui/createListView.ts +0 -23
  1070. package/src/tui/createLookupView.ts +0 -26
  1071. package/src/tui/helpers/computeWidths.ts +0 -53
  1072. package/src/tui/helpers/fitColumns.ts +0 -33
  1073. package/src/tui/helpers/formatMarkdown.ts +0 -19
  1074. package/src/tui/helpers/getTerminalSize.ts +0 -16
  1075. package/src/tui/helpers/index.ts +0 -6
  1076. package/src/tui/helpers/syntaxColor.ts +0 -67
  1077. package/src/tui/helpers/truncateText.ts +0 -12
  1078. package/src/tui/hooks/index.ts +0 -3
  1079. package/src/tui/hooks/types.ts +0 -7
  1080. package/src/tui/hooks/useAutoExit.ts +0 -17
  1081. package/src/tui/hooks/useTerminalSize.ts +0 -19
  1082. package/src/tui/index.ts +0 -15
  1083. package/src/tui/renderInk.tsx +0 -18
  1084. package/src/tui/types.ts +0 -12
  1085. package/src/tui/views/ListView/ListView.tsx +0 -104
  1086. package/src/tui/views/ListView/index.ts +0 -2
  1087. package/src/tui/views/ListView/types.ts +0 -14
  1088. package/src/tui/views/LookupView/LookupView.tsx +0 -244
  1089. package/src/tui/views/LookupView/index.ts +0 -2
  1090. package/src/tui/views/LookupView/types.ts +0 -16
  1091. package/src/tui/views/index.ts +0 -4
@@ -0,0 +1,828 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import {
3
+ existsSync,
4
+ mkdirSync,
5
+ mkdtempSync,
6
+ readFileSync,
7
+ rmSync,
8
+ symlinkSync,
9
+ writeFileSync,
10
+ } from "node:fs";
11
+ import type { createRequire } from "node:module";
12
+ import { tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+ import { runTask } from "@canonical/task/node";
15
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
16
+ import { VERSION } from "../../constants.js";
17
+ import type { ConfigLayers, PackageEntry } from "../../kernel/config/types.js";
18
+ import { PragmaError } from "../../kernel/error/PragmaError.js";
19
+ import { executeVerb } from "../../kernel/project/cli/dispatch.js";
20
+ import { bootRuntime } from "../../kernel/runtime/boot.js";
21
+ import { createQueryFacade } from "../../kernel/runtime/facade.js";
22
+ import { readLock } from "../../kernel/runtime/lock.js";
23
+ import { lockPath, packDir } from "../../kernel/runtime/paths.js";
24
+ import {
25
+ detectPrefixClashes,
26
+ resolvePackageJson,
27
+ } from "../../kernel/runtime/refs/resolve.js";
28
+ import { createLazyStore } from "../../kernel/runtime/store.js";
29
+ import type { GlobalFlags, PragmaRuntime } from "../../kernel/runtime/types.js";
30
+ import type { VerbSpec } from "../../kernel/spec/types.js";
31
+ import { projectMcp } from "../../testing/helpers/projectMcp.js";
32
+ import { discoverSkills } from "../skill/discover.js";
33
+ import { collectStatus } from "./collectStatus.js";
34
+ import { sourcesModule } from "./index.js";
35
+ import { buildUpdateTask } from "./runUpdate.js";
36
+
37
+ const FLAGS: GlobalFlags = {
38
+ llm: false,
39
+ autoLlm: false,
40
+ format: "plain",
41
+ verbose: false,
42
+ };
43
+ const flagsJson: GlobalFlags = { ...FLAGS, format: "json" };
44
+ const NO_MUT = { dryRun: false, undo: false, yes: false };
45
+ const statusVerb = sourcesModule.verbs[0] as VerbSpec;
46
+
47
+ const TTL = `@prefix ex: <https://ex.test/#> .
48
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
49
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
50
+ ex:Widget a owl:Class ; rdfs:label "Widget" .
51
+ ex:one a ex:Widget ; rdfs:label "One" .
52
+ `;
53
+
54
+ let roots: string[] = [];
55
+ const tmp = (prefix: string): string => {
56
+ const dir = mkdtempSync(join(tmpdir(), prefix));
57
+ roots.push(dir);
58
+ return dir;
59
+ };
60
+
61
+ /** A runtime whose config is the given package list (no config files needed). */
62
+ function runtimeFor(cwd: string, packages: PackageEntry[]): PragmaRuntime {
63
+ const layers: ConfigLayers = {
64
+ config: { channel: "normal", packages },
65
+ origins: {
66
+ tier: "default",
67
+ channel: "default",
68
+ detail: "default",
69
+ packages: "project",
70
+ stories: "default",
71
+ prefixes: "default",
72
+ prompts: "default",
73
+ },
74
+ global: { path: "/nonexistent", exists: false },
75
+ project: { exists: false },
76
+ };
77
+ const loadConfig = async (): Promise<ConfigLayers> => layers;
78
+ const store = createLazyStore({ cwd, loadConfig });
79
+ return {
80
+ cwd,
81
+ version: VERSION,
82
+ globalFlags: FLAGS,
83
+ loadConfig,
84
+ store,
85
+ query: createQueryFacade(store),
86
+ };
87
+ }
88
+
89
+ beforeEach(() => {
90
+ roots = [];
91
+ });
92
+ afterEach(() => {
93
+ for (const dir of roots) rmSync(dir, { recursive: true, force: true });
94
+ });
95
+
96
+ /** A local package directory with a definitions TTL. */
97
+ function filePackage(): string {
98
+ const pkg = tmp("pragma-pkg-");
99
+ mkdirSync(join(pkg, "definitions"), { recursive: true });
100
+ writeFileSync(join(pkg, "definitions", "widget.ttl"), TTL);
101
+ return pkg;
102
+ }
103
+
104
+ describe("sources lock round-trip (PROTECTED)", () => {
105
+ it("file source: builds, locks, and --frozen rewrites a byte-identical lock", async () => {
106
+ const pkg = filePackage();
107
+ const cwd = tmp("pragma-proj-");
108
+ const runtime = runtimeFor(cwd, [
109
+ { name: "pkg-a", source: `file://${pkg}` },
110
+ ]);
111
+
112
+ const result = await runTask(await buildUpdateTask(runtime, false));
113
+ expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
114
+
115
+ const lock = readLock(cwd);
116
+ expect(lock?.packs).toHaveLength(1);
117
+ expect(lock?.packs[0]?.name).toBe("pkg-a");
118
+ expect(lock?.packs[0]?.resolved).toBe(pkg);
119
+ expect(lock?.contentHash).toBe(result.contentHash);
120
+
121
+ const firstBytes = readFileSync(lockPath(cwd), "utf-8");
122
+ // A --frozen re-run reproduces the locked state byte-for-byte.
123
+ await runTask(await buildUpdateTask(runtime, true));
124
+ expect(readFileSync(lockPath(cwd), "utf-8")).toBe(firstBytes);
125
+ });
126
+
127
+ it("git source: resolves and locks a commit SHA, --frozen pins it", async () => {
128
+ const repo = tmp("pragma-repo-");
129
+ const git = (args: string[]) =>
130
+ execFileSync("git", args, {
131
+ cwd: repo,
132
+ stdio: "pipe",
133
+ env: {
134
+ ...process.env,
135
+ GIT_AUTHOR_NAME: "t",
136
+ GIT_AUTHOR_EMAIL: "t@t",
137
+ GIT_COMMITTER_NAME: "t",
138
+ GIT_COMMITTER_EMAIL: "t@t",
139
+ },
140
+ });
141
+ git(["init", "-b", "main"]);
142
+ mkdirSync(join(repo, "definitions"), { recursive: true });
143
+ writeFileSync(join(repo, "definitions", "widget.ttl"), TTL);
144
+ git(["add", "-A"]);
145
+ git(["commit", "-m", "init"]);
146
+
147
+ const cwd = tmp("pragma-proj-");
148
+ const runtime = runtimeFor(cwd, [
149
+ { name: "pkg-git", source: `git+file://${repo}#main` },
150
+ ]);
151
+
152
+ await runTask(await buildUpdateTask(runtime, false));
153
+ const lock = readLock(cwd);
154
+ expect(lock?.packs[0]?.resolved).toMatch(/^[0-9a-f]{40}$/);
155
+
156
+ const firstBytes = readFileSync(lockPath(cwd), "utf-8");
157
+ await runTask(await buildUpdateTask(runtime, true));
158
+ expect(readFileSync(lockPath(cwd), "utf-8")).toBe(firstBytes);
159
+ });
160
+
161
+ it("a non-frozen re-run over an unchanged source rewrites a byte-identical lock (L1)", async () => {
162
+ // On base, every non-frozen update stamped a fresh `resolvedAt`, so a no-op
163
+ // re-run dirtied the tree. When the revision is unchanged the timestamp is
164
+ // preserved, so the lock is byte-identical.
165
+ const pkg = filePackage();
166
+ const cwd = tmp("pragma-proj-");
167
+ const runtime = runtimeFor(cwd, [
168
+ { name: "pkg-a", source: `file://${pkg}` },
169
+ ]);
170
+ await runTask(await buildUpdateTask(runtime, false));
171
+ const firstBytes = readFileSync(lockPath(cwd), "utf-8");
172
+ await runTask(await buildUpdateTask(runtime, false));
173
+ expect(readFileSync(lockPath(cwd), "utf-8")).toBe(firstBytes);
174
+ });
175
+
176
+ it("follows a symlinked .ttl into the build (L6)", async () => {
177
+ // pnpm / workspace trees symlink their sources; Dirent.isFile is false for a
178
+ // symlink, so on base the only `.ttl` was skipped → 0 sources → the empty
179
+ // build. Following the link ingests it and the build+lock succeed.
180
+ const pkg = tmp("pragma-symlink-pkg-");
181
+ mkdirSync(join(pkg, "definitions"), { recursive: true });
182
+ const realTtl = join(pkg, "real.ttl");
183
+ writeFileSync(realTtl, TTL);
184
+ symlinkSync(realTtl, join(pkg, "definitions", "linked.ttl"));
185
+ const cwd = tmp("pragma-proj-");
186
+ const runtime = runtimeFor(cwd, [
187
+ { name: "pkg-a", source: `file://${pkg}` },
188
+ ]);
189
+
190
+ const result = await runTask(await buildUpdateTask(runtime, false));
191
+ expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
192
+ expect(readLock(cwd)?.packs).toHaveLength(1);
193
+ });
194
+
195
+ it("does not recurse into a symlinked directory cycle (L6 safety)", async () => {
196
+ // The L6 fix follows symlinked FILES but must NOT recurse into a symlinked
197
+ // DIRECTORY: a link to an ancestor dir is a cycle that, if walked, recurses
198
+ // without bound → a stack-overflow RangeError (an INTERNAL "please report").
199
+ // The real `.ttl` is still ingested and the build completes.
200
+ const pkg = tmp("pragma-symlink-cycle-");
201
+ mkdirSync(join(pkg, "definitions"), { recursive: true });
202
+ writeFileSync(join(pkg, "definitions", "widget.ttl"), TTL);
203
+ // `definitions/loop` → `definitions` (its own parent): a symlink cycle.
204
+ symlinkSync(join(pkg, "definitions"), join(pkg, "definitions", "loop"));
205
+ const cwd = tmp("pragma-proj-");
206
+ const runtime = runtimeFor(cwd, [
207
+ { name: "pkg-a", source: `file://${pkg}` },
208
+ ]);
209
+
210
+ const result = await runTask(await buildUpdateTask(runtime, false));
211
+ expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
212
+ expect(readLock(cwd)?.packs).toHaveLength(1);
213
+ });
214
+
215
+ it("undo restores the prior lock (no prior → removed)", async () => {
216
+ const pkg = filePackage();
217
+ const cwd = tmp("pragma-proj-");
218
+ const runtime = runtimeFor(cwd, [
219
+ { name: "pkg-a", source: `file://${pkg}` },
220
+ ]);
221
+ const { runUndo } = await import("@canonical/task/node");
222
+ await runUndo(await buildUpdateTask(runtime, false));
223
+ // Prior lock was absent, so undo removes the file.
224
+ expect(readLock(cwd)).toBeUndefined();
225
+ });
226
+ });
227
+
228
+ describe("sources update — package-declared prefixes (M1)", () => {
229
+ it("compacts a package's own namespace to its declared prefix in the index", async () => {
230
+ // The fixture TTL declares `@prefix ex: <https://ex.test/#>`, but the config
231
+ // carries NO `ex` prefix. Without harvesting the package's own prologue, the
232
+ // index falls back to full URIs (breaking prefixed-type completion and PR3
233
+ // reads); with it, names compact to `ex:Widget` / `ex:one`.
234
+ const pkg = filePackage();
235
+ const cwd = tmp("pragma-proj-");
236
+ const runtime = runtimeFor(cwd, [
237
+ { name: "pkg-a", source: `file://${pkg}` },
238
+ ]);
239
+
240
+ const result = await runTask(await buildUpdateTask(runtime, false));
241
+ const index = JSON.parse(
242
+ readFileSync(join(packDir(result.contentHash), "index.json"), "utf-8"),
243
+ ) as {
244
+ prefixes: Record<string, string>;
245
+ entities: { name: string; type: string }[];
246
+ };
247
+
248
+ // The harvested prefix is persisted (so boot reads the same names).
249
+ expect(index.prefixes.ex).toBe("https://ex.test/#");
250
+ const names = index.entities.map((entity) => entity.name);
251
+ expect(names).toContain("ex:Widget");
252
+ expect(names).toContain("ex:one");
253
+ // No entity NAME leaks a full URI (the pre-fix regression).
254
+ for (const name of names) expect(name).not.toMatch(/^https?:/);
255
+ // The primary type filter key is prefixed too — completion filters on it.
256
+ expect(
257
+ index.entities.find((entity) => entity.name === "ex:one")?.type,
258
+ ).toBe("ex:Widget");
259
+ });
260
+ });
261
+
262
+ describe("sources update — refuses an empty store (A4)", () => {
263
+ /** A local package that ships NO `.ttl` (an empty definitions directory). */
264
+ function emptyPackage(): string {
265
+ const pkg = tmp("pragma-empty-pkg-");
266
+ mkdirSync(join(pkg, "definitions"), { recursive: true });
267
+ return pkg;
268
+ }
269
+
270
+ it("a package with no .ttl is refused, and no lock is written", async () => {
271
+ // On base this builds a 0-triple pack whose empty data.nq fails the
272
+ // completeness gate — so the "successful" update boots to a PERMANENT
273
+ // STORE_UNAVAILABLE loop. The fix refuses before writing the lock.
274
+ const pkg = emptyPackage();
275
+ const cwd = tmp("pragma-proj-");
276
+ const runtime = runtimeFor(cwd, [
277
+ { name: "pkg-a", source: `file://${pkg}` },
278
+ ]);
279
+
280
+ await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
281
+ code: "CONFIG_ERROR",
282
+ });
283
+ // No lock → the embedded fallback / prior state survives, no boot loop.
284
+ expect(readLock(cwd)).toBeUndefined();
285
+ });
286
+
287
+ it("no configured packages is refused rather than locking an empty pack", async () => {
288
+ const cwd = tmp("pragma-proj-");
289
+ const runtime = runtimeFor(cwd, []);
290
+ await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
291
+ code: "CONFIG_ERROR",
292
+ });
293
+ expect(readLock(cwd)).toBeUndefined();
294
+ });
295
+
296
+ it("a comment-only .ttl (0 triples) is refused too", async () => {
297
+ const pkg = tmp("pragma-noTriples-pkg-");
298
+ mkdirSync(join(pkg, "definitions"), { recursive: true });
299
+ // Parses fine, but yields no triples — the post-build 0-triple guard.
300
+ writeFileSync(
301
+ join(pkg, "definitions", "empty.ttl"),
302
+ "# only a comment, no triples\n",
303
+ );
304
+ const cwd = tmp("pragma-proj-");
305
+ const runtime = runtimeFor(cwd, [
306
+ { name: "pkg-a", source: `file://${pkg}` },
307
+ ]);
308
+ await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
309
+ code: "CONFIG_ERROR",
310
+ });
311
+ expect(readLock(cwd)).toBeUndefined();
312
+ });
313
+ });
314
+
315
+ describe("sources update — conflicting @prefix detection (A5)", () => {
316
+ it("flags a label bound to two different IRIs across packages", () => {
317
+ const clashes = detectPrefixClashes([
318
+ { content: "@prefix ex: <https://a.test/#> .\nex:One a ex:T ." },
319
+ { content: "@prefix ex: <https://b.test/#> .\nex:Two a ex:T ." },
320
+ ]);
321
+ expect(clashes).toHaveLength(1);
322
+ expect(clashes.at(0)?.label).toBe("ex");
323
+ expect(clashes.at(0)?.iris).toEqual([
324
+ "https://a.test/#",
325
+ "https://b.test/#",
326
+ ]);
327
+ });
328
+
329
+ it("does NOT flag harmless same-label/same-IRI redeclarations", () => {
330
+ const clashes = detectPrefixClashes([
331
+ { content: "@prefix ex: <https://a.test/#> .\nex:One a ex:T ." },
332
+ { content: "@prefix ex: <https://a.test/#> .\nex:Two a ex:T ." },
333
+ ]);
334
+ expect(clashes).toEqual([]);
335
+ });
336
+
337
+ it("warns loudly on a cross-package prefix clash during update", async () => {
338
+ const owl = "@prefix owl: <http://www.w3.org/2002/07/owl#> .\n";
339
+ const pkgA = tmp("pragma-clash-a-");
340
+ mkdirSync(join(pkgA, "definitions"), { recursive: true });
341
+ writeFileSync(
342
+ join(pkgA, "definitions", "a.ttl"),
343
+ `@prefix ex: <https://a.test/#> .\n${owl}ex:Thing a owl:Class .\nex:one a ex:Thing .\n`,
344
+ );
345
+ const pkgB = tmp("pragma-clash-b-");
346
+ mkdirSync(join(pkgB, "definitions"), { recursive: true });
347
+ writeFileSync(
348
+ join(pkgB, "definitions", "b.ttl"),
349
+ `@prefix ex: <https://b.test/#> .\n${owl}ex:Widget a owl:Class .\nex:two a ex:Widget .\n`,
350
+ );
351
+ const cwd = tmp("pragma-proj-");
352
+ const reports: string[] = [];
353
+ const runtime: PragmaRuntime = {
354
+ ...runtimeFor(cwd, [
355
+ { name: "pkg-a", source: `file://${pkgA}` },
356
+ { name: "pkg-b", source: `file://${pkgB}` },
357
+ ]),
358
+ report: (message: string) => reports.push(message),
359
+ };
360
+
361
+ await runTask(await buildUpdateTask(runtime, false));
362
+ expect(
363
+ reports.some(
364
+ (r) => r.includes('Prefix "ex:"') && r.includes("conflicting"),
365
+ ),
366
+ ).toBe(true);
367
+ });
368
+ });
369
+
370
+ describe("sources update — network-free preview (M2)", () => {
371
+ const updateVerb = sourcesModule.verbs[1] as VerbSpec;
372
+ const DRY_RUN = { dryRun: true, undo: false, yes: false };
373
+ // A source that can ONLY be satisfied by a clone. If a preview resolved it,
374
+ // the git clone would fail and the run would error (or hang on the network) —
375
+ // so a clean plan proves nothing was fetched or built.
376
+ const UNREACHABLE = "git+file:///pragma-does-not-exist-42/repo.git#main";
377
+
378
+ it("CLI --dry-run previews the refs offline, resolving nothing", async () => {
379
+ const cwd = tmp("pragma-proj-");
380
+ const runtime = runtimeFor(cwd, [
381
+ { name: "pkg-remote", source: UNREACHABLE },
382
+ ]);
383
+
384
+ const outcome = await executeVerb(updateVerb, {}, DRY_RUN, runtime);
385
+
386
+ // A successful plan — the unreachable clone was never attempted.
387
+ expect(outcome.exitCode).toBe(0);
388
+ expect(outcome.stdout).toContain("Resolve and build 1 package(s)");
389
+ expect(outcome.stdout).toContain(UNREACHABLE);
390
+ // The one project mutation is previewed, not performed.
391
+ expect(outcome.stdout).toContain("pragma.lock.json");
392
+ expect(readLock(cwd)).toBeUndefined();
393
+ // The store was never even asked for.
394
+ expect(runtime.store.booted).toBe(false);
395
+ });
396
+
397
+ it("MCP sources_update without confirm returns a plan, fetching nothing", async () => {
398
+ const cwd = tmp("pragma-proj-");
399
+ writeFileSync(
400
+ join(cwd, "pragma.config.ts"),
401
+ `export default { packages: [{ name: "pkg-remote", source: "${UNREACHABLE}" }] };\n`,
402
+ );
403
+
404
+ const mcp = await projectMcp([sourcesModule], cwd);
405
+ const envelope = await mcp.callTool("sources_update"); // no confirm
406
+ await mcp.cleanup();
407
+
408
+ expect(envelope.ok).toBe(true);
409
+ expect(envelope.meta).toMatchObject({
410
+ planOnly: true,
411
+ confirmRequired: true,
412
+ });
413
+ const plan = (envelope.data as { plan: string[] }).plan;
414
+ expect(plan.some((line) => line.includes(UNREACHABLE))).toBe(true);
415
+ // Plan-first withheld the write — no lock landed.
416
+ expect(readLock(cwd)).toBeUndefined();
417
+ });
418
+ });
419
+
420
+ describe("sources update — reproducible-or-fail (m5)", () => {
421
+ it("--frozen refuses a package that has no lock entry", async () => {
422
+ const pkg = filePackage();
423
+ const cwd = tmp("pragma-proj-");
424
+ const runtime = runtimeFor(cwd, [
425
+ { name: "pkg-a", source: `file://${pkg}` },
426
+ ]);
427
+
428
+ // No prior lock → nothing to reproduce → refuse rather than silently
429
+ // advance. The throw is raised during setup, before any Task is returned.
430
+ await expect(buildUpdateTask(runtime, true)).rejects.toMatchObject({
431
+ code: "CONFIG_ERROR",
432
+ });
433
+ expect(readLock(cwd)).toBeUndefined();
434
+ });
435
+ });
436
+
437
+ describe("npm resolution tolerates restrictive exports (m6)", () => {
438
+ it("resolvePackageJson walks up past an exports map hiding ./package.json", () => {
439
+ const pkgDir = tmp("pragma-npm-");
440
+ writeFileSync(
441
+ join(pkgDir, "package.json"),
442
+ JSON.stringify({
443
+ name: "faux",
444
+ version: "9.9.9",
445
+ exports: { ".": "./index.js" },
446
+ }),
447
+ );
448
+ // Emulate Node throwing ERR_PACKAGE_PATH_NOT_EXPORTED for `<pkg>/package.json`
449
+ // while the bare entry still resolves.
450
+ const require = {
451
+ resolve(request: string): string {
452
+ if (request === "faux/package.json") {
453
+ const err = new Error("no ./package.json export") as Error & {
454
+ code: string;
455
+ };
456
+ err.code = "ERR_PACKAGE_PATH_NOT_EXPORTED";
457
+ throw err;
458
+ }
459
+ if (request === "faux") return join(pkgDir, "index.js");
460
+ throw new Error(`cannot resolve ${request}`);
461
+ },
462
+ } as unknown as ReturnType<typeof createRequire>;
463
+
464
+ expect(resolvePackageJson(require, "faux")).toBe(
465
+ join(pkgDir, "package.json"),
466
+ );
467
+
468
+ // A genuinely-absent package still yields undefined (→ "not installed").
469
+ const missing = {
470
+ resolve(): string {
471
+ throw new Error("not found");
472
+ },
473
+ } as unknown as ReturnType<typeof createRequire>;
474
+ expect(resolvePackageJson(missing, "faux")).toBeUndefined();
475
+ });
476
+ });
477
+
478
+ describe("sources update — data-failure classification (U6)", () => {
479
+ /** A local package whose definitions TTL is malformed (bad triple). */
480
+ function badFilePackage(): string {
481
+ const pkg = tmp("pragma-badpkg-");
482
+ mkdirSync(join(pkg, "definitions"), { recursive: true });
483
+ // A predicate with no object → ke/Oxigraph throws a Turtle parser error,
484
+ // exactly the class that used to escape as INTERNAL_ERROR "report this issue".
485
+ writeFileSync(
486
+ join(pkg, "definitions", "broken.ttl"),
487
+ "@prefix ex: <https://ex.test/#> .\nex:One a ex:Widget .\nex:Two ex:brokenPredicate .\n",
488
+ );
489
+ return pkg;
490
+ }
491
+
492
+ it("classifies a bad triple as a NAMED data error, not 'report this issue'", async () => {
493
+ const pkg = badFilePackage();
494
+ const cwd = tmp("pragma-proj-");
495
+ const runtime = runtimeFor(cwd, [
496
+ { name: "bad-pkg", source: `file://${pkg}` },
497
+ ]);
498
+
499
+ let caught: unknown;
500
+ try {
501
+ await buildUpdateTask(runtime, false);
502
+ } catch (error) {
503
+ caught = error;
504
+ }
505
+
506
+ // A classified data error (exit-1 CONFIG_ERROR), NOT INTERNAL_ERROR.
507
+ expect(caught).toBeInstanceOf(PragmaError);
508
+ const err = caught as PragmaError;
509
+ expect(err.code).toBe("CONFIG_ERROR");
510
+ // It NAMES the offending package/file …
511
+ expect(err.message).toContain("bad-pkg/definitions/broken.ttl");
512
+ // … carries the parser's own detail …
513
+ expect(err.message.toLowerCase()).toContain("parser error");
514
+ // … and is NOT the internal-bug "please report this issue" path.
515
+ expect(err.message).not.toContain("Internal error");
516
+ expect(err.recovery?.message ?? "").not.toContain("report this issue");
517
+ // The recovery points the user at a runnable, useful next step.
518
+ expect(err.recovery?.cli).toBe("pragma sources update --verbose");
519
+ // Nothing was locked on failure.
520
+ expect(readLock(cwd)).toBeUndefined();
521
+ });
522
+
523
+ it("classifies a git clone failure, naming the package (not INTERNAL)", async () => {
524
+ // A git+file:// ref to a path that does not exist → the clone fails
525
+ // immediately (hermetic, no network). On base this raw execFileSync throw
526
+ // escapes as INTERNAL_ERROR "report this issue"; it must be a named data error.
527
+ const cwd = tmp("pragma-proj-");
528
+ const runtime = runtimeFor(cwd, [
529
+ {
530
+ name: "pkg-remote",
531
+ source: "git+file:///pragma-nope-42/repo.git#main",
532
+ },
533
+ ]);
534
+
535
+ let caught: unknown;
536
+ try {
537
+ await buildUpdateTask(runtime, false);
538
+ } catch (error) {
539
+ caught = error;
540
+ }
541
+ expect(caught).toBeInstanceOf(PragmaError);
542
+ const err = caught as PragmaError;
543
+ expect(err.code).toBe("CONFIG_ERROR");
544
+ expect(err.message).toContain("pkg-remote");
545
+ expect(err.message).not.toContain("Internal error");
546
+ expect(readLock(cwd)).toBeUndefined();
547
+ });
548
+
549
+ it("names the SPECIFIC bad file among several good ones", async () => {
550
+ const pkg = tmp("pragma-badpkg-mixed-");
551
+ mkdirSync(join(pkg, "definitions"), { recursive: true });
552
+ writeFileSync(join(pkg, "definitions", "aaa-good.ttl"), TTL);
553
+ writeFileSync(
554
+ join(pkg, "definitions", "zzz-bad.ttl"),
555
+ "@prefix ex: <https://ex.test/#> .\nex:Broken ex:noObject .\n",
556
+ );
557
+ const cwd = tmp("pragma-proj-");
558
+ const runtime = runtimeFor(cwd, [{ name: "mix", source: `file://${pkg}` }]);
559
+
560
+ await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
561
+ code: "CONFIG_ERROR",
562
+ });
563
+ let caught: unknown;
564
+ try {
565
+ await buildUpdateTask(runtime, false);
566
+ } catch (error) {
567
+ caught = error;
568
+ }
569
+ // Per-source isolation pins the bad file, not the good sibling.
570
+ expect((caught as PragmaError).message).toContain(
571
+ "mix/definitions/zzz-bad.ttl",
572
+ );
573
+ expect((caught as PragmaError).message).not.toContain("aaa-good.ttl");
574
+ });
575
+ });
576
+
577
+ describe("sources update — hidden files and --skip-invalid", () => {
578
+ const BAD_TTL =
579
+ "@prefix ex: <https://ex.test/#> .\nex:Broken ex:noObject .\n";
580
+
581
+ /** The good widget package plus one extra definitions file. */
582
+ function packageWithExtra(name: string, content: string): string {
583
+ const pkg = filePackage();
584
+ writeFileSync(join(pkg, "definitions", name), content);
585
+ return pkg;
586
+ }
587
+
588
+ it("skips dot-prefixed files rather than ingesting them (hidden artifacts)", async () => {
589
+ // A malformed `.hidden.ttl` beside the good widget.ttl: on base the walker
590
+ // ingests it and the build fails; hidden files must be skipped entirely.
591
+ const pkg = packageWithExtra(".hidden.ttl", BAD_TTL);
592
+ const cwd = tmp("pragma-proj-");
593
+ const runtime = runtimeFor(cwd, [
594
+ { name: "pkg-a", source: `file://${pkg}` },
595
+ ]);
596
+
597
+ const result = await runTask(await buildUpdateTask(runtime, false));
598
+ expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
599
+ expect(readLock(cwd)?.packs).toHaveLength(1);
600
+ });
601
+
602
+ it("without --skip-invalid, one malformed source fails the whole update", async () => {
603
+ const pkg = packageWithExtra("bad.ttl", BAD_TTL);
604
+ const cwd = tmp("pragma-proj-");
605
+ const runtime = runtimeFor(cwd, [
606
+ { name: "pkg-a", source: `file://${pkg}` },
607
+ ]);
608
+ await expect(buildUpdateTask(runtime, false, false)).rejects.toMatchObject({
609
+ code: "CONFIG_ERROR",
610
+ });
611
+ expect(readLock(cwd)).toBeUndefined();
612
+ });
613
+
614
+ it("with --skip-invalid, drops the bad source, warns loudly, and builds from the rest", async () => {
615
+ const pkg = packageWithExtra("bad.ttl", BAD_TTL);
616
+ const cwd = tmp("pragma-proj-");
617
+ const reports: string[] = [];
618
+ const runtime: PragmaRuntime = {
619
+ ...runtimeFor(cwd, [{ name: "pkg-a", source: `file://${pkg}` }]),
620
+ report: (message: string) => reports.push(message),
621
+ };
622
+
623
+ const result = await runTask(await buildUpdateTask(runtime, false, true));
624
+ // Built from the good widget.ttl, not aborted.
625
+ expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
626
+ expect(readLock(cwd)?.packs).toHaveLength(1);
627
+ // Loud per-source warning names the dropped file …
628
+ expect(
629
+ reports.some(
630
+ (r) => r.includes("skipped invalid source") && r.includes("bad.ttl"),
631
+ ),
632
+ ).toBe(true);
633
+ // … plus a summary of how many were dropped.
634
+ expect(reports.some((r) => /Skipped 1 invalid source/.test(r))).toBe(true);
635
+ });
636
+
637
+ it("with --skip-invalid, still errors when EVERY source is invalid", async () => {
638
+ const pkg = tmp("pragma-allbad-");
639
+ mkdirSync(join(pkg, "definitions"), { recursive: true });
640
+ writeFileSync(join(pkg, "definitions", "bad.ttl"), BAD_TTL);
641
+ const cwd = tmp("pragma-proj-");
642
+ const runtime: PragmaRuntime = {
643
+ ...runtimeFor(cwd, [{ name: "pkg-a", source: `file://${pkg}` }]),
644
+ report: () => {},
645
+ };
646
+ await expect(buildUpdateTask(runtime, false, true)).rejects.toMatchObject({
647
+ code: "CONFIG_ERROR",
648
+ });
649
+ expect(readLock(cwd)).toBeUndefined();
650
+ });
651
+ });
652
+
653
+ describe("sources update — progress streaming (U7/U11)", () => {
654
+ const updateVerb = sourcesModule.verbs[1] as VerbSpec;
655
+
656
+ /** Capture everything written to stderr while `fn` runs. */
657
+ async function captureStderr(fn: () => Promise<void>): Promise<string> {
658
+ const lines: string[] = [];
659
+ const spy = vi
660
+ .spyOn(process.stderr, "write")
661
+ .mockImplementation((chunk: string | Uint8Array): boolean => {
662
+ lines.push(typeof chunk === "string" ? chunk : chunk.toString());
663
+ return true;
664
+ });
665
+ try {
666
+ await fn();
667
+ } finally {
668
+ spy.mockRestore();
669
+ }
670
+ return lines.join("");
671
+ }
672
+
673
+ it("streams stage lines to stderr during a real update", async () => {
674
+ const pkg = filePackage();
675
+ const cwd = tmp("pragma-proj-");
676
+ const runtime = runtimeFor(cwd, [
677
+ { name: "pkg-a", source: `file://${pkg}` },
678
+ ]);
679
+
680
+ const stderr = await captureStderr(async () => {
681
+ const outcome = await executeVerb(updateVerb, {}, NO_MUT, runtime);
682
+ expect(outcome.exitCode).toBe(0);
683
+ });
684
+
685
+ // The clone/parse/build phases each announce themselves (no more silence).
686
+ expect(stderr).toContain("Reading pkg-a");
687
+ expect(stderr).toContain("Building store from 1 source(s)");
688
+ // Built fresh or reused from cache — either way the phase is reported.
689
+ expect(stderr).toMatch(/(Built|Reused) store/);
690
+ // Non-verbose omits the per-file lines.
691
+ expect(stderr).not.toContain("parse pkg-a/definitions/widget.ttl");
692
+ });
693
+
694
+ it("--verbose adds a line per source file", async () => {
695
+ const pkg = filePackage();
696
+ const cwd = tmp("pragma-proj-");
697
+ const runtime: PragmaRuntime = {
698
+ ...runtimeFor(cwd, [{ name: "pkg-a", source: `file://${pkg}` }]),
699
+ globalFlags: { ...FLAGS, verbose: true },
700
+ };
701
+
702
+ const stderr = await captureStderr(async () => {
703
+ await executeVerb(updateVerb, {}, NO_MUT, runtime);
704
+ });
705
+
706
+ expect(stderr).toContain("parse pkg-a/definitions/widget.ttl");
707
+ });
708
+ });
709
+
710
+ describe("sources update — installs package skills (U10)", () => {
711
+ let savedDataHome: string | undefined;
712
+ let dataHome: string;
713
+
714
+ /** A local package that also ships `skills/<name>/SKILL.md`. */
715
+ function skillPackage(skillName: string): string {
716
+ const pkg = filePackage(); // definitions/widget.ttl → the build succeeds
717
+ const skillDir = join(pkg, "skills", skillName);
718
+ mkdirSync(skillDir, { recursive: true });
719
+ writeFileSync(
720
+ join(skillDir, "SKILL.md"),
721
+ `---\nname: ${skillName}\ndescription: From a package.\n---\nBody.`,
722
+ );
723
+ return pkg;
724
+ }
725
+
726
+ beforeEach(() => {
727
+ savedDataHome = process.env.XDG_DATA_HOME;
728
+ dataHome = tmp("pragma-datahome-");
729
+ process.env.XDG_DATA_HOME = dataHome;
730
+ });
731
+ afterEach(() => {
732
+ if (savedDataHome === undefined) delete process.env.XDG_DATA_HOME;
733
+ else process.env.XDG_DATA_HOME = savedDataHome;
734
+ });
735
+
736
+ it("symlinks a package skill into the installed root so `skill list` finds it", async () => {
737
+ const pkg = skillPackage("foo");
738
+ const cwd = tmp("pragma-proj-");
739
+ const runtime = runtimeFor(cwd, [
740
+ { name: "pkg-a", source: `file://${pkg}` },
741
+ ]);
742
+
743
+ await runTask(await buildUpdateTask(runtime, false));
744
+
745
+ // Installed as a symlink into $XDG_DATA_HOME/pragma/skills …
746
+ const linked = join(dataHome, "pragma", "skills", "foo");
747
+ expect(existsSync(linked)).toBe(true);
748
+ // … and discovery now sees it.
749
+ expect(discoverSkills(cwd).map((s) => s.name)).toContain("foo");
750
+ });
751
+
752
+ it("keeps project .pragma/skills precedence over an installed same-name skill", async () => {
753
+ const pkg = skillPackage("shared");
754
+ const cwd = tmp("pragma-proj-");
755
+ const projSkill = join(cwd, ".pragma", "skills", "shared");
756
+ mkdirSync(projSkill, { recursive: true });
757
+ writeFileSync(
758
+ join(projSkill, "SKILL.md"),
759
+ "---\nname: shared\ndescription: PROJECT copy.\n---\n",
760
+ );
761
+
762
+ const runtime = runtimeFor(cwd, [
763
+ { name: "pkg-a", source: `file://${pkg}` },
764
+ ]);
765
+ await runTask(await buildUpdateTask(runtime, false));
766
+
767
+ const shared = discoverSkills(cwd).filter((s) => s.name === "shared");
768
+ expect(shared).toHaveLength(1);
769
+ expect(shared[0]?.description).toBe("PROJECT copy.");
770
+ });
771
+
772
+ it("is reversible — undo removes the installed skill symlink", async () => {
773
+ const pkg = skillPackage("bar");
774
+ const cwd = tmp("pragma-proj-");
775
+ const runtime = runtimeFor(cwd, [
776
+ { name: "pkg-a", source: `file://${pkg}` },
777
+ ]);
778
+ const { runUndo } = await import("@canonical/task/node");
779
+ await runUndo(await buildUpdateTask(runtime, false));
780
+
781
+ expect(existsSync(join(dataHome, "pragma", "skills", "bar"))).toBe(false);
782
+ });
783
+ });
784
+
785
+ describe("sources status — entityCount from the manifest (A10)", () => {
786
+ it("reports the count without re-parsing index.json", async () => {
787
+ const pkg = filePackage(); // ex:Widget class + ex:one individual
788
+ const cwd = tmp("pragma-proj-");
789
+ const runtime = runtimeFor(cwd, [
790
+ { name: "pkg-a", source: `file://${pkg}` },
791
+ ]);
792
+ const result = await runTask(await buildUpdateTask(runtime, false));
793
+
794
+ // Delete index.json: any path that PARSED it to count would now fail —
795
+ // proving the figure is read from the manifest's persisted entityCount.
796
+ rmSync(join(packDir(result.contentHash), "index.json"), { force: true });
797
+
798
+ const status = await collectStatus(bootRuntime(flagsJson, cwd));
799
+ // One abox individual (ex:one); the ex:Widget class is tbox, not counted.
800
+ expect(status.entityCount).toBe(1);
801
+ });
802
+ });
803
+
804
+ describe("sources status CLI-json == MCP tool (PROTECTED)", () => {
805
+ it("a cold store's status is byte-equal on both surfaces", async () => {
806
+ // Both surfaces boot from the SAME cwd + isolated config (default packages,
807
+ // no lock), so the storeless status must be identical.
808
+ const cwd = tmp("pragma-proj-");
809
+ const cli = await executeVerb(
810
+ statusVerb,
811
+ {},
812
+ NO_MUT,
813
+ bootRuntime(flagsJson, cwd),
814
+ );
815
+ const cliEnvelope = JSON.parse(cli.stdout as string);
816
+
817
+ const mcp = await projectMcp([sourcesModule], cwd);
818
+ const mcpEnvelope = await mcp.callTool("sources_status");
819
+ await mcp.cleanup();
820
+
821
+ expect(cliEnvelope).toEqual(mcpEnvelope);
822
+ expect(cliEnvelope.ok).toBe(true);
823
+ expect((cliEnvelope.data as { lockPresent: boolean }).lockPresent).toBe(
824
+ false,
825
+ );
826
+ expect((cliEnvelope.data as { cached: boolean }).cached).toBe(false);
827
+ });
828
+ });