@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.
- package/README.md +3 -2
- package/bundled-skills/adoption-a1-styles/SKILL.md +24 -0
- package/bundled-skills/adoption-a2-components/SKILL.md +22 -6
- package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +1397 -327
- package/bundled-skills/anatomy-author/SKILL.md +840 -137
- package/bundled-skills/design-auditor/SKILL.md +133 -9
- package/bundled-skills/implement-component/SKILL.md +192 -23
- package/bundled-skills/specify-component/SKILL.md +124 -12
- package/bundled-skills/specify-pattern/SKILL.md +47 -8
- package/dist/package.json +23 -20
- package/dist/pragma.conf.js +963 -40
- package/dist/pragma.conf.js.map +1 -1
- package/dist/src/capabilities/capabilities/catalog.js +14 -5
- package/dist/src/capabilities/capabilities/catalog.js.map +1 -1
- package/dist/src/capabilities/capabilities/hints.js +33 -5
- package/dist/src/capabilities/capabilities/hints.js.map +1 -1
- package/dist/src/capabilities/config/show.render.js +30 -2
- package/dist/src/capabilities/config/show.render.js.map +1 -1
- package/dist/src/capabilities/create/create.verb.js +2 -1
- package/dist/src/capabilities/create/create.verb.js.map +1 -1
- package/dist/src/capabilities/create/createSurface.generated.js +23 -1
- package/dist/src/capabilities/create/createSurface.generated.js.map +1 -1
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +11 -6
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -1
- package/dist/src/capabilities/doctor/checks/harnessInventory.js +1 -1
- package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -1
- package/dist/src/capabilities/doctor/checks/isSupportedNodeVersion.js +38 -0
- package/dist/src/capabilities/doctor/checks/isSupportedNodeVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js +104 -14
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -1
- package/dist/src/capabilities/graph/connect.render.js +101 -0
- package/dist/src/capabilities/graph/connect.render.js.map +1 -0
- package/dist/src/capabilities/graph/connect.types.js +21 -0
- package/dist/src/capabilities/graph/connect.types.js.map +1 -0
- package/dist/src/capabilities/graph/connect.verb.js +147 -0
- package/dist/src/capabilities/graph/connect.verb.js.map +1 -0
- package/dist/src/capabilities/graph/index.js +5 -3
- package/dist/src/capabilities/graph/index.js.map +1 -1
- package/dist/src/capabilities/graph/queryText.js +206 -0
- package/dist/src/capabilities/graph/queryText.js.map +1 -0
- package/dist/src/capabilities/graph/relationIndex.js +302 -0
- package/dist/src/capabilities/graph/relationIndex.js.map +1 -0
- package/dist/src/capabilities/graph/runConnect.js +456 -0
- package/dist/src/capabilities/graph/runConnect.js.map +1 -0
- package/dist/src/capabilities/graph/runQuery.js +21 -4
- package/dist/src/capabilities/graph/runQuery.js.map +1 -1
- package/dist/src/capabilities/setup/buildPlan.js +6 -2
- package/dist/src/capabilities/setup/buildPlan.js.map +1 -1
- package/dist/src/capabilities/setup/operations/index.js +7 -2
- package/dist/src/capabilities/setup/operations/index.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupCompletions.js +6 -2
- package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupConfig.js +4 -2
- package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupGenerator.js +72 -14
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupLsp.js +372 -62
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupMcp.js +150 -5
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupSkills.js +4 -2
- package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -1
- package/dist/src/capabilities/setup/operations/writability.js +114 -0
- package/dist/src/capabilities/setup/operations/writability.js.map +1 -0
- package/dist/src/capabilities/setup/plan.js.map +1 -1
- package/dist/src/capabilities/setup/setup.verb.js +80 -31
- package/dist/src/capabilities/setup/setup.verb.js.map +1 -1
- package/dist/src/capabilities/setup/targets.js +124 -42
- package/dist/src/capabilities/setup/targets.js.map +1 -1
- package/dist/src/capabilities/shared/index.js +1 -1
- package/dist/src/capabilities/shared/index.js.map +1 -1
- package/dist/src/constants.js +7 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/kernel/error/renderError.js +3 -2
- package/dist/src/kernel/error/renderError.js.map +1 -1
- package/dist/src/kernel/error/validOptions.js +41 -0
- package/dist/src/kernel/error/validOptions.js.map +1 -0
- package/dist/src/kernel/packs/compile.js +90 -6
- package/dist/src/kernel/packs/compile.js.map +1 -1
- package/dist/src/kernel/packs/cursor.js +135 -0
- package/dist/src/kernel/packs/cursor.js.map +1 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js +9 -2
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -1
- package/dist/src/kernel/packs/paging.js +108 -0
- package/dist/src/kernel/packs/paging.js.map +1 -0
- package/dist/src/kernel/packs/renderPack.js +154 -5
- package/dist/src/kernel/packs/renderPack.js.map +1 -1
- package/dist/src/kernel/packs/resolveEntity.js +118 -19
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -1
- package/dist/src/kernel/packs/runBodies.js +156 -18
- package/dist/src/kernel/packs/runBodies.js.map +1 -1
- package/dist/src/kernel/packs/schema.js +160 -12
- package/dist/src/kernel/packs/schema.js.map +1 -1
- package/dist/src/kernel/packs/sparql/authorQuery.js +227 -0
- package/dist/src/kernel/packs/sparql/authorQuery.js.map +1 -0
- package/dist/src/kernel/packs/sparql/buildListQuery.js +251 -0
- package/dist/src/kernel/packs/sparql/buildListQuery.js.map +1 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js +125 -22
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -1
- package/dist/src/kernel/packs/sparql/filterValues.js +145 -0
- package/dist/src/kernel/packs/sparql/filterValues.js.map +1 -0
- package/dist/src/kernel/packs/sparql/index.js +24 -14
- package/dist/src/kernel/packs/sparql/index.js.map +1 -1
- package/dist/src/kernel/packs/sparql/runSelect.js +10 -4
- package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -1
- package/dist/src/kernel/packs/sparql/searchTerm.js +25 -0
- package/dist/src/kernel/packs/sparql/searchTerm.js.map +1 -0
- package/dist/src/kernel/packs/storyRules.js +151 -0
- package/dist/src/kernel/packs/storyRules.js.map +1 -0
- package/dist/src/kernel/packs/tierScope.js +310 -0
- package/dist/src/kernel/packs/tierScope.js.map +1 -0
- package/dist/src/kernel/packs/types.js +80 -0
- package/dist/src/kernel/packs/types.js.map +1 -1
- package/dist/src/kernel/project/cli/buildProgram.js +10 -1
- package/dist/src/kernel/project/cli/buildProgram.js.map +1 -1
- package/dist/src/kernel/project/cli/dispatch.js +104 -3
- package/dist/src/kernel/project/cli/dispatch.js.map +1 -1
- package/dist/src/kernel/project/cli/rootHelp.js +8 -5
- package/dist/src/kernel/project/cli/rootHelp.js.map +1 -1
- package/dist/src/kernel/project/cli/suggestNames.js +31 -7
- package/dist/src/kernel/project/cli/suggestNames.js.map +1 -1
- package/dist/src/kernel/project/mcp/registerVerb.js +5 -1
- package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -1
- package/dist/src/kernel/render/renderers.js +34 -2
- package/dist/src/kernel/render/renderers.js.map +1 -1
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +2 -3
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -1
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +1 -1
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -1
- package/dist/src/kernel/runtime/graphpack/embedded/pack.manifest.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.manifest.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js +13 -6
- package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -1
- package/dist/src/kernel/runtime/graphpack/read.js +17 -10
- package/dist/src/kernel/runtime/graphpack/read.js.map +1 -1
- package/dist/src/kernel/runtime/loadSession.js +3 -1
- package/dist/src/kernel/runtime/loadSession.js.map +1 -1
- package/dist/src/kernel/runtime/probe.js +1 -1
- package/dist/src/kernel/runtime/probe.js.map +1 -1
- package/dist/src/kernel/runtime/readEntity.js +19 -4
- package/dist/src/kernel/runtime/readEntity.js.map +1 -1
- package/dist/src/kernel/runtime/refs/parseRef.js +17 -1
- package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -1
- package/dist/src/kernel/runtime/refs/resolve.js +38 -5
- package/dist/src/kernel/runtime/refs/resolve.js.map +1 -1
- package/dist/src/kernel/spec/emitReference.js +1 -1
- package/dist/src/kernel/spec/emitReference.js.map +1 -1
- package/package.json +23 -20
- package/pragma.conf.ts +983 -40
- package/src/capabilities/block.parity.test.ts +207 -27
- package/src/capabilities/block.shipped.exec.test.ts +156 -14
- package/src/capabilities/block.tierRank.exec.test.ts +46 -9
- package/src/capabilities/capabilities/catalog.ts +14 -5
- package/src/capabilities/capabilities/hints.ts +40 -5
- package/src/capabilities/config/collectConfigShow.test.ts +1 -0
- package/src/capabilities/config/set.test.ts +24 -25
- package/src/capabilities/config/show.render.test.ts +9 -4
- package/src/capabilities/config/show.render.ts +30 -2
- package/src/capabilities/create/byteEquality.test.ts +28 -1
- package/src/capabilities/create/create.test.ts +1 -0
- package/src/capabilities/create/create.verb.ts +2 -1
- package/src/capabilities/create/createGrammar.test.ts +4 -1
- package/src/capabilities/create/createSurface.generated.ts +23 -1
- package/src/capabilities/create/crossCli.subprocess.test.ts +10 -3
- package/src/capabilities/distribution.parity.test.ts +12 -11
- package/src/capabilities/distribution.test.ts +77 -7
- package/src/capabilities/doctor/checks/checkNodeVersion.test.ts +49 -0
- package/src/capabilities/doctor/checks/checkNodeVersion.ts +11 -7
- package/src/capabilities/doctor/checks/harnessInventory.test.ts +13 -6
- package/src/capabilities/doctor/checks/harnessInventory.ts +8 -4
- package/src/capabilities/doctor/checks/isSupportedNodeVersion.test.ts +111 -0
- package/src/capabilities/doctor/checks/isSupportedNodeVersion.ts +34 -0
- package/src/capabilities/doctor/checks/mcpCommand.test.ts +7 -1
- package/src/capabilities/doctor/checks/targetHealth.ts +114 -13
- package/src/capabilities/doctor/doctor.test.ts +327 -36
- package/src/capabilities/emptyRecovery.test.ts +84 -28
- package/src/capabilities/graph/connect.render.ts +141 -0
- package/src/capabilities/graph/connect.shipped.exec.test.ts +370 -0
- package/src/capabilities/graph/connect.test.ts +361 -0
- package/src/capabilities/graph/connect.types.ts +136 -0
- package/src/capabilities/graph/connect.verb.ts +165 -0
- package/src/capabilities/graph/index.ts +5 -3
- package/src/capabilities/graph/query.shipped.exec.test.ts +66 -0
- package/src/capabilities/graph/query.test.ts +17 -0
- package/src/capabilities/graph/queryText.test.ts +121 -0
- package/src/capabilities/graph/queryText.ts +240 -0
- package/src/capabilities/graph/relationIndex.ts +372 -0
- package/src/capabilities/graph/runConnect.ts +577 -0
- package/src/capabilities/graph/runQuery.ts +21 -6
- package/src/capabilities/lazy.test.ts +32 -2
- package/src/capabilities/listBudget.shipped.exec.test.ts +239 -0
- package/src/capabilities/listLookup.shipped.exec.test.ts +387 -0
- package/src/capabilities/listQuery.shipped.exec.test.ts +400 -0
- package/src/capabilities/resources/resources.test.ts +38 -2
- package/src/capabilities/setup/buildPlan.ts +7 -1
- package/src/capabilities/setup/operations/index.ts +14 -0
- package/src/capabilities/setup/operations/setupCompletions.ts +9 -2
- package/src/capabilities/setup/operations/setupConfig.ts +7 -2
- package/src/capabilities/setup/operations/setupGenerator.ts +93 -15
- package/src/capabilities/setup/operations/setupLsp.ts +544 -85
- package/src/capabilities/setup/operations/setupMcp.ts +212 -4
- package/src/capabilities/setup/operations/setupSkills.ts +7 -2
- package/src/capabilities/setup/operations/writability.test.ts +151 -0
- package/src/capabilities/setup/operations/writability.ts +135 -0
- package/src/capabilities/setup/plan.ts +11 -0
- package/src/capabilities/setup/setup.test.ts +992 -16
- package/src/capabilities/setup/setup.verb.ts +84 -36
- package/src/capabilities/setup/targets.ts +152 -48
- package/src/capabilities/setup/types.ts +41 -5
- package/src/capabilities/shared/index.ts +1 -0
- package/src/capabilities/sources/sources.test.ts +55 -0
- package/src/capabilities/surface.test.ts +59 -11
- package/src/capabilities/tier.parity.test.ts +2 -2
- package/src/capabilities/token.parity.test.ts +784 -0
- package/src/capabilities/tokenGraph.cli.test.ts +279 -0
- package/src/capabilities/tokenGraph.shipped.exec.test.ts +653 -0
- package/src/capabilities/variable.parity.test.ts +448 -0
- package/src/constants.ts +8 -0
- package/src/kernel/completion/shellDrive.test.ts +32 -30
- package/src/kernel/config/defaults.test.ts +21 -2
- package/src/kernel/config/readConfig.test.ts +1 -1
- package/src/kernel/error/renderError.ts +3 -2
- package/src/kernel/error/validOptions.test.ts +57 -0
- package/src/kernel/error/validOptions.ts +45 -0
- package/src/kernel/packs/collect.test.ts +2 -0
- package/src/kernel/packs/compile.test.ts +188 -15
- package/src/kernel/packs/compile.ts +109 -14
- package/src/kernel/packs/cursor.ts +135 -0
- package/src/kernel/packs/filteredEmpty.test.ts +213 -0
- package/src/kernel/packs/graphql/buildLookupDocument.ts +16 -9
- package/src/kernel/packs/graphqlSource.test.ts +152 -0
- package/src/kernel/packs/listNotice.test.ts +156 -0
- package/src/kernel/packs/paging.ts +110 -0
- package/src/kernel/packs/renderPack.ts +186 -13
- package/src/kernel/packs/resolveEntity.test.ts +62 -3
- package/src/kernel/packs/resolveEntity.ts +186 -26
- package/src/kernel/packs/runBodies.ts +196 -26
- package/src/kernel/packs/schema.ts +180 -13
- package/src/kernel/packs/sparql/authorQuery.test.ts +179 -0
- package/src/kernel/packs/sparql/authorQuery.ts +257 -0
- package/src/kernel/packs/sparql/buildListQuery.test.ts +344 -0
- package/src/kernel/packs/sparql/buildListQuery.ts +344 -0
- package/src/kernel/packs/sparql/buildLookupQuery.test.ts +138 -0
- package/src/kernel/packs/sparql/buildLookupQuery.ts +140 -20
- package/src/kernel/packs/sparql/filterValues.test.ts +86 -0
- package/src/kernel/packs/sparql/filterValues.ts +182 -0
- package/src/kernel/packs/sparql/index.ts +30 -14
- package/src/kernel/packs/sparql/runSelect.test.ts +63 -0
- package/src/kernel/packs/sparql/runSelect.ts +42 -2
- package/src/kernel/packs/sparql/searchTerm.ts +29 -0
- package/src/kernel/packs/storyRules.ts +180 -0
- package/src/kernel/packs/tierScope.test.ts +487 -0
- package/src/kernel/packs/tierScope.ts +409 -0
- package/src/kernel/packs/toolDescription.test.ts +13 -10
- package/src/kernel/packs/types.ts +311 -9
- package/src/kernel/project/cli/buildProgram.ts +17 -1
- package/src/kernel/project/cli/dispatch.test.ts +87 -0
- package/src/kernel/project/cli/dispatch.ts +114 -4
- package/src/kernel/project/cli/rootHelp.ts +8 -5
- package/src/kernel/project/cli/suggest.test.ts +35 -0
- package/src/kernel/project/cli/suggestNames.ts +34 -7
- package/src/kernel/project/mcp/registerVerb.ts +5 -1
- package/src/kernel/render/contracts.ts +2 -0
- package/src/kernel/render/prefixes.test.ts +2 -0
- package/src/kernel/render/renderers.test.ts +43 -0
- package/src/kernel/render/renderers.ts +34 -1
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +2 -3
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
- package/src/kernel/runtime/graphpack/embedded/pack.manifest.generated.ts +3 -0
- package/src/kernel/runtime/graphpack/embedded.ts +14 -6
- package/src/kernel/runtime/graphpack/graphpack.test.ts +31 -5
- package/src/kernel/runtime/graphpack/read.ts +17 -13
- package/src/kernel/runtime/loadSession.ts +3 -1
- package/src/kernel/runtime/probe.ts +1 -1
- package/src/kernel/runtime/readEntity.ts +19 -4
- package/src/kernel/runtime/refs/parseRef.test.ts +49 -1
- package/src/kernel/runtime/refs/parseRef.ts +25 -1
- package/src/kernel/runtime/refs/resolve.ts +39 -5
- package/src/kernel/runtime/types.ts +30 -0
- package/src/kernel/spec/emitReference.ts +1 -1
- package/src/kernel/spec/surfaceConformance.test.ts +2 -2
- package/src/kernel/spec/types.ts +17 -0
- package/src/testing/PARITY_GAPS.ts +4 -4
- package/src/testing/behavioral/agentSession.mcp.test.ts +43 -39
- package/src/testing/behavioral/completion.test.ts +7 -6
- package/src/testing/behavioral/disclosure.test.ts +39 -37
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +82 -64
- package/src/testing/behavioral/errorMatrix.storeless.test.ts +11 -10
- package/src/testing/behavioral/journeys.cli.test.ts +71 -32
- package/src/testing/behavioral/journeys.defaultPack.test.ts +6 -4
- package/src/testing/behavioral/journeys.firstInstall.test.ts +70 -5
- package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +4 -3
- package/src/testing/behavioral/journeys.packageStories.test.ts +2 -1
- package/src/testing/behavioral/mcpSurface.test.ts +28 -25
- package/src/testing/behavioral/parity.test.ts +25 -23
- package/src/testing/eval/__snapshots__/eval.test.ts.snap +20 -0
- package/src/testing/eval/cases/effectful.ts +7 -1
- package/src/testing/eval/cases/readNouns.ts +100 -11
- package/src/testing/fixtures/blockGraph.ts +89 -5
- package/src/testing/fixtures/connectGraph.ts +159 -0
- package/src/testing/fixtures/graph/canonical.ts +128 -32
- package/src/testing/helpers/fsProbe.ts +88 -0
- package/src/testing/helpers/runCli.test.ts +44 -0
- package/src/testing/helpers/runCli.ts +27 -3
- package/src/testing/perf/budgets.test.ts +3 -1
- package/src/testing/perf/budgets.ts +138 -54
- package/dist/src/kernel/packs/sparql/applyFilters.js +0 -167
- package/dist/src/kernel/packs/sparql/applyFilters.js.map +0 -1
- package/dist/src/kernel/packs/sparql/applySearch.js +0 -25
- package/dist/src/kernel/packs/sparql/applySearch.js.map +0 -1
- package/src/kernel/packs/sparql/applyFilters.ts +0 -203
- 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
|
|
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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAItD,sEAAsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,aAAa;IACb,KAAK;IACL,KAAK;IACL,QAAQ;CACA,CAAC;
|
|
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
|
-
|
|
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
|
|
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",
|