@canonical/pragma-cli 0.36.0 → 0.38.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 (312) hide show
  1. package/README.md +3 -2
  2. package/bundled-skills/adoption-a1-styles/SKILL.md +24 -0
  3. package/bundled-skills/adoption-a2-components/SKILL.md +22 -6
  4. package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +1397 -327
  5. package/bundled-skills/anatomy-author/SKILL.md +840 -137
  6. package/bundled-skills/design-auditor/SKILL.md +133 -9
  7. package/bundled-skills/implement-component/SKILL.md +192 -23
  8. package/bundled-skills/specify-component/SKILL.md +124 -12
  9. package/bundled-skills/specify-pattern/SKILL.md +47 -8
  10. package/dist/package.json +23 -20
  11. package/dist/pragma.conf.js +963 -40
  12. package/dist/pragma.conf.js.map +1 -1
  13. package/dist/src/capabilities/capabilities/catalog.js +14 -5
  14. package/dist/src/capabilities/capabilities/catalog.js.map +1 -1
  15. package/dist/src/capabilities/capabilities/hints.js +33 -5
  16. package/dist/src/capabilities/capabilities/hints.js.map +1 -1
  17. package/dist/src/capabilities/config/show.render.js +30 -2
  18. package/dist/src/capabilities/config/show.render.js.map +1 -1
  19. package/dist/src/capabilities/create/create.verb.js +2 -1
  20. package/dist/src/capabilities/create/create.verb.js.map +1 -1
  21. package/dist/src/capabilities/create/createSurface.generated.js +23 -1
  22. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -1
  23. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +11 -6
  24. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -1
  25. package/dist/src/capabilities/doctor/checks/harnessInventory.js +1 -1
  26. package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -1
  27. package/dist/src/capabilities/doctor/checks/isSupportedNodeVersion.js +38 -0
  28. package/dist/src/capabilities/doctor/checks/isSupportedNodeVersion.js.map +1 -0
  29. package/dist/src/capabilities/doctor/checks/targetHealth.js +104 -14
  30. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -1
  31. package/dist/src/capabilities/graph/connect.render.js +101 -0
  32. package/dist/src/capabilities/graph/connect.render.js.map +1 -0
  33. package/dist/src/capabilities/graph/connect.types.js +21 -0
  34. package/dist/src/capabilities/graph/connect.types.js.map +1 -0
  35. package/dist/src/capabilities/graph/connect.verb.js +147 -0
  36. package/dist/src/capabilities/graph/connect.verb.js.map +1 -0
  37. package/dist/src/capabilities/graph/index.js +5 -3
  38. package/dist/src/capabilities/graph/index.js.map +1 -1
  39. package/dist/src/capabilities/graph/queryText.js +206 -0
  40. package/dist/src/capabilities/graph/queryText.js.map +1 -0
  41. package/dist/src/capabilities/graph/relationIndex.js +302 -0
  42. package/dist/src/capabilities/graph/relationIndex.js.map +1 -0
  43. package/dist/src/capabilities/graph/runConnect.js +456 -0
  44. package/dist/src/capabilities/graph/runConnect.js.map +1 -0
  45. package/dist/src/capabilities/graph/runQuery.js +21 -4
  46. package/dist/src/capabilities/graph/runQuery.js.map +1 -1
  47. package/dist/src/capabilities/setup/buildPlan.js +6 -2
  48. package/dist/src/capabilities/setup/buildPlan.js.map +1 -1
  49. package/dist/src/capabilities/setup/operations/index.js +7 -2
  50. package/dist/src/capabilities/setup/operations/index.js.map +1 -1
  51. package/dist/src/capabilities/setup/operations/setupCompletions.js +6 -2
  52. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -1
  53. package/dist/src/capabilities/setup/operations/setupConfig.js +4 -2
  54. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -1
  55. package/dist/src/capabilities/setup/operations/setupGenerator.js +72 -14
  56. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -1
  57. package/dist/src/capabilities/setup/operations/setupLsp.js +372 -62
  58. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -1
  59. package/dist/src/capabilities/setup/operations/setupMcp.js +150 -5
  60. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -1
  61. package/dist/src/capabilities/setup/operations/setupSkills.js +4 -2
  62. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -1
  63. package/dist/src/capabilities/setup/operations/writability.js +114 -0
  64. package/dist/src/capabilities/setup/operations/writability.js.map +1 -0
  65. package/dist/src/capabilities/setup/plan.js.map +1 -1
  66. package/dist/src/capabilities/setup/setup.verb.js +80 -31
  67. package/dist/src/capabilities/setup/setup.verb.js.map +1 -1
  68. package/dist/src/capabilities/setup/targets.js +124 -42
  69. package/dist/src/capabilities/setup/targets.js.map +1 -1
  70. package/dist/src/capabilities/shared/index.js +1 -1
  71. package/dist/src/capabilities/shared/index.js.map +1 -1
  72. package/dist/src/constants.js +7 -1
  73. package/dist/src/constants.js.map +1 -1
  74. package/dist/src/kernel/error/renderError.js +3 -2
  75. package/dist/src/kernel/error/renderError.js.map +1 -1
  76. package/dist/src/kernel/error/validOptions.js +41 -0
  77. package/dist/src/kernel/error/validOptions.js.map +1 -0
  78. package/dist/src/kernel/packs/compile.js +90 -6
  79. package/dist/src/kernel/packs/compile.js.map +1 -1
  80. package/dist/src/kernel/packs/cursor.js +135 -0
  81. package/dist/src/kernel/packs/cursor.js.map +1 -0
  82. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +9 -2
  83. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -1
  84. package/dist/src/kernel/packs/paging.js +108 -0
  85. package/dist/src/kernel/packs/paging.js.map +1 -0
  86. package/dist/src/kernel/packs/renderPack.js +154 -5
  87. package/dist/src/kernel/packs/renderPack.js.map +1 -1
  88. package/dist/src/kernel/packs/resolveEntity.js +118 -19
  89. package/dist/src/kernel/packs/resolveEntity.js.map +1 -1
  90. package/dist/src/kernel/packs/runBodies.js +156 -18
  91. package/dist/src/kernel/packs/runBodies.js.map +1 -1
  92. package/dist/src/kernel/packs/schema.js +160 -12
  93. package/dist/src/kernel/packs/schema.js.map +1 -1
  94. package/dist/src/kernel/packs/sparql/authorQuery.js +227 -0
  95. package/dist/src/kernel/packs/sparql/authorQuery.js.map +1 -0
  96. package/dist/src/kernel/packs/sparql/buildListQuery.js +251 -0
  97. package/dist/src/kernel/packs/sparql/buildListQuery.js.map +1 -0
  98. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +125 -22
  99. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -1
  100. package/dist/src/kernel/packs/sparql/filterValues.js +145 -0
  101. package/dist/src/kernel/packs/sparql/filterValues.js.map +1 -0
  102. package/dist/src/kernel/packs/sparql/index.js +24 -14
  103. package/dist/src/kernel/packs/sparql/index.js.map +1 -1
  104. package/dist/src/kernel/packs/sparql/runSelect.js +10 -4
  105. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -1
  106. package/dist/src/kernel/packs/sparql/searchTerm.js +25 -0
  107. package/dist/src/kernel/packs/sparql/searchTerm.js.map +1 -0
  108. package/dist/src/kernel/packs/storyRules.js +151 -0
  109. package/dist/src/kernel/packs/storyRules.js.map +1 -0
  110. package/dist/src/kernel/packs/tierScope.js +310 -0
  111. package/dist/src/kernel/packs/tierScope.js.map +1 -0
  112. package/dist/src/kernel/packs/types.js +80 -0
  113. package/dist/src/kernel/packs/types.js.map +1 -1
  114. package/dist/src/kernel/project/cli/buildProgram.js +10 -1
  115. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -1
  116. package/dist/src/kernel/project/cli/dispatch.js +104 -3
  117. package/dist/src/kernel/project/cli/dispatch.js.map +1 -1
  118. package/dist/src/kernel/project/cli/rootHelp.js +8 -5
  119. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -1
  120. package/dist/src/kernel/project/cli/suggestNames.js +31 -7
  121. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -1
  122. package/dist/src/kernel/project/mcp/registerVerb.js +5 -1
  123. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -1
  124. package/dist/src/kernel/render/renderers.js +34 -2
  125. package/dist/src/kernel/render/renderers.js.map +1 -1
  126. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +2 -3
  127. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -1
  128. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +1 -1
  129. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -1
  130. package/dist/src/kernel/runtime/graphpack/embedded/pack.manifest.generated.js +4 -0
  131. package/dist/src/kernel/runtime/graphpack/embedded/pack.manifest.generated.js.map +1 -0
  132. package/dist/src/kernel/runtime/graphpack/embedded.js +13 -6
  133. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -1
  134. package/dist/src/kernel/runtime/graphpack/read.js +17 -10
  135. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -1
  136. package/dist/src/kernel/runtime/loadSession.js +3 -1
  137. package/dist/src/kernel/runtime/loadSession.js.map +1 -1
  138. package/dist/src/kernel/runtime/probe.js +1 -1
  139. package/dist/src/kernel/runtime/probe.js.map +1 -1
  140. package/dist/src/kernel/runtime/readEntity.js +19 -4
  141. package/dist/src/kernel/runtime/readEntity.js.map +1 -1
  142. package/dist/src/kernel/runtime/refs/parseRef.js +17 -1
  143. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -1
  144. package/dist/src/kernel/runtime/refs/resolve.js +38 -5
  145. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -1
  146. package/dist/src/kernel/spec/emitReference.js +1 -1
  147. package/dist/src/kernel/spec/emitReference.js.map +1 -1
  148. package/package.json +23 -20
  149. package/pragma.conf.ts +983 -40
  150. package/src/capabilities/block.parity.test.ts +207 -27
  151. package/src/capabilities/block.shipped.exec.test.ts +156 -14
  152. package/src/capabilities/block.tierRank.exec.test.ts +46 -9
  153. package/src/capabilities/capabilities/catalog.ts +14 -5
  154. package/src/capabilities/capabilities/hints.ts +40 -5
  155. package/src/capabilities/config/collectConfigShow.test.ts +1 -0
  156. package/src/capabilities/config/set.test.ts +24 -25
  157. package/src/capabilities/config/show.render.test.ts +9 -4
  158. package/src/capabilities/config/show.render.ts +30 -2
  159. package/src/capabilities/create/byteEquality.test.ts +28 -1
  160. package/src/capabilities/create/create.test.ts +1 -0
  161. package/src/capabilities/create/create.verb.ts +2 -1
  162. package/src/capabilities/create/createGrammar.test.ts +4 -1
  163. package/src/capabilities/create/createSurface.generated.ts +23 -1
  164. package/src/capabilities/create/crossCli.subprocess.test.ts +10 -3
  165. package/src/capabilities/distribution.parity.test.ts +12 -11
  166. package/src/capabilities/distribution.test.ts +77 -7
  167. package/src/capabilities/doctor/checks/checkNodeVersion.test.ts +49 -0
  168. package/src/capabilities/doctor/checks/checkNodeVersion.ts +11 -7
  169. package/src/capabilities/doctor/checks/harnessInventory.test.ts +13 -6
  170. package/src/capabilities/doctor/checks/harnessInventory.ts +8 -4
  171. package/src/capabilities/doctor/checks/isSupportedNodeVersion.test.ts +111 -0
  172. package/src/capabilities/doctor/checks/isSupportedNodeVersion.ts +34 -0
  173. package/src/capabilities/doctor/checks/mcpCommand.test.ts +7 -1
  174. package/src/capabilities/doctor/checks/targetHealth.ts +114 -13
  175. package/src/capabilities/doctor/doctor.test.ts +327 -36
  176. package/src/capabilities/emptyRecovery.test.ts +84 -28
  177. package/src/capabilities/graph/connect.render.ts +141 -0
  178. package/src/capabilities/graph/connect.shipped.exec.test.ts +370 -0
  179. package/src/capabilities/graph/connect.test.ts +361 -0
  180. package/src/capabilities/graph/connect.types.ts +136 -0
  181. package/src/capabilities/graph/connect.verb.ts +165 -0
  182. package/src/capabilities/graph/index.ts +5 -3
  183. package/src/capabilities/graph/query.shipped.exec.test.ts +66 -0
  184. package/src/capabilities/graph/query.test.ts +17 -0
  185. package/src/capabilities/graph/queryText.test.ts +121 -0
  186. package/src/capabilities/graph/queryText.ts +240 -0
  187. package/src/capabilities/graph/relationIndex.ts +372 -0
  188. package/src/capabilities/graph/runConnect.ts +577 -0
  189. package/src/capabilities/graph/runQuery.ts +21 -6
  190. package/src/capabilities/lazy.test.ts +32 -2
  191. package/src/capabilities/listBudget.shipped.exec.test.ts +239 -0
  192. package/src/capabilities/listLookup.shipped.exec.test.ts +387 -0
  193. package/src/capabilities/listQuery.shipped.exec.test.ts +400 -0
  194. package/src/capabilities/resources/resources.test.ts +38 -2
  195. package/src/capabilities/setup/buildPlan.ts +7 -1
  196. package/src/capabilities/setup/operations/index.ts +14 -0
  197. package/src/capabilities/setup/operations/setupCompletions.ts +9 -2
  198. package/src/capabilities/setup/operations/setupConfig.ts +7 -2
  199. package/src/capabilities/setup/operations/setupGenerator.ts +93 -15
  200. package/src/capabilities/setup/operations/setupLsp.ts +544 -85
  201. package/src/capabilities/setup/operations/setupMcp.ts +212 -4
  202. package/src/capabilities/setup/operations/setupSkills.ts +7 -2
  203. package/src/capabilities/setup/operations/writability.test.ts +151 -0
  204. package/src/capabilities/setup/operations/writability.ts +135 -0
  205. package/src/capabilities/setup/plan.ts +11 -0
  206. package/src/capabilities/setup/setup.test.ts +992 -16
  207. package/src/capabilities/setup/setup.verb.ts +84 -36
  208. package/src/capabilities/setup/targets.ts +152 -48
  209. package/src/capabilities/setup/types.ts +41 -5
  210. package/src/capabilities/shared/index.ts +1 -0
  211. package/src/capabilities/sources/sources.test.ts +55 -0
  212. package/src/capabilities/surface.test.ts +59 -11
  213. package/src/capabilities/tier.parity.test.ts +2 -2
  214. package/src/capabilities/token.parity.test.ts +784 -0
  215. package/src/capabilities/tokenGraph.cli.test.ts +279 -0
  216. package/src/capabilities/tokenGraph.shipped.exec.test.ts +653 -0
  217. package/src/capabilities/variable.parity.test.ts +448 -0
  218. package/src/constants.ts +8 -0
  219. package/src/kernel/completion/shellDrive.test.ts +32 -30
  220. package/src/kernel/config/defaults.test.ts +21 -2
  221. package/src/kernel/config/readConfig.test.ts +1 -1
  222. package/src/kernel/error/renderError.ts +3 -2
  223. package/src/kernel/error/validOptions.test.ts +57 -0
  224. package/src/kernel/error/validOptions.ts +45 -0
  225. package/src/kernel/packs/collect.test.ts +2 -0
  226. package/src/kernel/packs/compile.test.ts +188 -15
  227. package/src/kernel/packs/compile.ts +109 -14
  228. package/src/kernel/packs/cursor.ts +135 -0
  229. package/src/kernel/packs/filteredEmpty.test.ts +213 -0
  230. package/src/kernel/packs/graphql/buildLookupDocument.ts +16 -9
  231. package/src/kernel/packs/graphqlSource.test.ts +152 -0
  232. package/src/kernel/packs/listNotice.test.ts +156 -0
  233. package/src/kernel/packs/paging.ts +110 -0
  234. package/src/kernel/packs/renderPack.ts +186 -13
  235. package/src/kernel/packs/resolveEntity.test.ts +62 -3
  236. package/src/kernel/packs/resolveEntity.ts +186 -26
  237. package/src/kernel/packs/runBodies.ts +196 -26
  238. package/src/kernel/packs/schema.ts +180 -13
  239. package/src/kernel/packs/sparql/authorQuery.test.ts +179 -0
  240. package/src/kernel/packs/sparql/authorQuery.ts +257 -0
  241. package/src/kernel/packs/sparql/buildListQuery.test.ts +344 -0
  242. package/src/kernel/packs/sparql/buildListQuery.ts +344 -0
  243. package/src/kernel/packs/sparql/buildLookupQuery.test.ts +138 -0
  244. package/src/kernel/packs/sparql/buildLookupQuery.ts +140 -20
  245. package/src/kernel/packs/sparql/filterValues.test.ts +86 -0
  246. package/src/kernel/packs/sparql/filterValues.ts +182 -0
  247. package/src/kernel/packs/sparql/index.ts +30 -14
  248. package/src/kernel/packs/sparql/runSelect.test.ts +63 -0
  249. package/src/kernel/packs/sparql/runSelect.ts +42 -2
  250. package/src/kernel/packs/sparql/searchTerm.ts +29 -0
  251. package/src/kernel/packs/storyRules.ts +180 -0
  252. package/src/kernel/packs/tierScope.test.ts +487 -0
  253. package/src/kernel/packs/tierScope.ts +409 -0
  254. package/src/kernel/packs/toolDescription.test.ts +13 -10
  255. package/src/kernel/packs/types.ts +311 -9
  256. package/src/kernel/project/cli/buildProgram.ts +17 -1
  257. package/src/kernel/project/cli/dispatch.test.ts +87 -0
  258. package/src/kernel/project/cli/dispatch.ts +114 -4
  259. package/src/kernel/project/cli/rootHelp.ts +8 -5
  260. package/src/kernel/project/cli/suggest.test.ts +35 -0
  261. package/src/kernel/project/cli/suggestNames.ts +34 -7
  262. package/src/kernel/project/mcp/registerVerb.ts +5 -1
  263. package/src/kernel/render/contracts.ts +2 -0
  264. package/src/kernel/render/prefixes.test.ts +2 -0
  265. package/src/kernel/render/renderers.test.ts +43 -0
  266. package/src/kernel/render/renderers.ts +34 -1
  267. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +2 -3
  268. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
  269. package/src/kernel/runtime/graphpack/embedded/pack.manifest.generated.ts +3 -0
  270. package/src/kernel/runtime/graphpack/embedded.ts +14 -6
  271. package/src/kernel/runtime/graphpack/graphpack.test.ts +31 -5
  272. package/src/kernel/runtime/graphpack/read.ts +17 -13
  273. package/src/kernel/runtime/loadSession.ts +3 -1
  274. package/src/kernel/runtime/probe.ts +1 -1
  275. package/src/kernel/runtime/readEntity.ts +19 -4
  276. package/src/kernel/runtime/refs/parseRef.test.ts +49 -1
  277. package/src/kernel/runtime/refs/parseRef.ts +25 -1
  278. package/src/kernel/runtime/refs/resolve.ts +39 -5
  279. package/src/kernel/runtime/types.ts +30 -0
  280. package/src/kernel/spec/emitReference.ts +1 -1
  281. package/src/kernel/spec/surfaceConformance.test.ts +2 -2
  282. package/src/kernel/spec/types.ts +17 -0
  283. package/src/testing/PARITY_GAPS.ts +4 -4
  284. package/src/testing/behavioral/agentSession.mcp.test.ts +43 -39
  285. package/src/testing/behavioral/completion.test.ts +7 -6
  286. package/src/testing/behavioral/disclosure.test.ts +39 -37
  287. package/src/testing/behavioral/errorMatrix.mcp.test.ts +82 -64
  288. package/src/testing/behavioral/errorMatrix.storeless.test.ts +11 -10
  289. package/src/testing/behavioral/journeys.cli.test.ts +71 -32
  290. package/src/testing/behavioral/journeys.defaultPack.test.ts +6 -4
  291. package/src/testing/behavioral/journeys.firstInstall.test.ts +70 -5
  292. package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +4 -3
  293. package/src/testing/behavioral/journeys.packageStories.test.ts +2 -1
  294. package/src/testing/behavioral/mcpSurface.test.ts +28 -25
  295. package/src/testing/behavioral/parity.test.ts +25 -23
  296. package/src/testing/eval/__snapshots__/eval.test.ts.snap +20 -0
  297. package/src/testing/eval/cases/effectful.ts +7 -1
  298. package/src/testing/eval/cases/readNouns.ts +100 -11
  299. package/src/testing/fixtures/blockGraph.ts +89 -5
  300. package/src/testing/fixtures/connectGraph.ts +159 -0
  301. package/src/testing/fixtures/graph/canonical.ts +128 -32
  302. package/src/testing/helpers/fsProbe.ts +88 -0
  303. package/src/testing/helpers/runCli.test.ts +44 -0
  304. package/src/testing/helpers/runCli.ts +27 -3
  305. package/src/testing/perf/budgets.test.ts +3 -1
  306. package/src/testing/perf/budgets.ts +138 -54
  307. package/dist/src/kernel/packs/sparql/applyFilters.js +0 -167
  308. package/dist/src/kernel/packs/sparql/applyFilters.js.map +0 -1
  309. package/dist/src/kernel/packs/sparql/applySearch.js +0 -25
  310. package/dist/src/kernel/packs/sparql/applySearch.js.map +0 -1
  311. package/src/kernel/packs/sparql/applyFilters.ts +0 -203
  312. package/src/kernel/packs/sparql/applySearch.ts +0 -33
@@ -26,7 +26,7 @@
26
26
  */
27
27
  import { MCP_SERVER_NAME } from "../../../constants.js";
28
28
  import { detectionFailure, detectTargets, resolveRoots, } from "../../setup/buildPlan.js";
29
- import { lspEditorNames, lspSkipReason, mcpGroupState, mcpWriteState, skillsSkipReason, skillsSkipRemedy, } from "../../setup/operations/index.js";
29
+ import { blockedMcpGroups, describeEditorSource, firstLspBlock, firstMcpBlock, installableEditors, LSP_SKIP_REMEDY, lspBlockReason, lspEditorNames, lspSkipReason, mcpBlockReason, mcpGroupState, mcpWriteState, skillsSkipReason, skillsSkipRemedy, } from "../../setup/operations/index.js";
30
30
  import { shortenPath, TARGET_IDS } from "../../setup/plan.js";
31
31
  import { MCP_NO_LOCATION } from "../../setup/targets.js";
32
32
  import { checkShellCompletions } from "./checkShellCompletions.js";
@@ -42,15 +42,78 @@ const configHealth = (d, roots) => {
42
42
  }
43
43
  return { status: "pass", detail: `${path} — valid` };
44
44
  };
45
- /** The `lsp` row — the first this report has ever had. */
46
- const lspHealth = (d) => {
45
+ /**
46
+ * The `lsp` row: one sub-item per editor, saying HOW it was found and where
47
+ * pragma stands in it.
48
+ *
49
+ * Provenance per editor is the point. A colleague whose macOS `setup lsp`
50
+ * reported nothing had VS Code installed the whole time, and a one-line row
51
+ * ("not installed in …", or a bare skip) could not tell them whether pragma had
52
+ * missed the editor or found it and could not act. Per the owner, 2026-09-16,
53
+ * this report says per editor how it was found and why a step was skipped.
54
+ *
55
+ * The row's own status keeps the report's invariant that every `available` row
56
+ * has a remedy: any editor that CAN be installed into makes the row
57
+ * `available`, whose derived fix is `pragma setup lsp`. A row where NOTHING is
58
+ * installed and nothing is installable is a `skip` carrying the first block's
59
+ * own remedy — a Nix declaration, a `chmod`, or the palette command — never
60
+ * the derived command, which would only reproduce the skip.
61
+ *
62
+ * An INSTALLED editor is a `pass` even when its extensions folder is blocked.
63
+ * The copy is there and works; the block only says this command cannot CHANGE
64
+ * it. Reporting a skip instead told the owner of a site-managed folder that
65
+ * already held the extension to chmod it and install again, and made a machine
66
+ * that is installed everywhere it can be a permanent `○ lsp`.
67
+ */
68
+ const lspHealth = (d, roots) => {
47
69
  if (d.state === "unknown") {
48
- return { status: "skip", detail: lspSkipReason(d) };
70
+ return {
71
+ status: "skip",
72
+ detail: lspSkipReason(d),
73
+ remedy: LSP_SKIP_REMEDY,
74
+ };
75
+ }
76
+ const items = d.editors.map((e) => {
77
+ const reason = e.installed ? undefined : lspBlockReason(e);
78
+ const state = reason ?? (e.installed ? "installed" : "not installed");
79
+ return {
80
+ label: e.editor.name,
81
+ status: e.installed
82
+ ? "pass"
83
+ : reason !== undefined
84
+ ? "skip"
85
+ : "available",
86
+ detail: `${describeEditorSource(e, roots)} · ${state}`,
87
+ };
88
+ });
89
+ const installable = installableEditors(d);
90
+ if (installable.length > 0) {
91
+ return {
92
+ status: "available",
93
+ detail: `not installed in ${installable.map((e) => e.editor.name).join(", ")}`,
94
+ items,
95
+ };
96
+ }
97
+ // Nothing installable. The row is the block's only when nothing is installed
98
+ // either — otherwise the honest headline is what IS in place.
99
+ const block = d.editors.some((e) => e.installed)
100
+ ? undefined
101
+ : firstLspBlock(d);
102
+ if (block !== undefined) {
103
+ return {
104
+ status: "skip",
105
+ // The headline names the editor; the item's own detail does not, because
106
+ // its label already has.
107
+ detail: block.headline,
108
+ items,
109
+ remedy: block.remedy,
110
+ };
49
111
  }
50
- const editors = lspEditorNames(d).join(", ");
51
- return d.state === "installed"
52
- ? { status: "pass", detail: `installed in ${editors}` }
53
- : { status: "available", detail: `not installed in ${editors}` };
112
+ return {
113
+ status: "pass",
114
+ detail: `installed in ${lspEditorNames(d).join(", ")}`,
115
+ items,
116
+ };
54
117
  };
55
118
  /**
56
119
  * The `mcp` row: one sub-item per file, each saying whether the entry is
@@ -66,6 +129,12 @@ async function mcpHealth(d, scope, cwd, roots) {
66
129
  const items = d.groups.map((group) => {
67
130
  const state = mcpGroupState(d, group.path);
68
131
  const label = shortenPath(group.path, roots);
132
+ // A file pragma must not write is reported as a skip, not as an
133
+ // `available` whose `fix:` would fail the moment it ran.
134
+ const blocked = mcpBlockReason(d, group, roots);
135
+ if (blocked !== undefined) {
136
+ return { label, status: "skip", detail: blocked };
137
+ }
69
138
  if (state === "absent") {
70
139
  return { label, status: "available", detail: "not registered" };
71
140
  }
@@ -80,6 +149,21 @@ async function mcpHealth(d, scope, cwd, roots) {
80
149
  : `registered, but \`${MCP_SERVER_NAME}\` is not on PATH`,
81
150
  };
82
151
  });
152
+ // Every location blocked means the row's whole answer is the block: it
153
+ // carries the first one's remedy — the entry to declare by hand — rather than
154
+ // the derived `pragma setup mcp`, which would only reproduce the skip.
155
+ const blockedGroups = blockedMcpGroups(d);
156
+ const block = blockedGroups.length === d.groups.length
157
+ ? firstMcpBlock(d, roots)
158
+ : undefined;
159
+ if (block !== undefined) {
160
+ return {
161
+ status: "skip",
162
+ detail: block.reason,
163
+ items,
164
+ remedy: block.remedy,
165
+ };
166
+ }
83
167
  const configured = items.filter((item) => item.status === "pass").length;
84
168
  const failing = items.filter((item) => item.status === "fail").length;
85
169
  if (failing > 0) {
@@ -89,6 +173,7 @@ async function mcpHealth(d, scope, cwd, roots) {
89
173
  items,
90
174
  };
91
175
  }
176
+ const writable = items.length - blockedGroups.length;
92
177
  if (configured === 0) {
93
178
  // Absence in the LOCAL PROJECT is not a failure: registering there is
94
179
  // opt-in, so a repository with no checked-in MCP config is healthy. The
@@ -100,13 +185,13 @@ async function mcpHealth(d, scope, cwd, roots) {
100
185
  }
101
186
  : {
102
187
  status: "available",
103
- detail: `not registered in any of ${items.length} config files`,
188
+ detail: `not registered in any of ${writable} config files`,
104
189
  items,
105
190
  };
106
191
  }
107
192
  return {
108
- status: configured === items.length ? "pass" : "available",
109
- detail: `registered in ${configured} of ${items.length} config files`,
193
+ status: configured === writable ? "pass" : "available",
194
+ detail: `registered in ${configured} of ${writable} config files`,
110
195
  items,
111
196
  };
112
197
  }
@@ -198,7 +283,7 @@ async function healthOf(row, rt, roots) {
198
283
  };
199
284
  }
200
285
  case "lsp":
201
- return lspHealth(row.detection);
286
+ return lspHealth(row.detection, roots);
202
287
  case "mcp":
203
288
  return mcpHealth(row.detection, row.scope, rt.cwd, roots);
204
289
  default:
@@ -316,12 +401,17 @@ export const fixCommandFor = (id, scope, bin) => `${bin} setup ${id}${scope ===
316
401
  *
317
402
  * @param rt - The per-invocation runtime.
318
403
  * @param bin - The binary name the `fix:` lines are derived from.
404
+ * @param probe - The writability filesystem seam, threaded to every row's
405
+ * detection. Defaults to the real one; a test injects a fixture to reach the
406
+ * blocked arms — a `/nix/store` path, a directory that refuses `W_OK` —
407
+ * through THIS entry point, rather than opening the row bodies up as exports
408
+ * nothing in production would call.
319
409
  * @returns One {@link CheckResult} per (target, scope), plus one per scope.
320
410
  * @note Impure — every target's detection reads the real filesystem.
321
411
  */
322
- export async function scopedChecks(rt, bin) {
412
+ export async function scopedChecks(rt, bin, probe) {
323
413
  const roots = await resolveRoots(rt);
324
- const detected = await detectTargets(rt, [...TARGET_IDS], "both");
414
+ const detected = await detectTargets(rt, [...TARGET_IDS], "both", probe);
325
415
  const [targetRows, inventoryRows] = await Promise.all([
326
416
  Promise.all(detected.map(async (row) => {
327
417
  const health = await healthOf(row, rt, roots);
@@ -1 +1 @@
1
- {"version":3,"file":"targetHealth.js","sourceRoot":"","sources":["../../../../../src/capabilities/doctor/checks/targetHealth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"targetHealth.js","sourceRoot":"","sources":["../../../../../src/capabilities/doctor/checks/targetHealth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Formatters for `graph connect` — the same answer in two registers.
3
+ *
4
+ * A person gets one ROW PER STEP grouped by path, with each node's human name
5
+ * from the pack index, because what a reader wants from "how do these two
6
+ * connect" is the chain, read left to right, with the direction of every edge
7
+ * visible.
8
+ *
9
+ * An agent gets ONE OBJECT. Not Markdown: the answer is structured data — two
10
+ * endpoints, a verdict, the paths, and the policy the walk ran under — and
11
+ * flattening it into prose would make a caller parse back out what it already
12
+ * had (Constitution XI). This is also why neither format ever explains WHY two
13
+ * things relate: the predicates on the path are the explanation, and a sentence
14
+ * synthesised from them would be pragma asserting a meaning the graph does not
15
+ * carry.
16
+ *
17
+ * Terms arrive already compacted and named by the relation index, against the
18
+ * store's own merged prefix map — so these formatters carry no prefix map and
19
+ * re-derive nothing.
20
+ */
21
+ /** The short form of a term: prefixed when there is one, else the raw value. */
22
+ const short = (term) => term.prefixed ?? term.value;
23
+ /** A term as a reader should see it — short form, with its name when known. */
24
+ const named = (term) => term.title ? `${short(term)} (${term.title})` : short(term);
25
+ /** A blank node has no address, and saying so beats printing a dead handle. */
26
+ const node = (term) => term.addressable === false ? `[record ${term.value}]` : named(term);
27
+ /** `1 hop` / `2 hops` — a count a reader does not have to forgive. */
28
+ const count = (n, noun) => `${n} ${noun}${n === 1 ? "" : "s"}`;
29
+ /** The sentence for each way of being unconnected — one per case, never shared. */
30
+ const REFUSALS = {
31
+ "endpoint-carries-no-relation": "Not connectable: one endpoint carries no relation the model uses — it is only classified.",
32
+ "shares-only-rosters": "Not connected in the model. The two share membership, which is not a relation.",
33
+ "no-path-within-hop-limit": "Not connected: no relation path between them within the hop limit.",
34
+ };
35
+ /** One roster group, as a line a reader can act on. */
36
+ function rosterLine(roster) {
37
+ const shape = roster.side === "subjects"
38
+ ? `${short(roster.predicate)} -> ${node(roster.node)}`
39
+ : `${node(roster.node)} -> ${short(roster.predicate)}`;
40
+ return ` ${shape} (${roster.members} members)`;
41
+ }
42
+ /** One path, as a header plus one row per step. */
43
+ function pathLines(path, ordinal) {
44
+ const lines = [` Path ${ordinal} (${count(path.steps.length, "hop")})`];
45
+ for (const step of path.steps) {
46
+ const arrow = step.direction === "forward"
47
+ ? `--${short(step.predicate)}->`
48
+ : `<-${short(step.predicate)}--`;
49
+ lines.push(` ${node(step.from)} ${arrow} ${node(step.to)}`);
50
+ }
51
+ return lines;
52
+ }
53
+ /** The policy block every answer carries, positive or negative. */
54
+ function policyLines(data) {
55
+ return [
56
+ "",
57
+ ` Hop limit ${data.hopLimit}; edges whose fan-in exceeds ${data.rosterThreshold} are rosters, not relations.`,
58
+ ` Packs searched: ${data.packs.length > 0 ? data.packs.join(", ") : "none recorded"}`,
59
+ ];
60
+ }
61
+ export const connectFormatters = {
62
+ plain(data) {
63
+ const title = `${node(data.a.term)} <-> ${node(data.b.term)}`;
64
+ const lines = [title, "=".repeat(Math.min(Math.max(title.length, 24), 96))];
65
+ if (data.connected) {
66
+ lines.push(` Connected in ${count(data.hops ?? 0, "relation hop")}, by ${count(data.pathCount, "shortest path")}.`, "");
67
+ for (const [index, path] of data.paths.entries()) {
68
+ lines.push(...pathLines(path, index + 1));
69
+ lines.push("");
70
+ }
71
+ if (data.truncated) {
72
+ lines.push(` Showing ${data.paths.length} of ${data.pathCount} shortest paths — raise --paths for the rest.`);
73
+ }
74
+ }
75
+ else {
76
+ lines.push(` ${REFUSALS[data.unconnectedBecause ?? "no-path-within-hop-limit"]}`);
77
+ for (const endpoint of [data.a, data.b]) {
78
+ if (endpoint.relatable)
79
+ continue;
80
+ lines.push("", ` ${node(endpoint.term)} carries no relation. It is classified by:`, ...(endpoint.classifiedBy ?? []).map(rosterLine));
81
+ }
82
+ if (data.sharedRosters.length > 0) {
83
+ lines.push("", " Rosters they both belong to:");
84
+ lines.push(...data.sharedRosters.map(rosterLine));
85
+ lines.push("", " A roster is answered by the noun's own list verb, not by a path.");
86
+ }
87
+ }
88
+ lines.push(...policyLines(data));
89
+ return lines.join("\n").trimEnd();
90
+ },
91
+ /**
92
+ * The agent-facing format IS the object — one JSON value on one line.
93
+ *
94
+ * `json` pretty-prints the same payload for a human reading a pipe; the two
95
+ * are the same data by construction, so an agent and a reader never see
96
+ * different answers to the same question.
97
+ */
98
+ llm: (data) => JSON.stringify(data),
99
+ json: (data) => JSON.stringify(data, null, 2),
100
+ };
101
+ //# sourceMappingURL=connect.render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.render.js","sourceRoot":"","sources":["../../../../src/capabilities/graph/connect.render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The shape of a `graph connect` answer — the ONE contract its run body writes
3
+ * and its three formatters read.
4
+ *
5
+ * Type-only, and deliberately its own module: the formatters hang off the verb
6
+ * spec, so they are on the static import graph the lazy-dispatch probe walks
7
+ * (`capabilities/lazy.test.ts`), while the walk itself must stay behind a
8
+ * dynamic import. A shared type module lets both sides name the same answer
9
+ * without dragging the traversal onto the storeless fast path.
10
+ *
11
+ * Every answer carries the POLICY it was produced under — the hop limit, the
12
+ * roster threshold, and the packs searched. That is Constitution VI applied to
13
+ * the answer rather than only to the source: the commonest answer this verb
14
+ * gives is "these two are not connected", and that sentence means nothing
15
+ * without knowing how far it looked, what it was willing to walk, and what it
16
+ * was looking in. A missing pack is what makes an honest "no path" and a
17
+ * dishonest one byte-identical, so `packs` is present whether the answer is
18
+ * positive or negative.
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=connect.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.types.js","sourceRoot":"","sources":["../../../../src/capabilities/graph/connect.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * `graph connect <a> <b>` — what connects two entities, and what "unlinked"
3
+ * means when nothing does.
4
+ *
5
+ * The third verb on the `graph` noun, beside `inspect` (one entity's
6
+ * neighbourhood) and `query` (the raw SPARQL escape hatch). It belongs here for
7
+ * the same reason those two do: it reads ACROSS the whole store rather than
8
+ * within one population, so it hangs off the noun for a store-wide read and
9
+ * adds no noun of its own.
10
+ *
11
+ * It is hand-written rather than a declared pack story because the pack grammar
12
+ * cannot express it. A list story's parameters are exactly its declared filters
13
+ * plus its declared search, every filter is projected as an OPTIONAL NAMED
14
+ * flag, and the only positional-and-required parameter the compiler ever mints
15
+ * is a lookup's single name — so there is nowhere in the grammar to put two
16
+ * required entity arguments. And a filter is a row predicate over an author's
17
+ * query, so a declared form would have to enumerate the walk space and let a
18
+ * filter pick one pair out of it: at four hops that space is 71 million walks,
19
+ * against the largest declared story's 1,698 rows.
20
+ *
21
+ * Both arguments accept exactly what `graph inspect` accepts — a prefixed name
22
+ * or an absolute IRI — and complete from the pack index through the same
23
+ * `names`/`index` source a compiled lookup's `<name>` uses, so the two
24
+ * positionals behave like every other entity argument in the CLI.
25
+ *
26
+ * Store-backed and read-only, like both its siblings. The traversal lives in a
27
+ * dynamically-imported run body: the relation index it needs is built by one
28
+ * scan of the store, and a process that never asks a connect question must
29
+ * never pay for it — which is the same guarantee `needsStore` and the lazy
30
+ * store already give every other read.
31
+ */
32
+ import { BIN_NAME } from "../../constants.js";
33
+ import { PragmaError } from "../../kernel/error/index.js";
34
+ import { asVerb } from "../../kernel/spec/asVerb.js";
35
+ import { connectFormatters } from "./connect.render.js";
36
+ /**
37
+ * The hop limit in force unless `--hops` says otherwise.
38
+ *
39
+ * Four, from the measured connectivity ladder on the shipped pack: it is the
40
+ * smallest limit that spans the longest genuine bridge in this store — the walk
41
+ * from a platform variable through its declaration and its references to the
42
+ * symbol behind it — and the largest that keeps the answer set honest. At three
43
+ * that walk is refused; at six the connected fraction jumps and the paths stop
44
+ * being something a person can hold in mind.
45
+ */
46
+ export const DEFAULT_HOPS = 4;
47
+ /** The ceiling `--hops` may be raised to; above it the verb refuses. */
48
+ export const MAX_HOPS = 6;
49
+ /** How many shortest paths are shown unless `--paths` says otherwise. */
50
+ export const DEFAULT_PATHS = 10;
51
+ /**
52
+ * Hold a numeric param to a whole number within its stated range.
53
+ *
54
+ * REFUSES rather than clamps. A clamped `--hops 40` would answer a question
55
+ * nobody asked and report a limit the caller did not set, which is precisely
56
+ * the hidden policy every answer's policy block exists to rule out.
57
+ *
58
+ * The kernel already coerces a `number` param and rejects what is not a number
59
+ * at all (`project/cli/dispatch.ts#coerceParam`, and `z.number()` over MCP), so
60
+ * what is left to check is RANGE and wholeness — `--hops 2.5` is a number, and
61
+ * it is not a hop count.
62
+ *
63
+ * @param value - The coerced param value.
64
+ * @param name - The flag's name, for the diagnostic.
65
+ * @param fallback - The value when the flag was not given.
66
+ * @param min - The smallest accepted value.
67
+ * @param max - The largest accepted value, if there is one.
68
+ * @returns The validated integer.
69
+ * @throws PragmaError INVALID_INPUT when the value is not an integer in range.
70
+ */
71
+ function bounded(value, name, fallback, min, max) {
72
+ if (value === undefined || value === null)
73
+ return fallback;
74
+ const parsed = typeof value === "number" ? value : Number(value);
75
+ const ceiling = max === undefined ? "" : ` and at most ${max}`;
76
+ if (!Number.isInteger(parsed) ||
77
+ parsed < min ||
78
+ (max !== undefined && parsed > max)) {
79
+ throw PragmaError.invalidInput(name, String(value), {
80
+ recovery: {
81
+ message: `--${name} must be a whole number of at least ${min}${ceiling}.`,
82
+ },
83
+ });
84
+ }
85
+ return parsed;
86
+ }
87
+ const connectVerb = {
88
+ path: ["graph", "connect"],
89
+ summary: "Show the shortest relation paths between two entities.",
90
+ doc: "Finds every shortest path of RELATION edges between two entities, and says which kind of nothing it found when there is no path. An edge counts as a relation only where it does not fan out into a roster — membership of a class, a tier or a family is answered by that noun's list verb, not by a path — so most pairs are correctly reported as unconnected. Address each endpoint by prefixed name (ds:global.component.button) or absolute IRI. Every answer states the hop limit, the fan-in threshold, and the packs searched.",
91
+ params: [
92
+ {
93
+ kind: "string",
94
+ name: "a",
95
+ doc: "The first endpoint — a prefixed name or absolute IRI.",
96
+ positional: true,
97
+ required: true,
98
+ complete: { kind: "names", source: { from: "index", type: "" } },
99
+ },
100
+ {
101
+ kind: "string",
102
+ name: "b",
103
+ doc: "The second endpoint — a prefixed name or absolute IRI.",
104
+ positional: true,
105
+ required: true,
106
+ complete: { kind: "names", source: { from: "index", type: "" } },
107
+ },
108
+ {
109
+ kind: "number",
110
+ name: "hops",
111
+ doc: `Largest path length to return (default ${DEFAULT_HOPS}, ceiling ${MAX_HOPS}).`,
112
+ default: DEFAULT_HOPS,
113
+ },
114
+ {
115
+ kind: "number",
116
+ name: "paths",
117
+ doc: `Most shortest paths to show (default ${DEFAULT_PATHS}); the answer always reports the true total.`,
118
+ default: DEFAULT_PATHS,
119
+ },
120
+ ],
121
+ output: { formatters: connectFormatters },
122
+ examples: [
123
+ {
124
+ cmd: `${BIN_NAME} graph connect ds:global.component.button dt:color.text`,
125
+ note: "a block and a token symbol",
126
+ },
127
+ {
128
+ cmd: `${BIN_NAME} graph connect ds:global.component.button ds:apps.pattern.datatable --format json`,
129
+ note: "an honest unlinked answer, with the policy it was found under",
130
+ },
131
+ ],
132
+ capability: {
133
+ needsStore: true,
134
+ mutates: false,
135
+ mcp: {
136
+ expose: true,
137
+ annotations: { readOnlyHint: true, openWorldHint: false },
138
+ },
139
+ },
140
+ run: (params, rt) => import("./runConnect.js").then((m) => m.runConnect(rt, String(params.a), String(params.b), {
141
+ hops: bounded(params.hops, "hops", DEFAULT_HOPS, 1, MAX_HOPS),
142
+ paths: bounded(params.paths, "paths", DEFAULT_PATHS, 1),
143
+ })),
144
+ };
145
+ /** The `graph connect` verb. */
146
+ export const graphConnectVerb = asVerb(connectVerb);
147
+ //# sourceMappingURL=connect.verb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.verb.js","sourceRoot":"","sources":["../../../../src/capabilities/graph/connect.verb.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  /**
2
- * The `graph` capability module — `inspect` (single-entity read) plus `query`
3
- * (the raw SPARQL escape hatch, PR6). The covenant blesses both.
2
+ * The `graph` capability module — `inspect` (single-entity read), `query` (the
3
+ * raw SPARQL escape hatch, PR6) and `connect` (relation paths between two
4
+ * entities). The covenant blesses all three.
4
5
  */
5
6
  import { resourceProvider } from "../resources/index.js";
7
+ import { graphConnectVerb } from "./connect.verb.js";
6
8
  import { graphInspectVerb } from "./inspect.verb.js";
7
9
  import { graphQueryVerb } from "./query.verb.js";
8
10
  /**
@@ -13,7 +15,7 @@ import { graphQueryVerb } from "./query.verb.js";
13
15
  */
14
16
  export const graphModule = {
15
17
  name: "graph",
16
- verbs: [graphInspectVerb, graphQueryVerb],
18
+ verbs: [graphConnectVerb, graphInspectVerb, graphQueryVerb],
17
19
  mcpResources: resourceProvider,
18
20
  };
19
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/capabilities/graph/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,CAAC,gBAAgB,EAAE,cAAc,CAAC;IACzC,YAAY,EAAE,gBAAgB;CAC/B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/capabilities/graph/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,CAAC;IAC3D,YAAY,EAAE,gBAAgB;CAC/B,CAAC"}