@vibe-commit/capture 0.9.0 → 0.11.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 +49 -1
- package/dist/agent_hooks.js +2 -2
- package/dist/cli.d.ts +35 -0
- package/dist/cli.js +412 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/backfill.js +19 -2
- package/dist/commands/backfill.js.map +1 -1
- package/dist/commands/finalize.d.ts +37 -1
- package/dist/commands/finalize.js +131 -29
- package/dist/commands/finalize.js.map +1 -1
- package/dist/commands/status.js +7 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/status_machine.js +5 -0
- package/dist/commands/status_machine.js.map +1 -1
- package/dist/commands/upload_worker.d.ts +63 -0
- package/dist/commands/upload_worker.js +336 -0
- package/dist/commands/upload_worker.js.map +1 -0
- package/dist/commands/why.d.ts +19 -1
- package/dist/commands/why.js +35 -3
- package/dist/commands/why.js.map +1 -1
- package/dist/commit_files.d.ts +64 -0
- package/dist/commit_files.js +83 -0
- package/dist/commit_files.js.map +1 -0
- package/dist/copy/strings.d.ts +34 -14
- package/dist/copy/strings.js +51 -14
- package/dist/copy/strings.js.map +1 -1
- package/dist/drain.d.ts +68 -0
- package/dist/drain.js +234 -0
- package/dist/drain.js.map +1 -0
- package/dist/firing.d.ts +169 -0
- package/dist/firing.js +334 -0
- package/dist/firing.js.map +1 -0
- package/dist/hooks/entry.d.ts +171 -26
- package/dist/hooks/entry.js +335 -507
- package/dist/hooks/entry.js.map +1 -1
- package/dist/hooks/fire_lock.d.ts +36 -87
- package/dist/hooks/fire_lock.js +40 -99
- package/dist/hooks/fire_lock.js.map +1 -1
- package/dist/hooks/post_commit.d.ts +11 -0
- package/dist/hooks/post_commit.js +16 -8
- package/dist/hooks/post_commit.js.map +1 -1
- package/dist/identity.d.ts +32 -0
- package/dist/identity.js +38 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +3 -17
- package/dist/index.js +59 -450
- package/dist/index.js.map +1 -1
- package/dist/paths.d.ts +18 -0
- package/dist/paths.js +31 -0
- package/dist/paths.js.map +1 -1
- package/dist/pending_prune.d.ts +2 -2
- package/dist/pending_prune.js +2 -2
- package/dist/policy.d.ts +17 -0
- package/dist/policy.js +7 -0
- package/dist/policy.js.map +1 -1
- package/dist/post.d.ts +63 -4
- package/dist/post.js +76 -24
- package/dist/post.js.map +1 -1
- package/dist/replay.d.ts +167 -0
- package/dist/replay.js +301 -0
- package/dist/replay.js.map +1 -0
- package/dist/session_targets.d.ts +12 -0
- package/dist/session_targets.js +6 -1
- package/dist/session_targets.js.map +1 -1
- package/dist/spool.d.ts +55 -21
- package/dist/spool.js +182 -38
- package/dist/spool.js.map +1 -1
- package/dist/spool_union.d.ts +18 -2
- package/dist/spool_union.js +23 -2
- package/dist/spool_union.js.map +1 -1
- package/dist/state.js +21 -14
- package/dist/state.js.map +1 -1
- package/dist/stdin.d.ts +2 -0
- package/dist/stdin.js +13 -0
- package/dist/stdin.js.map +1 -0
- package/dist/uploader_status.d.ts +34 -0
- package/dist/uploader_status.js +25 -0
- package/dist/uploader_status.js.map +1 -0
- package/dist/uploader_view.d.ts +39 -0
- package/dist/uploader_view.js +106 -0
- package/dist/uploader_view.js.map +1 -0
- package/dist/verbs.d.ts +11 -0
- package/dist/verbs.js +13 -0
- package/dist/verbs.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,59 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* `vibecommit` —
|
|
3
|
+
* `vibecommit` — the process entry. A DISPATCHER, and deliberately nothing more.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* `
|
|
5
|
+
* ⛔ THIS FILE'S STATIC IMPORTS ARE THE LOAD COST OF EVERY HOOK. It used to import every interactive verb (`auth`,
|
|
6
|
+
* `connect`, `status`, the OAuth stack...), so `vibecommit hook` and the git hooks paid ~390 ms of module loading for code
|
|
7
|
+
* they never run. Now each branch below loads only what it runs, with a dynamic `import()`, and the interactive half
|
|
8
|
+
* lives in `cli.ts`. `test/load-path.test.ts` fails the build if a value import of an interactive verb reaches a hook path.
|
|
7
9
|
*
|
|
8
|
-
*
|
|
9
|
-
* status/off output spec CR-021 failure policy CR-018
|
|
10
|
-
* repo binding key + X-Repo-Slug CR-017 / CR-019
|
|
11
|
-
*
|
|
12
|
-
* What IS established here, and must not be undone by those tasks:
|
|
10
|
+
* What is established in `cli.ts`, and must not be undone:
|
|
13
11
|
* - no user-facing string literal in a command body (CR-090 → `src/copy/`)
|
|
14
12
|
* - the exit-code contract is split hook vs interactive (CR-022 → `src/exit.ts`)
|
|
15
|
-
* - one commit-header renderer taking the grade (CR-090 → `src/copy/grades.ts`)
|
|
16
|
-
* - every escape sequence comes from `src/term.ts` (DESIGN.md §13.2)
|
|
17
13
|
* - the hook contract is enforced by the entry, not by each verb
|
|
18
14
|
*/
|
|
19
|
-
import { realpathSync
|
|
15
|
+
import { realpathSync } from "node:fs";
|
|
20
16
|
import { homedir } from "node:os";
|
|
21
17
|
import { fileURLToPath } from "node:url";
|
|
22
|
-
import { createInterface } from "node:readline/promises";
|
|
23
|
-
import { Writable } from "node:stream";
|
|
24
|
-
import { resolveAgentId } from "./agents/registry.js";
|
|
25
|
-
import { auth } from "./commands/auth.js";
|
|
26
|
-
import { browserCredential } from "./commands/browser_credential.js";
|
|
27
|
-
import { updateNudge } from "./update_nudge.js";
|
|
28
|
-
import { connect } from "./commands/connect.js";
|
|
29
|
-
import { finalize } from "./commands/finalize.js";
|
|
30
|
-
import { offVerb, statusVerb } from "./commands/status.js";
|
|
31
|
-
import { report } from "./commands/report.js";
|
|
32
|
-
import { backfill, backfillForConnect } from "./commands/backfill.js";
|
|
33
|
-
import { scan } from "./commands/scan.js";
|
|
34
|
-
import { why } from "./commands/why.js";
|
|
35
|
-
import { HELP, INTERNAL, USAGE } from "./copy/index.js";
|
|
36
18
|
import { EXIT } from "./exit.js";
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
|
|
40
|
-
import { channelCommand, installChannel } from "./install.js";
|
|
41
|
-
import { renderJsonError } from "./json.js";
|
|
42
|
-
import { LABEL_GUTTER, renderErrorBlock, resolveColour, wrap } from "./term.js";
|
|
43
|
-
import { CLIENT_VERSION } from "./version.js";
|
|
44
|
-
// `CR-216/U2` adds `auth`, and adding it MOVES `test/help.golden.txt` — which
|
|
45
|
-
// `CR-084d` and the `post-commit` note below were both careful not to do. The
|
|
46
|
-
// difference is the point: those two are a FLAG and a HIDDEN verb, neither of
|
|
47
|
-
// which a human types, so moving the golden file for them would have been noise.
|
|
48
|
-
// `auth` is typed by a human on a new machine before anything else works, so a
|
|
49
|
-
// help screen that omitted it would be the defect one layer up. The golden file
|
|
50
|
-
// exists to make a change to that screen deliberate, not to make it impossible.
|
|
51
|
-
/** The verbs with a `--json` mode (`src/json.ts`'s `JsonVerb`): a failure under the flag is a document, not a block. */
|
|
52
|
-
const JSON_VERBS = ["status", "why", "report", "scan"];
|
|
53
|
-
const VERBS = ["auth", "connect", "scan", "backfill", "status", "off", "why", "report", "finalize"];
|
|
54
|
-
export function isVerb(value) {
|
|
55
|
-
return VERBS.includes(value);
|
|
56
|
-
}
|
|
19
|
+
import { readStdin } from "./stdin.js";
|
|
20
|
+
import { isVerb } from "./verbs.js";
|
|
21
|
+
export { isVerb };
|
|
57
22
|
/**
|
|
58
23
|
* Hook invocations are distinguished by ARGV FIRST, then by env.
|
|
59
24
|
*
|
|
@@ -73,359 +38,6 @@ export function invocationMode(env, argv) {
|
|
|
73
38
|
return "hook";
|
|
74
39
|
return env.CLAUDE_HOOK_EVENT ? "hook" : "interactive";
|
|
75
40
|
}
|
|
76
|
-
/**
|
|
77
|
-
* `--help`, wrapped hard at 80 columns per DESIGN.md §13.4.
|
|
78
|
-
*
|
|
79
|
-
* Never reflows to `process.stdout.columns`: identical commands must emit
|
|
80
|
-
* identical bytes, or issue-paste, screenshots and every golden-file test of the
|
|
81
|
-
* copy break. `test/help-golden.test.ts` is that golden file.
|
|
82
|
-
*
|
|
83
|
-
* No SGR here at all. Colour would have to be resolved before help could be
|
|
84
|
-
* rendered, and help is the one surface where structure alone is enough —
|
|
85
|
-
* indentation and the label gutter carry it, which is §13.1's point about
|
|
86
|
-
* `NO_COLOR` being a lossless degradation rather than a downgrade.
|
|
87
|
-
*/
|
|
88
|
-
export function renderHelp() {
|
|
89
|
-
const lines = [
|
|
90
|
-
...wrap(HELP.tagline, 2),
|
|
91
|
-
"",
|
|
92
|
-
...wrap(`${USAGE.usageLabel} ${HELP.usage}`, 2),
|
|
93
|
-
"",
|
|
94
|
-
...wrap(USAGE.commandsLabel, 2),
|
|
95
|
-
];
|
|
96
|
-
for (const verb of VERBS) {
|
|
97
|
-
// The description is wrapped on its own and the verb column is written over
|
|
98
|
-
// the first line's indent. Wrapping `verb + padding + description` as one
|
|
99
|
-
// string would not work: `wrap` normalises whitespace, so the fixed gutter
|
|
100
|
-
// would collapse to a single space.
|
|
101
|
-
const head = ` ${verb.padEnd(LABEL_GUTTER)}`;
|
|
102
|
-
const body = wrap(HELP.commands[verb], head.length);
|
|
103
|
-
lines.push(head + body[0].slice(head.length), ...body.slice(1));
|
|
104
|
-
}
|
|
105
|
-
lines.push("", ...wrap(`${USAGE.docsLabel} ${HELP.docsUrl}`, 2));
|
|
106
|
-
return lines.join("\n");
|
|
107
|
-
}
|
|
108
|
-
function interactiveContext(argv) {
|
|
109
|
-
return {
|
|
110
|
-
env: process.env,
|
|
111
|
-
home: homedir(),
|
|
112
|
-
cwd: process.cwd(),
|
|
113
|
-
nodeVersion: process.versions.node,
|
|
114
|
-
// `CR-183`. Resolved from argv HERE, the same pure read the hook branch at
|
|
115
|
-
// the bottom of this file makes — `connect` needs it to know whether the
|
|
116
|
-
// agent it was told about has a way to find the running session at all.
|
|
117
|
-
agentId: resolveAgentId(argv),
|
|
118
|
-
colour: resolveColour({
|
|
119
|
-
env: process.env,
|
|
120
|
-
isTty: process.stdout.isTTY === true,
|
|
121
|
-
noColorFlag: argv.includes("--no-color"),
|
|
122
|
-
json: argv.includes("--json"),
|
|
123
|
-
}),
|
|
124
|
-
stdinIsTty: process.stdin.isTTY === true,
|
|
125
|
-
stdout: process.stdout,
|
|
126
|
-
stderr: process.stderr,
|
|
127
|
-
/**
|
|
128
|
-
* The readline interface is created HERE, on the first question, and not
|
|
129
|
-
* once per invocation — CR-117.
|
|
130
|
-
*
|
|
131
|
-
* `createInterface` RESUMES stdin, and a resumed stdin keeps the event loop
|
|
132
|
-
* alive until it ends. Built eagerly, a verb that returns without ever
|
|
133
|
-
* prompting sat there until the pipe closed: `connect` refusing a non-TTY,
|
|
134
|
-
* and `status` / `off`, which never ask anything. On a terminal that looked
|
|
135
|
-
* fine, because stdin ends at EOF; under `cmd | vibecommit connect` in CI it
|
|
136
|
-
* is the hang the source finding names first, burning the job's whole
|
|
137
|
-
* timeout with the refusal already on screen and no way to explain it.
|
|
138
|
-
*
|
|
139
|
-
* It also makes style guide §10.2 rule 2 literally true rather than nearly
|
|
140
|
-
* true: on the refusal path stdin is not read, resumed, or opened at all.
|
|
141
|
-
*/
|
|
142
|
-
ask: async (question) => {
|
|
143
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
144
|
-
try {
|
|
145
|
-
return await rl.question(question);
|
|
146
|
-
}
|
|
147
|
-
finally {
|
|
148
|
-
rl.close();
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
now: () => new Date(),
|
|
152
|
-
selfPath: process.argv[1] ?? "",
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
async function main(argv) {
|
|
156
|
-
const [verb] = argv;
|
|
157
|
-
if (verb === undefined || verb === "--help" || verb === "-h") {
|
|
158
|
-
process.stdout.write(`${renderHelp()}\n`);
|
|
159
|
-
return EXIT.ok;
|
|
160
|
-
}
|
|
161
|
-
if (verb === "--version" || verb === "-v") {
|
|
162
|
-
process.stdout.write(`${CLIENT_VERSION}\n`);
|
|
163
|
-
return EXIT.ok;
|
|
164
|
-
}
|
|
165
|
-
if (!isVerb(verb)) {
|
|
166
|
-
// PR 7 (Q6): a block like every other failure — a code, and the way to the command list as the LAST line. No help dump.
|
|
167
|
-
const colour = resolveColour({
|
|
168
|
-
env: process.env,
|
|
169
|
-
isTty: process.stderr.isTTY === true,
|
|
170
|
-
noColorFlag: argv.includes("--no-color"),
|
|
171
|
-
json: false,
|
|
172
|
-
});
|
|
173
|
-
process.stderr.write(`${renderErrorBlock({
|
|
174
|
-
kind: "bad",
|
|
175
|
-
code: "UNKNOWN_COMMAND",
|
|
176
|
-
what: USAGE.unknownCommandWhat(verb),
|
|
177
|
-
why: [],
|
|
178
|
-
fixLabel: USAGE.unknownCommandFix,
|
|
179
|
-
fixes: [channelCommand(process.env, process.argv[1] ?? "", USAGE.unknownCommandHelp)],
|
|
180
|
-
}, colour).join("\n")}\n`);
|
|
181
|
-
return EXIT.usage;
|
|
182
|
-
}
|
|
183
|
-
const ctx = interactiveContext(argv);
|
|
184
|
-
// Slice 2 (S4, R3-11): a credential `g` made and did not keep is revoked by the NEXT verb that runs — once, at its start, silent,
|
|
185
|
-
// needing no credential, inside one 3 s bound across every row. Not for `--help`, not for `scan` (network-free by contract,
|
|
186
|
-
// README), not for a `--stdin`, piped or no-terminal `auth` (below), and never from a hook (this is the verb path; hooks branch off at the bottom of this file).
|
|
187
|
-
// F8 (L10): nor for `auth` run with `--stdin`, piped or with no terminal ("it only saves the credential" stays exactly true of it).
|
|
188
|
-
const authSavesOnly = verb === "auth" && (argv.includes("--stdin") || !ctx.stdinIsTty);
|
|
189
|
-
if (verb !== "scan" && !authSavesOnly && !argv.includes("--help") && !argv.includes("-h")) {
|
|
190
|
-
// Loaded HERE, on the verb path only (the connect.ts rule): `vibecommit hook` never imports the module that holds a token.
|
|
191
|
-
const { retryPendingRevokes } = await import("./pending_revoke.js");
|
|
192
|
-
await retryPendingRevokes(ctx.home, ctx.env, globalThis.fetch, ctx.now());
|
|
193
|
-
}
|
|
194
|
-
const code = await runVerb(verb, argv, ctx);
|
|
195
|
-
// `13A`: the nudge is the LAST line of a verb that SUCCEEDED — never after an error (the §13.6 fix
|
|
196
|
-
// line must stay last) and never with `--json`. It lives here, not in the verbs, so no verb's own
|
|
197
|
-
// output or exit path can reach it by accident; `updateNudge` itself fails silent.
|
|
198
|
-
if (code === EXIT.ok &&
|
|
199
|
-
(verb === "status" || verb === "connect" || verb === "auth") &&
|
|
200
|
-
!argv.includes("--json") &&
|
|
201
|
-
!argv.includes("--help") &&
|
|
202
|
-
!argv.includes("-h")) {
|
|
203
|
-
const lines = await updateNudge(ctx);
|
|
204
|
-
if (lines.length > 0)
|
|
205
|
-
process.stdout.write(`${lines.join("\n")}\n`);
|
|
206
|
-
}
|
|
207
|
-
return code;
|
|
208
|
-
}
|
|
209
|
-
/** The real browser beat for `auth` and `connect`: the real network and the real clock, plus `--device`. */
|
|
210
|
-
const realBrowser = (ctx, retry, options) => browserCredential(ctx, retry, {}, options);
|
|
211
|
-
async function runVerb(verb, argv, ctx) {
|
|
212
|
-
switch (verb) {
|
|
213
|
-
case "auth":
|
|
214
|
-
// `CR-216/U2`. Both readers are injected here rather than reached for
|
|
215
|
-
// inside the verb, the same way `why` takes its reader: the suite drives
|
|
216
|
-
// every arm, and neither a TTY nor a pipe can be typed into by a test.
|
|
217
|
-
return await auth(ctx, argv.slice(1), {
|
|
218
|
-
readSecret: readSecretFromTty,
|
|
219
|
-
readStdin,
|
|
220
|
-
// `CR-226`. The browser mint, first on a terminal; the two readers above
|
|
221
|
-
// stay the fallback. Injected HERE and nowhere else — the verb's default
|
|
222
|
-
// is paste-only, so this line is what makes the route reachable.
|
|
223
|
-
browser: realBrowser,
|
|
224
|
-
// `CR-236`. After a save inside a git work tree on a terminal, `auth` continues into `connect`.
|
|
225
|
-
// ⛔ NO `browser` HERE, AND THAT IS THE "ONE AUTH" GUARANTEE: this verb just saved a credential, so
|
|
226
|
-
// the chained `connect` finds one; were it ever absent it falls to the old warning, never to a
|
|
227
|
-
// second sign-in. `test/auth-connect-chain.test.ts` brace-matches this call to keep it so.
|
|
228
|
-
// The backfill offer IS passed: it is not a sign-in, it asks its own y/N (default N) on a terminal only, and the chain
|
|
229
|
-
// itself runs only on a terminal (the `!piped` gate, D32 guard 1), so a piped or CI `auth` never reaches it.
|
|
230
|
-
// Slice 2: the account's network is passed (it is not a sign-in), so the chained `connect` syncs and shows the picker's
|
|
231
|
-
// "on your account" group. `g` needs a `browser`, which this call never has, so the chain can never reach it.
|
|
232
|
-
connect: (c) => connect(c, {}, { backfill: backfillForConnect, account: { fetch: globalThis.fetch } }),
|
|
233
|
-
// R3-7: a credential this verb saves, off the chain, is synced before it returns (only on a machine that has synced before).
|
|
234
|
-
account: { fetch: globalThis.fetch },
|
|
235
|
-
});
|
|
236
|
-
case "connect":
|
|
237
|
-
// `--sign-in` (CR-084d) is a FLAG, not a verb: `VERBS` is what `renderHelp`
|
|
238
|
-
// iterates, so a sixth verb would move `test/help.golden.txt`, and the
|
|
239
|
-
// brief for this task is explicit that the golden file must not move.
|
|
240
|
-
// `CR-226`: the browser beat for a fresh machine. Same rule as `auth` —
|
|
241
|
-
// `connect`'s default never opens a browser, so without this argument the
|
|
242
|
-
// route is unreachable from the install path.
|
|
243
|
-
// `TODOS[184]`: `help` added — `connect` has no `argv` param, so its `--help`/`-h` check reads this
|
|
244
|
-
// option field, computed the same way `signIn` already is.
|
|
245
|
-
return await connect(ctx, {
|
|
246
|
-
signIn: argv.includes("--sign-in"),
|
|
247
|
-
// `CR-234d`: sign in by code.
|
|
248
|
-
device: argv.includes("--device"),
|
|
249
|
-
// `D28`: the typed prompt even on a terminal — the checklist's way out for a screen reader.
|
|
250
|
-
typed: argv.includes("--typed"),
|
|
251
|
-
help: argv.includes("--help") || argv.includes("-h"),
|
|
252
|
-
},
|
|
253
|
-
// `D14`/`D15`: the backfill offer after "Capture is on" (PR 5's `backfillForConnect`).
|
|
254
|
-
// Slice 2: `account` is the network for the sync, the "on your account" group, `g` and the joining-machine question.
|
|
255
|
-
{ browser: realBrowser, backfill: backfillForConnect, account: { fetch: globalThis.fetch } });
|
|
256
|
-
case "scan":
|
|
257
|
-
// `D33 · 27A`. Read-only, no network, and a public verb so an agent can list capturable repos
|
|
258
|
-
// without entering a consent flow. Reads its own `--json` like `status`.
|
|
259
|
-
return scan(ctx, argv.slice(1));
|
|
260
|
-
case "backfill":
|
|
261
|
-
// `D14`/`D15`. Asks first (default N), uploads earlier sessions one at a time, no commit links. Takes no arguments.
|
|
262
|
-
return await backfill(ctx, argv.slice(1));
|
|
263
|
-
case "status":
|
|
264
|
-
// `argv.slice(1)` for the same reason `why` and `report` take it: `status`
|
|
265
|
-
// reads its own `--json` flag rather than this package acquiring an
|
|
266
|
-
// argument parser it has deliberately never had (DESIGN.md §13.3).
|
|
267
|
-
// Slice 2 (S4): one bounded account sync first, then the screen. The sync only refreshes the files `status` reads.
|
|
268
|
-
return await statusVerb(ctx, argv.slice(1), { fetch: globalThis.fetch });
|
|
269
|
-
case "off":
|
|
270
|
-
// `TODOS[184]`: `off` now takes its trailing argv, so a stray argument (including `--help`
|
|
271
|
-
// landing here by accident) can no longer silently revoke consent.
|
|
272
|
-
// Slice 2 (S4): the turn-off is local first; with a credential it is then queued for the account and synced once.
|
|
273
|
-
return await offVerb(ctx, argv.slice(1), { fetch: globalThis.fetch });
|
|
274
|
-
case "why":
|
|
275
|
-
// CR-086. `argv.slice(1)` is everything after the verb — there is no
|
|
276
|
-
// argument parser in this package and `why` does not add one; it reads
|
|
277
|
-
// `<file>:<line>` and refuses `--json`, which is the smallest shape that
|
|
278
|
-
// satisfies the verbatim-approved `--help` sentence.
|
|
279
|
-
return await why(ctx, argv.slice(1));
|
|
280
|
-
case "report":
|
|
281
|
-
// CR-108, W10. Same shape as `why`: `argv.slice(1)` is everything after
|
|
282
|
-
// the verb, and the verb reads its own two flags rather than adding an
|
|
283
|
-
// argument parser this package deliberately does not have.
|
|
284
|
-
return await report(ctx, argv.slice(1));
|
|
285
|
-
case "finalize":
|
|
286
|
-
// `TODOS[146]`. Same shape as `report`: the verb reads its own flags.
|
|
287
|
-
return await finalize(ctx, argv.slice(1));
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Read a secret from the terminal WITHOUT ECHOING IT — `CR-216/U2`.
|
|
292
|
-
*
|
|
293
|
-
* `ctx.ask` is not reusable for this. It is the consent prompt: it echoes, which
|
|
294
|
-
* is correct for `y/N` and wrong for a long-lived credential, which would then
|
|
295
|
-
* sit in the terminal's scrollback to be scrolled back to, screenshotted into a
|
|
296
|
-
* bug report, or captured by a terminal logger.
|
|
297
|
-
*
|
|
298
|
-
* The mute is the ordinary readline technique: `output` receives the prompt
|
|
299
|
-
* first and is muted only for the keystrokes that follow, so the question is
|
|
300
|
-
* still visible and the answer never is. The trailing newline is ours to write —
|
|
301
|
-
* the user's own Return was swallowed with the rest, and without it whatever
|
|
302
|
-
* prints next lands on the prompt line.
|
|
303
|
-
*
|
|
304
|
-
* Nothing here holds the secret: `rl.question`'s resolved string goes straight to
|
|
305
|
-
* the caller, which wraps it in an `IngestCredential` before doing anything else
|
|
306
|
-
* with it.
|
|
307
|
-
*/
|
|
308
|
-
function readSecretFromTty(prompt) {
|
|
309
|
-
let muted = false;
|
|
310
|
-
const muffled = new Writable({
|
|
311
|
-
write(chunk, encoding, cb) {
|
|
312
|
-
if (!muted)
|
|
313
|
-
process.stdout.write(chunk, encoding);
|
|
314
|
-
cb();
|
|
315
|
-
},
|
|
316
|
-
});
|
|
317
|
-
const rl = createInterface({ input: process.stdin, output: muffled, terminal: true });
|
|
318
|
-
const answer = rl.question(prompt);
|
|
319
|
-
muted = true;
|
|
320
|
-
return answer.finally(() => {
|
|
321
|
-
rl.close();
|
|
322
|
-
process.stdout.write("\n");
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
function readStdin() {
|
|
326
|
-
return new Promise((resolve) => {
|
|
327
|
-
let buf = "";
|
|
328
|
-
process.stdin.setEncoding("utf8");
|
|
329
|
-
process.stdin.on("data", (chunk) => {
|
|
330
|
-
buf += chunk;
|
|
331
|
-
});
|
|
332
|
-
process.stdin.on("end", () => resolve(buf));
|
|
333
|
-
process.stdin.on("error", () => resolve(""));
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* The INTERACTIVE half of the split exit contract — CR-022, D61 round 3 §D8.
|
|
338
|
-
*
|
|
339
|
-
* The hook half is enforced in `hooks/entry.ts`: swallow everything, exit 0, stay
|
|
340
|
-
* silent, because a non-zero hook feeds stderr back into the user's agent and
|
|
341
|
-
* derails the task they were actually doing. **An interactive verb must not
|
|
342
|
-
* inherit that blanket.** As originally written the exit-0/stdout-empty rule read
|
|
343
|
-
* as governing the whole binary, which would make `why` on a read-lane 5xx exit 0
|
|
344
|
-
* and print nothing — a read verb failing silently, which is the defect this
|
|
345
|
-
* split exists to prevent.
|
|
346
|
-
*
|
|
347
|
-
* So: same fault, same binary, two modes, two behaviours. Interactive gets exit 1
|
|
348
|
-
* and §13.6's shape.
|
|
349
|
-
*
|
|
350
|
-
* Two things this deliberately does NOT do:
|
|
351
|
-
* - **No signal handling.** `Ctrl-C` cancelling a `connect` prompt is normal
|
|
352
|
-
* CLI behaviour, and suppressing `SIGINT` globally would be a UX regression
|
|
353
|
-
* dressed up as a fix. The hook's signal override stays scoped to hook mode.
|
|
354
|
-
* - **No stack trace** unless `VIBECOMMIT_DEBUG` is set (§13.6, first
|
|
355
|
-
* prohibition). The detail then goes out RAW, after the block, rather than
|
|
356
|
-
* through `wrap()`, which would reflow a stack into nonsense.
|
|
357
|
-
*/
|
|
358
|
-
function reportUnexpected(error, argv) {
|
|
359
|
-
const colour = resolveColour({
|
|
360
|
-
env: process.env,
|
|
361
|
-
isTty: process.stderr.isTTY === true,
|
|
362
|
-
noColorFlag: argv.includes("--no-color"),
|
|
363
|
-
json: argv.includes("--json"),
|
|
364
|
-
});
|
|
365
|
-
const block = {
|
|
366
|
-
kind: "bad",
|
|
367
|
-
code: "INTERNAL_ERROR",
|
|
368
|
-
what: INTERNAL.unexpectedWhat,
|
|
369
|
-
why: [INTERNAL.unexpectedWhy],
|
|
370
|
-
fixLabel: INTERNAL.unexpectedFix,
|
|
371
|
-
fixes: [INTERNAL.unexpectedDebugCommand(installChannel(process.env, process.argv[1] ?? "").command)],
|
|
372
|
-
};
|
|
373
|
-
// PR 7: under `--json` on a read verb the failure is ONE document on stdout and nothing on stderr — the same shape every
|
|
374
|
-
// other `--json` failure has. (`VIBECOMMIT_DEBUG` is an explicit opt-in to the raw detail on stderr, and still prints.)
|
|
375
|
-
const jsonVerb = argv.includes("--json") ? JSON_VERBS.find((v) => v === argv[0]) : undefined;
|
|
376
|
-
const lines = jsonVerb === undefined ? renderErrorBlock(block, colour) : [];
|
|
377
|
-
if (jsonVerb !== undefined) {
|
|
378
|
-
try {
|
|
379
|
-
writeSync(1, renderJsonError(jsonVerb, block));
|
|
380
|
-
}
|
|
381
|
-
catch {
|
|
382
|
-
// An unwritable stdout is not worth a second exception on this path.
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
if (process.env.VIBECOMMIT_DEBUG !== undefined)
|
|
386
|
-
lines.push(...(lines.length > 0 ? [""] : []), detailOf(error));
|
|
387
|
-
if (lines.length === 0)
|
|
388
|
-
return;
|
|
389
|
-
// `writeSync(2, …)` rather than `process.stderr.write`: stderr to a pipe is
|
|
390
|
-
// asynchronous and `process.exit` does not flush it, so the caller below would
|
|
391
|
-
// race its own diagnostic away. Same reason `finish()` uses it on fd 1.
|
|
392
|
-
try {
|
|
393
|
-
writeSync(2, `${lines.join("\n")}\n`);
|
|
394
|
-
}
|
|
395
|
-
catch {
|
|
396
|
-
// An unwritable stderr is not worth a second exception on this path.
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* The raw detail, for `VIBECOMMIT_DEBUG` only.
|
|
401
|
-
*
|
|
402
|
-
* Interpolating an error is safe by construction here: an `IngestCredential`
|
|
403
|
-
* renders `vcik_…redacted` through `toString`, `toJSON` and the inspect hook, so
|
|
404
|
-
* a stack that embedded one cannot print the plaintext.
|
|
405
|
-
*/
|
|
406
|
-
function detailOf(error) {
|
|
407
|
-
if (error instanceof Error && typeof error.stack === "string")
|
|
408
|
-
return error.stack;
|
|
409
|
-
return String(error);
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Catch what escapes `main()` entirely — a stray timer's throw, a rejection from
|
|
413
|
-
* a promise nobody awaited. Without these, Node prints its own stack trace to
|
|
414
|
-
* stderr, which §13.6 forbids outright.
|
|
415
|
-
*
|
|
416
|
-
* These force an exit rather than setting `process.exitCode`, because by
|
|
417
|
-
* definition something unexpected is still in flight and may be holding the event
|
|
418
|
-
* loop open. The `main()` rejection path below does not: nothing is in flight
|
|
419
|
-
* there, and letting the loop drain preserves whatever the verb already wrote.
|
|
420
|
-
*/
|
|
421
|
-
function installInteractiveGuards(argv) {
|
|
422
|
-
const fail = (error) => {
|
|
423
|
-
reportUnexpected(error, argv);
|
|
424
|
-
process.exit(EXIT.failure);
|
|
425
|
-
};
|
|
426
|
-
process.on("uncaughtException", fail);
|
|
427
|
-
process.on("unhandledRejection", fail);
|
|
428
|
-
}
|
|
429
41
|
/**
|
|
430
42
|
* Swallow EPIPE.
|
|
431
43
|
*
|
|
@@ -478,83 +90,80 @@ function invokedAsBinary() {
|
|
|
478
90
|
return false;
|
|
479
91
|
}
|
|
480
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Every dispatch below is a dynamic `import()` that FAILS CLOSED to the verb's own contract. A hook, `post-commit` and
|
|
95
|
+
* `post-rewrite` run inside the user's agent or `git commit`: an import that throws (a plugin update replacing `bin/` under a
|
|
96
|
+
* running process, a truncated install) must exit 0 and print nothing, not put a stack trace in their terminal. The
|
|
97
|
+
* interactive branch is the opposite on purpose: a broken install should be LOUD there, so its rejection is not caught.
|
|
98
|
+
*/
|
|
481
99
|
if (invokedAsBinary()) {
|
|
482
100
|
installPipeGuards();
|
|
483
101
|
const argv = process.argv.slice(2);
|
|
484
102
|
if (argv[0] === "post-commit") {
|
|
485
|
-
// ⛔ A HIDDEN VERB, dispatched here rather than through `main`, and NOT in
|
|
486
|
-
//
|
|
487
|
-
// `test/help.golden.txt` for a verb no human ever types. `hook` is dispatched
|
|
488
|
-
// the same way, for the same reason.
|
|
103
|
+
// ⛔ A HIDDEN VERB, dispatched here rather than through `main`, and NOT in `VERBS` — `renderHelp` iterates that list, so
|
|
104
|
+
// adding it would move `test/help.golden.txt` for a verb no human ever types. `hook` is dispatched the same way.
|
|
489
105
|
//
|
|
490
|
-
// It runs inside the user's `git commit`, so it exits 0 unconditionally and
|
|
491
|
-
//
|
|
106
|
+
// It runs inside the user's `git commit`, so it exits 0 unconditionally and writes nothing to either stream
|
|
107
|
+
// (`hooks/post_commit.ts`).
|
|
492
108
|
//
|
|
493
|
-
// ⛔ `env` IS THE LADDER'S FIRST RUNG. Claude Code exports
|
|
494
|
-
// `
|
|
495
|
-
//
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
}
|
|
500
|
-
if (argv[0] === "post-rewrite") {
|
|
501
|
-
// The other hidden verb, for the same reason — and it is `post-commit`'s
|
|
502
|
-
//
|
|
503
|
-
// DESTROY (`M5`), and this is the only hook git tells about the pairing.
|
|
109
|
+
// ⛔ `env` IS THE LADDER'S FIRST RUNG. Claude Code exports `CLAUDE_CODE_SESSION_ID` into the Bash tool's environment and
|
|
110
|
+
// git passes it through to us (`M1`), so the committing session identifies ITSELF instead of being guessed at by mtime.
|
|
111
|
+
// This is the one place the real environment is read on this path; everything below takes it as a parameter.
|
|
112
|
+
void import("./hooks/post_commit.js")
|
|
113
|
+
.then(({ runPostCommit }) => process.exit(runPostCommit({ home: homedir(), cwd: process.cwd(), env: process.env })))
|
|
114
|
+
.catch(() => process.exit(EXIT.ok));
|
|
115
|
+
}
|
|
116
|
+
else if (argv[0] === "post-rewrite") {
|
|
117
|
+
// The other hidden verb, for the same reason — and it is `post-commit`'s other half: `--amend` and `rebase` fire
|
|
118
|
+
// `post-commit` for a sha they then DESTROY (`M5`), and this is the only hook git tells about the pairing.
|
|
504
119
|
//
|
|
505
|
-
// ⛔ THE PAIRS ARRIVE ON STDIN, and it is read HERE so `hooks/post_rewrite.ts`
|
|
506
|
-
//
|
|
507
|
-
//
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
// unreadable stream means. An empty read parses to zero pairs, which is an
|
|
511
|
-
// ordinary answer rather than a failure.
|
|
512
|
-
void readStdin().then((stdin) => process.exit(runPostRewrite({
|
|
120
|
+
// ⛔ THE PAIRS ARRIVE ON STDIN, and it is read HERE so `hooks/post_rewrite.ts` opens nothing — the same seam that keeps
|
|
121
|
+
// every other module in this package free of a real file descriptor. `readStdin` resolves an `error` to `""`, and an empty
|
|
122
|
+
// read parses to zero pairs, which is an ordinary answer rather than a failure.
|
|
123
|
+
void Promise.all([import("./hooks/post_rewrite.js"), readStdin()])
|
|
124
|
+
.then(([{ runPostRewrite }, stdin]) => process.exit(runPostRewrite({
|
|
513
125
|
home: homedir(),
|
|
514
126
|
cwd: process.cwd(),
|
|
515
127
|
env: process.env,
|
|
516
128
|
// git's own `argv[1]` — `amend` or `rebase`.
|
|
517
129
|
kind: argv[1] ?? "",
|
|
518
130
|
stdin,
|
|
519
|
-
})))
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
//
|
|
524
|
-
//
|
|
525
|
-
// is
|
|
131
|
+
})))
|
|
132
|
+
.catch(() => process.exit(EXIT.ok));
|
|
133
|
+
}
|
|
134
|
+
else if (argv[0] === "__upload-worker") {
|
|
135
|
+
// The third hidden verb: the detached upload worker (U5). Spawned by a hook with `stdio: "ignore"`, so it has nobody to talk to and exits 0
|
|
136
|
+
// unconditionally. Dispatched BEFORE the env-keyed hook branch below, so an inherited `CLAUDE_HOOK_EVENT` cannot route it into the hook.
|
|
137
|
+
// Not in `VERBS`, for the same reason `hook` is not: `renderHelp` iterates that list and no human types this.
|
|
138
|
+
void import("./commands/upload_worker.js")
|
|
139
|
+
.then(({ runUploadWorkerMain }) => runUploadWorkerMain(process.env, homedir()))
|
|
140
|
+
.then((code) => process.exit(code))
|
|
141
|
+
.catch(() => process.exit(EXIT.ok));
|
|
526
142
|
}
|
|
527
143
|
else if (invocationMode(process.env, argv) === "hook") {
|
|
528
|
-
// `runHook` installs the contract guards before it does any work and always
|
|
529
|
-
//
|
|
530
|
-
void
|
|
144
|
+
// `runHook` installs the contract guards before it does any work and always calls `process.exit(0)`. It never returns, so
|
|
145
|
+
// nothing follows it.
|
|
146
|
+
void Promise.all([import("./hooks/entry.js"), import("./agents/registry.js")])
|
|
147
|
+
.then(([{ runHook }, { resolveAgentId }]) => runHook({
|
|
531
148
|
env: process.env,
|
|
532
149
|
home: homedir(),
|
|
533
150
|
nodeVersion: process.versions.node,
|
|
534
|
-
// ⛔ `CR-183` — THE ONE PLACE THE FLAG IS READ ON THIS PATH, and it is read
|
|
535
|
-
//
|
|
536
|
-
//
|
|
537
|
-
//
|
|
538
|
-
// This is the seam that already injects `home` and `nodeVersion`.
|
|
151
|
+
// ⛔ `CR-183` — THE ONE PLACE THE FLAG IS READ ON THIS PATH, and it is read HERE rather than inside the hook for a
|
|
152
|
+
// structural reason: `runHook` never receives argv at all, and `parseHookInput` must not select the adapter because
|
|
153
|
+
// stdin is the input the confinement boundary exists to constrain. This is the seam that already injects `home` and
|
|
154
|
+
// `nodeVersion`.
|
|
539
155
|
//
|
|
540
|
-
// ⚠
|
|
541
|
-
//
|
|
542
|
-
// registered command MUST lead with the `hook` verb — put the flag first
|
|
543
|
-
// and this branch is never taken.
|
|
156
|
+
// ⚠ Resolving an id is not entering hook mode. `invocationMode` keys on `argv[0]`, so the registered command MUST
|
|
157
|
+
// lead with the `hook` verb — put the flag first and this branch is never taken.
|
|
544
158
|
agentId: resolveAgentId(argv),
|
|
545
159
|
readStdin,
|
|
546
160
|
// `11A`: state 2 names the command that reconnects THIS install.
|
|
547
161
|
selfPath: process.argv[1] ?? "",
|
|
548
|
-
})
|
|
162
|
+
}))
|
|
163
|
+
.catch(() => process.exit(EXIT.ok));
|
|
549
164
|
}
|
|
550
165
|
else {
|
|
551
|
-
|
|
552
|
-
void main(argv).then((code) => {
|
|
553
|
-
process.exitCode = code;
|
|
554
|
-
}, (error) => {
|
|
555
|
-
reportUnexpected(error, argv);
|
|
556
|
-
process.exitCode = EXIT.failure;
|
|
557
|
-
});
|
|
166
|
+
void import("./cli.js").then(({ runCli }) => runCli(argv));
|
|
558
167
|
}
|
|
559
168
|
}
|
|
560
169
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
CHANGED
|
@@ -205,6 +205,24 @@ export declare function targetsDir(home: string): string;
|
|
|
205
205
|
export declare function sessionsRoot(home: string): string;
|
|
206
206
|
/** One session's target record: scan cursors, resolved roots, targets, undecided names. Not a `.json` (see `targetsDir`). */
|
|
207
207
|
export declare function sessionTargetsPath(home: string, sessionId: string): string;
|
|
208
|
+
/**
|
|
209
|
+
* U3 — a session's FIRING LOG: one line per hook that ended a turn, appended by the hook and replayed by the upload worker
|
|
210
|
+
* (`firing.ts`). Beside the session's target record, never under a repo digest: a firing belongs to the SESSION, and the repos it
|
|
211
|
+
* touches are named inside the line. `.firings.jsonl` is not `.json`, for the reason the whole directory is (`targetsDir`).
|
|
212
|
+
*/
|
|
213
|
+
export declare function sessionFiringsPath(home: string, sessionId: string): string;
|
|
214
|
+
/** U3 — the worker's progress through `sessionFiringsPath`, written only under the session's writer lock. */
|
|
215
|
+
export declare function sessionFiringsCursorPath(home: string, sessionId: string): string;
|
|
216
|
+
/** U5 — the machine-wide upload worker's lock for ONE identity (`identity.ts`). Beside the session records; neither a `.targets` nor a `.json`; the status file is `.status` for the same reason. */
|
|
217
|
+
export declare function uploaderLockPath(home: string, identity: string): string;
|
|
218
|
+
/** U5 — what the worker reports about itself, for `status` and the hook's notices: counts and classes, never a body, a path or a credential. */
|
|
219
|
+
export declare function uploaderStatusPath(home: string, identity: string): string;
|
|
220
|
+
/**
|
|
221
|
+
* U3 — `<repo digest>/<session>.live`: the HOOK-only liveness stamp (`firing.ts`). Beside the session's state file, with an extension
|
|
222
|
+
* that is neither `.json` nor `.jsonl`, so no scan of state files (`lastSendForRepo`, `stuckForRepo`) takes it for a session.
|
|
223
|
+
* Null on no repo, for the reason `sessionStatePath` is.
|
|
224
|
+
*/
|
|
225
|
+
export declare function sessionLivePath(home: string, key: SessionKey): string | null;
|
|
208
226
|
/** Which work tree a state digest names — written by `spool.ts` when a commit is spooled. Null for no repo key. */
|
|
209
227
|
export declare function repoKeyNotePath(home: string, repoKey: string): string | null;
|
|
210
228
|
/** The digest a work tree's state directory is named by (`repoSessionsDir`). Exposed for the spool-evidence reader. */
|