@nanonets/graft 0.13.0 → 0.15.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 +16 -5
- package/dist/ai/crux.d.ts.map +1 -1
- package/dist/ai/crux.js +8 -50
- package/dist/ai/crux.js.map +1 -1
- package/dist/ai/llm/factory.d.ts +5 -1
- package/dist/ai/llm/factory.d.ts.map +1 -1
- package/dist/ai/llm/factory.js +8 -0
- package/dist/ai/llm/factory.js.map +1 -1
- package/dist/ai/llm/litellm.d.ts +34 -0
- package/dist/ai/llm/litellm.d.ts.map +1 -0
- package/dist/ai/llm/litellm.js +45 -0
- package/dist/ai/llm/litellm.js.map +1 -0
- package/dist/ai/llm/openai.d.ts.map +1 -1
- package/dist/ai/llm/openai.js +66 -7
- package/dist/ai/llm/openai.js.map +1 -1
- package/dist/ai/llm/recover-tool.d.ts +19 -0
- package/dist/ai/llm/recover-tool.d.ts.map +1 -0
- package/dist/ai/llm/recover-tool.js +109 -0
- package/dist/ai/llm/recover-tool.js.map +1 -0
- package/dist/ai/providers.d.ts.map +1 -1
- package/dist/ai/providers.js +2 -0
- package/dist/ai/providers.js.map +1 -1
- package/dist/ai/synthesize.d.ts.map +1 -1
- package/dist/ai/synthesize.js +19 -5
- package/dist/ai/synthesize.js.map +1 -1
- package/dist/app/checkout.d.ts +28 -0
- package/dist/app/checkout.d.ts.map +1 -0
- package/dist/app/checkout.js +100 -0
- package/dist/app/checkout.js.map +1 -0
- package/dist/app/events.d.ts +37 -0
- package/dist/app/events.d.ts.map +1 -0
- package/dist/app/events.js +59 -0
- package/dist/app/events.js.map +1 -0
- package/dist/app/identity.d.ts +54 -0
- package/dist/app/identity.d.ts.map +1 -0
- package/dist/app/identity.js +96 -0
- package/dist/app/identity.js.map +1 -0
- package/dist/app/main.d.ts +2 -0
- package/dist/app/main.d.ts.map +1 -0
- package/dist/app/main.js +56 -0
- package/dist/app/main.js.map +1 -0
- package/dist/app/pages.d.ts +39 -0
- package/dist/app/pages.d.ts.map +1 -0
- package/dist/app/pages.js +86 -0
- package/dist/app/pages.js.map +1 -0
- package/dist/app/queue.d.ts +40 -0
- package/dist/app/queue.d.ts.map +1 -0
- package/dist/app/queue.js +68 -0
- package/dist/app/queue.js.map +1 -0
- package/dist/app/review.d.ts +23 -0
- package/dist/app/review.d.ts.map +1 -0
- package/dist/app/review.js +129 -0
- package/dist/app/review.js.map +1 -0
- package/dist/app/server.d.ts +40 -0
- package/dist/app/server.d.ts.map +1 -0
- package/dist/app/server.js +117 -0
- package/dist/app/server.js.map +1 -0
- package/dist/ask/ask.d.ts +35 -0
- package/dist/ask/ask.d.ts.map +1 -1
- package/dist/ask/ask.js +427 -63
- package/dist/ask/ask.js.map +1 -1
- package/dist/ask/file-rank.d.ts +72 -0
- package/dist/ask/file-rank.d.ts.map +1 -0
- package/dist/ask/file-rank.js +160 -0
- package/dist/ask/file-rank.js.map +1 -0
- package/dist/ask/file-selection.d.ts +4 -0
- package/dist/ask/file-selection.d.ts.map +1 -1
- package/dist/ask/file-selection.js +25 -0
- package/dist/ask/file-selection.js.map +1 -1
- package/dist/ask/fuse.d.ts +16 -0
- package/dist/ask/fuse.d.ts.map +1 -1
- package/dist/ask/fuse.js +21 -4
- package/dist/ask/fuse.js.map +1 -1
- package/dist/ask/graphrank.d.ts +18 -0
- package/dist/ask/graphrank.d.ts.map +1 -1
- package/dist/ask/graphrank.js +65 -19
- package/dist/ask/graphrank.js.map +1 -1
- package/dist/blast/blast-cli.d.ts +5 -0
- package/dist/blast/blast-cli.d.ts.map +1 -1
- package/dist/blast/blast-cli.js +15 -0
- package/dist/blast/blast-cli.js.map +1 -1
- package/dist/blast/blast.d.ts +9 -0
- package/dist/blast/blast.d.ts.map +1 -1
- package/dist/blast/blast.js.map +1 -1
- package/dist/blast/owners.d.ts +85 -0
- package/dist/blast/owners.d.ts.map +1 -0
- package/dist/blast/owners.js +272 -0
- package/dist/blast/owners.js.map +1 -0
- package/dist/blast/render.d.ts.map +1 -1
- package/dist/blast/render.js +105 -0
- package/dist/blast/render.js.map +1 -1
- package/dist/blast/viz.d.ts.map +1 -1
- package/dist/blast/viz.js +10 -0
- package/dist/blast/viz.js.map +1 -1
- package/dist/claude/format.js +1 -1
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +43 -3
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/settings-merge.d.ts +11 -0
- package/dist/claude/settings-merge.d.ts.map +1 -1
- package/dist/claude/settings-merge.js +24 -10
- package/dist/claude/settings-merge.js.map +1 -1
- package/dist/claude/state.d.ts +13 -0
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/statusline.d.ts +5 -3
- package/dist/claude/statusline.d.ts.map +1 -1
- package/dist/claude/statusline.js +6 -4
- package/dist/claude/statusline.js.map +1 -1
- package/dist/claude/tally.d.ts +23 -0
- package/dist/claude/tally.d.ts.map +1 -0
- package/dist/claude/tally.js +138 -0
- package/dist/claude/tally.js.map +1 -0
- package/dist/cli.js +117 -2
- package/dist/cli.js.map +1 -1
- package/dist/context/build.d.ts.map +1 -1
- package/dist/context/build.js +23 -4
- package/dist/context/build.js.map +1 -1
- package/dist/context/check.d.ts.map +1 -1
- package/dist/context/check.js +2 -1
- package/dist/context/check.js.map +1 -1
- package/dist/context/node-file.d.ts +2 -1
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +37 -2
- package/dist/context/node-file.js.map +1 -1
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -0
- package/dist/engine.js.map +1 -1
- package/dist/graph/bindings.d.ts +6 -5
- package/dist/graph/bindings.d.ts.map +1 -1
- package/dist/graph/bindings.js +117 -5
- package/dist/graph/bindings.js.map +1 -1
- package/dist/graph/build.d.ts +4 -0
- package/dist/graph/build.d.ts.map +1 -1
- package/dist/graph/build.js +7 -4
- package/dist/graph/build.js.map +1 -1
- package/dist/graph/check.d.ts.map +1 -1
- package/dist/graph/check.js +36 -6
- package/dist/graph/check.js.map +1 -1
- package/dist/graph/extract.d.ts +9 -2
- package/dist/graph/extract.d.ts.map +1 -1
- package/dist/graph/extract.js +356 -12
- package/dist/graph/extract.js.map +1 -1
- package/dist/graph/fingerprint.d.ts +6 -1
- package/dist/graph/fingerprint.d.ts.map +1 -1
- package/dist/graph/fingerprint.js +7 -3
- package/dist/graph/fingerprint.js.map +1 -1
- package/dist/graph/generic.d.ts.map +1 -1
- package/dist/graph/generic.js +0 -1
- package/dist/graph/generic.js.map +1 -1
- package/dist/graph/invariants.d.ts +3 -2
- package/dist/graph/invariants.d.ts.map +1 -1
- package/dist/graph/invariants.js +6 -3
- package/dist/graph/invariants.js.map +1 -1
- package/dist/graph/refresh.d.ts.map +1 -1
- package/dist/graph/refresh.js +6 -2
- package/dist/graph/refresh.js.map +1 -1
- package/dist/graph/resolve.d.ts +1 -1
- package/dist/graph/resolve.d.ts.map +1 -1
- package/dist/graph/resolve.js +106 -5
- package/dist/graph/resolve.js.map +1 -1
- package/dist/graph/scopes.d.ts.map +1 -1
- package/dist/graph/scopes.js +2 -1
- package/dist/graph/scopes.js.map +1 -1
- package/dist/graph/source-files.d.ts +7 -2
- package/dist/graph/source-files.d.ts.map +1 -1
- package/dist/graph/source-files.js +19 -6
- package/dist/graph/source-files.js.map +1 -1
- package/dist/graph/workspace-cli.d.ts +2 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -1
- package/dist/graph/workspace-cli.js +3 -0
- package/dist/graph/workspace-cli.js.map +1 -1
- package/dist/hosts/mcp-config.d.ts +12 -0
- package/dist/hosts/mcp-config.d.ts.map +1 -1
- package/dist/hosts/mcp-config.js +46 -5
- package/dist/hosts/mcp-config.js.map +1 -1
- package/dist/hosts/retract.d.ts +47 -0
- package/dist/hosts/retract.d.ts.map +1 -0
- package/dist/hosts/retract.js +473 -0
- package/dist/hosts/retract.js.map +1 -0
- package/dist/ingest/fs.d.ts +19 -5
- package/dist/ingest/fs.d.ts.map +1 -1
- package/dist/ingest/fs.js +29 -9
- package/dist/ingest/fs.js.map +1 -1
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +7 -2
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/sessions.d.ts.map +1 -1
- package/dist/telemetry/sessions.js +6 -0
- package/dist/telemetry/sessions.js.map +1 -1
- package/dist/util/state.d.ts +12 -2
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +4 -0
- package/dist/util/state.js.map +1 -1
- package/dist/viewer/app.js +2 -1
- package/dist/viewer/style.css +14 -0
- package/dist/viz/assemble.d.ts +17 -0
- package/dist/viz/assemble.d.ts.map +1 -1
- package/dist/viz/assemble.js.map +1 -1
- package/package.json +11 -3
- package/scripts/graph-quality.mjs +3 -3
- package/scripts/tally-audit.mjs +140 -0
- package/dist/ai/llm/claude-cli.d.ts +0 -60
- package/dist/ai/llm/claude-cli.d.ts.map +0 -1
- package/dist/ai/llm/claude-cli.js +0 -417
- package/dist/ai/llm/claude-cli.js.map +0 -1
- package/dist/util/num.d.ts +0 -3
- package/dist/util/num.d.ts.map +0 -1
- package/dist/util/num.js +0 -20
- package/dist/util/num.js.map +0 -1
package/dist/hosts/mcp-config.js
CHANGED
|
@@ -83,19 +83,60 @@ export function mergeJsonKey(id, path, topKey, entry) {
|
|
|
83
83
|
writeFileSync(path, `${JSON.stringify(root, null, 2)}\n`);
|
|
84
84
|
return { id, path, action };
|
|
85
85
|
}
|
|
86
|
+
/** The `[mcp_servers.graft]` table header, as written and as matched. */
|
|
87
|
+
const TOML_HEADER = '[mcp_servers.graft]';
|
|
88
|
+
/**
|
|
89
|
+
* Remove the `[mcp_servers.graft]` table from a TOML config, returning the rest.
|
|
90
|
+
*
|
|
91
|
+
* Line-based on purpose: a real parse-and-reserialize would reformat the user's
|
|
92
|
+
* whole file. The table runs from its header to the next `[`-header or EOF, which
|
|
93
|
+
* is exactly the shape {@link upsertCodexToml} appends. Exported so the writer and
|
|
94
|
+
* `retract.ts` can never disagree about what "graft's section" means.
|
|
95
|
+
*/
|
|
96
|
+
export function stripTomlSection(text) {
|
|
97
|
+
const lines = text.split('\n');
|
|
98
|
+
const start = lines.findIndex((l) => l.trim() === TOML_HEADER);
|
|
99
|
+
if (start === -1)
|
|
100
|
+
return { rest: text, found: false };
|
|
101
|
+
let end = start + 1;
|
|
102
|
+
while (end < lines.length && !lines[end].trimStart().startsWith('['))
|
|
103
|
+
end++;
|
|
104
|
+
const rest = [...lines.slice(0, start), ...lines.slice(end)]
|
|
105
|
+
.join('\n')
|
|
106
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
107
|
+
.replace(/^\n+/, '');
|
|
108
|
+
return { rest, found: true };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Register graft in a TOML config, replacing any section a previous version left.
|
|
112
|
+
*
|
|
113
|
+
* The old behaviour was to skip entirely once the header existed, which froze the
|
|
114
|
+
* launch command at whatever the first init wrote: a repo wired when graft wasn't
|
|
115
|
+
* on PATH kept the slow `npx` form forever, and no upgrade could correct it. Strip
|
|
116
|
+
* and re-append instead, so this converges like every other writer — foreign
|
|
117
|
+
* tables are untouched either way.
|
|
118
|
+
*/
|
|
86
119
|
function upsertCodexToml(id, path) {
|
|
87
120
|
const existed = existsSync(path);
|
|
88
121
|
const text = existed ? readFileSync(path, 'utf8') : '';
|
|
89
|
-
if (/^\[mcp_servers\.graft\]$/m.test(text))
|
|
90
|
-
return { id, path, action: 'unchanged' };
|
|
91
122
|
const { command, args } = serverEntry();
|
|
92
123
|
const argList = args.map((a) => JSON.stringify(a)).join(", ");
|
|
93
|
-
const section =
|
|
94
|
-
const
|
|
124
|
+
const section = `${TOML_HEADER}\ncommand = \"${command}\"\nargs = [${argList}]\n`;
|
|
125
|
+
const { rest, found } = stripTomlSection(text);
|
|
126
|
+
// Byte-identical already: don't rewrite the file just to reorder it.
|
|
127
|
+
if (found && text === appendSection(rest, section))
|
|
128
|
+
return { id, path, action: 'unchanged' };
|
|
95
129
|
mkdirSync(dirname(path), { recursive: true });
|
|
96
|
-
writeFileSync(path,
|
|
130
|
+
writeFileSync(path, appendSection(rest, section));
|
|
97
131
|
return { id, path, action: existed ? 'updated' : 'created' };
|
|
98
132
|
}
|
|
133
|
+
/** Append a section after exactly one blank line, or at the top of an empty file. */
|
|
134
|
+
function appendSection(text, section) {
|
|
135
|
+
if (text.trim() === '')
|
|
136
|
+
return section;
|
|
137
|
+
const sep = text.endsWith('\n\n') ? '' : text.endsWith('\n') ? '\n' : '\n\n';
|
|
138
|
+
return `${text}${sep}${section}`;
|
|
139
|
+
}
|
|
99
140
|
function jsonTarget(hostId, id, path, topKey, entry, scope = 'repo') {
|
|
100
141
|
return { hostId, id, path, scope, kind: 'mcp', what: `${topKey}.graft`, format: 'json', topKey, entry };
|
|
101
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/hosts/mcp-config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/hosts/mcp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { WriteScope } from './plan.js';
|
|
2
|
+
/** What a retraction did to one target. */
|
|
3
|
+
export type RetractAction =
|
|
4
|
+
/** graft's contribution was there and is now gone. */
|
|
5
|
+
'removed'
|
|
6
|
+
/** the whole file was graft's, so the file itself is gone. */
|
|
7
|
+
| 'deleted'
|
|
8
|
+
/** nothing of graft's here. */
|
|
9
|
+
| 'absent'
|
|
10
|
+
/** file exists but can't be parsed — left untouched rather than risk it. */
|
|
11
|
+
| 'skipped-unparseable';
|
|
12
|
+
export interface Retraction {
|
|
13
|
+
/** The host this target belongs to, for grouping the report. */
|
|
14
|
+
hostId: string;
|
|
15
|
+
path: string;
|
|
16
|
+
/** Short human label for what was removed from that file. */
|
|
17
|
+
what: string;
|
|
18
|
+
scope: WriteScope;
|
|
19
|
+
action: RetractAction;
|
|
20
|
+
}
|
|
21
|
+
export interface RetractOpts {
|
|
22
|
+
home?: string;
|
|
23
|
+
/** false → report only, touch nothing. Defaults to false: a destructive
|
|
24
|
+
* operation must be asked for, never assumed. */
|
|
25
|
+
apply?: boolean;
|
|
26
|
+
/** false → skip targets outside the repo (the ~/.codex and ~/.gemini writes). */
|
|
27
|
+
global?: boolean;
|
|
28
|
+
/** false → keep `graft/` and the ignore entries. `init` sets this: the cache is
|
|
29
|
+
* regenerable but re-parsing a large repo costs minutes, and init is about to
|
|
30
|
+
* use it. */
|
|
31
|
+
cache?: boolean;
|
|
32
|
+
/** Host ids about to be re-written, so their targets are left alone. `init`
|
|
33
|
+
* passes its selection: retracting a file it is one step from rewriting is
|
|
34
|
+
* pure churn (and would report every write as `created`). */
|
|
35
|
+
exclude?: string[];
|
|
36
|
+
}
|
|
37
|
+
/** What a retraction *would* remove. Pure — touches nothing. */
|
|
38
|
+
export declare function planRetract(repo: string, opts?: RetractOpts): Retraction[];
|
|
39
|
+
/**
|
|
40
|
+
* Remove graft's contribution from every target. Reports every target it
|
|
41
|
+
* considered, including the ones that were already clean, so a caller can show
|
|
42
|
+
* either the full sweep or just what changed.
|
|
43
|
+
*/
|
|
44
|
+
export declare function runRetract(repo: string, opts?: RetractOpts): Retraction[];
|
|
45
|
+
/** The subset worth showing a user: targets that had something to remove. */
|
|
46
|
+
export declare function changed(retractions: Retraction[]): Retraction[];
|
|
47
|
+
//# sourceMappingURL=retract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retract.d.ts","sourceRoot":"","sources":["../../src/hosts/retract.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,2CAA2C;AAC3C,MAAM,MAAM,aAAa;AACvB,sDAAsD;AACpD,SAAS;AACX,8DAA8D;GAC5D,SAAS;AACX,+BAA+B;GAC7B,QAAQ;AACV,4EAA4E;GAC1E,qBAAqB,CAAC;AAE1B,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;sDACkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;kBAEc;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;kEAE8D;IAC9D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAkYD,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,EAAE,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,EAAE,CAG7E;AAED,6EAA6E;AAC7E,wBAAgB,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAE/D"}
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retraction: undo every edit graft has ever made to a repo.
|
|
3
|
+
*
|
|
4
|
+
* `init` is additive — it writes the files the *currently selected* hosts need
|
|
5
|
+
* and never looks at the rest. So a repo wired by an older version (or by the
|
|
6
|
+
* same version with different `--agents`) keeps the files that run produced,
|
|
7
|
+
* and the two sets accumulate. Retraction is the missing half: it walks every
|
|
8
|
+
* target graft could ever have written and removes graft's contribution, so
|
|
9
|
+
* `retract` + `init` converges the repo on exactly this version's intent.
|
|
10
|
+
*
|
|
11
|
+
* The target list is derived from the same registries `init` writes through
|
|
12
|
+
* (`HOSTS`, `mcpTargets`, `hookTargets`, `claudeTargets`), so a host added
|
|
13
|
+
* later is retractable for free — there is no second list to keep in sync.
|
|
14
|
+
* Only {@link LEGACY_TARGETS} is hand-maintained, and only for paths that have
|
|
15
|
+
* been *removed* from those registries: once a host is gone, nothing else
|
|
16
|
+
* remembers the file it used to write.
|
|
17
|
+
*
|
|
18
|
+
* Two invariants, both load-bearing:
|
|
19
|
+
* 1. Never delete what graft did not write. Inside a file the user owns, only
|
|
20
|
+
* the marker-fenced region and graft-named keys are touched; foreign MCP
|
|
21
|
+
* servers, hooks, and settings are preserved byte for byte.
|
|
22
|
+
* 2. Never leave an empty shell. A file that held nothing but graft's
|
|
23
|
+
* contribution is deleted, not truncated to `{}` or a blank document —
|
|
24
|
+
* an orphan file is the very residue this exists to remove.
|
|
25
|
+
*/
|
|
26
|
+
import { readFileSync, writeFileSync, existsSync, rmSync, rmdirSync, statSync, readdirSync } from 'node:fs';
|
|
27
|
+
import { join, dirname } from 'node:path';
|
|
28
|
+
import { homedir } from 'node:os';
|
|
29
|
+
import { HOSTS } from './registry.js';
|
|
30
|
+
import { START, END } from './sections.js';
|
|
31
|
+
import { mcpTargets, stripTomlSection } from './mcp-config.js';
|
|
32
|
+
import { hookTargets } from './codex-hooks.js';
|
|
33
|
+
import { antigravitySkillTargets } from './antigravity.js';
|
|
34
|
+
import { claudeTargets } from '../claude/init.js';
|
|
35
|
+
import { isGraftAllowEntry, isGraftFooterRegex } from '../claude/settings-merge.js';
|
|
36
|
+
/**
|
|
37
|
+
* Paths that older versions wrote and the live registries no longer mention.
|
|
38
|
+
* Empty today — every host in `HOSTS` since the multi-host layer landed is
|
|
39
|
+
* still there, and the marker string and the `graft` name have never changed,
|
|
40
|
+
* so the derived list covers every version to date.
|
|
41
|
+
*
|
|
42
|
+
* This is where a *removed* host's file goes. Deleting an entry from `HOSTS`
|
|
43
|
+
* without adding it here is what strands a file in every existing repo.
|
|
44
|
+
*/
|
|
45
|
+
const LEGACY_TARGETS = [];
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// primitive operations
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
/** True when a file has no non-whitespace content left. */
|
|
50
|
+
function isBlank(text) {
|
|
51
|
+
return text.trim() === '';
|
|
52
|
+
}
|
|
53
|
+
function removeFile(path, apply) {
|
|
54
|
+
if (!existsSync(path))
|
|
55
|
+
return 'absent';
|
|
56
|
+
if (apply) {
|
|
57
|
+
rmSync(path, { force: true });
|
|
58
|
+
pruneEmptyDirs(dirname(path));
|
|
59
|
+
}
|
|
60
|
+
return 'deleted';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Walk up from a just-emptied directory removing empty ancestors, so retracting
|
|
64
|
+
* `.claude/skills/graft/SKILL.md` doesn't leave a hollow `skills/graft/` behind.
|
|
65
|
+
* Stops at the first non-empty directory — never climbs out of the repo, because
|
|
66
|
+
* any ancestor that far up has other content in it.
|
|
67
|
+
*/
|
|
68
|
+
function pruneEmptyDirs(dir) {
|
|
69
|
+
for (let d = dir, i = 0; i < 6; i++) {
|
|
70
|
+
try {
|
|
71
|
+
if (readdirSync(d).length > 0)
|
|
72
|
+
return;
|
|
73
|
+
rmdirSync(d); // throws on a non-empty dir — exactly the guard we want
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return; // not a dir, not empty, or not ours to remove
|
|
77
|
+
}
|
|
78
|
+
const parent = dirname(d);
|
|
79
|
+
if (parent === d)
|
|
80
|
+
return;
|
|
81
|
+
d = parent;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Strip the marker-fenced graft block from a file the user owns.
|
|
86
|
+
*
|
|
87
|
+
* Paragraph spacing around the removed block is collapsed back to a single
|
|
88
|
+
* blank line, so a file that had prose either side of the block reads exactly
|
|
89
|
+
* as it did before graft appended to it.
|
|
90
|
+
*/
|
|
91
|
+
function stripSection(path, apply) {
|
|
92
|
+
if (!existsSync(path))
|
|
93
|
+
return 'absent';
|
|
94
|
+
const text = readFileSync(path, 'utf8');
|
|
95
|
+
if (!text.includes(START))
|
|
96
|
+
return 'absent';
|
|
97
|
+
const eol = text.includes('\r\n') ? '\r\n' : '\n';
|
|
98
|
+
const lines = text.split(/\r\n|\n/);
|
|
99
|
+
const out = [];
|
|
100
|
+
let inside = false;
|
|
101
|
+
let found = false;
|
|
102
|
+
for (const line of lines) {
|
|
103
|
+
const t = line.trim();
|
|
104
|
+
if (!inside && t === START) {
|
|
105
|
+
inside = true;
|
|
106
|
+
found = true;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (inside) {
|
|
110
|
+
if (t === END)
|
|
111
|
+
inside = false;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
out.push(line);
|
|
115
|
+
}
|
|
116
|
+
if (!found)
|
|
117
|
+
return 'absent';
|
|
118
|
+
// Collapse the run of blank lines the block left behind, and trim the edges.
|
|
119
|
+
const collapsed = out
|
|
120
|
+
.join('\n')
|
|
121
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
122
|
+
.replace(/^\n+/, '')
|
|
123
|
+
.replace(/\n+$/, '\n');
|
|
124
|
+
if (!apply)
|
|
125
|
+
return isBlank(collapsed) ? 'deleted' : 'removed';
|
|
126
|
+
if (isBlank(collapsed))
|
|
127
|
+
return removeFile(path, true);
|
|
128
|
+
writeFileSync(path, eol === '\n' ? collapsed : collapsed.replace(/\n/g, '\r\n'));
|
|
129
|
+
return 'removed';
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Delete `<topKey>.graft` from a JSON config, preserving every other server.
|
|
133
|
+
* An unparseable file is reported and left alone — the user may have comments or
|
|
134
|
+
* a half-finished edit in there, and rewriting it would lose more than it fixes.
|
|
135
|
+
*/
|
|
136
|
+
function removeJsonKey(path, topKey, apply) {
|
|
137
|
+
if (!existsSync(path))
|
|
138
|
+
return 'absent';
|
|
139
|
+
let root;
|
|
140
|
+
try {
|
|
141
|
+
root = JSON.parse(readFileSync(path, 'utf8'));
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return 'skipped-unparseable';
|
|
145
|
+
}
|
|
146
|
+
if (typeof root !== 'object' || root === null || Array.isArray(root))
|
|
147
|
+
return 'skipped-unparseable';
|
|
148
|
+
const bucket = root[topKey];
|
|
149
|
+
if (typeof bucket !== 'object' || bucket === null || Array.isArray(bucket))
|
|
150
|
+
return 'absent';
|
|
151
|
+
const map = bucket;
|
|
152
|
+
if (!('graft' in map))
|
|
153
|
+
return 'absent';
|
|
154
|
+
if (!apply) {
|
|
155
|
+
return Object.keys(map).length === 1 && Object.keys(root).length === 1 ? 'deleted' : 'removed';
|
|
156
|
+
}
|
|
157
|
+
delete map.graft;
|
|
158
|
+
if (Object.keys(map).length === 0)
|
|
159
|
+
delete root[topKey];
|
|
160
|
+
if (Object.keys(root).length === 0)
|
|
161
|
+
return removeFile(path, true);
|
|
162
|
+
writeFileSync(path, `${JSON.stringify(root, null, 2)}\n`);
|
|
163
|
+
return 'removed';
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Delete the `[mcp_servers.graft]` table from a TOML config.
|
|
167
|
+
*
|
|
168
|
+
* Line-based on purpose: a real TOML parse-and-reserialize would reformat the
|
|
169
|
+
* user's whole file. The table runs from its header to the next `[`-header or
|
|
170
|
+
* EOF, which is exactly what `upsertCodexToml` appends.
|
|
171
|
+
*/
|
|
172
|
+
function removeTomlSection(path, apply) {
|
|
173
|
+
if (!existsSync(path))
|
|
174
|
+
return 'absent';
|
|
175
|
+
const { rest: kept, found } = stripTomlSection(readFileSync(path, 'utf8'));
|
|
176
|
+
if (!found)
|
|
177
|
+
return 'absent';
|
|
178
|
+
if (!apply)
|
|
179
|
+
return isBlank(kept) ? 'deleted' : 'removed';
|
|
180
|
+
if (isBlank(kept))
|
|
181
|
+
return removeFile(path, true);
|
|
182
|
+
writeFileSync(path, kept.endsWith('\n') ? kept : `${kept}\n`);
|
|
183
|
+
return 'removed';
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Remove graft's fragments from `.claude/settings.json`, keeping the user's.
|
|
187
|
+
*
|
|
188
|
+
* The statusline check is by *shim path*, not exact string equality: an older
|
|
189
|
+
* version's command differed in shape, and `mergeGraftSettings` would read that
|
|
190
|
+
* as a hand-written statusline and refuse to touch it forever. Matching the
|
|
191
|
+
* helper path recognizes graft's own output across every version that wrote it.
|
|
192
|
+
*/
|
|
193
|
+
function stripClaudeSettings(path, apply) {
|
|
194
|
+
if (!existsSync(path))
|
|
195
|
+
return 'absent';
|
|
196
|
+
let root;
|
|
197
|
+
try {
|
|
198
|
+
root = JSON.parse(readFileSync(path, 'utf8'));
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return 'skipped-unparseable';
|
|
202
|
+
}
|
|
203
|
+
if (typeof root !== 'object' || root === null || Array.isArray(root))
|
|
204
|
+
return 'skipped-unparseable';
|
|
205
|
+
const before = JSON.stringify(root);
|
|
206
|
+
const isGraftCmd = (v) => JSON.stringify(v ?? '').includes('graft-statusline.cjs');
|
|
207
|
+
for (const key of ['statusLine', 'subagentStatusLine']) {
|
|
208
|
+
if (root[key] !== undefined && isGraftCmd(root[key]))
|
|
209
|
+
delete root[key];
|
|
210
|
+
}
|
|
211
|
+
if (root.hooks && typeof root.hooks === 'object' && !Array.isArray(root.hooks)) {
|
|
212
|
+
for (const event of Object.keys(root.hooks)) {
|
|
213
|
+
const prior = root.hooks[event];
|
|
214
|
+
if (!Array.isArray(prior))
|
|
215
|
+
continue;
|
|
216
|
+
const kept = prior.filter((e) => !JSON.stringify(e ?? '').includes('graft-hooks.cjs'));
|
|
217
|
+
if (kept.length === 0)
|
|
218
|
+
delete root.hooks[event];
|
|
219
|
+
else
|
|
220
|
+
root.hooks[event] = kept;
|
|
221
|
+
}
|
|
222
|
+
if (Object.keys(root.hooks).length === 0)
|
|
223
|
+
delete root.hooks;
|
|
224
|
+
}
|
|
225
|
+
if (Array.isArray(root.footerLinksRegexes)) {
|
|
226
|
+
const kept = root.footerLinksRegexes.filter((r) => !isGraftFooterRegex(r));
|
|
227
|
+
if (kept.length === 0)
|
|
228
|
+
delete root.footerLinksRegexes;
|
|
229
|
+
else
|
|
230
|
+
root.footerLinksRegexes = kept;
|
|
231
|
+
}
|
|
232
|
+
if (root.permissions && Array.isArray(root.permissions.allow)) {
|
|
233
|
+
const kept = root.permissions.allow.filter((a) => !isGraftAllowEntry(a));
|
|
234
|
+
if (kept.length === 0)
|
|
235
|
+
delete root.permissions.allow;
|
|
236
|
+
else
|
|
237
|
+
root.permissions.allow = kept;
|
|
238
|
+
if (Object.keys(root.permissions).length === 0)
|
|
239
|
+
delete root.permissions;
|
|
240
|
+
}
|
|
241
|
+
const after = JSON.stringify(root);
|
|
242
|
+
if (after === before)
|
|
243
|
+
return 'absent';
|
|
244
|
+
if (!apply)
|
|
245
|
+
return Object.keys(root).length === 0 ? 'deleted' : 'removed';
|
|
246
|
+
if (Object.keys(root).length === 0)
|
|
247
|
+
return removeFile(path, true);
|
|
248
|
+
writeFileSync(path, `${JSON.stringify(root, null, 2)}\n`);
|
|
249
|
+
return 'removed';
|
|
250
|
+
}
|
|
251
|
+
/** Remove graft's PostToolUse/SessionStart/etc. entries from Codex's hooks.json. */
|
|
252
|
+
function stripCodexHooks(path, apply) {
|
|
253
|
+
if (!existsSync(path))
|
|
254
|
+
return 'absent';
|
|
255
|
+
let root;
|
|
256
|
+
try {
|
|
257
|
+
root = JSON.parse(readFileSync(path, 'utf8'));
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return 'skipped-unparseable';
|
|
261
|
+
}
|
|
262
|
+
if (typeof root !== 'object' || root === null || Array.isArray(root))
|
|
263
|
+
return 'skipped-unparseable';
|
|
264
|
+
if (!root.hooks || typeof root.hooks !== 'object' || Array.isArray(root.hooks))
|
|
265
|
+
return 'absent';
|
|
266
|
+
const before = JSON.stringify(root);
|
|
267
|
+
for (const event of Object.keys(root.hooks)) {
|
|
268
|
+
const prior = root.hooks[event];
|
|
269
|
+
if (!Array.isArray(prior))
|
|
270
|
+
continue;
|
|
271
|
+
const kept = prior.filter((e) => !JSON.stringify(e ?? '').includes('graft-hooks.cjs'));
|
|
272
|
+
if (kept.length === 0)
|
|
273
|
+
delete root.hooks[event];
|
|
274
|
+
else
|
|
275
|
+
root.hooks[event] = kept;
|
|
276
|
+
}
|
|
277
|
+
if (Object.keys(root.hooks).length === 0)
|
|
278
|
+
delete root.hooks;
|
|
279
|
+
if (JSON.stringify(root) === before)
|
|
280
|
+
return 'absent';
|
|
281
|
+
if (!apply)
|
|
282
|
+
return Object.keys(root).length === 0 ? 'deleted' : 'removed';
|
|
283
|
+
if (Object.keys(root).length === 0)
|
|
284
|
+
return removeFile(path, true);
|
|
285
|
+
writeFileSync(path, `${JSON.stringify(root, null, 2)}\n`);
|
|
286
|
+
return 'removed';
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Drop graft's block from `.gitignore` / `.ignore`.
|
|
290
|
+
*
|
|
291
|
+
* Both are written as a comment line plus entries; the comment is graft's own
|
|
292
|
+
* wording, so it identifies the block. Entries are matched individually too, so
|
|
293
|
+
* a hand-tidied file (comment deleted, entry kept) still retracts cleanly.
|
|
294
|
+
*/
|
|
295
|
+
function stripIgnoreEntries(path, entries, apply) {
|
|
296
|
+
if (!existsSync(path))
|
|
297
|
+
return 'absent';
|
|
298
|
+
const text = readFileSync(path, 'utf8');
|
|
299
|
+
const kept = text
|
|
300
|
+
.split('\n')
|
|
301
|
+
.filter((l) => {
|
|
302
|
+
const t = l.trim();
|
|
303
|
+
if (t.startsWith('#') && t.includes('graft'))
|
|
304
|
+
return false;
|
|
305
|
+
return !entries.some((re) => re.test(t));
|
|
306
|
+
})
|
|
307
|
+
.join('\n')
|
|
308
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
309
|
+
.replace(/^\n+/, '')
|
|
310
|
+
.replace(/\n+$/, '\n');
|
|
311
|
+
if (kept === text)
|
|
312
|
+
return 'absent';
|
|
313
|
+
if (!apply)
|
|
314
|
+
return isBlank(kept) ? 'deleted' : 'removed';
|
|
315
|
+
if (isBlank(kept))
|
|
316
|
+
return removeFile(path, true);
|
|
317
|
+
writeFileSync(path, kept.endsWith('\n') ? kept : `${kept}\n`);
|
|
318
|
+
return 'removed';
|
|
319
|
+
}
|
|
320
|
+
function removeDir(path, apply) {
|
|
321
|
+
try {
|
|
322
|
+
if (!statSync(path).isDirectory())
|
|
323
|
+
return 'absent';
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
return 'absent';
|
|
327
|
+
}
|
|
328
|
+
if (apply) {
|
|
329
|
+
rmSync(path, { recursive: true, force: true });
|
|
330
|
+
pruneEmptyDirs(dirname(path));
|
|
331
|
+
}
|
|
332
|
+
return 'deleted';
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Every target graft could have written, in removal order.
|
|
336
|
+
*
|
|
337
|
+
* Derived from the live registries, NOT hand-listed: `HOSTS` gives the
|
|
338
|
+
* instruction files, `mcpTargets` over *all* host ids gives the MCP configs
|
|
339
|
+
* (with the format and top-level key each one needs), and `claudeTargets`
|
|
340
|
+
* gives the Claude Code layer. That's what keeps this complete as hosts are
|
|
341
|
+
* added — see the module note.
|
|
342
|
+
*/
|
|
343
|
+
function targets(repo, opts) {
|
|
344
|
+
const home = opts.home ?? homedir();
|
|
345
|
+
const exclude = new Set(opts.exclude ?? []);
|
|
346
|
+
const out = [];
|
|
347
|
+
/**
|
|
348
|
+
* Paths a *kept* host also writes, which must survive even though some other,
|
|
349
|
+
* unselected host names them too.
|
|
350
|
+
*
|
|
351
|
+
* Three hosts share `AGENTS.md` (agents, hermes, antigravity). Excluding by host
|
|
352
|
+
* id alone would strip that shared block on behalf of a host nobody selected,
|
|
353
|
+
* and the only reason the end state came out right was that `init` happened to
|
|
354
|
+
* rewrite it immediately afterwards. Exclude by path as well, so retraction
|
|
355
|
+
* never depends on what runs next.
|
|
356
|
+
*/
|
|
357
|
+
const keptPaths = new Set();
|
|
358
|
+
for (const host of HOSTS) {
|
|
359
|
+
if (exclude.has(host.id))
|
|
360
|
+
keptPaths.add(join(repo, host.relPath));
|
|
361
|
+
}
|
|
362
|
+
for (const t of mcpTargets(repo, [...exclude], { home }))
|
|
363
|
+
keptPaths.add(t.path);
|
|
364
|
+
if (exclude.has('claude'))
|
|
365
|
+
for (const t of claudeTargets(repo))
|
|
366
|
+
keptPaths.add(t.path);
|
|
367
|
+
if (exclude.has('agents'))
|
|
368
|
+
for (const t of hookTargets(home))
|
|
369
|
+
keptPaths.add(t.path);
|
|
370
|
+
if (exclude.has('antigravity'))
|
|
371
|
+
for (const t of antigravitySkillTargets(home))
|
|
372
|
+
keptPaths.add(t.path);
|
|
373
|
+
/** Queue a target unless a kept host owns that path, or it's already queued. */
|
|
374
|
+
const seen = new Set();
|
|
375
|
+
const add = (t) => {
|
|
376
|
+
if (keptPaths.has(t.path) || seen.has(t.path))
|
|
377
|
+
return;
|
|
378
|
+
seen.add(t.path);
|
|
379
|
+
out.push(t);
|
|
380
|
+
};
|
|
381
|
+
// 1. Instruction files, one per host. Owned files go wholesale; shared files
|
|
382
|
+
// lose only their fenced block.
|
|
383
|
+
for (const host of HOSTS) {
|
|
384
|
+
if (exclude.has(host.id))
|
|
385
|
+
continue;
|
|
386
|
+
const path = join(repo, host.relPath);
|
|
387
|
+
add(host.kind === 'owned'
|
|
388
|
+
? { hostId: host.id, path, what: 'graft-owned instruction file', scope: 'repo', run: (a) => removeFile(path, a) }
|
|
389
|
+
: { hostId: host.id, path, what: 'fenced graft section', scope: 'repo', run: (a) => stripSection(path, a) });
|
|
390
|
+
}
|
|
391
|
+
// 1b. Instruction files from hosts that no longer exist in the registry.
|
|
392
|
+
for (const legacy of LEGACY_TARGETS) {
|
|
393
|
+
const path = join(repo, legacy.relPath);
|
|
394
|
+
add({
|
|
395
|
+
hostId: 'legacy', path, what: legacy.what, scope: 'repo',
|
|
396
|
+
run: (a) => (legacy.kind === 'owned' ? removeFile(path, a) : stripSection(path, a)),
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
// 2. MCP registrations. Asking for every host id at once yields the union of
|
|
400
|
+
// config files, each already carrying its format and top-level key.
|
|
401
|
+
const allIds = HOSTS.map((h) => h.id).filter((id) => !exclude.has(id));
|
|
402
|
+
for (const t of mcpTargets(repo, allIds, { home })) {
|
|
403
|
+
if (opts.global === false && t.scope === 'global')
|
|
404
|
+
continue;
|
|
405
|
+
add({
|
|
406
|
+
hostId: t.hostId, path: t.path, what: t.what, scope: t.scope,
|
|
407
|
+
run: (a) => (t.format === 'toml' ? removeTomlSection(t.path, a) : removeJsonKey(t.path, t.topKey, a)),
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
// 3. Claude Code: settings fragments, both shims, the skill, and the .mcp.json key.
|
|
411
|
+
if (!exclude.has('claude')) {
|
|
412
|
+
const [settings, statusline, hooks, skill, mcp] = claudeTargets(repo).map((t) => t.path);
|
|
413
|
+
for (const t of [
|
|
414
|
+
{ hostId: 'claude', path: settings, what: 'statusline + hooks + allowlist + footer regex', scope: 'repo', run: (a) => stripClaudeSettings(settings, a) },
|
|
415
|
+
{ hostId: 'claude', path: statusline, what: 'statusline shim', scope: 'repo', run: (a) => removeFile(statusline, a) },
|
|
416
|
+
{ hostId: 'claude', path: hooks, what: 'hooks shim', scope: 'repo', run: (a) => removeFile(hooks, a) },
|
|
417
|
+
{ hostId: 'claude', path: skill, what: 'graft skill', scope: 'repo', run: (a) => removeFile(skill, a) },
|
|
418
|
+
{ hostId: 'claude', path: mcp, what: 'mcpServers.graft', scope: 'repo', run: (a) => removeJsonKey(mcp, 'mcpServers', a) },
|
|
419
|
+
])
|
|
420
|
+
add(t);
|
|
421
|
+
}
|
|
422
|
+
// 4. Global: Codex's hook shim + entries, and Antigravity's shared skill.
|
|
423
|
+
if (opts.global !== false) {
|
|
424
|
+
if (!exclude.has('agents')) {
|
|
425
|
+
for (const t of hookTargets(home)) {
|
|
426
|
+
add({
|
|
427
|
+
hostId: t.hostId, path: t.path, what: t.what, scope: 'global',
|
|
428
|
+
run: (a) => (t.path.endsWith('.json') ? stripCodexHooks(t.path, a) : removeFile(t.path, a)),
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (!exclude.has('antigravity')) {
|
|
433
|
+
for (const t of antigravitySkillTargets(home)) {
|
|
434
|
+
add({ hostId: t.hostId, path: t.path, what: t.what, scope: 'global', run: (a) => removeFile(t.path, a) });
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
// 5. The graph cache and the ignore entries that admit it. Last, so a failure
|
|
439
|
+
// here can't strand the wiring half-retracted.
|
|
440
|
+
if (opts.cache !== false) {
|
|
441
|
+
const cache = join(repo, 'graft');
|
|
442
|
+
const gitignore = join(repo, '.gitignore');
|
|
443
|
+
const ignore = join(repo, '.ignore');
|
|
444
|
+
for (const t of [
|
|
445
|
+
{ hostId: 'graph', path: cache, what: 'local graph cache', scope: 'repo', run: (a) => removeDir(cache, a) },
|
|
446
|
+
{ hostId: 'graph', path: gitignore, what: 'graft/ ignore entry', scope: 'repo', run: (a) => stripIgnoreEntries(gitignore, [/^\/?graft\/?$/], a) },
|
|
447
|
+
{ hostId: 'graph', path: ignore, what: 'graft/ search re-admit entries', scope: 'repo', run: (a) => stripIgnoreEntries(ignore, [/^!?graft\/?$/, /^graft\/\.(cache|graph)\/?$/], a) },
|
|
448
|
+
])
|
|
449
|
+
add(t);
|
|
450
|
+
}
|
|
451
|
+
return out;
|
|
452
|
+
}
|
|
453
|
+
// ---------------------------------------------------------------------------
|
|
454
|
+
// public API
|
|
455
|
+
// ---------------------------------------------------------------------------
|
|
456
|
+
/** What a retraction *would* remove. Pure — touches nothing. */
|
|
457
|
+
export function planRetract(repo, opts = {}) {
|
|
458
|
+
return targets(repo, { ...opts, apply: false }).map(({ run, ...t }) => ({ ...t, action: run(false) }));
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Remove graft's contribution from every target. Reports every target it
|
|
462
|
+
* considered, including the ones that were already clean, so a caller can show
|
|
463
|
+
* either the full sweep or just what changed.
|
|
464
|
+
*/
|
|
465
|
+
export function runRetract(repo, opts = {}) {
|
|
466
|
+
const apply = opts.apply !== false;
|
|
467
|
+
return targets(repo, opts).map(({ run, ...t }) => ({ ...t, action: run(apply) }));
|
|
468
|
+
}
|
|
469
|
+
/** The subset worth showing a user: targets that had something to remove. */
|
|
470
|
+
export function changed(retractions) {
|
|
471
|
+
return retractions.filter((r) => r.action !== 'absent');
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=retract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retract.js","sourceRoot":"","sources":["../../src/hosts/retract.ts"],"names":[],"mappings":"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"}
|