@shield-agent/kya 0.33.6 → 0.35.3
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/.cursor-plugin/plugin.json +2 -2
- package/.mcp.json +1 -1
- package/LIMITATIONS.md +2 -1
- package/README.md +39 -640
- package/amp/settings.example.json +1 -1
- package/assets/report-blocked.png +0 -0
- package/assets/report-certify.png +0 -0
- package/assets/report-overview.png +0 -0
- package/assets/screenshot-features.json +18 -0
- package/claude/claude_desktop_config.example.json +1 -1
- package/cline/cline_mcp_settings.example.json +1 -1
- package/copilot/mcp-config.example.json +1 -1
- package/dist/alerts/config.d.ts +22 -0
- package/dist/alerts/config.d.ts.map +1 -0
- package/dist/alerts/config.js +59 -0
- package/dist/alerts/config.js.map +1 -0
- package/dist/alerts/constants.d.ts +5 -0
- package/dist/alerts/constants.d.ts.map +1 -0
- package/dist/alerts/constants.js +5 -0
- package/dist/alerts/constants.js.map +1 -0
- package/dist/alerts/desktop.d.ts +19 -0
- package/dist/alerts/desktop.d.ts.map +1 -0
- package/dist/alerts/desktop.js +57 -0
- package/dist/alerts/desktop.js.map +1 -0
- package/dist/alerts/incident-alert.d.ts +42 -0
- package/dist/alerts/incident-alert.d.ts.map +1 -0
- package/dist/alerts/incident-alert.js +84 -0
- package/dist/alerts/incident-alert.js.map +1 -0
- package/dist/alerts/scan.d.ts +37 -0
- package/dist/alerts/scan.d.ts.map +1 -0
- package/dist/alerts/scan.js +188 -0
- package/dist/alerts/scan.js.map +1 -0
- package/dist/alerts/state.d.ts +55 -0
- package/dist/alerts/state.d.ts.map +1 -0
- package/dist/alerts/state.js +178 -0
- package/dist/alerts/state.js.map +1 -0
- package/dist/alerts/triage-input.d.ts +36 -0
- package/dist/alerts/triage-input.d.ts.map +1 -0
- package/dist/alerts/triage-input.js +159 -0
- package/dist/alerts/triage-input.js.map +1 -0
- package/dist/alerts/triage-model.d.ts +42 -0
- package/dist/alerts/triage-model.d.ts.map +1 -0
- package/dist/alerts/triage-model.js +126 -0
- package/dist/alerts/triage-model.js.map +1 -0
- package/dist/alerts/triage-prompt.d.ts +23 -0
- package/dist/alerts/triage-prompt.d.ts.map +1 -0
- package/dist/alerts/triage-prompt.js +53 -0
- package/dist/alerts/triage-prompt.js.map +1 -0
- package/dist/alerts/triage-schema.json +52 -0
- package/dist/alerts/triage-setup.d.ts +77 -0
- package/dist/alerts/triage-setup.d.ts.map +1 -0
- package/dist/alerts/triage-setup.js +290 -0
- package/dist/alerts/triage-setup.js.map +1 -0
- package/dist/alerts/triage-status.d.ts +26 -0
- package/dist/alerts/triage-status.d.ts.map +1 -0
- package/dist/alerts/triage-status.js +61 -0
- package/dist/alerts/triage-status.js.map +1 -0
- package/dist/alerts/triage-tokenizer.d.ts +29 -0
- package/dist/alerts/triage-tokenizer.d.ts.map +1 -0
- package/dist/alerts/triage-tokenizer.js +82 -0
- package/dist/alerts/triage-tokenizer.js.map +1 -0
- package/dist/card-png.d.ts +3 -0
- package/dist/card-png.d.ts.map +1 -0
- package/dist/card-png.js +54 -0
- package/dist/card-png.js.map +1 -0
- package/dist/card.d.ts +62 -0
- package/dist/card.d.ts.map +1 -0
- package/dist/card.js +154 -0
- package/dist/card.js.map +1 -0
- package/dist/certify/evaluate.d.ts +11 -1
- package/dist/certify/evaluate.d.ts.map +1 -1
- package/dist/certify/evaluate.js +8 -1
- package/dist/certify/evaluate.js.map +1 -1
- package/dist/certify/render.d.ts.map +1 -1
- package/dist/certify/render.js +10 -1
- package/dist/certify/render.js.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +234 -49
- package/dist/cli.js.map +1 -1
- package/dist/commands/alerts.d.ts +16 -0
- package/dist/commands/alerts.d.ts.map +1 -0
- package/dist/commands/alerts.js +112 -0
- package/dist/commands/alerts.js.map +1 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +4 -3
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +12 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +94 -8
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/notify-flush.d.ts.map +1 -1
- package/dist/commands/notify-flush.js +3 -0
- package/dist/commands/notify-flush.js.map +1 -1
- package/dist/commands/receipt-serve.d.ts +1 -1
- package/dist/commands/receipt-serve.d.ts.map +1 -1
- package/dist/commands/receipt-serve.js +3 -2
- package/dist/commands/receipt-serve.js.map +1 -1
- package/dist/commands/receipt.d.ts +19 -0
- package/dist/commands/receipt.d.ts.map +1 -1
- package/dist/commands/receipt.js +21 -1
- package/dist/commands/receipt.js.map +1 -1
- package/dist/commands/serve-mcp.d.ts +2 -0
- package/dist/commands/serve-mcp.d.ts.map +1 -1
- package/dist/commands/serve-mcp.js +2 -0
- package/dist/commands/serve-mcp.js.map +1 -1
- package/dist/commands/start.d.ts +50 -2
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +233 -27
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/team.d.ts +19 -2
- package/dist/commands/team.d.ts.map +1 -1
- package/dist/commands/team.js +93 -13
- package/dist/commands/team.js.map +1 -1
- package/dist/commands/uninstall.d.ts +20 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +378 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/wire-hooks.d.ts +16 -2
- package/dist/commands/wire-hooks.d.ts.map +1 -1
- package/dist/commands/wire-hooks.js +86 -21
- package/dist/commands/wire-hooks.js.map +1 -1
- package/dist/cta.d.ts +3 -1
- package/dist/cta.d.ts.map +1 -1
- package/dist/cta.js +11 -6
- package/dist/cta.js.map +1 -1
- package/dist/fs-atomic.d.ts.map +1 -1
- package/dist/fs-atomic.js +9 -2
- package/dist/fs-atomic.js.map +1 -1
- package/dist/guard-demo.d.ts +23 -0
- package/dist/guard-demo.d.ts.map +1 -0
- package/dist/guard-demo.js +34 -0
- package/dist/guard-demo.js.map +1 -0
- package/dist/guard-entry.d.ts +2 -0
- package/dist/guard-entry.d.ts.map +1 -0
- package/dist/guard-entry.js +50 -0
- package/dist/guard-entry.js.map +1 -0
- package/dist/guard-lite.d.ts +27 -0
- package/dist/guard-lite.d.ts.map +1 -0
- package/dist/guard-lite.js +274 -0
- package/dist/guard-lite.js.map +1 -0
- package/dist/guard-pack.d.ts +7 -2
- package/dist/guard-pack.d.ts.map +1 -1
- package/dist/guard-pack.js +202 -4
- package/dist/guard-pack.js.map +1 -1
- package/dist/hook-health.d.ts +7 -0
- package/dist/hook-health.d.ts.map +1 -0
- package/dist/hook-health.js +105 -0
- package/dist/hook-health.js.map +1 -0
- package/dist/investigate/detectors.d.ts +6 -0
- package/dist/investigate/detectors.d.ts.map +1 -1
- package/dist/investigate/detectors.js +10 -0
- package/dist/investigate/detectors.js.map +1 -1
- package/dist/manifest.d.ts +106 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +454 -0
- package/dist/manifest.js.map +1 -0
- package/dist/mcp/http.d.ts +1 -0
- package/dist/mcp/http.d.ts.map +1 -1
- package/dist/mcp/http.js +1 -0
- package/dist/mcp/http.js.map +1 -1
- package/dist/mcp/protocol.d.ts +2 -0
- package/dist/mcp/protocol.d.ts.map +1 -1
- package/dist/mcp/protocol.js +5 -1
- package/dist/mcp/protocol.js.map +1 -1
- package/dist/mcp/stdio.d.ts +1 -0
- package/dist/mcp/stdio.d.ts.map +1 -1
- package/dist/mcp/stdio.js +1 -0
- package/dist/mcp/stdio.js.map +1 -1
- package/dist/never-list-input.d.ts +2 -0
- package/dist/never-list-input.d.ts.map +1 -1
- package/dist/never-list-input.js +30 -30
- package/dist/never-list-input.js.map +1 -1
- package/dist/notify/dispatch.d.ts +1 -1
- package/dist/notify/dispatch.d.ts.map +1 -1
- package/dist/notify/dispatch.js +4 -1
- package/dist/notify/dispatch.js.map +1 -1
- package/dist/notify/incident-templates.d.ts +23 -0
- package/dist/notify/incident-templates.d.ts.map +1 -0
- package/dist/notify/incident-templates.js +128 -0
- package/dist/notify/incident-templates.js.map +1 -0
- package/dist/notify/index.d.ts +12 -0
- package/dist/notify/index.d.ts.map +1 -1
- package/dist/notify/index.js +50 -3
- package/dist/notify/index.js.map +1 -1
- package/dist/notify/templates.d.ts +6 -0
- package/dist/notify/templates.d.ts.map +1 -1
- package/dist/notify/templates.js +12 -2
- package/dist/notify/templates.js.map +1 -1
- package/dist/offline-evaluate.d.ts.map +1 -1
- package/dist/offline-evaluate.js +2 -1
- package/dist/offline-evaluate.js.map +1 -1
- package/dist/parse-args.js +1 -1
- package/dist/parse-args.js.map +1 -1
- package/dist/receipt/changes.d.ts +2 -1
- package/dist/receipt/changes.d.ts.map +1 -1
- package/dist/receipt/changes.js +9 -0
- package/dist/receipt/changes.js.map +1 -1
- package/dist/receipt/dashboard.d.ts +14 -1
- package/dist/receipt/dashboard.d.ts.map +1 -1
- package/dist/receipt/dashboard.js +20 -2
- package/dist/receipt/dashboard.js.map +1 -1
- package/dist/receipt/live-server.d.ts +19 -0
- package/dist/receipt/live-server.d.ts.map +1 -1
- package/dist/receipt/live-server.js +119 -0
- package/dist/receipt/live-server.js.map +1 -1
- package/dist/receipt/receipt-css.d.ts.map +1 -1
- package/dist/receipt/receipt-css.js +45 -0
- package/dist/receipt/receipt-css.js.map +1 -1
- package/dist/receipt/render-receipt.d.ts +17 -0
- package/dist/receipt/render-receipt.d.ts.map +1 -1
- package/dist/receipt/render-receipt.js +479 -80
- package/dist/receipt/render-receipt.js.map +1 -1
- package/dist/receipt/search.d.ts.map +1 -1
- package/dist/receipt/search.js +2 -0
- package/dist/receipt/search.js.map +1 -1
- package/dist/receipt/semantic-setup.d.ts +4 -0
- package/dist/receipt/semantic-setup.d.ts.map +1 -1
- package/dist/receipt/semantic-setup.js +10 -1
- package/dist/receipt/semantic-setup.js.map +1 -1
- package/dist/receipt/share.d.ts +15 -0
- package/dist/receipt/share.d.ts.map +1 -1
- package/dist/receipt/share.js +34 -1
- package/dist/receipt/share.js.map +1 -1
- package/dist/telemetry.d.ts +17 -2
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +67 -7
- package/dist/telemetry.js.map +1 -1
- package/dist/trail.d.ts +45 -0
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +38 -0
- package/dist/trail.js.map +1 -1
- package/dist/write-journal.d.ts +39 -0
- package/dist/write-journal.d.ts.map +1 -0
- package/dist/write-journal.js +107 -0
- package/dist/write-journal.js.map +1 -0
- package/droid/README.md +1 -1
- package/droid/mcp.example.json +1 -1
- package/gemini/settings.example.json +1 -1
- package/grok/README.md +2 -2
- package/kilo/kilo.example.json +1 -1
- package/kimi/mcp.example.json +1 -1
- package/kiro/mcp.example.json +1 -1
- package/manifest.json +2 -2
- package/mastracode/mcp.example.json +1 -1
- package/mcp.json +1 -1
- package/openai/codex.config.example.toml +1 -1
- package/opencode/opencode.example.json +1 -1
- package/package.json +9 -3
- package/qwen/settings.example.json +1 -1
- package/server.json +3 -3
package/dist/commands/team.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `kya team init` / `kya team managed-settings`: spread the Claude Code plugin to a team.
|
|
3
3
|
*
|
|
4
|
+
* `team init --guard` does the same for the kya-guard plugin (one bundled file, no install step): the same marketplace pin,
|
|
5
|
+
* and enabledPlugins["kya-guard@shield-kya"] = true instead of kya@shield-kya. It prints the exact diff and a README badge,
|
|
6
|
+
* writes no .kya/policy.json, and refuses when kya@shield-kya is on (both plugins would write a row for every call).
|
|
7
|
+
* The write is recorded in ~/.kya/manifest.json by the caller (src/cli.ts), so `kya uninstall --project` reverses it.
|
|
8
|
+
*
|
|
4
9
|
* init merges two keys into the CURRENT PROJECT's `.claude/settings.json` (never the user's):
|
|
5
10
|
* extraKnownMarketplaces["shield-kya"] = github The-Pixel-Boys/shield-kya at ref v<version>
|
|
6
11
|
* enabledPlugins["kya@shield-kya"] = true
|
|
@@ -11,7 +16,7 @@
|
|
|
11
16
|
* admin policy document. A prerelease kya refuses both (no public tag to pin). Schema: code.claude.com/docs/en/plugins/org and
|
|
12
17
|
* /docs/en/plugins/marketplace-reference (marketplace `github` source: repo, ref, path; no sha).
|
|
13
18
|
*/
|
|
14
|
-
import { existsSync, lstatSync,
|
|
19
|
+
import { existsSync, lstatSync, readFileSync, realpathSync } from "node:fs";
|
|
15
20
|
import { homedir } from "node:os";
|
|
16
21
|
import { basename, dirname, join } from "node:path";
|
|
17
22
|
import { globalConfigDir } from "../config.js";
|
|
@@ -20,8 +25,13 @@ import { atomicWriteSync } from "../fs-atomic.js";
|
|
|
20
25
|
import { POLICY_FILE, POLICY_SCAFFOLD } from "../project-policy.js";
|
|
21
26
|
import { compareVersions } from "../update-check.js";
|
|
22
27
|
import { CLI_VERSION } from "../version.js";
|
|
28
|
+
import { journalMkdir } from "../write-journal.js";
|
|
23
29
|
export const MARKETPLACE = "shield-kya";
|
|
24
30
|
export const PLUGIN_ID = "kya@shield-kya";
|
|
31
|
+
export const GUARD_PLUGIN_ID = "kya-guard@shield-kya";
|
|
32
|
+
export const SCOREBOARD_URL = "https://shield-agent.com/replays";
|
|
33
|
+
/** The line a maintainer pastes into the README: a static badge that reads "agent-guarded" and links to the scoreboard. */
|
|
34
|
+
export const GUARD_BADGE = `[](${SCOREBOARD_URL})`;
|
|
25
35
|
export const PUBLIC_REPO = "The-Pixel-Boys/shield-kya";
|
|
26
36
|
/** Public repo release tags are `v<version>` (the `kya-v*` tags live only in the private monorepo). */
|
|
27
37
|
export function releaseRef(version = CLI_VERSION) {
|
|
@@ -92,8 +102,56 @@ function newerThan(a, b) {
|
|
|
92
102
|
const tag = /^v\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/;
|
|
93
103
|
return tag.test(a) && tag.test(b) && compareVersions(a, b) > 0;
|
|
94
104
|
}
|
|
95
|
-
/**
|
|
96
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Unified diff of two texts, 2 lines of context. Line based (LCS): the settings files are small.
|
|
107
|
+
* Empty string when the texts are equal.
|
|
108
|
+
*/
|
|
109
|
+
export function unifiedDiff(label, before, after) {
|
|
110
|
+
if (before === after)
|
|
111
|
+
return "";
|
|
112
|
+
const a = before === "" ? [] : before.replace(/\n$/, "").split("\n");
|
|
113
|
+
const b = after.replace(/\n$/, "").split("\n");
|
|
114
|
+
const n = a.length;
|
|
115
|
+
const m = b.length;
|
|
116
|
+
const lcs = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
117
|
+
for (let i = n - 1; i >= 0; i--)
|
|
118
|
+
for (let j = m - 1; j >= 0; j--)
|
|
119
|
+
lcs[i][j] = a[i] === b[j] ? lcs[i + 1][j + 1] + 1 : Math.max(lcs[i + 1][j], lcs[i][j + 1]);
|
|
120
|
+
const ops = [];
|
|
121
|
+
let i = 0;
|
|
122
|
+
let j = 0;
|
|
123
|
+
while (i < n || j < m) {
|
|
124
|
+
if (i < n && j < m && a[i] === b[j])
|
|
125
|
+
ops.push([" ", a[i++]]), j++;
|
|
126
|
+
else if (i < n && (j === m || lcs[i + 1][j] >= lcs[i][j + 1]))
|
|
127
|
+
ops.push(["-", a[i++]]); // a removal first, as diff does
|
|
128
|
+
else
|
|
129
|
+
ops.push(["+", b[j++]]);
|
|
130
|
+
}
|
|
131
|
+
const keep = ops.map(([k], x) => k !== " " || ops.slice(Math.max(0, x - 2), x + 3).some(([c]) => c !== " "));
|
|
132
|
+
const out = [`--- ${before === "" ? "/dev/null" : `a/${label}`}`, `+++ b/${label}`];
|
|
133
|
+
let x = 0;
|
|
134
|
+
while (x < ops.length) {
|
|
135
|
+
if (!keep[x]) {
|
|
136
|
+
x++;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
let end = x;
|
|
140
|
+
while (end < ops.length && keep[end])
|
|
141
|
+
end++;
|
|
142
|
+
const hunk = ops.slice(x, end);
|
|
143
|
+
const startA = ops.slice(0, x).filter(([k]) => k !== "+").length + 1;
|
|
144
|
+
const startB = ops.slice(0, x).filter(([k]) => k !== "-").length + 1;
|
|
145
|
+
out.push(`@@ -${startA},${hunk.filter(([k]) => k !== "+").length} +${startB},${hunk.filter(([k]) => k !== "-").length} @@`);
|
|
146
|
+
for (const [k, line] of hunk)
|
|
147
|
+
out.push(`${k}${line}`);
|
|
148
|
+
x = end;
|
|
149
|
+
}
|
|
150
|
+
return out.join("\n");
|
|
151
|
+
}
|
|
152
|
+
/** Merge our two keys into `settings`; returns change lines. Throws (nothing written) on conflicts. `guard` swaps kya for kya-guard. */
|
|
153
|
+
export function mergeTeamSettings(settings, version = CLI_VERSION, guard = false) {
|
|
154
|
+
const pluginId = guard ? GUARD_PLUGIN_ID : PLUGIN_ID;
|
|
97
155
|
const changes = [];
|
|
98
156
|
const want = marketplaceSource(version);
|
|
99
157
|
// Claude Code reads the alias only when the canonical key is absent: adding ours would drop theirs.
|
|
@@ -125,17 +183,21 @@ export function mergeTeamSettings(settings, version = CLI_VERSION) {
|
|
|
125
183
|
const enabled = settings.enabledPlugins ?? {};
|
|
126
184
|
if (!isObj(enabled))
|
|
127
185
|
throw refuse("enabledPlugins is not an object; fix it by hand first");
|
|
128
|
-
if (enabled[
|
|
129
|
-
throw refuse(`enabledPlugins["${
|
|
186
|
+
if (enabled[pluginId] === false) {
|
|
187
|
+
throw refuse(`enabledPlugins["${pluginId}"] is false (someone turned it off); change it by hand if you want it on`);
|
|
188
|
+
}
|
|
189
|
+
if (guard && enabled[PLUGIN_ID] === true) {
|
|
190
|
+
throw refuse(`enabledPlugins["${PLUGIN_ID}"] is on: kya and kya-guard together write two rows for every call; turn one off by hand first`);
|
|
130
191
|
}
|
|
131
|
-
if (enabled[
|
|
132
|
-
enabled[
|
|
133
|
-
changes.push(`+ enabledPlugins["${
|
|
192
|
+
if (enabled[pluginId] !== true) {
|
|
193
|
+
enabled[pluginId] = true;
|
|
194
|
+
changes.push(`+ enabledPlugins["${pluginId}"] = true`);
|
|
134
195
|
}
|
|
135
196
|
settings.enabledPlugins = enabled;
|
|
136
197
|
return changes;
|
|
137
198
|
}
|
|
138
199
|
export function runTeamInit(opts) {
|
|
200
|
+
const guard = opts.guard === true;
|
|
139
201
|
const { dir, file, policyDir, policyFile } = guardPaths(opts.cwd, opts.env ?? process.env);
|
|
140
202
|
const before = existsSync(file) ? readFileSync(file, "utf8") : undefined;
|
|
141
203
|
let settings = {};
|
|
@@ -149,19 +211,23 @@ export function runTeamInit(opts) {
|
|
|
149
211
|
}
|
|
150
212
|
if (!isObj(settings))
|
|
151
213
|
throw refuse(`${file} is not a JSON object; nothing was written`);
|
|
152
|
-
const settingsChanges = mergeTeamSettings(settings, opts.version);
|
|
214
|
+
const settingsChanges = mergeTeamSettings(settings, opts.version, guard);
|
|
153
215
|
const indent = before ? detectIndent(before) : 2;
|
|
154
216
|
// ponytail: re-serializes the whole file; a surgical text insert would keep a hand-made layout.
|
|
155
217
|
const reformatted = !!before?.trim() && `${JSON.stringify(JSON.parse(before), null, indent)}\n` !== before;
|
|
156
218
|
const content = `${JSON.stringify(settings, null, indent)}\n`;
|
|
157
219
|
// The policy file is created once and never rewritten: a team's rules belong to the team, not to kya.
|
|
158
|
-
const policyChanges = existsSync(policyFile) ? [] : [`+ ${POLICY_FILE} = empty policy (no rules yet; add tool ids to deny or requireApprove)`];
|
|
220
|
+
const policyChanges = guard || existsSync(policyFile) ? [] : [`+ ${POLICY_FILE} = empty policy (no rules yet; add tool ids to deny or requireApprove)`];
|
|
159
221
|
const changes = [...settingsChanges, ...policyChanges];
|
|
160
|
-
const
|
|
222
|
+
const diff = guard ? unifiedDiff(".claude/settings.json", before ?? "", content) : "";
|
|
223
|
+
const base = {
|
|
224
|
+
path: file, dryRun: opts.dryRun === true, changes, content, ref: releaseRef(opts.version), reformatted, guard, diff,
|
|
225
|
+
badge: guard ? GUARD_BADGE : "",
|
|
226
|
+
};
|
|
161
227
|
if (base.dryRun || changes.length === 0)
|
|
162
228
|
return { ...base, written: false };
|
|
163
229
|
if (!existsSync(dir) && settingsChanges.length > 0)
|
|
164
|
-
|
|
230
|
+
journalMkdir(dir); // journaled: `kya uninstall --project` removes it again
|
|
165
231
|
// Re-check right before the rename that .claude and settings.json are still not symlinks and still the
|
|
166
232
|
// project's. Residual: a same-user process can still swap them between this check and the rename (TOCTOU);
|
|
167
233
|
// a planted temp file or symlink cannot be followed, since atomicWriteSync creates its temp with O_EXCL.
|
|
@@ -174,12 +240,26 @@ export function runTeamInit(opts) {
|
|
|
174
240
|
atomicWriteSync(file, content, recheck);
|
|
175
241
|
if (policyChanges.length > 0) {
|
|
176
242
|
if (!existsSync(policyDir))
|
|
177
|
-
|
|
243
|
+
journalMkdir(policyDir);
|
|
178
244
|
atomicWriteSync(policyFile, POLICY_SCAFFOLD, recheck);
|
|
179
245
|
}
|
|
180
246
|
return { ...base, written: true };
|
|
181
247
|
}
|
|
248
|
+
function formatGuardHuman(r) {
|
|
249
|
+
const lines = [];
|
|
250
|
+
if (r.changes.length === 0)
|
|
251
|
+
lines.push(`${r.path} already enables ${GUARD_PLUGIN_ID} at ${r.ref}; nothing to do.`);
|
|
252
|
+
else
|
|
253
|
+
lines.push(`${r.dryRun ? "Would write" : "Wrote"} ${r.path}:`, ...r.changes.map((c) => ` ${c}`), "", "Diff:", r.diff);
|
|
254
|
+
if (r.changes.length > 0 && r.reformatted) {
|
|
255
|
+
lines.push("Note: the existing file's layout is normalized to standard JSON (keys and values unchanged).");
|
|
256
|
+
}
|
|
257
|
+
lines.push("", "README badge (paste it near the top of your README):", r.badge, "", "Next: commit .claude/settings.json. Teammates see Claude Code's folder trust prompt once;", `after they accept it, the ${MARKETPLACE} marketplace is added and ${GUARD_PLUGIN_ID} installs at the next session.`, `Pinned to tag ${r.ref} of ${PUBLIC_REPO}. Rerun kya team init --guard after upgrading kya to move the pin.`, `Verify the tag exists and ships the plugin (git ls-remote https://github.com/${PUBLIC_REPO} refs/tags/${r.ref}; the folder plugins/kya-guard must be in it);`, "if it is not, teammates will see the plugin skipped, not an error.", "The guard needs Node.js 22 or later on PATH. It checks every tool call locally, makes no network call, and fails open.", "Remove: kya uninstall --project (reverses this write), or delete the two keys by hand.");
|
|
258
|
+
return lines.join("\n");
|
|
259
|
+
}
|
|
182
260
|
export function formatTeamInitHuman(r) {
|
|
261
|
+
if (r.guard)
|
|
262
|
+
return formatGuardHuman(r);
|
|
183
263
|
const lines = [];
|
|
184
264
|
if (r.changes.length === 0)
|
|
185
265
|
lines.push(`${r.path} already enables ${PLUGIN_ID} at ${r.ref}; nothing to do.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team.js","sourceRoot":"","sources":["../../src/commands/team.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"team.js","sourceRoot":"","sources":["../../src/commands/team.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface UninstallLine {
|
|
2
|
+
readonly path: string;
|
|
3
|
+
readonly what: string;
|
|
4
|
+
}
|
|
5
|
+
export interface UninstallResult {
|
|
6
|
+
readonly dryRun: boolean;
|
|
7
|
+
readonly restored: readonly UninstallLine[];
|
|
8
|
+
readonly keysRemoved: readonly UninstallLine[];
|
|
9
|
+
readonly deleted: readonly UninstallLine[];
|
|
10
|
+
readonly leftAlone: readonly UninstallLine[];
|
|
11
|
+
readonly nothingToUndo: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function runUninstall(opts: {
|
|
14
|
+
env: NodeJS.ProcessEnv;
|
|
15
|
+
cwd: string;
|
|
16
|
+
project: boolean;
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
}): UninstallResult;
|
|
19
|
+
export declare function formatUninstallHuman(r: UninstallResult, cwd: string): string;
|
|
20
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAwLD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,eAAe,CAsI/H;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CA0B5E"}
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kya uninstall - undo what `kya start` / `kya connect` wrote, from
|
|
3
|
+
* ~/.kya/manifest.json. Removes only the keys KYA added, deletes files KYA
|
|
4
|
+
* created when they are unchanged, restores merged files byte for byte when
|
|
5
|
+
* nothing touched them since, and lists what it left alone.
|
|
6
|
+
*
|
|
7
|
+
* The manifest drives deletes and writes, so it is not trusted blindly: it must
|
|
8
|
+
* be a 0600 file owned by the user with a valid shape; every entry must name a
|
|
9
|
+
* known KYA target path; backups must live under ~/.kya/undo/; project files go
|
|
10
|
+
* through the project path guard; a symlink or hard link is refused.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, realpathSync, rmdirSync, rmSync } from "node:fs";
|
|
13
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
14
|
+
import { atomicWriteSync, projectWritePath, writeProjectFile } from "../fs-atomic.js";
|
|
15
|
+
import { readManifestStrict, resolvedOf, sha256, tomlHeaders, writeManifest, manifestPath, withManifestLock, } from "../manifest.js";
|
|
16
|
+
import { globalConfigDir } from "../config.js";
|
|
17
|
+
import { CONNECT_REGISTRY } from "./connect.js";
|
|
18
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
19
|
+
const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
20
|
+
function getAt(doc, path) {
|
|
21
|
+
let cur = doc;
|
|
22
|
+
for (const k of path) {
|
|
23
|
+
if (!isObj(cur) || !(k in cur))
|
|
24
|
+
return undefined;
|
|
25
|
+
cur = cur[k];
|
|
26
|
+
}
|
|
27
|
+
return cur;
|
|
28
|
+
}
|
|
29
|
+
function setAt(doc, path, value) {
|
|
30
|
+
let cur = doc;
|
|
31
|
+
for (const k of path.slice(0, -1)) {
|
|
32
|
+
if (!isObj(cur[k]))
|
|
33
|
+
cur[k] = {};
|
|
34
|
+
cur = cur[k];
|
|
35
|
+
}
|
|
36
|
+
cur[path[path.length - 1]] = value;
|
|
37
|
+
}
|
|
38
|
+
function deleteAt(doc, path) {
|
|
39
|
+
if (path.length === 0)
|
|
40
|
+
return;
|
|
41
|
+
const parent = getAt(doc, path.slice(0, -1));
|
|
42
|
+
if (isObj(parent))
|
|
43
|
+
delete parent[path[path.length - 1]];
|
|
44
|
+
}
|
|
45
|
+
/** Drop containers that became empty and that the original file did not have. */
|
|
46
|
+
function prune(doc, orig, path) {
|
|
47
|
+
for (let n = path.length; n > 0; n--) {
|
|
48
|
+
const p = path.slice(0, n);
|
|
49
|
+
const v = getAt(doc, p);
|
|
50
|
+
const empty = Array.isArray(v) ? v.length === 0 : isObj(v) && Object.keys(v).length === 0;
|
|
51
|
+
if (!empty || getAt(orig, p) !== undefined)
|
|
52
|
+
return;
|
|
53
|
+
deleteAt(doc, p);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function surgicalJson(text, entry, orig) {
|
|
57
|
+
const doc = JSON.parse(text);
|
|
58
|
+
if (!isObj(doc))
|
|
59
|
+
throw new Error("not an object");
|
|
60
|
+
const unrestored = [];
|
|
61
|
+
for (const a of entry.added) {
|
|
62
|
+
if (a.kind === "key") {
|
|
63
|
+
const was = getAt(orig, a.path);
|
|
64
|
+
if (was !== undefined)
|
|
65
|
+
setAt(doc, a.path, was);
|
|
66
|
+
else
|
|
67
|
+
deleteAt(doc, a.path);
|
|
68
|
+
prune(doc, orig, a.path.slice(0, -1));
|
|
69
|
+
}
|
|
70
|
+
else if (a.kind === "item") {
|
|
71
|
+
const arr = getAt(doc, a.path);
|
|
72
|
+
if (Array.isArray(arr)) {
|
|
73
|
+
const keep = arr.filter((i) => !same(i, a.value));
|
|
74
|
+
if (keep.length !== arr.length)
|
|
75
|
+
setAt(doc, a.path, keep);
|
|
76
|
+
}
|
|
77
|
+
prune(doc, orig, a.path);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
for (const p of entry.removed) {
|
|
81
|
+
const was = getAt(orig, p);
|
|
82
|
+
if (getAt(doc, p) !== undefined)
|
|
83
|
+
continue;
|
|
84
|
+
if (was !== undefined)
|
|
85
|
+
setAt(doc, p, was);
|
|
86
|
+
else
|
|
87
|
+
unrestored.push(p.join("."));
|
|
88
|
+
}
|
|
89
|
+
return { text: `${JSON.stringify(doc, null, 2)}\n`, unrestored };
|
|
90
|
+
}
|
|
91
|
+
function surgicalToml(text, entry, orig) {
|
|
92
|
+
let out = text;
|
|
93
|
+
for (const a of entry.added) {
|
|
94
|
+
const blocks = tomlHeaders(out).filter((h) => a.kind === "toml-table" ? !h.array && h.name === a.name : a.kind === "toml-hook" ? h.array && h.body.includes(a.identity) : false);
|
|
95
|
+
for (const b of blocks.reverse())
|
|
96
|
+
out = out.slice(0, b.start) + out.slice(b.end);
|
|
97
|
+
}
|
|
98
|
+
const unrestored = [];
|
|
99
|
+
const origBlocks = orig === undefined ? [] : tomlHeaders(orig).filter((h) => !h.array);
|
|
100
|
+
for (const name of entry.removedToml ?? []) {
|
|
101
|
+
if (tomlHeaders(out).some((h) => !h.array && h.name === name))
|
|
102
|
+
continue;
|
|
103
|
+
const block = origBlocks.find((h) => h.name === name);
|
|
104
|
+
if (!block) {
|
|
105
|
+
unrestored.push(`[${name}]`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const body = block.body.endsWith("\n") ? block.body : `${block.body}\n`;
|
|
109
|
+
out = `${out}${out.length === 0 || out.endsWith("\n") ? "" : "\n"}${out.length === 0 ? "" : "\n"}${body}`;
|
|
110
|
+
}
|
|
111
|
+
return { text: out, unrestored };
|
|
112
|
+
}
|
|
113
|
+
function surgicalLines(text, adds) {
|
|
114
|
+
const lines = text.split("\n");
|
|
115
|
+
for (const a of adds) {
|
|
116
|
+
if (a.kind !== "line")
|
|
117
|
+
continue;
|
|
118
|
+
const i = lines.lastIndexOf(a.text);
|
|
119
|
+
if (i !== -1)
|
|
120
|
+
lines.splice(i, 1);
|
|
121
|
+
}
|
|
122
|
+
return { text: lines.join("\n"), unrestored: [] };
|
|
123
|
+
}
|
|
124
|
+
function within(path, dir) {
|
|
125
|
+
const r = relative(resolve(dir), resolve(path));
|
|
126
|
+
return r === "" || (r !== ".." && !r.startsWith(`..${sep}`) && !isAbsolute(r));
|
|
127
|
+
}
|
|
128
|
+
function canon(p) {
|
|
129
|
+
try {
|
|
130
|
+
return realpathSync(p);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return resolvedOf(p);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** The only files undo may touch: what start and connect write. */
|
|
137
|
+
function targetSet(home, project) {
|
|
138
|
+
const out = new Set();
|
|
139
|
+
const add = (p) => {
|
|
140
|
+
if (p)
|
|
141
|
+
out.add(canon(p));
|
|
142
|
+
};
|
|
143
|
+
for (const spec of Object.values(CONNECT_REGISTRY)) {
|
|
144
|
+
add(spec.globalPath?.(home));
|
|
145
|
+
if (project)
|
|
146
|
+
add(spec.projectPath?.(project));
|
|
147
|
+
}
|
|
148
|
+
add(join(home, ".claude", "settings.json"));
|
|
149
|
+
add(join(home, ".grok", "hooks", "shield-kya.json"));
|
|
150
|
+
add(join(home, ".kimi-code", "config.toml"));
|
|
151
|
+
add(join(home, ".kya", "bin", "kya-hook"));
|
|
152
|
+
add(join(home, ".kya", "gateways.json"));
|
|
153
|
+
if (project) {
|
|
154
|
+
add(join(project, ".claude", "settings.json"));
|
|
155
|
+
add(join(project, ".gitignore"));
|
|
156
|
+
add(join(project, ".kya", "config.json"));
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
function allowed(e, c) {
|
|
161
|
+
const set = targetSet(c.home, e.project);
|
|
162
|
+
return set.has(canon(e.path)) || set.has(e.path);
|
|
163
|
+
}
|
|
164
|
+
/** A reason to refuse this entry, or undefined when it is safe to touch. */
|
|
165
|
+
function refusal(e, c) {
|
|
166
|
+
if (!allowed(e, c))
|
|
167
|
+
return "not a file kya start or kya connect writes (manifest entry refused)";
|
|
168
|
+
if (e.backup !== undefined && existsSync(e.backup)) {
|
|
169
|
+
if (lstatSync(e.backup).isSymbolicLink())
|
|
170
|
+
return "its backup is a symlink (refused)";
|
|
171
|
+
if (!within(realpathSync(e.backup), canon(c.undoDir)))
|
|
172
|
+
return "its backup is outside ~/.kya/undo (manifest entry refused)";
|
|
173
|
+
}
|
|
174
|
+
else if (e.backup !== undefined && !within(resolve(e.backup), c.undoDir)) {
|
|
175
|
+
return "its backup path is outside ~/.kya/undo (manifest entry refused)";
|
|
176
|
+
}
|
|
177
|
+
if (!existsSync(e.path))
|
|
178
|
+
return undefined;
|
|
179
|
+
if (e.resolved !== undefined && resolvedOf(e.path) !== e.resolved)
|
|
180
|
+
return "its path no longer resolves to where KYA wrote it (a parent directory was replaced by a link)";
|
|
181
|
+
const st = lstatSync(e.path);
|
|
182
|
+
if (st.isSymbolicLink())
|
|
183
|
+
return "it is now a symlink (refused, not followed)";
|
|
184
|
+
if (!st.isFile())
|
|
185
|
+
return "it is not a regular file";
|
|
186
|
+
if (st.nlink > 1)
|
|
187
|
+
return `it has other hard links (${st.nlink}); refused`;
|
|
188
|
+
if (e.project !== undefined && within(e.path, e.project)) {
|
|
189
|
+
try {
|
|
190
|
+
projectWritePath(e.path, e.project);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
return err instanceof Error ? err.message : "project path refused";
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
function errMsg(err) {
|
|
199
|
+
return err instanceof Error ? err.message : String(err);
|
|
200
|
+
}
|
|
201
|
+
export function runUninstall(opts) {
|
|
202
|
+
const dryRun = opts.dryRun === true;
|
|
203
|
+
const globalDir = globalConfigDir(opts.env);
|
|
204
|
+
const manifest = readManifestStrict(globalDir);
|
|
205
|
+
const result = (p) => ({
|
|
206
|
+
dryRun,
|
|
207
|
+
restored: [],
|
|
208
|
+
keysRemoved: [],
|
|
209
|
+
deleted: [],
|
|
210
|
+
leftAlone: [],
|
|
211
|
+
...p,
|
|
212
|
+
});
|
|
213
|
+
if (!manifest)
|
|
214
|
+
return result({ nothingToUndo: true });
|
|
215
|
+
const ctx = { home: dirname(globalDir), globalDir, undoDir: join(globalDir, "undo") };
|
|
216
|
+
const inScope = (e) => !opts.project || within(e.path, opts.cwd);
|
|
217
|
+
const todo = manifest.entries.filter(inScope);
|
|
218
|
+
const restored = [];
|
|
219
|
+
const keysRemoved = [];
|
|
220
|
+
const deleted = [];
|
|
221
|
+
const leftAlone = [];
|
|
222
|
+
const doneBackups = [];
|
|
223
|
+
/** Entries that stay in the manifest: refused or failed, so a re-run can finish them. */
|
|
224
|
+
const kept = new Set();
|
|
225
|
+
const put = (e, content) => {
|
|
226
|
+
if (dryRun)
|
|
227
|
+
return;
|
|
228
|
+
if (e.project !== undefined && within(e.path, e.project))
|
|
229
|
+
writeProjectFile(e.path, content.toString(), e.project);
|
|
230
|
+
else
|
|
231
|
+
atomicWriteSync(e.path, content);
|
|
232
|
+
};
|
|
233
|
+
for (const e of todo) {
|
|
234
|
+
const bk = e.backup ? ` (backup: ${e.backup})` : "";
|
|
235
|
+
if (!existsSync(e.path)) {
|
|
236
|
+
if (!allowed(e, ctx)) {
|
|
237
|
+
kept.add(e.path);
|
|
238
|
+
leftAlone.push({ path: e.path, what: `not a file kya start or kya connect writes (manifest entry refused)${bk}` });
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
leftAlone.push({ path: e.path, what: `already gone${bk}` });
|
|
242
|
+
if (e.backup)
|
|
243
|
+
doneBackups.push(e.backup);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
const why = refusal(e, ctx);
|
|
247
|
+
if (why !== undefined) {
|
|
248
|
+
kept.add(e.path);
|
|
249
|
+
leftAlone.push({ path: e.path, what: `${why}; left in place${bk}` });
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
const bytes = readFileSync(e.path);
|
|
254
|
+
const unchanged = sha256(bytes) === e.sha256 && !e.stale;
|
|
255
|
+
if (e.action === "created") {
|
|
256
|
+
if (!unchanged) {
|
|
257
|
+
leftAlone.push({ path: e.path, what: `KYA created it, but it changed since (or before a later KYA write); left in place (delete it by hand if you want it gone)${bk}` });
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (!dryRun)
|
|
261
|
+
rmSync(e.path, { force: true });
|
|
262
|
+
deleted.push({ path: e.path, what: "created by KYA, unchanged" });
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
const backupBytes = e.backup && existsSync(e.backup) ? readFileSync(e.backup) : undefined;
|
|
266
|
+
if (backupBytes && sha256(backupBytes) === sha256(bytes)) {
|
|
267
|
+
restored.push({ path: e.path, what: "already in its original state" });
|
|
268
|
+
doneBackups.push(e.backup);
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
if (unchanged && backupBytes) {
|
|
272
|
+
put(e, backupBytes);
|
|
273
|
+
restored.push({ path: e.path, what: "restored byte for byte from the backup" });
|
|
274
|
+
doneBackups.push(e.backup);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
const text = bytes.toString("utf8");
|
|
278
|
+
const origText = backupBytes?.toString("utf8");
|
|
279
|
+
let s;
|
|
280
|
+
if (e.path.endsWith(".json"))
|
|
281
|
+
s = surgicalJson(text, e, origText !== undefined ? JSON.parse(origText) : undefined);
|
|
282
|
+
else if (e.path.endsWith(".toml"))
|
|
283
|
+
s = surgicalToml(text, e, origText);
|
|
284
|
+
else
|
|
285
|
+
s = surgicalLines(text, e.added);
|
|
286
|
+
put(e, s.text);
|
|
287
|
+
keysRemoved.push({ path: e.path, what: `changed since KYA wrote it, so only KYA's entries were removed: ${e.keys.join(", ")}` });
|
|
288
|
+
if (s.unrestored.length > 0) {
|
|
289
|
+
// The backup is the only copy of what the gateway moved: keep it and the entry.
|
|
290
|
+
kept.add(e.path);
|
|
291
|
+
leftAlone.push({ path: e.path, what: `could not put back ${s.unrestored.join(", ")} (not found in the backup); backup kept${bk}` });
|
|
292
|
+
}
|
|
293
|
+
else if (e.backup)
|
|
294
|
+
doneBackups.push(e.backup);
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
kept.add(e.path);
|
|
298
|
+
leftAlone.push({ path: e.path, what: `could not undo it (${errMsg(err)}); left in place, run kya uninstall again after fixing${bk}` });
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (!dryRun) {
|
|
302
|
+
for (const b of doneBackups) {
|
|
303
|
+
if (!todo.some((e) => kept.has(e.path) && e.backup === b))
|
|
304
|
+
rmSync(b, { force: true });
|
|
305
|
+
}
|
|
306
|
+
withManifestLock(globalDir, () => {
|
|
307
|
+
const handled = new Set(todo.filter((e) => !kept.has(e.path)).map((e) => e.path));
|
|
308
|
+
const rest = manifest.entries.filter((e) => !handled.has(e.path));
|
|
309
|
+
const roots = [ctx.home, ...rest.map((e) => e.project).filter((p) => p !== undefined), opts.cwd];
|
|
310
|
+
const dirs = [...manifest.dirs].sort((a, b) => b.length - a.length);
|
|
311
|
+
const keepDirs = [];
|
|
312
|
+
for (const d of dirs) {
|
|
313
|
+
const safe = isAbsolute(d) && roots.some((r) => within(d, r) && resolve(d) !== resolve(r));
|
|
314
|
+
if (!safe || (opts.project && !within(d, opts.cwd))) {
|
|
315
|
+
keepDirs.push(d);
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
try {
|
|
319
|
+
if (existsSync(d) && !lstatSync(d).isSymbolicLink() && readdirSync(d).length === 0)
|
|
320
|
+
rmdirSync(d);
|
|
321
|
+
else if (existsSync(d))
|
|
322
|
+
keepDirs.push(d);
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
keepDirs.push(d);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (rest.length === 0) {
|
|
329
|
+
rmSync(manifestPath(globalDir), { force: true });
|
|
330
|
+
try {
|
|
331
|
+
if (existsSync(ctx.undoDir) && readdirSync(ctx.undoDir).length === 0)
|
|
332
|
+
rmdirSync(ctx.undoDir);
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
/* not empty: leave it */
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
writeManifest(globalDir, { version: 1, entries: rest, dirs: keepDirs });
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
// The lock file is gone by now; remove the global dir only when nothing else lives there.
|
|
343
|
+
try {
|
|
344
|
+
if (existsSync(globalDir) && readdirSync(globalDir).length === 0)
|
|
345
|
+
rmdirSync(globalDir);
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
/* the global dir holds other KYA data: leave it */
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return { dryRun, restored, keysRemoved, deleted, leftAlone, nothingToUndo: todo.length === 0 };
|
|
352
|
+
}
|
|
353
|
+
export function formatUninstallHuman(r, cwd) {
|
|
354
|
+
if (r.nothingToUndo) {
|
|
355
|
+
return [
|
|
356
|
+
"Nothing to undo: ~/.kya/manifest.json lists no files for this scope.",
|
|
357
|
+
"Hooks and MCP entries written by an older kya (before the manifest) are not listed; remove the shield-kya entries by hand.",
|
|
358
|
+
].join("\n");
|
|
359
|
+
}
|
|
360
|
+
const verb = r.dryRun ? "Would" : "Did";
|
|
361
|
+
const lines = [`KYA uninstall${r.dryRun ? " (dry run: nothing changed)" : ""}`];
|
|
362
|
+
const show = (head, list) => {
|
|
363
|
+
if (list.length === 0)
|
|
364
|
+
return;
|
|
365
|
+
lines.push(`${head}:`);
|
|
366
|
+
for (const l of list) {
|
|
367
|
+
const rel = relative(cwd, l.path);
|
|
368
|
+
lines.push(` ${rel.startsWith("..") || rel === "" ? l.path : rel}: ${l.what}`);
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
show(`${verb} restore`, r.restored);
|
|
372
|
+
show(`${verb} remove KYA's entries from`, r.keysRemoved);
|
|
373
|
+
show(`${verb} delete`, r.deleted);
|
|
374
|
+
show("Left alone", r.leftAlone);
|
|
375
|
+
lines.push("Not touched: .kya/ (your activity trail and report files) and ~/.kya/ state. Delete them by hand if you want them gone.", "The background report server keeps running until you run: kya stop");
|
|
376
|
+
return lines.join("\n");
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=uninstall.js.map
|