@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
@@ -17,10 +17,20 @@
17
17
  * write itself stays idempotent (a re-merge of the identical entry is
18
18
  * byte-for-byte), so a re-run is a no-op the recap reports as "unchanged" — the
19
19
  * same state-awareness `setup skills` has always had.
20
+ *
21
+ * And it asks, for each group, whether the file could be WRITTEN at all —
22
+ * `probeWritable`, before a single write is composed. A NixOS or home-manager
23
+ * user whose config directory is managed produced a `failed` row carrying a
24
+ * raw `EACCES` and no next step, on a machine configured exactly as its owner
25
+ * intends; that is now a named skip whose remedy is the entry itself, printed
26
+ * through the same serializer the write would have used, for the user to put
27
+ * in the config that owns the directory.
20
28
  */
21
29
  import { dirname } from "node:path";
22
30
  import { mkdir, sequence_ } from "@canonical/task";
23
31
  import { MCP_SERVER_NAME } from "../../../constants.js";
32
+ import { shortenPath } from "../plan.js";
33
+ import { probeWritable } from "./writability.js";
24
34
  /**
25
35
  * The argv a registered harness spawns to reach the server.
26
36
  *
@@ -129,12 +139,13 @@ const mcpWriteKey = (write) => `${write.path}\u0000${write.mcpKey}`;
129
139
  *
130
140
  * @param rt - The per-invocation runtime.
131
141
  * @param scope - The scope being planned (global or project).
142
+ * @param probe - The writability filesystem seam; defaults to the real one.
132
143
  * @returns The scope's target groups, their prior states, + the config writer.
133
144
  * @note Impure — reads the filesystem via `detectHarnesses` + `readMcpConfigFrom`.
134
145
  */
135
- export async function detectMcp(rt, scope) {
146
+ export async function detectMcp(rt, scope, probe) {
136
147
  const cwd = rt.cwd;
137
- const [{ detectHarnesses, groupTargetsForScope, mcpEntryMatches, readMcpConfigFrom, readPlatformEnv, removeMcpConfigFrom, writeMcpConfigTargets, }, { runTask },] = await Promise.all([
148
+ const [{ detectHarnesses, groupTargetsForScope, mcpEntryMatches, readMcpConfigFrom, readPlatformEnv, removeMcpConfigFrom, serializeTomlInlineEntry, writeMcpConfigTargets, }, { runTask },] = await Promise.all([
138
149
  import("@canonical/harnesses"),
139
150
  import("@canonical/task/node"),
140
151
  ]);
@@ -150,6 +161,15 @@ export async function detectMcp(rt, scope) {
150
161
  // than measured separately.
151
162
  const stateByPath = new Map();
152
163
  const stateByWrite = new Map();
164
+ // Writability, per file, before anything is composed. Cheap (a stat walk and
165
+ // one `access`), and it is what turns an unavoidable failure into a row that
166
+ // says what to do instead.
167
+ const blockedByPath = new Map();
168
+ for (const group of groups) {
169
+ const block = probeWritable(group.path, probe);
170
+ if (block !== undefined)
171
+ blockedByPath.set(group.path, block);
172
+ }
153
173
  await Promise.all(groups.map(async (group) => {
154
174
  const want = pragmaMcpEntry(cwd, group.scope);
155
175
  const classified = await Promise.all(group.writes.map(async (write) => ({
@@ -165,10 +185,12 @@ export async function detectMcp(rt, scope) {
165
185
  groups,
166
186
  stateByPath,
167
187
  stateByWrite,
188
+ blockedByPath,
168
189
  cwd,
169
190
  platform,
170
191
  writeMcpConfigTargets,
171
192
  removeMcpConfigFrom,
193
+ serializeTomlInlineEntry,
172
194
  };
173
195
  }
174
196
  /**
@@ -190,6 +212,120 @@ export function mcpGroupState(d, path) {
190
212
  export function mcpWriteState(d, write) {
191
213
  return d.stateByWrite.get(mcpWriteKey(write)) ?? "absent";
192
214
  }
215
+ /**
216
+ * The block on one group's file, or `undefined` when it can be written.
217
+ *
218
+ * @param d - The detection gathered up front.
219
+ * @param path - The group's config file path.
220
+ * @returns The {@link WriteBlock}, or undefined.
221
+ */
222
+ export const mcpGroupBlock = (d, path) => d.blockedByPath.get(path);
223
+ /**
224
+ * Why one BLOCKED group's file cannot be written — one line, as the renderer
225
+ * prints one.
226
+ *
227
+ * @param d - The detection gathered up front.
228
+ * @param group - A group whose file is blocked.
229
+ * @param roots - The two roots the path renders relative to.
230
+ * @returns The reason.
231
+ */
232
+ function describeMcpBlock(block, path, roots) {
233
+ const where = shortenPath(path, roots);
234
+ return block.kind === "nix-store"
235
+ ? `${where} is managed by Nix (it resolves to ${block.resolved})`
236
+ : `${where} is not writable (${block.path})`;
237
+ }
238
+ /**
239
+ * Why one group's file cannot be written, or `undefined` when it can be.
240
+ *
241
+ * @param d - The detection gathered up front.
242
+ * @param group - The group whose file may be blocked.
243
+ * @param roots - The two roots the path renders relative to.
244
+ * @returns The reason, or `undefined` when the file can be written.
245
+ */
246
+ export function mcpBlockReason(d, group, roots) {
247
+ const block = mcpGroupBlock(d, group.path);
248
+ return block === undefined
249
+ ? undefined
250
+ : describeMcpBlock(block, group.path, roots);
251
+ }
252
+ /**
253
+ * The remedy beneath a blocked group: the EXACT entry a write would have
254
+ * emitted, and nothing else.
255
+ *
256
+ * It is serialized through the group's own `serializeEntry` — the same
257
+ * function the writer uses — so the entry a user copies into their
258
+ * home-manager or NixOS config is byte-for-byte what `setup mcp` would have
259
+ * written, and the next detection classifies it `registered` rather than
260
+ * `drifted`. A hand-written sample in this string would be a second
261
+ * serializer to keep in sync, and the failure mode is a config the tool then
262
+ * offers to "repair" forever.
263
+ *
264
+ * It is written in the file's OWN FORMAT. A JSON body pasted into Codex's
265
+ * `config.toml` is not an entry, it is a syntax error, and the row that
266
+ * printed it was the one row whose whole job was to say what to write. The
267
+ * TOML spelling is the dotted-key inline table — the same entry the writer's
268
+ * `[mcp_servers.pragma]` table holds, in the one-line form a remedy can print
269
+ * (the renderer gives it one dim line).
270
+ *
271
+ * Every write in the group is included, keyed by its own `mcpKey`: a shared
272
+ * `.vscode/mcp.json` holds two independent entries, and half the answer is
273
+ * not an answer.
274
+ *
275
+ * The line does NOT restate the path or the cause. The reason line directly
276
+ * above it has said both ({@link mcpBlockReason}), and a remedy that repeats
277
+ * them is the duplication the LSP remedies beside it dropped: a remedy states
278
+ * the action.
279
+ *
280
+ * @param d - The detection gathered up front.
281
+ * @param group - The group whose file is blocked.
282
+ * @param roots - The two roots the path renders relative to.
283
+ * @returns The remedy line.
284
+ */
285
+ function blockedMcpRemedy(d, group, roots) {
286
+ const want = pragmaMcpEntry(d.cwd, group.scope);
287
+ const where = shortenPath(group.path, roots);
288
+ const toml = group.writes[0]?.configFormat === "toml";
289
+ const body = toml
290
+ ? group.writes
291
+ .map((write) => d.serializeTomlInlineEntry(write.mcpKey, MCP_SERVER_NAME, write.serializeEntry(want)))
292
+ .join(" ")
293
+ : JSON.stringify(Object.fromEntries(group.writes.map((write) => [
294
+ write.mcpKey,
295
+ { [MCP_SERVER_NAME]: write.serializeEntry(want) },
296
+ ])));
297
+ return `put this entry in the config that owns ${where}: ${body}`;
298
+ }
299
+ /** The groups whose file cannot be written, in `d.groups` order. */
300
+ export const blockedMcpGroups = (d) => d.groups.filter((group) => d.blockedByPath.has(group.path));
301
+ /**
302
+ * The FIRST group whose file cannot be written, with its reason and its remedy
303
+ * already derived — or `undefined` when every file in the scope is writable.
304
+ *
305
+ * It hands back the derived strings rather than the group, for the reason
306
+ * `firstLspBlock` spells out: the blockedness is what makes the two strings
307
+ * exist, so a caller that took the group and asked for them separately had to
308
+ * assert that both were there, on both surfaces.
309
+ *
310
+ * @param d - The detection gathered up front.
311
+ * @param roots - The two roots the path renders relative to.
312
+ * @returns The first block's reason and remedy, or `undefined`.
313
+ */
314
+ export const firstMcpBlock = (d, roots) => {
315
+ // A walk rather than `blockedMcpGroups(d).at(0)`: the group and its block
316
+ // come out together, so nothing has to assert afterwards that the block a
317
+ // filter just proved is there really is.
318
+ for (const group of d.groups) {
319
+ const block = mcpGroupBlock(d, group.path);
320
+ if (block !== undefined) {
321
+ return {
322
+ reason: describeMcpBlock(block, group.path, roots),
323
+ remedy: blockedMcpRemedy(d, group, roots),
324
+ };
325
+ }
326
+ }
327
+ return undefined;
328
+ };
193
329
  /** The target groups the user selected (by path), or all when none recorded. */
194
330
  export function selectedGroups(d, selectedPaths) {
195
331
  return d.groups.filter((g) => selectedPaths.includes(g.path));
@@ -213,7 +349,10 @@ export function composeMcp(d, groups) {
213
349
  // task twice (preview + perform). One combined write per file keeps a shared
214
350
  // file (VS Code + Cline) a single read-modify-write — dry-run safe. The
215
351
  // written entry is SCOPE-shaped per group (a global entry omits `cwd`).
216
- const pending = groups.filter((group) => mcpGroupState(d, group.path) !== "registered");
352
+ const pending = groups.filter((group) => mcpGroupState(d, group.path) !== "registered" &&
353
+ // A blocked file is never written. The write is what USED to discover the
354
+ // block, and it discovered it as a raw fs error on a `failed` row.
355
+ !d.blockedByPath.has(group.path));
217
356
  return sequence_(pending.map((group) => d.writeMcpConfigTargets(group.writes, MCP_SERVER_NAME, pragmaMcpEntry(d.cwd, group.scope))));
218
357
  }
219
358
  /**
@@ -222,7 +361,10 @@ export function composeMcp(d, groups) {
222
361
  * this set, so a file that never carried the entry is never rewritten and a
223
362
  * foreign server in a file that does is never touched.
224
363
  */
225
- export const ownedMcpGroups = (d) => d.groups.filter((group) => mcpGroupState(d, group.path) !== "absent");
364
+ export const ownedMcpGroups = (d) => d.groups.filter((group) => mcpGroupState(d, group.path) !== "absent" &&
365
+ // A blocked file cannot be written, so it cannot be un-written either.
366
+ // The row says so rather than composing a reversal that would fail.
367
+ !d.blockedByPath.has(group.path));
226
368
  /**
227
369
  * Compose the removal of the pragma entry from every owned file.
228
370
  *
@@ -243,11 +385,14 @@ export const ownedMcpGroups = (d) => d.groups.filter((group) => mcpGroupState(d,
243
385
  * same file is never touched.
244
386
  *
245
387
  * @param d - The detection gathered up front.
388
+ * @param undoKey - Correlation key stamped on the reversal(s), echoed on
389
+ * their undo outcomes so the caller can read results back per row.
246
390
  * @returns A Task whose undo removes the pragma entry from each owned file.
247
391
  */
248
- export function composeMcpRemoval(d) {
392
+ export function composeMcpRemoval(d, undoKey) {
249
393
  return sequence_(ownedMcpGroups(d).map((group) => mkdir(dirname(group.path), true, {
250
394
  undo: sequence_(group.writes.map((write) => d.removeMcpConfigFrom(write, MCP_SERVER_NAME))),
395
+ undoKey,
251
396
  })));
252
397
  }
253
398
  //# sourceMappingURL=setupMcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setupMcp.js","sourceRoot":"","sources":["../../../../../src/capabilities/setup/operations/setupMcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAa,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAwCxD;;;;;;;;;;;;GAYG;AACH,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,OAAO,CAAU,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,KAAY;IACtD,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE;QAC9D,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,KAAK,UAAU,aAAa,CAC1B,KAAmB,EACnB,IAAqB,EACrB,YAGC,EACD,OAAsD;IAEtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,YAAY,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC;QACvE,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,kBAAkB,GAAG,CACzB,MAAiC,EACjB,EAAE;IAClB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,YAAY,CAAC;QAAE,OAAO,YAAY,CAAC;IACzE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,WAAW,GAAG,CAAC,KAAmB,EAAU,EAAE,CAClD,GAAG,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAiB,EACjB,KAAY;IAEZ,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;IACnB,MAAM,CACJ,EACE,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,GACtB,EACD,EAAE,OAAO,EAAE,EACZ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpB,MAAM,CAAC,sBAAsB,CAAC;QAC9B,MAAM,CAAC,sBAAsB,CAAC;KAC/B,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEpE,8EAA8E;IAC9E,2EAA2E;IAC3E,yEAAyE;IACzE,4EAA4E;IAC5E,8EAA8E;IAC9E,0EAA0E;IAC1E,4BAA4B;IAC5B,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,MAAM,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;IACvD,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACjC,KAAK;YACL,KAAK,EAAE,MAAM,aAAa,CACxB,KAAK,EACL,IAAI,EACJ,EAAE,iBAAiB,EAAE,eAAe,EAAE,EACtC,OAAO,CACR;SACF,CAAC,CAAC,CACJ,CAAC;QACF,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,CAAC;YAC1C,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QACD,WAAW,CAAC,GAAG,CACb,KAAK,CAAC,IAAI,EACV,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CACnD,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,OAAO;QACL,MAAM;QACN,WAAW;QACX,YAAY;QACZ,GAAG;QACH,QAAQ;QACR,qBAAqB;QACrB,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,CAAe,EAAE,IAAY;IACzD,OAAO,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;AAC7C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,CAAe,EACf,KAAmB;IAEnB,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC;AAC5D,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAC5B,CAAe,EACf,aAAgC;IAEhC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU,CACxB,CAAe,EACf,MAA8B;IAE9B,6EAA6E;IAC7E,6EAA6E;IAC7E,wEAAwE;IACxE,wEAAwE;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC3B,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,YAAY,CACzD,CAAC;IACF,OAAO,SAAS,CACd,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACpB,CAAC,CAAC,qBAAqB,CACrB,KAAK,CAAC,MAAM,EACZ,eAAe,EACf,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CACnC,CACF,CACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAe,EAA0B,EAAE,CACxE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAe;IAC/C,OAAO,SAAS,CACd,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE;QAC/B,IAAI,EAAE,SAAS,CACb,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACzB,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,eAAe,CAAC,CAC9C,CACF;KACF,CAAC,CACH,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"setupMcp.js","sourceRoot":"","sources":["../../../../../src/capabilities/setup/operations/setupMcp.ts"],"names":[],"mappings":"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"}
@@ -583,12 +583,14 @@ export const ownedSkillLinks = (d) => [
583
583
  * this command owns, never from what a fresh forward plan would create.
584
584
  *
585
585
  * @param d - The detection gathered up front.
586
+ * @param undoKey - Correlation key stamped on the reversal(s), echoed on
587
+ * their undo outcomes so the caller can read results back per row.
586
588
  * @returns A Task whose undo removes every owned link.
587
589
  */
588
- export function composeSkillsRemoval(d) {
590
+ export function composeSkillsRemoval(d, undoKey) {
589
591
  const owned = ownedSkillLinks(d);
590
592
  if (owned.length === 0)
591
593
  return sequence_([]);
592
- return sequence_(owned.map((a) => symlink(a.target, a.linkPath, { undo: deleteFile(a.linkPath) })));
594
+ return sequence_(owned.map((a) => symlink(a.target, a.linkPath, { undo: deleteFile(a.linkPath), undoKey })));
593
595
  }
594
596
  //# sourceMappingURL=setupSkills.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setupSkills.js","sourceRoot":"","sources":["../../../../../src/capabilities/setup/operations/setupSkills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setupSkills.js","sourceRoot":"","sources":["../../../../../src/capabilities/setup/operations/setupSkills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * "Could this command write there?" — asked BEFORE anything is written.
3
+ *
4
+ * Two machines answer no, and until this probe existed both answered it the
5
+ * same wrong way. A NixOS or home-manager user's `~/.vscode/extensions` is a
6
+ * symlink into `/nix/store`, which is a read-only filesystem by design:
7
+ * `--install-extension` failed with a raw fs error, or appeared to succeed and
8
+ * changed nothing. A managed config directory turned the MCP write into a
9
+ * `failed` row carrying an EACCES message and no next step. Neither is a
10
+ * failure of this command — the machine is configured exactly as its owner
11
+ * intends — so both become NAMED SKIPS whose remedy is the one action that
12
+ * works there: declaring the extension, or the MCP entry, in the config that
13
+ * owns the directory.
14
+ *
15
+ * Per the owner, 2026-09-16: the decision is made by the DIRECTORY, never by
16
+ * the OS. Nix is not a platform to branch on — a Nix user's home directory is
17
+ * ordinary, a non-Nix user can have a read-only mount, and `/etc/nixos` says
18
+ * nothing about whether THIS path is writable. So the probe walks the path it
19
+ * was actually given.
20
+ *
21
+ * The whole filesystem surface is the injected {@link FsProbe}, so every
22
+ * branch is exercised over a seam rather than by arranging a real read-only
23
+ * directory (which a test running as root cannot do at all). It lives under
24
+ * `setup/operations/` because setup is its one consumer: doctor reads the
25
+ * result off the detection records setup already produced, and never probes
26
+ * a second time.
27
+ */
28
+ import { accessSync, constants, existsSync, realpathSync } from "node:fs";
29
+ import { dirname } from "node:path";
30
+ /** The store prefix a Nix-managed path resolves under. */
31
+ const NIX_STORE_PREFIX = "/nix/store/";
32
+ /** The real filesystem — the default, and the only impure thing in this module. */
33
+ const nodeFs = { existsSync, accessSync, realpathSync };
34
+ /**
35
+ * The nearest node at or above `target` that exists, or `undefined` when the
36
+ * walk runs out of parents.
37
+ *
38
+ * `dirname("/")` is `"/"`, so the loop terminates on the fixed point rather
39
+ * than on a path shape — the same is true of a win32 drive root, which is why
40
+ * the comparison is against the previous value and not against a separator.
41
+ *
42
+ * @param target - The path to start at.
43
+ * @param fs - The filesystem seam.
44
+ * @returns The nearest existing node, or `undefined`.
45
+ * @note Impure — stats each path it walks through the injected seam.
46
+ */
47
+ const findNearestExisting = (target, fs) => {
48
+ let current = target;
49
+ for (;;) {
50
+ if (fs.existsSync(current))
51
+ return current;
52
+ const parent = dirname(current);
53
+ if (parent === current)
54
+ return undefined;
55
+ current = parent;
56
+ }
57
+ };
58
+ /**
59
+ * Probe whether `target` could be written, returning the {@link WriteBlock}
60
+ * that says why not — or `undefined` when the write can go ahead.
61
+ *
62
+ * Three rules, in this order:
63
+ *
64
+ * 1. **Walk up to the nearest node that exists**, starting AT the target. The
65
+ * target itself when it is there — home-manager symlinks `mcp.json`
66
+ * directly into the store while leaving `User/` writable, so stopping at
67
+ * the parent directory would call that file writable and then fail on the
68
+ * write. Otherwise its nearest existing ancestor, because a path that does
69
+ * not exist yet is writable exactly when the directory that would hold it
70
+ * is.
71
+ * 2. **`realpathSync` it**, so the answer is about the real filesystem rather
72
+ * than the symlink standing in front of it.
73
+ * 3. **`/nix/store/` wins over `W_OK`.** Checked first, deliberately: the
74
+ * store is read-only, so `access(W_OK)` would fail there too and the row
75
+ * would report "read-only" with a remedy about file permissions — advice
76
+ * that cannot work, because `chmod` on the store is not the fix and would
77
+ * be undone by the next `nixos-rebuild`. The remedy for a store path is a
78
+ * declaration in the user's own config, and naming the store is what earns
79
+ * it.
80
+ *
81
+ * @param target - The file or directory a write would create or modify.
82
+ * @param fs - The filesystem seam; defaults to the real `node:fs`.
83
+ * @returns The block, or `undefined` when the path is writable.
84
+ * @note Impure by default — it stats and resolves real paths. Every branch is
85
+ * reachable through the injected {@link FsProbe}.
86
+ */
87
+ export function probeWritable(target, fs = nodeFs) {
88
+ const existing = findNearestExisting(target, fs);
89
+ // Nothing at or above the target exists. That is not a permission answer,
90
+ // and inventing one either way would be a guess — the write will report its
91
+ // own error if it is really unreachable.
92
+ if (existing === undefined)
93
+ return undefined;
94
+ let resolved;
95
+ try {
96
+ resolved = fs.realpathSync(existing);
97
+ }
98
+ catch {
99
+ // The node existed a moment ago and cannot be resolved now (a race, or a
100
+ // symlink loop). Not a block: the caller's write is the honest judge.
101
+ return undefined;
102
+ }
103
+ if (resolved.startsWith(NIX_STORE_PREFIX)) {
104
+ return { kind: "nix-store", resolved };
105
+ }
106
+ try {
107
+ fs.accessSync(resolved, constants.W_OK);
108
+ }
109
+ catch {
110
+ return { kind: "read-only", path: resolved };
111
+ }
112
+ return undefined;
113
+ }
114
+ //# sourceMappingURL=writability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writability.js","sourceRoot":"","sources":["../../../../../src/capabilities/setup/operations/writability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,0DAA0D;AAC1D,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAcvC,mFAAmF;AACnF,MAAM,MAAM,GAAY,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AAEjE;;;;;;;;;;;;GAYG;AACH,MAAM,mBAAmB,GAAG,CAC1B,MAAc,EACd,EAAW,EACS,EAAE;IACtB,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,SAAS,CAAC;QACR,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,KAAc,MAAM;IAEpB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,0EAA0E;IAC1E,4EAA4E;IAC5E,yCAAyC;IACzC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE7C,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,sEAAsE;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../src/capabilities/setup/plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../src/capabilities/setup/plan.ts"],"names":[],"mappings":"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"}
@@ -175,6 +175,31 @@ async function runSetup(mode, rt, scope) {
175
175
  // — that is what makes the preview honest — so anything it says out loud has
176
176
  // to know which of the two it is.
177
177
  const previewing = interactionMode === "batch-dry-run";
178
+ // The undo truth channel. A real `--undo` interprets this verb's task ONLY
179
+ // as the undo interpreter's mocked collection walk — every exec exits 0,
180
+ // every prompt answers its default, and the OutcomeSink is never written —
181
+ // so nothing the task body could report describes what the collected
182
+ // reversals later did. The body therefore says NOTHING on the undo path
183
+ // (see the guard in the gen body below); the kernel calls this seam after
184
+ // the reversals actually ran, handing over the interpreter's per-undo
185
+ // outcomes, and `appliedUndo` projects them onto the rows through the SAME
186
+ // sink + `applied` path the forward run reports through. One outcome
187
+ // model, both directions.
188
+ if (!previewing && input.undo) {
189
+ rt.undoReport = (outcomes) => {
190
+ const applied = run.appliedUndo(outcomes);
191
+ const width = Math.max(...applied.rows.map((row) => row.target.length));
192
+ for (const row of applied.rows) {
193
+ if (row.outcome === undefined)
194
+ continue;
195
+ rt.report?.(renderProgressLine(row, width));
196
+ }
197
+ if (planExitFailed(applied)) {
198
+ rt.report?.(renderRecap(applied, "Removed"));
199
+ raiseFailedRows(applied, true);
200
+ }
201
+ };
202
+ }
178
203
  // A CONVERGED machine has no question to ask. Every row is `none` or `skip`,
179
204
  // so nothing composes an effect — and the wizard's confirm gate then mounted
180
205
  // Ink to render summon-core's "No operations planned." above a "Proceed?"
@@ -275,6 +300,16 @@ async function runSetup(mode, rt, scope) {
275
300
  return gen(function* () {
276
301
  const result = yield* $(task);
277
302
  const applied = run.applied(result.answers);
303
+ // A real `--undo` only ever drives this body under the undo
304
+ // interpreter's COLLECTION walk, with every effect mocked. `applied` is
305
+ // then a projection of the mocked walk (`removed` rows for reversals
306
+ // that have not run yet), so reporting it here printed green checks
307
+ // before anything happened. Say nothing; the kernel hands the executed
308
+ // reversals' outcomes to `rt.undoReport` afterwards, and `appliedUndo`
309
+ // grades the rows from those. (`--undo --dry-run` stays on the shared
310
+ // preview path below, where the same suppressions already apply.)
311
+ if (input.undo && !previewing)
312
+ return applied;
278
313
  // Progress: one line per row on stderr for an unattended run (the Ink
279
314
  // session already draws them for the wizard). stdout stays the data stream.
280
315
  //
@@ -295,40 +330,54 @@ async function runSetup(mode, rt, scope) {
295
330
  // stdout on a failing run.
296
331
  if (planExitFailed(applied)) {
297
332
  rt.report?.(renderRecap(applied));
298
- const failed = applied.rows.filter((row) => row.outcome?.status === "failed");
299
- // ONE failure reports itself. The row already carries the cause it was
300
- // given ("`bun` is not found on your PATH") and a remedy that runs on
301
- // this machine; replacing them with a count would throw away the only
302
- // two sentences that say what is wrong and what to do about it.
303
- const only = failed.length === 1 ? failed[0] : undefined;
304
- if (only?.outcome !== undefined) {
305
- throw new PragmaError({
306
- code: "UNSUPPORTED",
307
- message: `${only.target}: ${only.outcome.note ?? "the step did not complete"}`,
308
- ...(only.outcome.remedy === undefined
309
- ? {}
310
- : { recovery: { message: only.outcome.remedy } }),
311
- });
312
- }
313
- // Several failures: name every one with its own cause, then point at the
314
- // recap above. A bare list of target names would make the reader re-run
315
- // each one to find out why it failed.
316
- const named = failed
317
- .map((row) => `${row.target} (${row.outcome?.note ?? "no cause recorded"})`)
318
- .join("; ");
319
- throw new PragmaError({
320
- code: "UNSUPPORTED",
321
- message: `${failed.length} of ${planTally(applied).accountable} targets did not complete: ${named}.`,
322
- recovery: {
323
- message: `The other targets are configured. Re-run the ones that did not complete: ${failed
324
- .map((row) => `\`${BIN_NAME} setup ${row.target}\``)
325
- .join(", ")}.`,
326
- },
327
- });
333
+ raiseFailedRows(applied);
328
334
  }
329
335
  return applied;
330
336
  });
331
337
  }
338
+ /**
339
+ * Raise the run's failure from its rows — shared by the forward run's recap
340
+ * and the post-undo truth report, so the two paths name a shortfall in the
341
+ * same words. `undo` only re-words the multi-failure recovery line: the
342
+ * command that retries a removal is `setup <target> --undo`, not the
343
+ * installer.
344
+ *
345
+ * @param applied - The plan with outcomes filled in (at least one `failed`).
346
+ * @param undo - Whether the failed run was a removal.
347
+ * @throws PragmaError naming the failed row(s), always.
348
+ */
349
+ function raiseFailedRows(applied, undo = false) {
350
+ const failed = applied.rows.filter((row) => row.outcome?.status === "failed");
351
+ // ONE failure reports itself. The row already carries the cause it was
352
+ // given ("`bun` is not found on your PATH") and a remedy that runs on
353
+ // this machine; replacing them with a count would throw away the only
354
+ // two sentences that say what is wrong and what to do about it.
355
+ const only = failed.length === 1 ? failed[0] : undefined;
356
+ if (only?.outcome !== undefined) {
357
+ throw new PragmaError({
358
+ code: "UNSUPPORTED",
359
+ message: `${only.target}: ${only.outcome.note ?? "the step did not complete"}`,
360
+ ...(only.outcome.remedy === undefined
361
+ ? {}
362
+ : { recovery: { message: only.outcome.remedy } }),
363
+ });
364
+ }
365
+ // Several failures: name every one with its own cause, then point at the
366
+ // recap above. A bare list of target names would make the reader re-run
367
+ // each one to find out why it failed.
368
+ const named = failed
369
+ .map((row) => `${row.target} (${row.outcome?.note ?? "no cause recorded"})`)
370
+ .join("; ");
371
+ throw new PragmaError({
372
+ code: "UNSUPPORTED",
373
+ message: `${failed.length} of ${planTally(applied).accountable} targets did not complete: ${named}.`,
374
+ recovery: {
375
+ message: `The other targets are ${undo ? "removed" : "configured"}. Re-run the ones that did not complete: ${failed
376
+ .map((row) => `\`${BIN_NAME} setup ${row.target}${undo ? " --undo" : ""}\``)
377
+ .join(", ")}.`,
378
+ },
379
+ });
380
+ }
332
381
  /** Build a setup verb bound to its {@link SetupMode}. */
333
382
  function setupVerb(path, summary, mode, capability, extras = {}) {
334
383
  return {
@@ -369,7 +418,7 @@ const configVerb = setupVerb(["setup", "config"], "Create your global config fil
369
418
  const mcpVerb = setupVerb(["setup", "mcp"], `Register the ${BIN_NAME} MCP server with the AI harnesses on this machine.`, "mcp", SUB_CAPABILITY);
370
419
  const completionsVerb = setupVerb(["setup", "completions"], "Install TAB completion for the shell you are running.", "completions", SUB_CAPABILITY);
371
420
  const skillsVerb = setupVerb(["setup", "skills"], "Link the skills you have installed into every AI harness that reads them.", "skills", SUB_CAPABILITY);
372
- const lspVerb = setupVerb(["setup", "lsp"], "Install the Terrazzo design-token extension into your VS Code-family editors.", "lsp", SUB_CAPABILITY);
421
+ const lspVerb = setupVerb(["setup", "lsp"], "Install the Terrazzo design-token extension into the VS Code-family editors on this machine (on PATH, under /Applications or ~/Applications, or by its user directory).", "lsp", SUB_CAPABILITY);
373
422
  /** The `setup` capability module (run-all self-verb + five CLI-only sub-verbs). */
374
423
  export const setupModule = {
375
424
  name: "setup",