@canonical/pragma-cli 0.35.0 → 0.36.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 +2 -2
- package/bundled-skills/add-standard/SKILL.md +338 -0
- package/bundled-skills/adoption-a1-styles/SKILL.md +269 -0
- package/bundled-skills/adoption-a2-components/SKILL.md +291 -0
- package/bundled-skills/adoption-a3-forms/SKILL.md +260 -0
- package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +406 -0
- package/bundled-skills/anatomy-author/SKILL.md +1226 -0
- package/bundled-skills/design-auditor/SKILL.md +455 -0
- package/bundled-skills/implement-component/SKILL.md +333 -0
- package/bundled-skills/specify-component/SKILL.md +331 -0
- package/bundled-skills/specify-pattern/SKILL.md +292 -0
- package/dist/package.json +16 -15
- package/dist/pragma.conf.js +236 -34
- package/dist/pragma.conf.js.map +1 -1
- package/dist/src/bin.js +1 -1
- package/dist/src/bin.js.map +1 -1
- package/dist/src/capabilities/colophon/colophon.render.js +1 -1
- package/dist/src/capabilities/colophon/colophon.render.js.map +1 -1
- package/dist/src/capabilities/create/mount.js +4 -3
- package/dist/src/capabilities/create/mount.js.map +1 -1
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +60 -4
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -1
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +8 -8
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -1
- package/dist/src/capabilities/doctor/checks/harnessInventory.js +195 -0
- package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/index.js +6 -6
- package/dist/src/capabilities/doctor/checks/targetHealth.js +194 -50
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -1
- package/dist/src/capabilities/doctor/doctor.render.js +43 -64
- package/dist/src/capabilities/doctor/doctor.render.js.map +1 -1
- package/dist/src/capabilities/doctor/doctor.verb.js +6 -2
- package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -1
- package/dist/src/capabilities/doctor/runChecks.js +14 -11
- package/dist/src/capabilities/doctor/runChecks.js.map +1 -1
- package/dist/src/capabilities/graph/query.render.js +2 -2
- package/dist/src/capabilities/graph/query.render.js.map +1 -1
- package/dist/src/capabilities/info/collectInfo.js +8 -2
- package/dist/src/capabilities/info/collectInfo.js.map +1 -1
- package/dist/src/capabilities/info/info.render.js +6 -2
- package/dist/src/capabilities/info/info.render.js.map +1 -1
- package/dist/src/capabilities/prompt/prompt.render.js +2 -2
- package/dist/src/capabilities/prompt/prompt.render.js.map +1 -1
- package/dist/src/capabilities/setup/buildPlan.js +43 -39
- package/dist/src/capabilities/setup/buildPlan.js.map +1 -1
- package/dist/src/capabilities/setup/mode.js +2 -2
- package/dist/src/capabilities/setup/operations/index.js +4 -4
- package/dist/src/capabilities/setup/operations/index.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupGenerator.js +92 -45
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupLsp.js +88 -36
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupMcp.js +97 -51
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -1
- package/dist/src/capabilities/setup/operations/setupSkills.js +325 -47
- package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -1
- package/dist/src/capabilities/setup/plan.js.map +1 -1
- package/dist/src/capabilities/setup/plan.render.js +144 -66
- package/dist/src/capabilities/setup/plan.render.js.map +1 -1
- package/dist/src/capabilities/setup/setup.render.js +1 -1
- package/dist/src/capabilities/setup/setup.verb.js +86 -33
- package/dist/src/capabilities/setup/setup.verb.js.map +1 -1
- package/dist/src/capabilities/setup/targets.js +110 -45
- package/dist/src/capabilities/setup/targets.js.map +1 -1
- package/dist/src/capabilities/shared/index.js +6 -5
- package/dist/src/capabilities/shared/index.js.map +1 -1
- package/dist/src/capabilities/shared/packageManager.js +300 -54
- package/dist/src/capabilities/shared/packageManager.js.map +1 -1
- package/dist/src/capabilities/skill/discover.js +97 -11
- package/dist/src/capabilities/skill/discover.js.map +1 -1
- package/dist/src/capabilities/skill/render.js +2 -2
- package/dist/src/capabilities/skill/render.js.map +1 -1
- package/dist/src/capabilities/sources/installSkills.js +145 -3
- package/dist/src/capabilities/sources/installSkills.js.map +1 -1
- package/dist/src/capabilities/sources/runUpdate.js +68 -2
- package/dist/src/capabilities/sources/runUpdate.js.map +1 -1
- package/dist/src/capabilities/sources/update.verb.js +3 -3
- package/dist/src/capabilities/sources/update.verb.js.map +1 -1
- package/dist/src/capabilities/upgrade/runUpgrade.js +43 -7
- package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -1
- package/dist/src/capabilities/upgrade/upgrade.render.js +10 -2
- package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -1
- package/dist/src/constants.js +6 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/kernel/index.js +11 -2
- package/dist/src/kernel/index.js.map +1 -1
- package/dist/src/kernel/interactivity.js +68 -0
- package/dist/src/kernel/interactivity.js.map +1 -0
- package/dist/src/kernel/packs/renderPack.js +3 -3
- package/dist/src/kernel/packs/renderPack.js.map +1 -1
- package/dist/src/kernel/packs/resolveEntity.js +63 -12
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -1
- package/dist/src/kernel/packs/runBodies.js +57 -4
- package/dist/src/kernel/packs/runBodies.js.map +1 -1
- package/dist/src/kernel/packs/schema.js +54 -2
- package/dist/src/kernel/packs/schema.js.map +1 -1
- package/dist/src/kernel/packs/sparql/applyFilters.js +104 -5
- package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -1
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js +306 -43
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -1
- package/dist/src/kernel/packs/types.js.map +1 -1
- package/dist/src/kernel/project/cli/buildProgram.js +1 -1
- package/dist/src/kernel/project/cli/buildProgram.js.map +1 -1
- package/dist/src/kernel/project/cli/dispatch.js +23 -23
- package/dist/src/kernel/project/cli/dispatch.js.map +1 -1
- package/dist/src/kernel/project/cli/globalFlags.js +4 -1
- package/dist/src/kernel/project/cli/globalFlags.js.map +1 -1
- package/dist/src/kernel/project/cli/helpFormat.js +1 -2
- package/dist/src/kernel/project/cli/helpFormat.js.map +1 -1
- package/dist/src/kernel/project/cli/rootHelp.js +34 -4
- package/dist/src/kernel/project/cli/rootHelp.js.map +1 -1
- package/dist/src/kernel/project/mcp/registerVerb.js +16 -1
- package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -1
- package/dist/src/kernel/render/renderers.js +1 -1
- package/dist/src/kernel/render/style.js +29 -9
- package/dist/src/kernel/render/style.js.map +1 -1
- package/dist/src/kernel/render/vocabulary.js +174 -0
- package/dist/src/kernel/render/vocabulary.js.map +1 -0
- package/dist/src/kernel/spec/emitReference.js +1 -1
- package/dist/src/kernel/spec/emitReference.js.map +1 -1
- package/package.json +16 -15
- package/pragma.conf.ts +241 -34
- package/src/bin.ts +8 -1
- package/src/capabilities/block.parity.test.ts +25 -11
- package/src/capabilities/block.shipped.exec.test.ts +282 -0
- package/src/capabilities/block.tierRank.exec.test.ts +300 -0
- package/src/capabilities/colophon/colophon.render.ts +1 -2
- package/src/capabilities/colophon/colophon.test.ts +2 -2
- package/src/capabilities/create/createGrammar.test.ts +1 -1
- package/src/capabilities/create/mount.ts +3 -3
- package/src/capabilities/distribution.parity.test.ts +4 -0
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +69 -4
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +6 -4
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +8 -8
- package/src/capabilities/doctor/checks/harnessInventory.test.ts +219 -0
- package/src/capabilities/doctor/checks/harnessInventory.ts +298 -0
- package/src/capabilities/doctor/checks/index.ts +6 -6
- package/src/capabilities/doctor/checks/targetHealth.ts +229 -59
- package/src/capabilities/doctor/doctor.render.test.ts +108 -32
- package/src/capabilities/doctor/doctor.render.ts +56 -80
- package/src/capabilities/doctor/doctor.test.ts +247 -35
- package/src/capabilities/doctor/doctor.verb.ts +7 -2
- package/src/capabilities/doctor/runChecks.ts +14 -11
- package/src/capabilities/doctor/types.ts +15 -24
- package/src/capabilities/emptyRecovery.test.ts +10 -2
- package/src/capabilities/graph/query.render.ts +2 -2
- package/src/capabilities/info/collectInfo.ts +8 -1
- package/src/capabilities/info/info.render.ts +6 -2
- package/src/capabilities/info/info.test.ts +37 -1
- package/src/capabilities/info/types.ts +10 -2
- package/src/capabilities/prompt/prompt.render.ts +2 -2
- package/src/capabilities/renderVocabularySync.test.ts +82 -0
- package/src/capabilities/scopeTypeSync.test.ts +29 -15
- package/src/capabilities/setup/buildPlan.ts +45 -41
- package/src/capabilities/setup/index.ts +1 -1
- package/src/capabilities/setup/mode.ts +2 -2
- package/src/capabilities/setup/operations/index.ts +6 -1
- package/src/capabilities/setup/operations/setupGenerator.ts +144 -70
- package/src/capabilities/setup/operations/setupLsp.ts +129 -37
- package/src/capabilities/setup/operations/setupMcp.ts +132 -61
- package/src/capabilities/setup/operations/setupSkills.ts +392 -58
- package/src/capabilities/setup/plan.render.ts +171 -76
- package/src/capabilities/setup/plan.ts +17 -12
- package/src/capabilities/setup/setup.mcp.correctness.test.ts +9 -9
- package/src/capabilities/setup/setup.render.test.ts +50 -36
- package/src/capabilities/setup/setup.render.ts +1 -1
- package/src/capabilities/setup/setup.test.ts +881 -50
- package/src/capabilities/setup/setup.verb.ts +91 -33
- package/src/capabilities/setup/targets.ts +120 -52
- package/src/capabilities/setup/types.ts +10 -18
- package/src/capabilities/shared/index.ts +17 -6
- package/src/capabilities/shared/packageManager.test.ts +421 -6
- package/src/capabilities/shared/packageManager.ts +394 -59
- package/src/capabilities/skill/bundledSkills.test.ts +347 -0
- package/src/capabilities/skill/discover.ts +100 -11
- package/src/capabilities/skill/render.ts +2 -2
- package/src/capabilities/skill/skill.test.ts +17 -4
- package/src/capabilities/sources/installSkills.ts +181 -3
- package/src/capabilities/sources/runUpdate.ts +78 -2
- package/src/capabilities/sources/sources.test.ts +228 -0
- package/src/capabilities/sources/update.verb.ts +3 -3
- package/src/capabilities/surface.test.ts +2 -2
- package/src/capabilities/upgrade/runUpgrade.ts +45 -6
- package/src/capabilities/upgrade/types.ts +10 -2
- package/src/capabilities/upgrade/upgrade.render.ts +9 -2
- package/src/capabilities/upgrade/upgrade.test.ts +72 -0
- package/src/constants.ts +6 -1
- package/src/identity.test.ts +18 -5
- package/src/kernel/completion/entitySource.test.ts +15 -2
- package/src/kernel/completion/safety.test.ts +16 -9
- package/src/kernel/config/defaults.test.ts +2 -1
- package/src/kernel/index.ts +11 -2
- package/src/kernel/interactivity.test.ts +76 -0
- package/src/kernel/interactivity.ts +69 -0
- package/src/kernel/packs/compile.test.ts +92 -0
- package/src/kernel/packs/renderPack.ts +3 -3
- package/src/kernel/packs/resolveEntity.test.ts +75 -14
- package/src/kernel/packs/resolveEntity.ts +88 -24
- package/src/kernel/packs/runBodies.ts +84 -19
- package/src/kernel/packs/schema.ts +60 -4
- package/src/kernel/packs/sparql/applyFilters.ts +125 -4
- package/src/kernel/packs/sparql/buildLookupQuery.test.ts +290 -0
- package/src/kernel/packs/sparql/buildLookupQuery.ts +323 -45
- package/src/kernel/packs/toolDescription.test.ts +35 -1
- package/src/kernel/packs/types.ts +125 -2
- package/src/kernel/project/cli/buildProgram.test.ts +73 -2
- package/src/kernel/project/cli/buildProgram.ts +8 -1
- package/src/kernel/project/cli/dispatch.test.ts +5 -4
- package/src/kernel/project/cli/dispatch.ts +25 -24
- package/src/kernel/project/cli/globalFlags.ts +4 -1
- package/src/kernel/project/cli/helpFormat.ts +1 -2
- package/src/kernel/project/cli/rootHelp.ts +36 -3
- package/src/kernel/project/mcp/registerVerb.ts +20 -1
- package/src/kernel/render/renderers.ts +1 -1
- package/src/kernel/render/style.ts +32 -9
- package/src/kernel/render/vocabulary.ts +276 -0
- package/src/kernel/spec/emitReference.ts +1 -1
- package/src/kernel/spec/types.ts +35 -6
- package/src/testing/PARITY_GAPS.ts +9 -3
- package/src/testing/behavioral/docExamples.test.ts +4 -2
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +110 -7
- package/src/testing/behavioral/journeys.firstInstall.test.ts +7 -2
- package/src/testing/behavioral/journeys.packageStories.test.ts +6 -3
- package/src/testing/eval/__snapshots__/eval.test.ts.snap +26 -1
- package/src/testing/eval/cases/readNouns.ts +245 -9
- package/src/testing/fixtures/blockGraph.ts +28 -13
- package/src/testing/fixtures/graph/canonical.ts +95 -12
- package/dist/src/capabilities/shared/bands.js +0 -16
- package/dist/src/capabilities/shared/bands.js.map +0 -1
- package/src/capabilities/shared/bands.ts +0 -16
|
@@ -12,73 +12,95 @@
|
|
|
12
12
|
* aligned whether it holds one row or seven. Colour rides the shared TTY seam —
|
|
13
13
|
* a piped run renders byte-for-byte plain.
|
|
14
14
|
*/
|
|
15
|
-
import chalk from "chalk";
|
|
16
15
|
import { BIN_NAME } from "../../constants.js";
|
|
17
16
|
import { defaultStyle } from "../../kernel/render/style.js";
|
|
18
|
-
import {
|
|
17
|
+
import { NOT_RUN_GLYPH, OUTCOME_GLYPHS, outcomeRemedyWord, SCOPE_LABELS, SCOPE_PHRASES, } from "../../kernel/render/vocabulary.js";
|
|
19
18
|
import { planTally, shortenPath, } from "./plan.js";
|
|
20
|
-
/** The
|
|
21
|
-
const
|
|
22
|
-
done: "✓",
|
|
23
|
-
noop: "✓",
|
|
24
|
-
removed: "✓",
|
|
25
|
-
kept: "○",
|
|
26
|
-
skipped: "○",
|
|
27
|
-
failed: "✗",
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* The marker for a row that carries NO outcome — one the user deselected, so it
|
|
31
|
-
* was neither done nor skipped-for-cause. It must not be a ✓: a green check
|
|
32
|
-
* against work that never ran is the same lie the old recap told when it
|
|
33
|
-
* reported "Setup complete" over a target it had dropped.
|
|
34
|
-
*/
|
|
35
|
-
const NOT_RUN_GLYPH = "·";
|
|
19
|
+
/** The header's scope phrase: `global`, `local project`, or both of them. */
|
|
20
|
+
const scopePhrase = (scope) => SCOPE_PHRASES[scope];
|
|
36
21
|
/**
|
|
37
|
-
*
|
|
38
|
-
* a failure tint appears only on a colour-capable TTY. Mirrors `doctor`'s own
|
|
39
|
-
* styler, which is deliberate: a failed setup row and a failed doctor row are
|
|
40
|
-
* the same finding seen twice, and they are tinted alike.
|
|
41
|
-
*
|
|
42
|
-
* @param style - The shared styler.
|
|
43
|
-
* @returns The styler plus `red`.
|
|
44
|
-
*/
|
|
45
|
-
const withRed = (style) => ({
|
|
46
|
-
...style,
|
|
47
|
-
red: style.enabled ? (text) => chalk.red(text) : (text) => text,
|
|
48
|
-
});
|
|
49
|
-
/** The header's band phrase: `global band`, `project band`, or `both bands`. */
|
|
50
|
-
const scopePhrase = (scope) => scope === "both" ? "both bands" : `${scope} band`;
|
|
51
|
-
/**
|
|
52
|
-
* The header line. It names the band and BOTH roots exactly once, which is what
|
|
22
|
+
* The header line. It names the scope and BOTH roots exactly once, which is what
|
|
53
23
|
* frees every row below to render its paths root-relative instead of repeating
|
|
54
|
-
* a 120-character prefix per line.
|
|
24
|
+
* a 120-character prefix per line. The roots are LABELLED (`home:`, `project:`)
|
|
25
|
+
* because the `~` and `.` markers the rows use are only legible once something
|
|
26
|
+
* has said what they stand for.
|
|
55
27
|
*/
|
|
56
28
|
function header(plan, lead) {
|
|
57
29
|
const project = shortenPath(plan.roots.project, {
|
|
58
30
|
global: plan.roots.global,
|
|
59
31
|
project: "",
|
|
60
32
|
});
|
|
61
|
-
return `${lead} — ${scopePhrase(plan.scope)} (~ · project: ${project})`;
|
|
33
|
+
return `${lead} — ${scopePhrase(plan.scope)} (home: ~ · project: ${project})`;
|
|
62
34
|
}
|
|
63
|
-
/**
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
35
|
+
/**
|
|
36
|
+
* The plain verb each action reads as. The middle column is a column of VERBS:
|
|
37
|
+
* what this row will do. It used to render the raw {@link PlanAction} token, so
|
|
38
|
+
* it read as a column of status codes — and `none` was the worst of them,
|
|
39
|
+
* standing equally for "already correct" and "nothing found here". The two are
|
|
40
|
+
* now told apart by the pair: the word says nothing will happen, the detail
|
|
41
|
+
* beside it says what was found.
|
|
42
|
+
*
|
|
43
|
+
* `none` and `skip` are worded direction-neutrally on purpose. The SAME renderer
|
|
44
|
+
* draws the `--undo` plan, where a target-specific negation ("nothing to create"
|
|
45
|
+
* on the `config` row) would be plainly false — there the row is not creating
|
|
46
|
+
* anything, it is declining to delete.
|
|
47
|
+
*
|
|
48
|
+
* The token itself is untouched: `action` is the machine field `--format json`
|
|
49
|
+
* publishes, and this is the display layer over it.
|
|
50
|
+
*/
|
|
51
|
+
const ACTION_WORDS = {
|
|
52
|
+
install: "install",
|
|
53
|
+
update: "update",
|
|
54
|
+
link: "link",
|
|
55
|
+
remove: "remove",
|
|
56
|
+
none: "no change",
|
|
57
|
+
skip: "nothing to do",
|
|
58
|
+
};
|
|
59
|
+
/** The distinct actions a row's children carry (empty when it has none). */
|
|
60
|
+
const childActions = (row) => new Set((row.children ?? []).map((child) => child.action));
|
|
61
|
+
/**
|
|
62
|
+
* The middle column.
|
|
63
|
+
*
|
|
64
|
+
* A row with children takes its word from THEM when they agree, because the
|
|
65
|
+
* row-level token can disagree with every one of its own files: registering the
|
|
66
|
+
* MCP server in three files that have never held it plans as `update` (the
|
|
67
|
+
* table's word for "this row has work that is not a fresh install"), and
|
|
68
|
+
* printing `update` over three `(add)` children described the opposite of what
|
|
69
|
+
* the run would do. Before this the cell held the row's DETAIL instead — `3
|
|
70
|
+
* files`, which is a count, not an action, and left the plan with no column
|
|
71
|
+
* that said what would happen.
|
|
72
|
+
*/
|
|
73
|
+
function actionCell(row) {
|
|
74
|
+
const kinds = childActions(row);
|
|
75
|
+
if (row.action === "update" && kinds.size === 1 && kinds.has("add")) {
|
|
76
|
+
return ACTION_WORDS.install;
|
|
77
|
+
}
|
|
78
|
+
return ACTION_WORDS[row.action];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* One child rendered inline. The per-child action is printed only when the
|
|
82
|
+
* children DISAGREE — when they all do the same thing the row's own verb has
|
|
83
|
+
* just said it, and `lsp no change codium — VSCodium (unchanged)` said
|
|
84
|
+
* "nothing happens here" twice in two columns.
|
|
85
|
+
*/
|
|
86
|
+
const childCell = (row, child) => childActions(row).size === 1
|
|
87
|
+
? child.label
|
|
88
|
+
: `${child.label} (${child.action})`;
|
|
67
89
|
/** The right column: the children joined, or the row's own detail. */
|
|
68
90
|
const detailCell = (row) => row.children && row.children.length > 0
|
|
69
|
-
? row.children.map(childCell).join(" · ")
|
|
91
|
+
? row.children.map((child) => childCell(row, child)).join(" · ")
|
|
70
92
|
: row.action === "skip"
|
|
71
93
|
? (row.reason ?? row.detail)
|
|
72
94
|
: row.detail;
|
|
73
95
|
/** Pad every id to the widest, so the three columns line up. */
|
|
74
96
|
const widthOf = (rows, pick) => Math.max(0, ...rows.map((row) => pick(row).length));
|
|
75
|
-
/** Group rows by
|
|
76
|
-
function
|
|
77
|
-
const
|
|
78
|
-
return
|
|
79
|
-
.map((
|
|
80
|
-
|
|
81
|
-
plan.rows.filter((row) => row.
|
|
97
|
+
/** Group rows by scope, in the plan's own scope order. */
|
|
98
|
+
function byScope(plan) {
|
|
99
|
+
const scopes = ["global", "project"];
|
|
100
|
+
return scopes
|
|
101
|
+
.map((scope) => [
|
|
102
|
+
scope,
|
|
103
|
+
plan.rows.filter((row) => row.scope === scope),
|
|
82
104
|
])
|
|
83
105
|
.filter(([, rows]) => rows.length > 0);
|
|
84
106
|
}
|
|
@@ -95,10 +117,10 @@ export function renderPlanTable(plan, options = { lead: "Setup plan" }, style =
|
|
|
95
117
|
const idWidth = widthOf(plan.rows, (row) => row.target);
|
|
96
118
|
const actionWidth = widthOf(plan.rows, actionCell);
|
|
97
119
|
const lines = [style.bold(header(plan, options.lead)), ""];
|
|
98
|
-
const groups =
|
|
99
|
-
for (const [
|
|
120
|
+
const groups = byScope(plan);
|
|
121
|
+
for (const [scope, rows] of groups) {
|
|
100
122
|
if (plan.scope === "both")
|
|
101
|
-
lines.push(style.bold(
|
|
123
|
+
lines.push(style.bold(SCOPE_LABELS[scope]));
|
|
102
124
|
for (const row of rows) {
|
|
103
125
|
lines.push(` ${row.target.padEnd(idWidth)} ${actionCell(row).padEnd(actionWidth)} ${style.dim(detailCell(row))}`);
|
|
104
126
|
}
|
|
@@ -107,6 +129,55 @@ export function renderPlanTable(plan, options = { lead: "Setup plan" }, style =
|
|
|
107
129
|
lines.push("", options.hint);
|
|
108
130
|
return lines.join("\n");
|
|
109
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* What was DETECTED, rendered before anything is asked.
|
|
134
|
+
*
|
|
135
|
+
* The gap this closes is a rendering one, not an ordering one: detection is
|
|
136
|
+
* complete before the prompt array is even constructed (`buildSetupRun` does
|
|
137
|
+
* resolveRoots → detectTargets → buildPlan, and only then builds `prompts`), and
|
|
138
|
+
* the Ink view mounts no React until the FIRST prompt effect. So the facts were
|
|
139
|
+
* sitting in `run.plan` the whole time with nothing rendering them — the wizard
|
|
140
|
+
* leaked detection only through prompt-label suffixes, and `renderPlanTable` is
|
|
141
|
+
* reached only by `--dry-run` or the non-interactive preview. A wizard run
|
|
142
|
+
* never rendered it at all, and the confirm gate shows an EFFECTS summary, not
|
|
143
|
+
* a detection one.
|
|
144
|
+
*
|
|
145
|
+
* It is a plain-string formatter on purpose. It rides `rt.report` — the non-Ink
|
|
146
|
+
* stderr seam, `--quiet`-aware and a no-op over MCP — because pragma contains no
|
|
147
|
+
* React and no Ink, and three PROTECTED tests exist to keep it that way.
|
|
148
|
+
*
|
|
149
|
+
* The default lists DETECTED rows only; `--verbose` lists everything. "Detected"
|
|
150
|
+
* is `action !== "skip"`, which is not a new partition: it is exactly the
|
|
151
|
+
* predicate the row multiselect already uses to build its choices, so the
|
|
152
|
+
* summary and the question that follows it describe the same set.
|
|
153
|
+
*
|
|
154
|
+
* @param plan - The plan as detected (no outcomes yet).
|
|
155
|
+
* @param options - `verbose` widens detected-only to the whole table.
|
|
156
|
+
* @param style - Injected for tests; defaults to the shared TTY seam.
|
|
157
|
+
* @returns The rendered block, or `undefined` when there is nothing to say.
|
|
158
|
+
*/
|
|
159
|
+
export function renderDetectionSummary(plan, options = {}, style = defaultStyle()) {
|
|
160
|
+
const shown = options.verbose
|
|
161
|
+
? plan.rows
|
|
162
|
+
: plan.rows.filter((row) => row.action !== "skip");
|
|
163
|
+
if (shown.length === 0)
|
|
164
|
+
return undefined;
|
|
165
|
+
const hidden = plan.rows.length - shown.length;
|
|
166
|
+
const idWidth = widthOf(shown, (row) => row.target);
|
|
167
|
+
const actionWidth = widthOf(shown, actionCell);
|
|
168
|
+
const lines = [style.bold(header(plan, "Detected")), ""];
|
|
169
|
+
for (const [scope, rows] of byScope({ ...plan, rows: shown })) {
|
|
170
|
+
if (plan.scope === "both")
|
|
171
|
+
lines.push(style.bold(SCOPE_LABELS[scope]));
|
|
172
|
+
for (const row of rows) {
|
|
173
|
+
lines.push(` ${row.target.padEnd(idWidth)} ${actionCell(row).padEnd(actionWidth)} ${style.dim(detailCell(row))}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (hidden > 0) {
|
|
177
|
+
lines.push("", style.dim(`${hidden} target${hidden === 1 ? "" : "s"} not detected here — --verbose lists them`));
|
|
178
|
+
}
|
|
179
|
+
return lines.join("\n");
|
|
180
|
+
}
|
|
110
181
|
/**
|
|
111
182
|
* One progress line, emitted as a row's outcome lands. Same columns as the
|
|
112
183
|
* recap, so a reader watching the run and a reader reading the recap afterwards
|
|
@@ -118,23 +189,26 @@ export function renderPlanTable(plan, options = { lead: "Setup plan" }, style =
|
|
|
118
189
|
* @returns The line.
|
|
119
190
|
*/
|
|
120
191
|
export function renderProgressLine(row, idWidth, style = defaultStyle()) {
|
|
121
|
-
const painted = withRed(style);
|
|
122
192
|
const outcome = row.outcome;
|
|
123
193
|
// No outcome at all: the row was offered and left unselected. It is neither a
|
|
124
194
|
// success nor a skip-for-cause, and painting it green would claim work that
|
|
125
195
|
// never happened, so it gets a neutral marker and says plainly what it is.
|
|
126
196
|
if (outcome === undefined) {
|
|
127
|
-
return `${
|
|
197
|
+
return `${style.dim(NOT_RUN_GLYPH)} ${row.target.padEnd(idWidth)} ${style.dim(`${row.detail} — not selected`)}`;
|
|
128
198
|
}
|
|
129
|
-
const glyph =
|
|
199
|
+
const glyph = OUTCOME_GLYPHS[outcome.status];
|
|
130
200
|
const tinted = outcome.status === "failed"
|
|
131
|
-
?
|
|
201
|
+
? style.red(glyph)
|
|
132
202
|
: outcome.status === "skipped" || outcome.status === "kept"
|
|
133
|
-
?
|
|
134
|
-
:
|
|
203
|
+
? style.yellow(glyph)
|
|
204
|
+
: style.green(glyph);
|
|
135
205
|
const note = outcome.note;
|
|
136
206
|
const body = outcome.status === "skipped"
|
|
137
|
-
?
|
|
207
|
+
? // A colon, not a dash: the reasons carry their own em-dash clause
|
|
208
|
+
// ("no skills installed yet — pack skills arrive with …"), and two
|
|
209
|
+
// dashes in one line read as one run-on sentence rather than a label
|
|
210
|
+
// in front of a reason.
|
|
211
|
+
`skipped: ${row.reason ?? row.detail}`
|
|
138
212
|
: note
|
|
139
213
|
? `${row.detail} — ${note}`
|
|
140
214
|
: row.detail;
|
|
@@ -158,9 +232,9 @@ export function renderRecap(plan, lead = "Setup", style = defaultStyle()) {
|
|
|
158
232
|
const lines = [
|
|
159
233
|
style.bold(`${lead}: ${configured} of ${accountable} targets configured — ${scopePhrase(plan.scope)}`),
|
|
160
234
|
];
|
|
161
|
-
for (const [
|
|
235
|
+
for (const [scope, rows] of byScope(plan)) {
|
|
162
236
|
if (plan.scope === "both")
|
|
163
|
-
lines.push(style.bold(` ${
|
|
237
|
+
lines.push(style.bold(` ${SCOPE_LABELS[scope]}`));
|
|
164
238
|
for (const row of rows) {
|
|
165
239
|
lines.push(` ${renderProgressLine(row, idWidth, style)}`);
|
|
166
240
|
const remedy = row.outcome?.remedy;
|
|
@@ -168,7 +242,7 @@ export function renderRecap(plan, lead = "Setup", style = defaultStyle()) {
|
|
|
168
242
|
lines.push(` ${style.dim(remedy)}`);
|
|
169
243
|
}
|
|
170
244
|
}
|
|
171
|
-
lines.push("", style.dim(`
|
|
245
|
+
lines.push("", style.dim(`Check this again any time with \`${BIN_NAME} doctor\`.`));
|
|
172
246
|
return lines.join("\n");
|
|
173
247
|
}
|
|
174
248
|
/** The condensed Markdown form — the same rows, one bullet each. */
|
|
@@ -179,14 +253,18 @@ export function renderPlanLlm(plan, lead = "Setup") {
|
|
|
179
253
|
// Before a run there is no outcome to report, so the row shows its ACTION
|
|
180
254
|
// behind a neutral marker. Reusing the `noop` glyph here painted every row
|
|
181
255
|
// of an unapplied plan — skips included — with a green check.
|
|
182
|
-
const glyph = status === undefined ? NOT_RUN_GLYPH :
|
|
256
|
+
const glyph = status === undefined ? NOT_RUN_GLYPH : OUTCOME_GLYPHS[status];
|
|
183
257
|
const state = status ?? row.action;
|
|
184
|
-
lines.push(`- ${glyph} **${row.target}** (${row.
|
|
258
|
+
lines.push(`- ${glyph} **${row.target}** (${row.scope}): ${state} — ${detailCell(row)}`);
|
|
185
259
|
for (const child of row.children ?? []) {
|
|
186
|
-
lines.push(` - ${childCell(child)}`);
|
|
260
|
+
lines.push(` - ${childCell(row, child)}`);
|
|
261
|
+
}
|
|
262
|
+
// `fix:` for a row that failed, `next:` for one that skipped — a skip is
|
|
263
|
+
// not a fault, and labelling its instruction as a repair is what teaches a
|
|
264
|
+
// reader to treat skips as failures.
|
|
265
|
+
if (row.outcome?.remedy) {
|
|
266
|
+
lines.push(` - _${outcomeRemedyWord(row.outcome.status)}:_ ${row.outcome.remedy}`);
|
|
187
267
|
}
|
|
188
|
-
if (row.outcome?.remedy)
|
|
189
|
-
lines.push(` - _fix:_ ${row.outcome.remedy}`);
|
|
190
268
|
}
|
|
191
269
|
return lines.join("\n");
|
|
192
270
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.render.js","sourceRoot":"","sources":["../../../../src/capabilities/setup/plan.render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"plan.render.js","sourceRoot":"","sources":["../../../../src/capabilities/setup/plan.render.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* The plan REPLACED a tagged result union with one member per sub-verb, each
|
|
6
6
|
* rendering its own sentence in its own vocabulary. That union could not
|
|
7
|
-
* describe a run that touched several targets in two
|
|
7
|
+
* describe a run that touched several targets in two scopes, so the run-all
|
|
8
8
|
* reported a list of step names and nothing about what any of them did. One
|
|
9
9
|
* structure with one renderer is what makes the preview, the progress lines and
|
|
10
10
|
* the recap agree by construction rather than by review.
|
|
@@ -9,18 +9,18 @@
|
|
|
9
9
|
* only the self-verb is an MCP tool. `destructive: false` keeps MCP from
|
|
10
10
|
* advertising the tool as destructive.
|
|
11
11
|
*
|
|
12
|
-
* THE
|
|
13
|
-
* runs each harness's own default
|
|
12
|
+
* THE SCOPE DEFAULT IS GLOBAL. `--scope` used to default to `both`, and `both`
|
|
13
|
+
* runs each harness's own default scope — which is `project` for most of the
|
|
14
14
|
* registry — so a bare `setup` scattered `.mcp.json`, `.gemini/settings.json`
|
|
15
15
|
* and `opencode.json` into whatever directory you happened to be standing in.
|
|
16
|
-
* The user
|
|
16
|
+
* The user scope is what a machine-level installer configures; the project scope
|
|
17
17
|
* is a deliberate, checked-in, team-shared choice, and is now chosen with
|
|
18
18
|
* `--local` rather than assumed.
|
|
19
19
|
*
|
|
20
|
-
* Every sub-verb registers the scope flags UNIFORMLY. That is what lets the
|
|
20
|
+
* Every sub-verb registers the scope flags UNIFORMLY. That is what lets the scope
|
|
21
21
|
* answer come from the table instead of per-verb flag wiring — previously
|
|
22
22
|
* `setup completions --local` died as an unknown option, while `setup mcp
|
|
23
|
-
* --local` worked, for no reason a user could see. Asking a target for a
|
|
23
|
+
* --local` worked, for no reason a user could see. Asking a target for a scope it
|
|
24
24
|
* cannot honour is a usage error (exit 2) with the corrected command; asking the
|
|
25
25
|
* RUN-ALL for such a band merely filters, and the out-of-band target still shows
|
|
26
26
|
* as a named row.
|
|
@@ -34,14 +34,14 @@ import { BIN_NAME } from "../../constants.js";
|
|
|
34
34
|
import { PragmaError } from "../../kernel/error/index.js";
|
|
35
35
|
import { asVerb } from "../../kernel/spec/asVerb.js";
|
|
36
36
|
import { resolveSetupMode, setupModeInput } from "./mode.js";
|
|
37
|
-
import { planExitFailed, planTally, TARGET_IDS, } from "./plan.js";
|
|
38
|
-
import { renderProgressLine, renderRecap } from "./plan.render.js";
|
|
37
|
+
import { isActionable, planExitFailed, planTally, TARGET_IDS, } from "./plan.js";
|
|
38
|
+
import { renderDetectionSummary, renderProgressLine, renderRecap, } from "./plan.render.js";
|
|
39
39
|
import { renderDryRun, setupFormatters } from "./setup.render.js";
|
|
40
40
|
/**
|
|
41
41
|
* The `--scope` flag + its `--global`/`--local` boolean sugars. Registered by
|
|
42
|
-
* EVERY setup verb, including the single-
|
|
43
|
-
* sub-verbs and not others is a grammar the user has to memorise, and the
|
|
44
|
-
* a single-
|
|
42
|
+
* EVERY setup verb, including the single-scope ones: a flag that exists on some
|
|
43
|
+
* sub-verbs and not others is a grammar the user has to memorise, and the scope
|
|
44
|
+
* a single-scope target can honour is a question the target table answers.
|
|
45
45
|
*
|
|
46
46
|
* `--global` is a synonym of the default; it stays for scripts and for symmetry
|
|
47
47
|
* with `--local`.
|
|
@@ -50,19 +50,19 @@ const SCOPE_PARAMS = [
|
|
|
50
50
|
{
|
|
51
51
|
kind: "enum",
|
|
52
52
|
name: "scope",
|
|
53
|
-
doc: "
|
|
53
|
+
doc: "Where to configure: global (your home directory, the default), project (this repository), or both.",
|
|
54
54
|
values: ["project", "global", "both"],
|
|
55
55
|
default: "global",
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
kind: "boolean",
|
|
59
59
|
name: "global",
|
|
60
|
-
doc: "Shorthand for --scope global
|
|
60
|
+
doc: "Shorthand for --scope global — configure your home directory.",
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
kind: "boolean",
|
|
64
64
|
name: "local",
|
|
65
|
-
doc: "Shorthand for --scope project
|
|
65
|
+
doc: "Shorthand for --scope project — configure this project only.",
|
|
66
66
|
},
|
|
67
67
|
];
|
|
68
68
|
/**
|
|
@@ -81,32 +81,33 @@ function resolveScope(params) {
|
|
|
81
81
|
return scope === "project" || scope === "both" ? scope : "global";
|
|
82
82
|
}
|
|
83
83
|
/**
|
|
84
|
-
* Reject a sub-verb asked for a
|
|
84
|
+
* Reject a sub-verb asked for a scope its target cannot hold.
|
|
85
85
|
*
|
|
86
86
|
* This is a usage error, not a skip: the user typed a contradiction, and
|
|
87
|
-
* correcting it is exactly what exit 2 means. The message names the
|
|
87
|
+
* correcting it is exactly what exit 2 means. The message names the scope the
|
|
88
88
|
* target DOES have and prints the command that works, so the correction is one
|
|
89
89
|
* paste rather than one manual page.
|
|
90
90
|
*
|
|
91
91
|
* @param mode - The sub-verb's target, or `all`.
|
|
92
92
|
* @param scope - The resolved selection.
|
|
93
|
-
* @throws PragmaError INVALID_INPUT when the target has no such
|
|
93
|
+
* @throws PragmaError INVALID_INPUT when the target has no such scope.
|
|
94
94
|
*/
|
|
95
|
-
async function
|
|
95
|
+
async function assertScopeIsPossible(mode, scope) {
|
|
96
96
|
if (mode === "all" || scope === "both")
|
|
97
97
|
return;
|
|
98
98
|
const { findTarget } = await import("./targets.js");
|
|
99
99
|
const target = findTarget(mode);
|
|
100
|
-
if (target === undefined || target.
|
|
100
|
+
if (target === undefined || target.scopes.includes(scope))
|
|
101
101
|
return;
|
|
102
|
-
const only = target.
|
|
103
|
-
const level = only === "global" ? "
|
|
102
|
+
const only = target.scopes[0];
|
|
103
|
+
const level = only === "global" ? "global only" : "per-project only";
|
|
104
|
+
const asked = scope === "global" ? "globally" : "per project";
|
|
104
105
|
const corrected = only === "global"
|
|
105
106
|
? `${BIN_NAME} setup ${mode}`
|
|
106
107
|
: `${BIN_NAME} setup ${mode} --local`;
|
|
107
108
|
throw new PragmaError({
|
|
108
109
|
code: "INVALID_INPUT",
|
|
109
|
-
message: `${mode} is ${level} — it
|
|
110
|
+
message: `${mode} is ${level} — it cannot be configured ${asked}.`,
|
|
110
111
|
recovery: { message: `Run: ${corrected}` },
|
|
111
112
|
});
|
|
112
113
|
}
|
|
@@ -149,12 +150,12 @@ const SUB_CAPABILITY = {
|
|
|
149
150
|
*
|
|
150
151
|
* @param mode - Which entry point (`all` or one target).
|
|
151
152
|
* @param rt - The per-invocation runtime (mutated: `rt.exec` and `rt.planData`).
|
|
152
|
-
* @param scope - The resolved
|
|
153
|
+
* @param scope - The resolved scope selection.
|
|
153
154
|
* @returns The `Task<SetupPlan>` the dispatcher/MCP handler interprets.
|
|
154
155
|
* @note Impure — runs every target's real detection before returning a Task.
|
|
155
156
|
*/
|
|
156
157
|
async function runSetup(mode, rt, scope) {
|
|
157
|
-
await
|
|
158
|
+
await assertScopeIsPossible(mode, scope);
|
|
158
159
|
// Lazy dynamic imports (lazy-React discipline): summon-core's barrel is
|
|
159
160
|
// React-free, and the non-TTY branch picks autoPrompt/mcpPrompt (never mounts
|
|
160
161
|
// Ink), so `setup --yes` loads no React — the guard test enforces this.
|
|
@@ -174,12 +175,51 @@ async function runSetup(mode, rt, scope) {
|
|
|
174
175
|
// — that is what makes the preview honest — so anything it says out loud has
|
|
175
176
|
// to know which of the two it is.
|
|
176
177
|
const previewing = interactionMode === "batch-dry-run";
|
|
178
|
+
// A CONVERGED machine has no question to ask. Every row is `none` or `skip`,
|
|
179
|
+
// so nothing composes an effect — and the wizard's confirm gate then mounted
|
|
180
|
+
// Ink to render summon-core's "No operations planned." above a "Proceed?"
|
|
181
|
+
// over an empty tally. For a sub-verb, whose prompt list is empty, that
|
|
182
|
+
// contentless gate was the FIRST AND ONLY thing the user ever saw. The
|
|
183
|
+
// explanation existed the whole time (each row's `none` detail, one child row
|
|
184
|
+
// per file/editor marked `unchanged`) and was dropped at the render seam.
|
|
185
|
+
//
|
|
186
|
+
// So: report the plan instead of asking a question with no content. There is
|
|
187
|
+
// no `preview: true` here — the run really did complete. `applied({})` marks
|
|
188
|
+
// each `none` row `{status:"noop", note:"unchanged"}`, `wasApplied` is then
|
|
189
|
+
// true, and `setupFormatters.plain` renders the recap. That also retires a
|
|
190
|
+
// second defect: a non-interactive converged run used to print the misleading
|
|
191
|
+
// "Nothing was applied. Run again with --yes to apply." over an all-`none`
|
|
192
|
+
// plan. A run whose every DETECTION threw is not converged in this sense —
|
|
193
|
+
// its rows are skips that report `failed` — so it falls through to the normal
|
|
194
|
+
// path, which is the one that raises.
|
|
195
|
+
if (!previewing && run.plan.rows.every((row) => !isActionable(row.action))) {
|
|
196
|
+
const converged = run.applied({});
|
|
197
|
+
if (!planExitFailed(converged))
|
|
198
|
+
return pure(converged);
|
|
199
|
+
}
|
|
177
200
|
// Adaptation (b): a non-interactive run without `--yes` previews rather than
|
|
178
201
|
// mutating. It is the same plan the dry-run prints, plus one hint line, at
|
|
179
202
|
// exit 0 — the invocation completed a real read-only unit of work.
|
|
180
203
|
if (interactionMode === "refuse") {
|
|
181
204
|
return pure({ ...run.plan, preview: true });
|
|
182
205
|
}
|
|
206
|
+
// Say what was DETECTED before asking anything about it. The data has been
|
|
207
|
+
// sitting in `run.plan` since before the prompt list was built — `inkPrompt`
|
|
208
|
+
// mounts no React until the first Prompt effect — so this is a rendering gap,
|
|
209
|
+
// not an ordering one, and closing it is nearly free.
|
|
210
|
+
//
|
|
211
|
+
// It MUST be emitted here, before `execute` is driven: the summary and the
|
|
212
|
+
// Ink frame both write to stderr, and only a line written first lands in
|
|
213
|
+
// scrollback ABOVE the frame. `rt.report` is the non-Ink seam — `--quiet`
|
|
214
|
+
// silences it and it is a no-op over MCP — so no React is loaded to print it.
|
|
215
|
+
// A preview says nothing here: the plan table IS its output.
|
|
216
|
+
if (!previewing) {
|
|
217
|
+
const summary = renderDetectionSummary(run.plan, {
|
|
218
|
+
verbose: rt.globalFlags.verbose,
|
|
219
|
+
});
|
|
220
|
+
if (summary !== undefined)
|
|
221
|
+
rt.report?.(summary);
|
|
222
|
+
}
|
|
183
223
|
const { transport, yes, signal, abort } = rt.interaction ?? {
|
|
184
224
|
isTTY: false,
|
|
185
225
|
transport: "cli",
|
|
@@ -195,6 +235,19 @@ async function runSetup(mode, rt, scope) {
|
|
|
195
235
|
signal,
|
|
196
236
|
onCancel: abort,
|
|
197
237
|
});
|
|
238
|
+
// Live progress in the PLAN's units, not the interpreter's: the wizard's
|
|
239
|
+
// default execution view is the per-effect transcript — right for `create`,
|
|
240
|
+
// whose unit of work IS the file, and wrong here, where one unit is one
|
|
241
|
+
// configured target and the transcript renders eighteen symlink rows for
|
|
242
|
+
// the row the plan called `skills link 9 skills → 2 folders`. Each row
|
|
243
|
+
// event carries the SAME sentence `renderProgressLine` prints, so the
|
|
244
|
+
// watcher and the recap reader see one dialect. `--verbose` withholds the
|
|
245
|
+
// listener, which falls the wizard back to the full effect transcript —
|
|
246
|
+
// the same detected-only-unless-verbose rule the detection summary and
|
|
247
|
+
// doctor already follow.
|
|
248
|
+
if (rt.globalFlags.verbose !== true) {
|
|
249
|
+
run.setRowListener((event) => session.reportStep(event));
|
|
250
|
+
}
|
|
198
251
|
rt.exec = {
|
|
199
252
|
promptHandler: session.promptHandler,
|
|
200
253
|
onEffectStart: session.onEffectStart,
|
|
@@ -294,29 +347,29 @@ function setupVerb(path, summary, mode, capability, extras = {}) {
|
|
|
294
347
|
run: (params, rt) => runSetup(mode, rt, resolveScope(params)),
|
|
295
348
|
};
|
|
296
349
|
}
|
|
297
|
-
const setupAllVerb = setupVerb(["setup"], "
|
|
298
|
-
doc: "
|
|
350
|
+
const setupAllVerb = setupVerb(["setup"], "Set up your config file, TAB completion, the editor extension, MCP, and skills.", "all", SELF_CAPABILITY, {
|
|
351
|
+
doc: "Shows what each target needs, then applies the ones you keep. Everything is configured in your home directory by default; the scope option moves the run to this project alone, or covers both. Without an attended terminal the plan is printed and nothing is written unless the run is explicitly confirmed.",
|
|
299
352
|
examples: [
|
|
300
353
|
{ cmd: `${BIN_NAME} setup` },
|
|
301
354
|
{
|
|
302
355
|
cmd: `${BIN_NAME} setup --dry-run`,
|
|
303
|
-
note: "
|
|
356
|
+
note: "show the plan, write nothing",
|
|
304
357
|
},
|
|
305
358
|
{
|
|
306
359
|
cmd: `${BIN_NAME} setup --local`,
|
|
307
|
-
note: "configure
|
|
360
|
+
note: "configure this project instead of your home directory",
|
|
308
361
|
},
|
|
309
362
|
{
|
|
310
363
|
cmd: `${BIN_NAME} setup mcp`,
|
|
311
|
-
note: "
|
|
364
|
+
note: "only register the MCP server",
|
|
312
365
|
},
|
|
313
366
|
],
|
|
314
367
|
});
|
|
315
|
-
const configVerb = setupVerb(["setup", "config"], "Create
|
|
316
|
-
const mcpVerb = setupVerb(["setup", "mcp"], `Register the ${BIN_NAME} MCP server
|
|
317
|
-
const completionsVerb = setupVerb(["setup", "completions"], "Install
|
|
318
|
-
const skillsVerb = setupVerb(["setup", "skills"], "
|
|
319
|
-
const lspVerb = setupVerb(["setup", "lsp"], "
|
|
368
|
+
const configVerb = setupVerb(["setup", "config"], "Create your global config file, filled in with the defaults.", "config", SUB_CAPABILITY);
|
|
369
|
+
const mcpVerb = setupVerb(["setup", "mcp"], `Register the ${BIN_NAME} MCP server with the AI harnesses on this machine.`, "mcp", SUB_CAPABILITY);
|
|
370
|
+
const completionsVerb = setupVerb(["setup", "completions"], "Install TAB completion for the shell you are running.", "completions", SUB_CAPABILITY);
|
|
371
|
+
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);
|
|
320
373
|
/** The `setup` capability module (run-all self-verb + five CLI-only sub-verbs). */
|
|
321
374
|
export const setupModule = {
|
|
322
375
|
name: "setup",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.verb.js","sourceRoot":"","sources":["../../../../src/capabilities/setup/setup.verb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAa,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAMrD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EACL,cAAc,EACd,SAAS,EAET,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"setup.verb.js","sourceRoot":"","sources":["../../../../src/capabilities/setup/setup.verb.ts"],"names":[],"mappings":"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"}
|