carrick 0.3.66 → 0.3.68

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.
@@ -26,6 +26,14 @@
26
26
  // A spinner writes and rewrites one line, so anything else printing while it
27
27
  // spins corrupts it: `step()` owns the terminal for the duration of the work
28
28
  // it wraps, and the hosted read is quiet underneath it (see `hosted.ts`).
29
+ //
30
+ // A step also OWNS the line its work is reported on. `spinner.stop(text)` in
31
+ // 1.8.1 takes no status code, so a step that stopped with its own label and
32
+ // left the caller to print the outcome spent two lines on the one thing, and a
33
+ // step that stopped with the outcome printed a warning under a done marker.
34
+ // The spinner's three finishers carry the three markers exactly — `stop` is
35
+ // `◇`, `error` is `▲`, `cancel` is `■` — so the work's report goes to `step`
36
+ // and the spinner stops as whatever the work turned out to be (carrick#1032).
29
37
  import readline from "node:readline/promises";
30
38
  import * as clack from "@clack/prompts";
31
39
  import pc from "picocolors";
@@ -39,6 +47,7 @@ export function plainOutput(write = (text) => process.stdout.write(text)) {
39
47
  for (const entry of text.split("\n"))
40
48
  write(`${marker} ${entry}\n`);
41
49
  };
50
+ const marker = (kind) => kind === "done" ? DONE : kind === "warn" ? WARN : REFUSE;
42
51
  return {
43
52
  done: (text) => line(DONE, text),
44
53
  warn: (text) => line(WARN, text),
@@ -51,7 +60,15 @@ export function plainOutput(write = (text) => process.stdout.write(text)) {
51
60
  write(` ${entry}\n`);
52
61
  write("\n");
53
62
  },
54
- step: async (_label, work) => await work(),
63
+ // No spinner here, so the label was never printed: the step is exactly the
64
+ // one line its work reports, which is what the plain rendering already
65
+ // spent on it.
66
+ step: async (_label, work, report) => {
67
+ const value = await work();
68
+ const outcome = report(value);
69
+ line(marker(outcome.kind), outcome.text);
70
+ return value;
71
+ },
55
72
  // No colour, ever. picocolors turns itself ON when `CI` is set, which is
56
73
  // exactly the run whose output is captured as text, so the decision is made
57
74
  // here from the terminal rather than by the library from the environment.
@@ -81,35 +98,57 @@ export function plainOutput(write = (text) => process.stdout.write(text)) {
81
98
  quiet: false,
82
99
  };
83
100
  }
84
- /** clack's rendering, for a terminal. */
85
- export function interactiveOutput() {
101
+ /**
102
+ * clack's rendering, for a terminal.
103
+ *
104
+ * `output` is where the rendering goes. It is threaded into every clack call
105
+ * rather than left to the library's default because that is the only way this
106
+ * rendering can be read back: a terminal's own bytes are not capturable, and
107
+ * the plain one — which every executable test spawns — is a different renderer
108
+ * with different lines. A test that hands this a stream is the only thing that
109
+ * sees the interactive markers at all (carrick#1032).
110
+ */
111
+ export function interactiveOutput(output = process.stdout) {
86
112
  return {
87
- done: (text) => clack.log.step(text),
88
- warn: (text) => clack.log.warn(text),
89
- refuse: (text) => clack.log.error(text),
90
- say: (text) => clack.log.message(text),
91
- note: (title, body) => clack.note(body.join("\n"), title),
92
- step: async (label, work) => {
93
- const spinner = clack.spinner();
113
+ done: (text) => clack.log.step(text, { output }),
114
+ warn: (text) => clack.log.warn(text, { output }),
115
+ refuse: (text) => clack.log.error(text, { output }),
116
+ say: (text) => clack.log.message(text, { output }),
117
+ note: (title, body) => clack.note(body.join("\n"), title, { output }),
118
+ // The spinner's finishers ARE the markers: `stop` prints `◇`, `error`
119
+ // prints `▲` and `cancel` prints `■`, so the step ends on one line with
120
+ // the marker its work earned. Stopping with the label instead cost the
121
+ // hosted read two lines, and stopping with the outcome text alone put
122
+ // warnings and refusals under a done marker (carrick#1032).
123
+ step: async (label, work, report) => {
124
+ const spinner = clack.spinner({ output });
94
125
  spinner.start(label);
126
+ let value;
95
127
  try {
96
- const value = await work();
97
- spinner.stop(label);
98
- return value;
128
+ value = await work();
99
129
  }
100
130
  catch (error) {
101
- spinner.stop(label);
131
+ // The step did not finish, so it is a refusal: the caller prints why.
132
+ spinner.cancel(label);
102
133
  throw error;
103
134
  }
135
+ const outcome = report(value);
136
+ if (outcome.kind === "done")
137
+ spinner.stop(outcome.text);
138
+ else if (outcome.kind === "warn")
139
+ spinner.error(outcome.text);
140
+ else
141
+ spinner.cancel(outcome.text);
142
+ return value;
104
143
  },
105
144
  // A cancelled prompt is a no: `init` returns 0 and writes nothing, which
106
145
  // is what answering "n" has always done.
107
146
  confirm: async (question) => {
108
- const answer = await clack.confirm({ message: question, initialValue: true });
147
+ const answer = await clack.confirm({ message: question, initialValue: true, output });
109
148
  return clack.isCancel(answer) ? false : answer;
110
149
  },
111
150
  ask: async (question) => {
112
- const answer = await clack.text({ message: question });
151
+ const answer = await clack.text({ message: question, output });
113
152
  return clack.isCancel(answer) ? "" : answer.trim();
114
153
  },
115
154
  accent: (text) => pc.dim(text),
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/init/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/init/output.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,sEAAsE;AACtE,4DAA4D;AAC5D,4EAA4E;AAC5E,8EAA8E;AAC9E,mDAAmD;AACnD,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,mCAAmC;AACnC,0EAA0E;AAC1E,iDAAiD;AACjD,EAAE;AACF,+EAA+E;AAC/E,yEAAyE;AACzE,EAAE;AACF,2DAA2D;AAC3D,EAAE;AACF,+EAA+E;AAC/E,oEAAoE;AACpE,6EAA6E;AAC7E,6EAA6E;AAC7E,wEAAwE;AACxE,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,0EAA0E;AAC1E,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAE9E,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAE9C,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;AACxB,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;AACxB,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;AAE1B,MAAM,CAAC,MAAM,IAAI,GAAG,uCAAuC,CAAC;AAyC5D,oEAAoE;AACpE,MAAM,UAAU,WAAW,CAAC,QAAgC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IAC9F,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,IAAY,EAAQ,EAAE;QAClD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,IAAwB,EAAU,EAAE,CAClD,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3D,OAAO;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QAChC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QAChC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QACpC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;QACjC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACpB,KAAK,CAAC,IAAI,CAAC,CAAC;YACZ,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,IAAI;gBAAE,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QACD,2EAA2E;QAC3E,uEAAuE;QACvE,eAAe;QACf,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,yEAAyE;QACzE,4EAA4E;QAC5E,0EAA0E;QAC1E,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;QACtB,qEAAqE;QACrE,2EAA2E;QAC3E,0CAA0C;QAC1C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAC;gBACvD,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YACtB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,IAAI,CAAC;gBACH,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QACD,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAmB,OAAO,CAAC,MAAM;IACjE,OAAO;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;QAChD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;QAChD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;QACnD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;QAClD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC;QACrE,sEAAsE;QACtE,wEAAwE;QACxE,uEAAuE;QACvE,sEAAsE;QACtE,4DAA4D;QAC5D,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;YAClC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,IAAI,KAAuC,CAAC;YAC5C,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,sEAAsE;gBACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBACnD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;gBACzD,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,yEAAyE;QACzE,yCAAyC;QACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACtF,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACjD,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAe,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC;IAEjF,OAAO,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type McpRemoval } from "./mcp.ts";
2
+ import { type InitOutput } from "./output.ts";
3
+ export type RemoveOptions = {
4
+ workspace: string;
5
+ /** Leave the saved credential in place: this machine stays signed in. */
6
+ keepLogin: boolean;
7
+ };
8
+ export declare function parseArgs(argv: string[], cwd?: string): RemoveOptions | string;
9
+ /** The settings files a workspace can hold our hook entries in. */
10
+ export declare const SETTINGS_FILES: string[];
11
+ /**
12
+ * The files the scaffold pull request adds to a repository.
13
+ *
14
+ * The list is the scaffold tool's own (`carrick-cloud`
15
+ * `lambdas/mcp-server/src/tools/scaffold.ts`): the workflow, the agent skill,
16
+ * the three hook-pack scripts and the config. Only the ones that exist are
17
+ * printed, so the `git rm` line is one a reader can paste.
18
+ */
19
+ export declare const SCAFFOLD_FILES: string[];
20
+ export type RepoLeftovers = {
21
+ /** Whole files, relative to the workspace, for one `git rm`. */
22
+ files: string[];
23
+ /** What has to be edited by hand, one line each. */
24
+ sections: string[];
25
+ };
26
+ /**
27
+ * Everything the scaffold left in the repositories under this workspace.
28
+ *
29
+ * The repositories are `repoRoots`', which `carrick doctor` reads too. Nothing
30
+ * here is opened unless it exists, and nothing here is changed.
31
+ */
32
+ export declare function repoLeftovers(workspace: string): RepoLeftovers;
33
+ /** One `◇` line per client this run changed, and a warning for what it could not. */
34
+ export declare function mcpRemovalLines(removals: McpRemoval[]): {
35
+ done: string[];
36
+ warn: string[];
37
+ };
38
+ export declare function remove(argv: string[], out?: InitOutput): Promise<number>;
@@ -0,0 +1,248 @@
1
+ // Undoing `carrick init`, on this machine.
2
+ //
3
+ // An install that can state its own undo is the courtesy that makes people
4
+ // willing to try it (carrick#1034), and init now writes in six places: the
5
+ // hook entries in a workspace's `.claude` settings, an MCP server entry in
6
+ // each agent client's own configuration, the `.carrick` directory, and the
7
+ // credential in the user's configuration directory.
8
+ //
9
+ // Every step here is the inverse of a writer in this folder, and each pair
10
+ // lives in one file so the two cannot drift: `mergeCarrickHooks` /
11
+ // `removeCarrickHooks` in `settings.ts`, `mergeServerEntry` /
12
+ // `removeServerEntry` and `connectMcpClients` / `disconnectMcpClients` in
13
+ // `mcp.ts`, `writeProposal` / the `.carrick` removal below, `saveCredential` /
14
+ // `removeCredential` in `../auth/credentials.ts`.
15
+ //
16
+ // What it does NOT do is edit a tracked file. The scaffold pull request put
17
+ // files in the repository and a repository is version controlled: those are
18
+ // listed with the `git rm` line that removes them, and the sections that were
19
+ // merged into files someone else owns are named for a human to delete. A
20
+ // command that rewrote a committed workflow or an AGENTS.md would be
21
+ // destroying work this command cannot read.
22
+ //
23
+ // It runs no scan and never asks for the scanner binary: everything it touches
24
+ // is a file this package wrote.
25
+ import fs from "node:fs";
26
+ import path from "node:path";
27
+ import { removeCredential, credentialPath } from "../auth/credentials.js";
28
+ import { disconnectMcpClients } from "./mcp.js";
29
+ import { repoRoots } from "./repos.js";
30
+ import { removeCarrickHooks } from "./settings.js";
31
+ import { createOutput, DOCS } from "./output.js";
32
+ export function parseArgs(argv, cwd = process.cwd()) {
33
+ const options = { workspace: cwd, keepLogin: false };
34
+ for (let index = 0; index < argv.length; index += 1) {
35
+ const argument = argv[index];
36
+ switch (argument) {
37
+ case "--keep-login":
38
+ options.keepLogin = true;
39
+ break;
40
+ case "--workspace":
41
+ case "-w": {
42
+ const value = argv[index + 1];
43
+ if (!value)
44
+ return "--workspace needs a directory";
45
+ options.workspace = path.resolve(cwd, value);
46
+ index += 1;
47
+ break;
48
+ }
49
+ case "--help":
50
+ case "-h":
51
+ return help();
52
+ default:
53
+ if (argument?.startsWith("-"))
54
+ return `unknown option for \`carrick remove\`: ${argument}`;
55
+ options.workspace = path.resolve(cwd, argument ?? ".");
56
+ }
57
+ }
58
+ return options;
59
+ }
60
+ function help() {
61
+ return [
62
+ "carrick remove [DIRECTORY] [--keep-login]",
63
+ "",
64
+ "Undo what carrick init wrote on this machine: the Carrick hook entries in",
65
+ "this folder's .claude settings, the carrick MCP server in each agent",
66
+ "client's configuration, the .carrick directory, and the saved credential.",
67
+ "Other hooks, other MCP servers and the settings files themselves are left",
68
+ "as they are. Files the scaffold added to the repository are listed with the",
69
+ "git rm line that removes them; this command never edits a tracked file.",
70
+ "",
71
+ " -w, --workspace DIR The folder init was run in (default: this one)",
72
+ " --keep-login Leave the saved credential; remove everything else",
73
+ "",
74
+ `What each of those things is, and what it does: ${DOCS}`,
75
+ ].join("\n");
76
+ }
77
+ /** The settings files a workspace can hold our hook entries in. */
78
+ export const SETTINGS_FILES = [
79
+ path.join(".claude", "settings.json"),
80
+ path.join(".claude", "settings.local.json"),
81
+ ];
82
+ /**
83
+ * The files the scaffold pull request adds to a repository.
84
+ *
85
+ * The list is the scaffold tool's own (`carrick-cloud`
86
+ * `lambdas/mcp-server/src/tools/scaffold.ts`): the workflow, the agent skill,
87
+ * the three hook-pack scripts and the config. Only the ones that exist are
88
+ * printed, so the `git rm` line is one a reader can paste.
89
+ */
90
+ export const SCAFFOLD_FILES = [
91
+ path.join(".github", "workflows", "carrick.yml"),
92
+ path.join(".claude", "skills", "carrick", "SKILL.md"),
93
+ path.join(".claude", "session-start.sh"),
94
+ path.join(".claude", "turn-reminder.sh"),
95
+ path.join(".claude", "search-gate.sh"),
96
+ "carrick.json",
97
+ ];
98
+ /** The files the scaffold merged INTO, which only their owner can unpick. */
99
+ const SECTION_CARRIERS = [
100
+ { file: "AGENTS.md", holds: (body) => /^##\s+Carrick\s*$/m.test(body), what: 'the "## Carrick" section' },
101
+ { file: "CLAUDE.md", holds: (body) => /^##\s+Carrick\s*$/m.test(body), what: 'the "## Carrick" section' },
102
+ {
103
+ file: path.join(".claude", "settings.json"),
104
+ holds: (body) => body.includes("$CLAUDE_PROJECT_DIR/.claude/"),
105
+ what: "the hook-pack entries the scaffold merged in",
106
+ },
107
+ { file: ".gitignore", holds: (body) => body.includes("!.claude/"), what: "the .claude negations" },
108
+ ];
109
+ /**
110
+ * Everything the scaffold left in the repositories under this workspace.
111
+ *
112
+ * The repositories are `repoRoots`', which `carrick doctor` reads too. Nothing
113
+ * here is opened unless it exists, and nothing here is changed.
114
+ */
115
+ export function repoLeftovers(workspace) {
116
+ const roots = repoRoots(workspace);
117
+ const files = [];
118
+ const sections = [];
119
+ for (const root of roots) {
120
+ for (const relative of SCAFFOLD_FILES) {
121
+ const target = path.join(root, relative);
122
+ if (fs.existsSync(target))
123
+ files.push(path.relative(workspace, target) || relative);
124
+ }
125
+ for (const carrier of SECTION_CARRIERS) {
126
+ const target = path.join(root, carrier.file);
127
+ let body;
128
+ try {
129
+ body = fs.readFileSync(target, "utf8");
130
+ }
131
+ catch {
132
+ continue;
133
+ }
134
+ if (!carrier.holds(body))
135
+ continue;
136
+ sections.push(`${path.relative(workspace, target) || carrier.file}: ${carrier.what}`);
137
+ }
138
+ }
139
+ return { files, sections };
140
+ }
141
+ /** One `◇` line per client this run changed, and a warning for what it could not. */
142
+ export function mcpRemovalLines(removals) {
143
+ const done = [];
144
+ const warn = [];
145
+ for (const removal of removals) {
146
+ if (removal.state === "removed") {
147
+ done.push(removal.client === "Claude Code"
148
+ ? `MCP server removed for ${removal.client}`
149
+ : `MCP server removed for ${removal.client}: ${removal.detail}`);
150
+ }
151
+ else if (removal.state === "kept") {
152
+ warn.push(`${removal.client}: ${removal.detail}`);
153
+ }
154
+ else if (removal.state === "failed") {
155
+ warn.push(`MCP server not removed for ${removal.client}: ${removal.detail}`);
156
+ }
157
+ }
158
+ return { done, warn };
159
+ }
160
+ /** Strip our hook entries from one settings file. Null when there was nothing. */
161
+ function removeHooks(file) {
162
+ if (!fs.existsSync(file))
163
+ return null;
164
+ const existing = fs.readFileSync(file, "utf8");
165
+ const cleaned = removeCarrickHooks(existing);
166
+ if (!cleaned.changed)
167
+ return null;
168
+ fs.writeFileSync(file, cleaned.body);
169
+ return file;
170
+ }
171
+ export async function remove(argv, out = createOutput()) {
172
+ const parsed = parseArgs(argv);
173
+ if (typeof parsed === "string") {
174
+ process.stdout.write(`${parsed}\n`);
175
+ return parsed.startsWith("carrick remove") ? 0 : 2;
176
+ }
177
+ const { workspace } = parsed;
178
+ if (!fs.existsSync(workspace)) {
179
+ process.stderr.write(`carrick remove: ${workspace} is not a directory on this machine\n`);
180
+ return 1;
181
+ }
182
+ // Each step reports its own failure and the run carries on: a settings file
183
+ // someone hand-edited into invalid JSON must not leave the credential and
184
+ // the MCP entries behind.
185
+ let removed = 0;
186
+ for (const relative of SETTINGS_FILES) {
187
+ const file = path.join(workspace, relative);
188
+ try {
189
+ if (removeHooks(file) !== null) {
190
+ out.done(`Carrick hook entries removed from ${relative}`);
191
+ removed += 1;
192
+ }
193
+ }
194
+ catch (error) {
195
+ out.refuse(`Could not read ${relative}: ${error.message}. Remove the carrick hook entries there by hand.`);
196
+ }
197
+ }
198
+ const { done, warn } = mcpRemovalLines(disconnectMcpClients());
199
+ for (const line of done) {
200
+ out.done(line);
201
+ removed += 1;
202
+ }
203
+ for (const line of warn)
204
+ out.warn(line);
205
+ const carrick = path.join(workspace, ".carrick");
206
+ if (fs.existsSync(carrick)) {
207
+ try {
208
+ fs.rmSync(carrick, { recursive: true, force: true });
209
+ out.done(".carrick removed, with the proposal and the index in it");
210
+ removed += 1;
211
+ }
212
+ catch (error) {
213
+ out.refuse(`Could not remove ${carrick}: ${error.message}`);
214
+ }
215
+ }
216
+ if (parsed.keepLogin) {
217
+ out.say(`This machine stays signed in; the credential is ${credentialPath()}.`);
218
+ }
219
+ else {
220
+ try {
221
+ if (removeCredential()) {
222
+ out.done("Signed out: the saved credential is gone");
223
+ removed += 1;
224
+ out.say("Revoke the key itself at https://app.carrick.tools/account.");
225
+ }
226
+ if (process.env["CARRICK_TOKEN"] !== undefined) {
227
+ out.warn("CARRICK_TOKEN still signs this shell in; unset it to finish signing out.");
228
+ }
229
+ }
230
+ catch (error) {
231
+ out.refuse(error.message);
232
+ }
233
+ }
234
+ if (removed === 0)
235
+ out.say("Nothing left to remove on this machine.");
236
+ const leftovers = repoLeftovers(workspace);
237
+ if (leftovers.files.length > 0 || leftovers.sections.length > 0) {
238
+ out.say("");
239
+ out.say("In the repository, which this command does not edit:");
240
+ if (leftovers.files.length > 0)
241
+ out.say(` git rm ${leftovers.files.join(" ")}`);
242
+ for (const section of leftovers.sections)
243
+ out.say(` by hand — ${section}`);
244
+ }
245
+ out.note("Last step, when nothing else on this machine needs it", ["npm uninstall -g carrick"]);
246
+ return 0;
247
+ }
248
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/init/remove.ts"],"names":[],"mappings":"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"}
@@ -131,6 +131,18 @@ export declare const PROPOSAL_FILE: string;
131
131
  * config from a workspace that has since changed.
132
132
  */
133
133
  export declare function writeProposal(workspace: string, derived: DerivedWorkspace): string;
134
+ /**
135
+ * The repositories under a workspace, as this package counts them.
136
+ *
137
+ * A workspace is one repository or a folder of them, the same two shapes
138
+ * `init` takes, so the scan is this directory and its immediate children that
139
+ * hold a `.git` — a file counts as well as a directory, because a linked
140
+ * worktree's `.git` is a file (carrick#975). Nothing is opened and nothing is
141
+ * changed; `carrick remove` and `carrick doctor` both walk this list, and one
142
+ * definition is what keeps the command that audits an install and the command
143
+ * that undoes it looking at the same repos.
144
+ */
145
+ export declare function repoRoots(workspace: string): string[];
134
146
  /**
135
147
  * What one repository on disk says it is on GitHub, and why it said nothing.
136
148
  *
@@ -41,8 +41,8 @@ export const PROPOSAL_FILE = path.join(".carrick", "proposal.json");
41
41
  * writes the proposal before any index exists. Same bytes so neither rewrites
42
42
  * the other's file. Keep the two in step.
43
43
  */
44
- const SELF_IGNORE = "# Written by Carrick. Everything here is derived from your source and is\n" +
45
- "# rebuilt by re-running `carrick index`.\n*\n";
44
+ const SELF_IGNORE = "# Written by Carrick. Everything here is derived from your source and the\n" +
45
+ "# hosted index, and `carrick refresh` rebuilds it.\n*\n";
46
46
  /**
47
47
  * Write the derived proposal where the scaffold tool's agent reads it.
48
48
  *
@@ -61,6 +61,35 @@ export function writeProposal(workspace, derived) {
61
61
  fs.writeFileSync(path.join(workspace, PROPOSAL_FILE), document);
62
62
  return PROPOSAL_FILE;
63
63
  }
64
+ /**
65
+ * The repositories under a workspace, as this package counts them.
66
+ *
67
+ * A workspace is one repository or a folder of them, the same two shapes
68
+ * `init` takes, so the scan is this directory and its immediate children that
69
+ * hold a `.git` — a file counts as well as a directory, because a linked
70
+ * worktree's `.git` is a file (carrick#975). Nothing is opened and nothing is
71
+ * changed; `carrick remove` and `carrick doctor` both walk this list, and one
72
+ * definition is what keeps the command that audits an install and the command
73
+ * that undoes it looking at the same repos.
74
+ */
75
+ export function repoRoots(workspace) {
76
+ const roots = [workspace];
77
+ let children = [];
78
+ try {
79
+ children = fs.readdirSync(workspace, { withFileTypes: true });
80
+ }
81
+ catch {
82
+ children = [];
83
+ }
84
+ for (const child of children) {
85
+ if (!child.isDirectory() || child.name.startsWith("."))
86
+ continue;
87
+ const candidate = path.join(workspace, child.name);
88
+ if (fs.existsSync(path.join(candidate, ".git")))
89
+ roots.push(candidate);
90
+ }
91
+ return roots;
92
+ }
64
93
  function gitOrigin(repo) {
65
94
  const result = spawnSync("git", ["-C", repo, "remote", "get-url", "origin"], { encoding: "utf8", timeout: 5000 });
66
95
  return result.status === 0 ? result.stdout.trim() : null;
@@ -1 +1 @@
1
- {"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/init/repos.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/init/repos.ts"],"names":[],"mappings":"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"}
package/dist/init/run.js CHANGED
@@ -18,7 +18,7 @@ import { connectRepos, reposAreInProject, projectAssignments } from "./connect.j
18
18
  import { downloadHostedIndex, hostedReport, nativeRunner } from "./hosted.js";
19
19
  import { ensureProject, projectStep, SLUG } from "./projects.js";
20
20
  import { connectMcpClients, MCP_LINE } from "./mcp.js";
21
- import { hookCommand, mergeCarrickHooks } from "./settings.js";
21
+ import { hookCommand, mergeCarrickHooks, removeCarrickHooks } from "./settings.js";
22
22
  import { createOutput, DOCS } from "./output.js";
23
23
  import { renderTemplate } from "../templates.js";
24
24
  /**
@@ -403,7 +403,9 @@ export async function init(argv) {
403
403
  const settings = fs.existsSync(settingsFile) ? fs.readFileSync(settingsFile, "utf8") : null;
404
404
  const otherFile = path.join(workspace, ".claude", command.bare ? "settings.local.json" : "settings.json");
405
405
  const other = fs.existsSync(otherFile) ? fs.readFileSync(otherFile, "utf8") : null;
406
- const cleaned = other === null ? null : mergeCarrickHooks(other, null);
406
+ // The same removal `carrick remove` runs, so a file holding no entry of
407
+ // ours is left byte for byte rather than reformatted on the way past.
408
+ const cleaned = other === null ? null : removeCarrickHooks(other);
407
409
  const hooks = mergeCarrickHooks(settings, command.command);
408
410
  // Validate both documents before migrating our entries between them.
409
411
  if (cleaned?.changed)
@@ -433,9 +435,10 @@ export async function init(argv) {
433
435
  // the whole workspace's row, and `carrick index` from a laptop on a branch
434
436
  // replaces it for everyone who queries it (carrick#993 row 2, carrick#1020).
435
437
  if (hostedIndex.length > 0) {
436
- const outcome = await out.step("Reading the hosted index into .carrick/", () => downloadHostedIndex(plan.workspace, nativeRunner(out.quiet)));
437
- const report = hostedReport(outcome);
438
- out[report.kind](report.text);
438
+ // The step reports its own outcome, so the read is one line in a terminal
439
+ // as well as in a pipe: a spinner that stopped with its label spent a
440
+ // second line on the same event (carrick#1032).
441
+ await out.step("Reading the hosted index into .carrick/", () => downloadHostedIndex(plan.workspace, nativeRunner(out.quiet)), hostedReport);
439
442
  }
440
443
  else {
441
444
  out.done("No index yet: your agent runs the one scan");