@vibe-commit/capture 0.6.0 → 0.7.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 +84 -5
- package/dist/agent_hooks.d.ts +8 -0
- package/dist/agent_hooks.js +31 -1
- package/dist/agent_hooks.js.map +1 -1
- package/dist/agents/claude_code.d.ts +34 -0
- package/dist/agents/claude_code.js +141 -8
- package/dist/agents/claude_code.js.map +1 -1
- package/dist/agents/codex_cli.d.ts +13 -0
- package/dist/agents/codex_cli.js +241 -2
- package/dist/agents/codex_cli.js.map +1 -1
- package/dist/agents/cursor.d.ts +34 -0
- package/dist/agents/cursor.js +115 -1
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/session_listing.d.ts +29 -0
- package/dist/agents/session_listing.js +49 -0
- package/dist/agents/session_listing.js.map +1 -0
- package/dist/agents/types.d.ts +118 -8
- package/dist/agents/types.js +17 -3
- package/dist/agents/types.js.map +1 -1
- package/dist/commands/approval_pending.d.ts +9 -0
- package/dist/commands/approval_pending.js +23 -0
- package/dist/commands/approval_pending.js.map +1 -0
- package/dist/commands/auth.js +31 -11
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/backfill.d.ts +160 -0
- package/dist/commands/backfill.js +748 -0
- package/dist/commands/backfill.js.map +1 -0
- package/dist/commands/browser_credential.d.ts +2 -0
- package/dist/commands/browser_credential.js +31 -14
- package/dist/commands/browser_credential.js.map +1 -1
- package/dist/commands/connect.d.ts +137 -0
- package/dist/commands/connect.js +203 -109
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect_picker.d.ts +27 -0
- package/dist/commands/connect_picker.js +415 -0
- package/dist/commands/connect_picker.js.map +1 -0
- package/dist/commands/context.d.ts +16 -0
- package/dist/commands/context.js +27 -0
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/credential_problem.d.ts +15 -4
- package/dist/commands/credential_problem.js +29 -22
- package/dist/commands/credential_problem.js.map +1 -1
- package/dist/commands/device_credential.d.ts +2 -0
- package/dist/commands/device_credential.js +16 -14
- package/dist/commands/device_credential.js.map +1 -1
- package/dist/commands/finalize.d.ts +95 -0
- package/dist/commands/finalize.js +249 -74
- package/dist/commands/finalize.js.map +1 -1
- package/dist/commands/finish_mint.d.ts +2 -6
- package/dist/commands/finish_mint.js +10 -2
- package/dist/commands/finish_mint.js.map +1 -1
- package/dist/commands/report.js +38 -30
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/scan.d.ts +162 -0
- package/dist/commands/scan.js +507 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.js +119 -22
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/status_hooks.d.ts +14 -0
- package/dist/commands/status_hooks.js +81 -0
- package/dist/commands/status_hooks.js.map +1 -0
- package/dist/commands/status_machine.d.ts +18 -0
- package/dist/commands/status_machine.js +149 -0
- package/dist/commands/status_machine.js.map +1 -0
- package/dist/commands/why.js +44 -31
- package/dist/commands/why.js.map +1 -1
- package/dist/consent.d.ts +111 -0
- package/dist/consent.js +203 -1
- package/dist/consent.js.map +1 -1
- package/dist/copy/error_codes.d.ts +222 -0
- package/dist/copy/error_codes.js +105 -0
- package/dist/copy/error_codes.js.map +1 -0
- package/dist/copy/index.d.ts +2 -2
- package/dist/copy/index.js +2 -2
- package/dist/copy/index.js.map +1 -1
- package/dist/copy/strings.d.ts +497 -29
- package/dist/copy/strings.js +601 -35
- package/dist/copy/strings.js.map +1 -1
- package/dist/copy/time.d.ts +11 -0
- package/dist/copy/time.js +18 -0
- package/dist/copy/time.js.map +1 -1
- package/dist/credential.d.ts +5 -1
- package/dist/credential.js +2 -2
- package/dist/credential.js.map +1 -1
- package/dist/git.d.ts +43 -0
- package/dist/git.js +95 -0
- package/dist/git.js.map +1 -1
- package/dist/hooks/entry.d.ts +18 -1
- package/dist/hooks/entry.js +110 -13
- package/dist/hooks/entry.js.map +1 -1
- package/dist/hooks/post_commit.js +3 -3
- package/dist/hooks/post_commit.js.map +1 -1
- package/dist/hooks/post_rewrite.js +6 -4
- package/dist/hooks/post_rewrite.js.map +1 -1
- package/dist/hooks/session_start.d.ts +93 -0
- package/dist/hooks/session_start.js +199 -0
- package/dist/hooks/session_start.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +56 -8
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +57 -0
- package/dist/install.js +54 -20
- package/dist/install.js.map +1 -1
- package/dist/json.d.ts +32 -9
- package/dist/json.js +35 -8
- package/dist/json.js.map +1 -1
- package/dist/machine_state.d.ts +52 -0
- package/dist/machine_state.js +63 -0
- package/dist/machine_state.js.map +1 -0
- package/dist/oauth/session.d.ts +1 -0
- package/dist/org_pending.d.ts +52 -0
- package/dist/org_pending.js +109 -0
- package/dist/org_pending.js.map +1 -0
- package/dist/paths.d.ts +50 -0
- package/dist/paths.js +64 -0
- package/dist/paths.js.map +1 -1
- package/dist/picker.d.ts +180 -0
- package/dist/picker.js +477 -0
- package/dist/picker.js.map +1 -0
- package/dist/picker_checklist.d.ts +125 -0
- package/dist/picker_checklist.js +375 -0
- package/dist/picker_checklist.js.map +1 -0
- package/dist/policy.d.ts +54 -0
- package/dist/policy.js +47 -0
- package/dist/policy.js.map +1 -1
- package/dist/post.d.ts +50 -16
- package/dist/post.js +265 -58
- package/dist/post.js.map +1 -1
- package/dist/state.d.ts +6 -0
- package/dist/state.js +38 -1
- package/dist/state.js.map +1 -1
- package/dist/system_message.d.ts +8 -1
- package/dist/system_message.js +19 -1
- package/dist/system_message.js.map +1 -1
- package/dist/term.d.ts +28 -2
- package/dist/term.js +23 -2
- package/dist/term.js.map +1 -1
- package/dist/verb_help.d.ts +13 -0
- package/dist/verb_help.js +40 -0
- package/dist/verb_help.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -9
package/dist/copy/strings.d.ts
CHANGED
|
@@ -21,15 +21,72 @@ export declare const HELP: {
|
|
|
21
21
|
readonly usage: "vibecommit <command> [options]";
|
|
22
22
|
readonly tagline: "Record Claude Code sessions against the commits they produced.";
|
|
23
23
|
readonly commands: {
|
|
24
|
-
readonly auth: "Renew or replace this machine's credential.
|
|
25
|
-
readonly connect: "
|
|
26
|
-
readonly
|
|
24
|
+
readonly auth: "Renew or replace this machine's credential. On a terminal it then goes on to connect: in a git repo, or on a machine that captures nothing yet. Otherwise it only saves the credential.";
|
|
25
|
+
readonly connect: "Choose the repositories to capture, from any folder, and connect them. On a machine with no credential it signs in first.";
|
|
26
|
+
readonly scan: "List the repositories coding agents have been used in on this machine. Uploads nothing and changes no setting.";
|
|
27
|
+
readonly backfill: "Upload earlier coding-agent sessions still on this machine, for the repositories you chose. Asks first; no commit links.";
|
|
28
|
+
readonly status: "Show whether capture is on for this repo, or for this machine outside a repo, and when it last succeeded.";
|
|
27
29
|
readonly off: "Stop capturing for this repo.";
|
|
28
30
|
readonly why: "Show the conversation turns recorded against the commit that last changed this line.";
|
|
29
31
|
readonly report: "Summarise capture coverage over a time window.";
|
|
30
32
|
readonly finalize: "Close a finished session's last turn so commits made in it can be recorded.";
|
|
31
33
|
};
|
|
32
34
|
readonly docsUrl: "https://vibecommit.ai/docs/what-we-upload";
|
|
35
|
+
/**
|
|
36
|
+
* PR 6 item 2 (devex review): what `<verb> --help` prints BEYOND the one sentence above, which stays the first
|
|
37
|
+
* paragraph. Agents read `--help` first, and until now the flags and exit codes existed only in the README.
|
|
38
|
+
*
|
|
39
|
+
* ⚠ Every flag here is one the verb's own argv reader acts on (`src/index.ts`, and each verb's parser), and every exit
|
|
40
|
+
* code is one the verb returns (`src/exit.ts`). A flag the verb ignores, or a code it never returns, would be copy no
|
|
41
|
+
* gate can check, so `test/verb-help.test.ts` ties each list to the source it describes.
|
|
42
|
+
*/
|
|
43
|
+
readonly verbs: {
|
|
44
|
+
readonly connect: {
|
|
45
|
+
readonly usage: "vibecommit connect [--device] [--sign-in] [--typed]";
|
|
46
|
+
readonly options: readonly [readonly ["--device", "Sign in with a code approved on another device, for a machine with no browser."], readonly ["--sign-in", "Sign in through the browser before connecting."], readonly ["--typed", "Use the typed prompt even on a terminal, for a screen reader."]];
|
|
47
|
+
readonly exits: readonly [readonly ["0", "Done."], readonly ["1", "Failed, or a replacement credential was declined."], readonly ["2", "Bad arguments, or no person at a terminal to answer the consent question."], readonly ["3", "Not connected: this machine's credential is not accepted."]];
|
|
48
|
+
};
|
|
49
|
+
readonly auth: {
|
|
50
|
+
readonly usage: "vibecommit auth [--stdin | --paste | --device]";
|
|
51
|
+
readonly options: readonly [readonly ["--stdin", "Read the credential from standard input and stop after saving it."], readonly ["--paste", "Skip the browser and paste a credential made in Settings."], readonly ["--device", "Sign in with a code approved on another device."]];
|
|
52
|
+
readonly exits: readonly [readonly ["0", "Credential saved."], readonly ["1", "Nothing was saved."], readonly ["2", "Bad arguments, such as a credential passed as an argument."]];
|
|
53
|
+
};
|
|
54
|
+
readonly scan: {
|
|
55
|
+
readonly usage: "vibecommit scan [--json]";
|
|
56
|
+
readonly options: readonly [readonly ["--json", "Print one JSON document instead of text."]];
|
|
57
|
+
readonly exits: readonly [readonly ["0", "Repositories found."], readonly ["4", "None found."]];
|
|
58
|
+
};
|
|
59
|
+
readonly backfill: {
|
|
60
|
+
readonly usage: "vibecommit backfill";
|
|
61
|
+
readonly options: readonly [];
|
|
62
|
+
readonly exits: readonly [readonly ["0", "Done, declined at the question, or interrupted with Ctrl+C. Sessions held for an organization's approval count as done."], readonly ["1", "The server stopped the run, could not be reached or refused this machine's credential, or it could not run. Nothing already sent is lost; run it again to resume."], readonly ["2", "No terminal, or an argument was given."], readonly ["3", "Not connected."], readonly ["4", "Nothing to upload."]];
|
|
63
|
+
};
|
|
64
|
+
readonly status: {
|
|
65
|
+
readonly usage: "vibecommit status [--json]";
|
|
66
|
+
readonly options: readonly [readonly ["--json", "Print one JSON document instead of text."]];
|
|
67
|
+
readonly exits: readonly [readonly ["0", "Reported."], readonly ["1", "Failed."], readonly ["2", "Bad arguments."], readonly ["3", "Not connected."]];
|
|
68
|
+
};
|
|
69
|
+
readonly why: {
|
|
70
|
+
readonly usage: "vibecommit why <file>:<line> [--json]";
|
|
71
|
+
readonly options: readonly [readonly ["--json", "Print one JSON document instead of text."]];
|
|
72
|
+
readonly exits: readonly [readonly ["0", "Answered."], readonly ["1", "Failed."], readonly ["2", "Bad arguments."], readonly ["3", "Not connected."]];
|
|
73
|
+
};
|
|
74
|
+
readonly report: {
|
|
75
|
+
readonly usage: "vibecommit report --since <date> [--ref <ref>] [--json]";
|
|
76
|
+
readonly options: readonly [readonly ["--since", "Start of the window, as YYYY-MM-DD. Required."], readonly ["--ref", "The branch or commit to count. Default: the current branch."], readonly ["--json", "Print one JSON document instead of text."]];
|
|
77
|
+
readonly exits: readonly [readonly ["0", "Reported."], readonly ["1", "Failed."], readonly ["2", "Bad arguments."], readonly ["3", "Not connected."], readonly ["4", "The window is empty: nothing to report."]];
|
|
78
|
+
};
|
|
79
|
+
readonly finalize: {
|
|
80
|
+
readonly usage: "vibecommit finalize --session <id> | --latest [--force]";
|
|
81
|
+
readonly options: readonly [readonly ["--session", "The session to close."], readonly ["--latest", "The most recent session, when only one is recent."], readonly ["--force", "Skip the check that the transcript has stopped changing. Only for a session that is over."]];
|
|
82
|
+
readonly exits: readonly [readonly ["0", "Closed: the server confirmed the last turn is recorded."], readonly ["1", "Not confirmed closed: not a git repository, a transcript that cannot be read, a credential that is no longer accepted, or a delivery that failed."], readonly ["2", "Nothing was sent: bad arguments, an unknown or still-running session, or several recent sessions for --latest."], readonly ["3", "Not connected: this repo is not captured, or this machine has no credential."], readonly ["5", "Delivered, but the server did not confirm it. Treat it as not closed."]];
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
/** The two section labels of a verb's help. */
|
|
86
|
+
readonly optionsLabel: "Options:";
|
|
87
|
+
/** A verb with no flags of its own (`backfill`) says so under the label, so "Options:" never sits over nothing. */
|
|
88
|
+
readonly noOptions: "None. It takes no arguments.";
|
|
89
|
+
readonly exitCodesLabel: "Exit codes:";
|
|
33
90
|
};
|
|
34
91
|
/**
|
|
35
92
|
* The ENTRY POINT's own chrome and its two usage failures — `CR-090d`.
|
|
@@ -62,8 +119,14 @@ export declare const USAGE: {
|
|
|
62
119
|
readonly usageLabel: "Usage:";
|
|
63
120
|
readonly commandsLabel: "Commands:";
|
|
64
121
|
readonly docsLabel: "Docs:";
|
|
65
|
-
/**
|
|
66
|
-
|
|
122
|
+
/**
|
|
123
|
+
* The unknown-verb block (PR 7, Q6: `UNKNOWN_COMMAND`, routed through the shared renderer). The help text is no longer
|
|
124
|
+
* dumped after it, so the fix — the way to the list of commands — is the last thing on screen. The verb is whatever
|
|
125
|
+
* the user typed, so it is cut to a length the line can hold.
|
|
126
|
+
*/
|
|
127
|
+
readonly unknownCommandWhat: (verb: string) => string;
|
|
128
|
+
readonly unknownCommandFix: "See the commands:";
|
|
129
|
+
readonly unknownCommandHelp: "vibecommit --help";
|
|
67
130
|
};
|
|
68
131
|
export declare const STATUS: {
|
|
69
132
|
readonly onForRepo: "Capture is on for this repository.";
|
|
@@ -76,6 +139,25 @@ export declare const STATUS: {
|
|
|
76
139
|
* changed them to match the screen rather than changing the screen.
|
|
77
140
|
*/
|
|
78
141
|
readonly repoLabel: "repo";
|
|
142
|
+
/** 0.7.0, D6 · 2A: why this repo is on. One row under `repo`, only inside a repo that is on. */
|
|
143
|
+
readonly basisLabel: "basis";
|
|
144
|
+
readonly basisOwner: (owner: string) => string;
|
|
145
|
+
readonly basisRepo: "repo grant";
|
|
146
|
+
readonly basisClone: "per clone";
|
|
147
|
+
/** The machine-level screen (any folder that is not a work tree). */
|
|
148
|
+
readonly offMachine: "Capture is not on for any repository on this machine.";
|
|
149
|
+
readonly ownersLabel: "owners";
|
|
150
|
+
readonly reposLabel: "repos";
|
|
151
|
+
readonly offLabel: "off";
|
|
152
|
+
/**
|
|
153
|
+
* Machine-level `status`: the repos whose own last upload was refused because their org has not approved capture. §10.2's held
|
|
154
|
+
* vocabulary — the beat word `held`, and the backfill screen's "the org must approve capture" (Alexander, 2026-10-24 17:20).
|
|
155
|
+
*/
|
|
156
|
+
readonly heldLabel: "held";
|
|
157
|
+
readonly heldReason: "the org must approve capture";
|
|
158
|
+
readonly ownerTail: "all its repos, including ones you clone later";
|
|
159
|
+
readonly changeLabel: "Change what is captured";
|
|
160
|
+
readonly turnOffInside: "Turn one repo off, run inside it";
|
|
79
161
|
readonly lastSuccessLabel: "last sent";
|
|
80
162
|
readonly dashboardLabel: "dashboard";
|
|
81
163
|
/** `<slug> (git toplevel <path>)` — §10.3's repo row. */
|
|
@@ -96,6 +178,21 @@ export declare const STATUS: {
|
|
|
96
178
|
* after the rows, with the glyph turned `warn`. The date is absolute and in UTC.
|
|
97
179
|
*/
|
|
98
180
|
readonly credentialEnding: (date: string, authCommand: string) => string;
|
|
181
|
+
/**
|
|
182
|
+
* 0.7.0. A `grants.json` that is present and unreadable denies capture for every clone that has a remote
|
|
183
|
+
* (`consent.ts`'s `isCaptureAllowed`), and a hook cannot say so, so `status` does. The file name is the user's
|
|
184
|
+
* to fix; `connect` is where the next consent lands once it is readable.
|
|
185
|
+
*/
|
|
186
|
+
readonly grantsUnreadable: (connect: string) => string;
|
|
187
|
+
/**
|
|
188
|
+
* 0.7.0, `SessionStart` (T21). `npm i -g` alone never adds the event to an agent's config, so a 0.6.x machine is
|
|
189
|
+
* missing it until `connect` runs. Only said on the npm channel: the plugin ships its own `hooks.json`, and its
|
|
190
|
+
* contract (no `SessionStart`, no git hooks) is unchanged.
|
|
191
|
+
*/
|
|
192
|
+
readonly sessionStartMissing: (agents: string, connect: string) => string;
|
|
193
|
+
/** 0.7.0, D4 · A. A hook the user deleted stays deleted; `connect` is the watched way back. */
|
|
194
|
+
readonly commitHooksOff: (connect: string) => string;
|
|
195
|
+
readonly commitHooksForeign: (connect: string) => string;
|
|
99
196
|
readonly credentialShadowed: "VIBECOMMIT_TOKEN is set and takes precedence over the credential saved on this machine. Unset it to use the saved one.";
|
|
100
197
|
/**
|
|
101
198
|
* `CR-228`, `TODOS[142]` — bytes the client ADVANCED PAST without delivering.
|
|
@@ -118,7 +215,7 @@ export declare const STATUS: {
|
|
|
118
215
|
* turn only when a following prompt arrives, so nothing will ever seal this one and the commits made in
|
|
119
216
|
* it cannot be recorded. States the consequence and the command; promises nothing about the commits.
|
|
120
217
|
*/
|
|
121
|
-
readonly openTail: (sessions: number) => string;
|
|
218
|
+
readonly openTail: (sessions: number, finalizeLatest: string) => string;
|
|
122
219
|
/**
|
|
123
220
|
* `TODOS[145]` — commits the client has seen and is holding because no turn has closed yet. Normal
|
|
124
221
|
* mid-session; shown as a fact, not as a fault.
|
|
@@ -189,7 +286,7 @@ export declare const STATUS: {
|
|
|
189
286
|
* cannot tell a crashed session from one idle at lunch, and closing a session still in progress seals
|
|
190
287
|
* a turn that was not actually over.
|
|
191
288
|
*/
|
|
192
|
-
readonly heldIdle: (bytes: number, sessions: number, commits: number, ids?: readonly string[]) => string;
|
|
289
|
+
readonly heldIdle: (bytes: number, sessions: number, commits: number, finalizeSession: string, ids?: readonly string[]) => string;
|
|
193
290
|
readonly fixCommandLabel: "To reconnect, run";
|
|
194
291
|
/** §10.3's two trailing actions, rendered as an aligned pair. */
|
|
195
292
|
readonly turnOffLabel: "Turn capture off for this repo";
|
|
@@ -220,7 +317,18 @@ export declare const CONNECT: {
|
|
|
220
317
|
* the nouns are transcribed rather than reworded: *"the output of commands it
|
|
221
318
|
* ran"*, never *"Bash tool results"*.
|
|
222
319
|
*/
|
|
223
|
-
readonly consentHeading: "VibeCommit uploads your
|
|
320
|
+
readonly consentHeading: "VibeCommit uploads your coding-agent transcripts for this repo.";
|
|
321
|
+
/**
|
|
322
|
+
* D23 · 17A: the picker path's heading (every `connect` that shows the picker, in a repo or not). `consentHeading`
|
|
323
|
+
* above remains only on the no-remote (`local:`) in-repo path, where there is nothing to pick (D35 · 29A: "Claude
|
|
324
|
+
* Code transcripts" understated what uploads once `connect` also wired Codex and Cursor hooks, 0.2.0).
|
|
325
|
+
*/
|
|
326
|
+
readonly consentHeadingPicker: "VibeCommit uploads your coding-agent transcripts for the repositories you choose.";
|
|
327
|
+
/**
|
|
328
|
+
* ONE sentence, not a paragraph, added on the picker path only (design doc step 2, "The disclosure"): what the grant
|
|
329
|
+
* covers beyond the repos named on screen. The four paragraphs under either heading stay byte-identical.
|
|
330
|
+
*/
|
|
331
|
+
readonly consentScope: "The choice covers future clones of these repositories too, and adds commit hooks to each clone where it can.";
|
|
224
332
|
/**
|
|
225
333
|
* ⚠ "private-repo paths" IS THE APPROVED WORDING, and it is the reason
|
|
226
334
|
* `private` is deliberately NOT registered in `claims.ts`: a substring gate on
|
|
@@ -327,11 +435,33 @@ export declare const CONNECT: {
|
|
|
327
435
|
readonly doneUrlLabel: "View this session";
|
|
328
436
|
/** The `[y/N]` suffix. The capital is the default and the default is NO. */
|
|
329
437
|
readonly consentAnswers: "[y/N]";
|
|
330
|
-
/**
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
438
|
+
/**
|
|
439
|
+
* Non-TTY refusal — DESIGN.md §13.7 exit 2, D65 §DR7. PR 6 item 6: written for an AGENT that hit it, which is who reaches
|
|
440
|
+
* this branch. It says who must answer ("a person"), that an agent cannot, and what to relay, and it carries the code
|
|
441
|
+
* `CONSENT_NEEDS_TTY` for a wrapper to key on — PR 7 registered it and renders it on the block's own code line, so it is not
|
|
442
|
+
* repeated in the sentence. No `--yes`: that would bypass consent (D65 §DR7). The `what` line has no "you" (§13.6).
|
|
443
|
+
*/
|
|
444
|
+
readonly nonInteractiveWhat: "Consent needs a person at a terminal.";
|
|
445
|
+
readonly nonInteractiveWhy: "An agent cannot answer it, and standard input is not a terminal. Nothing was read and nothing was uploaded.";
|
|
446
|
+
/** A repo with no remote has a folder to name; the label is the fix and the command follows it. */
|
|
447
|
+
readonly nonInteractiveFix: (folder: string) => string;
|
|
448
|
+
/**
|
|
449
|
+
* The picker path's refusal (VQ + VT, PR 6 item 6 fit): it names no folder (the picker is not about one repo), has no
|
|
450
|
+
* "you" in the `what` line, and is reached BEFORE the scan beat, so "Nothing was read and nothing was uploaded" stays
|
|
451
|
+
* literally true.
|
|
452
|
+
*/
|
|
453
|
+
readonly pickerNonInteractiveWhat: "Choosing repositories needs a person at a terminal.";
|
|
454
|
+
readonly pickerNonInteractiveWhy: "An agent cannot answer it, and standard input is not a terminal, so no repository can be chosen and consent cannot be asked. Nothing was read and nothing was uploaded.";
|
|
455
|
+
readonly pickerNonInteractiveFix: "Ask the user to run this in a terminal:";
|
|
334
456
|
readonly alreadyConnected: "Capture is already on for this repository.";
|
|
457
|
+
/**
|
|
458
|
+
* 0.7.0. `grants.json` is present and unreadable, which denies this repository whatever consent it has (see
|
|
459
|
+
* `consent.ts`'s `isCaptureAllowed`). Answering the consent prompt could not change that, so `connect` stops
|
|
460
|
+
* BEFORE asking rather than take a yes it cannot honour.
|
|
461
|
+
*/
|
|
462
|
+
readonly grantsUnreadableWhat: "Capture can't be turned on: ~/.vibecommit/grants.json can't be read.";
|
|
463
|
+
readonly grantsUnreadableWhy: "Capture is stopped on this machine for every repository that has a remote until the file is readable. Nothing was changed.";
|
|
464
|
+
readonly grantsUnreadableFixLabel: "Fix the file or move it aside, then run:";
|
|
335
465
|
/**
|
|
336
466
|
* The browser sign-in beat (PKCE loopback → minted ingest credential) is the
|
|
337
467
|
* oauth lane's, not this task's. Until it lands, the supported path is the one
|
|
@@ -449,12 +579,12 @@ export declare const COMMIT_HOOK: {
|
|
|
449
579
|
readonly installed: (repo: string) => string;
|
|
450
580
|
readonly chained: (repo: string) => string;
|
|
451
581
|
readonly already: "Commit capture was already on for this clone.";
|
|
452
|
-
readonly perClone:
|
|
582
|
+
readonly perClone: (connect: string) => string;
|
|
453
583
|
readonly hooksPathWhat: "Commit capture could NOT be installed for this clone.";
|
|
454
584
|
readonly hooksPathWhy: (configured: string) => string;
|
|
455
585
|
readonly hooksPathFixLabel: "Fix, either one:";
|
|
456
586
|
readonly hooksPathFixUnset: "git config --unset core.hooksPath";
|
|
457
|
-
readonly hooksPathFixManual:
|
|
587
|
+
readonly hooksPathFixManual: (postCommit: string) => string;
|
|
458
588
|
readonly failedWhat: "Commit capture could NOT be installed for this clone.";
|
|
459
589
|
readonly failedWhy: (why: string) => string;
|
|
460
590
|
};
|
|
@@ -480,7 +610,7 @@ export declare const AGENT_HOOKS: {
|
|
|
480
610
|
readonly refusedWhat: (agent: string) => string;
|
|
481
611
|
readonly refusedWhy: (path: string, why: string) => string;
|
|
482
612
|
readonly refusedFixLabel: "Fix:";
|
|
483
|
-
readonly refusedFix: (path: string) => string;
|
|
613
|
+
readonly refusedFix: (path: string, connect: string) => string;
|
|
484
614
|
readonly failedWhat: (agent: string) => string;
|
|
485
615
|
readonly failedWhy: (path: string, why: string) => string;
|
|
486
616
|
};
|
|
@@ -608,9 +738,269 @@ export declare const SIGNIN: {
|
|
|
608
738
|
readonly busyWhy: "Only one process may renew a sign-in at a time, and the one holding it did not finish. Nothing was read and the stored sign-in is unchanged.";
|
|
609
739
|
readonly busyFix: "Run it again in a moment:";
|
|
610
740
|
};
|
|
741
|
+
/**
|
|
742
|
+
* `vibecommit scan` — design review D17 · 11A, D26, D27, D33 · 27A, and the screen VQ drew for it
|
|
743
|
+
* (style guide §10.13) on 2026-10-24.
|
|
744
|
+
*
|
|
745
|
+
* ⛔ **The nouns are the agent-neutral ones** (D11 · A, D35): "coding agent", never "Claude Code
|
|
746
|
+
* session", because the scan covers three agents and the picker's heading says the same. The agent
|
|
747
|
+
* NAMES appear only on a repo's second line, where they are facts about which store a count came from.
|
|
748
|
+
*
|
|
749
|
+
* ⚠ **Every sentence here is a claims-register row** (the register is `code`'s, VR's PR). None says
|
|
750
|
+
* "every" or "all": the scan counts transcripts still on disk, and what `cleanupPeriodDays` already
|
|
751
|
+
* deleted is not among them.
|
|
752
|
+
*/
|
|
753
|
+
export declare const SCAN: {
|
|
754
|
+
/** The beat line, drawn in the existing beat shape and overwritten once with `done` (D17). */
|
|
755
|
+
readonly beat: "Looking for repositories on this machine...";
|
|
756
|
+
readonly beatDone: "done";
|
|
757
|
+
readonly found: (count: number) => string;
|
|
758
|
+
readonly sessions: (count: number) => string;
|
|
759
|
+
readonly since: (date: string) => string;
|
|
760
|
+
/** What an agent is called on a repo's second line. The ids are wire values, not labels. */
|
|
761
|
+
readonly agent: {
|
|
762
|
+
readonly "claude-code": "Claude Code";
|
|
763
|
+
readonly "codex-cli": "Codex";
|
|
764
|
+
readonly cursor: "Cursor";
|
|
765
|
+
};
|
|
766
|
+
readonly notListed: "Not listed here:";
|
|
767
|
+
readonly noRemote: (count: number, connect: string) => string;
|
|
768
|
+
/**
|
|
769
|
+
* The picker's own line (PR 1 ruling 2): ONE count and ONE line for a folder with two or more
|
|
770
|
+
* candidate paths, a hashed name (cut, so it cannot be inverted) and a deleted sibling. Claude Code's
|
|
771
|
+
* and Cursor's only — a Codex row records its real `cwd` and is never ambiguous.
|
|
772
|
+
*/
|
|
773
|
+
readonly ambiguous: (count: number) => string;
|
|
774
|
+
/** Scan-only (ruling 5a): a folder, or a Codex `cwd`, that exists but is not inside a git work tree. */
|
|
775
|
+
readonly nonRepo: (count: number) => string;
|
|
776
|
+
readonly missingFolder: (count: number) => string;
|
|
777
|
+
/**
|
|
778
|
+
* ⛔ CLAIMS ONLY WHAT GIT SHOWS (ruling 7). The test is a session's mtime against the OLDEST reflog entry,
|
|
779
|
+
* and `gc.reflogExpire` prunes a long-lived clone's oldest entries, so "older than the reflog" is the fact
|
|
780
|
+
* and "the folder was reused" is a possibility — the same repo deleted and cloned again reads the same.
|
|
781
|
+
*/
|
|
782
|
+
readonly pathReused: (count: number) => string;
|
|
783
|
+
/** One clone: the path rides the line. More: this heading, then one indented path per clone. */
|
|
784
|
+
readonly noReflogOne: (path: string) => string;
|
|
785
|
+
readonly noReflogMany: (count: number) => string;
|
|
786
|
+
/** Rollouts on disk that no index row names (ruling 5c) — counted, never opened. */
|
|
787
|
+
readonly unindexed: (count: number) => string;
|
|
788
|
+
/**
|
|
789
|
+
* `Codex sessions couldn't be read (unrecognised index)`, one line per unreadable agent (R3-15). The
|
|
790
|
+
* bracket names a cause the user can act on; a plain read failure (ruling 6) has none to name, so it
|
|
791
|
+
* gets none. The `--json` `reason` is the same three words either way.
|
|
792
|
+
*/
|
|
793
|
+
readonly unreadable: (agent: string, reason: string | null) => string;
|
|
794
|
+
readonly next: "Choose what is captured:";
|
|
795
|
+
/** Exit 4. Both screens end on the same command. */
|
|
796
|
+
readonly none: "No coding-agent sessions were found on this machine.";
|
|
797
|
+
/**
|
|
798
|
+
* Exit 4 with `Not listed here:` lines: sessions exist that could not be listed, so `none` would be
|
|
799
|
+
* untrue. `none` prints only when that block is empty, i.e. the scan saw no session at all (VQ, PR 1
|
|
800
|
+
* ruling 3).
|
|
801
|
+
*/
|
|
802
|
+
readonly noneListable: "No repository could be listed from the sessions on this machine.";
|
|
803
|
+
readonly noneNext: "Choose owners or repos anyway:";
|
|
804
|
+
};
|
|
805
|
+
/**
|
|
806
|
+
* `vibecommit backfill` — style guide §10.14, design review D14 · 8A, D15 · 9A; capture 0.7.0, PR 5.
|
|
807
|
+
*
|
|
808
|
+
* Every sentence here is a claims-register row. ⛔ Three promises it must never make: that a backfilled session is
|
|
809
|
+
* LINKED to a commit (it arrives without links, and the copy says so), that "every" or "all" earlier sessions are
|
|
810
|
+
* uploaded (only the ones still on this machine and not yet sent), and that a held session will upload by itself (no
|
|
811
|
+
* hook fires for an old session, so the held line points at a re-run).
|
|
812
|
+
*
|
|
813
|
+
* The two folder reasons are different facts (VQ ruling): `folder differs` is a RECORDED folder that is not this clone,
|
|
814
|
+
* `folder not recorded` is a transcript that records none.
|
|
815
|
+
*/
|
|
816
|
+
export declare const BACKFILL: {
|
|
817
|
+
/**
|
|
818
|
+
* Inside `connect` the repos are the ones it just showed, so "these"; run on its own there is no "these", so it names whose
|
|
819
|
+
* they are (VQ, PR 5 review).
|
|
820
|
+
*/
|
|
821
|
+
readonly offerHeading: (repos: number, standalone: boolean) => string;
|
|
822
|
+
/** The count on a repo row. "Not yet uploaded", so it is never mistaken for the picker's total on disk. */
|
|
823
|
+
readonly notYetUploaded: (count: number) => string;
|
|
824
|
+
/**
|
|
825
|
+
* Cursor sessions are not offered (Alexander, 2026-10-24 13:54 EST: Cursor's transcripts record no folder, so the
|
|
826
|
+
* folder check cannot run). One muted line, only when a repo you chose has some.
|
|
827
|
+
*/
|
|
828
|
+
readonly cursorNotUploaded: (count: number) => string;
|
|
829
|
+
/** Two lines, as §10.14 draws them. */
|
|
830
|
+
/**
|
|
831
|
+
* A session over the 50 MiB cap is left out of the count and named here, so the offer never promises an upload the run would
|
|
832
|
+
* skip on every re-run. (Sub-agent streams are not capped.)
|
|
833
|
+
*/
|
|
834
|
+
readonly overSizeNote: (count: number) => string;
|
|
835
|
+
/**
|
|
836
|
+
* A clone with no reflog cannot be tested for a reused path (a transcript older than the clone's first reflog entry), and
|
|
837
|
+
* that test is the only guard against one, so its sessions are left out of the count and named here with the clone.
|
|
838
|
+
*/
|
|
839
|
+
readonly noReflogNote: (count: number, path: string) => string;
|
|
840
|
+
readonly uploadNote: readonly ["They upload one at a time, the same way new sessions do, without", "commit links."];
|
|
841
|
+
readonly question: (sessions: number) => string;
|
|
842
|
+
/** A no. A completed consent flow (§13.7), not an error. */
|
|
843
|
+
readonly declined: (backfill: string) => string;
|
|
844
|
+
readonly nothingToUpload: "Nothing to upload: no earlier session on this machine is waiting for a repository you've chosen.";
|
|
845
|
+
readonly runHeading: (sessions: number) => string;
|
|
846
|
+
/** Outcome fragments on a repo line, joined by " · ". */
|
|
847
|
+
readonly uploaded: (count: number) => string;
|
|
848
|
+
readonly skipped: (count: number, reason: string) => string;
|
|
849
|
+
readonly held: (count: number) => string;
|
|
850
|
+
readonly failed: (count: number, reason: string) => string;
|
|
851
|
+
readonly stopped: "stopped";
|
|
852
|
+
/** Skip reasons. */
|
|
853
|
+
readonly overSize: "over 50 MiB";
|
|
854
|
+
readonly folderDiffers: "folder differs";
|
|
855
|
+
readonly folderNotRecorded: "folder not recorded";
|
|
856
|
+
/** The transcript could not be opened at all (permissions), which is a different fact from one that records no folder. */
|
|
857
|
+
readonly couldntBeRead: "couldn't be read";
|
|
858
|
+
/** The file vanished between the offer and its upload: a skip, not a refusal by the server. */
|
|
859
|
+
readonly fileGone: "the file is gone";
|
|
860
|
+
/** `vibecommit off` (or a grant removed) while the run was going: the rest of that repo is not sent. */
|
|
861
|
+
readonly turnedOff: "turned off while this ran";
|
|
862
|
+
readonly outsideAgentFolder: "not in the agent's session folder";
|
|
863
|
+
/** Failure reasons: a `never`. The server's own code is never shown (§13.6: no bare status, no raw error). */
|
|
864
|
+
readonly refusedByServer: "the server refused it";
|
|
865
|
+
readonly repositoryForbidden: "another organization owns this repository";
|
|
866
|
+
readonly noRepoIdentity: "no repository identity";
|
|
867
|
+
readonly unrecognisedFileName: "the file name isn't a session id";
|
|
868
|
+
/** The summary. The glyph is `ok` only when nothing was held, stopped or failed. */
|
|
869
|
+
readonly summary: (uploaded: number, total: number, skipped: number, held: number, failed: number) => string;
|
|
870
|
+
/** `owners` is the held repos' owners, already phrased ("acme-corp", "acme-corp or other-org"). */
|
|
871
|
+
readonly heldBlock: (owners: string) => string;
|
|
872
|
+
readonly heldThenRun: "Then run:";
|
|
873
|
+
/**
|
|
874
|
+
* The stop block: a server `later` (5xx, 429) stops the run, with the resume fix. ⛔ It states only what landed: `uploaded` is
|
|
875
|
+
* sessions the server took, not sessions looked at, and "not yet uploaded" is what a re-run will OFFER again (skipped and held
|
|
876
|
+
* sessions among them), not a promise of what it will send.
|
|
877
|
+
*/
|
|
878
|
+
readonly stopWhat: (uploaded: number, total: number) => string;
|
|
879
|
+
readonly stopWhy: (notUploaded: number) => string;
|
|
880
|
+
/** No response at all (a refused connection, a timeout): not the server asking anything. */
|
|
881
|
+
readonly stopWhyUnreachable: (notUploaded: number) => string;
|
|
882
|
+
readonly stopFixLabel: "Resume:";
|
|
883
|
+
/** Ctrl+C at the y/N or during the upload. Exit 0: capture is on. */
|
|
884
|
+
readonly interrupted: (backfill: string) => string;
|
|
885
|
+
/** Exit 3. */
|
|
886
|
+
readonly notConnectedWhat: "This machine isn't connected.";
|
|
887
|
+
readonly notConnectedWhy: "`backfill` uploads with this machine's credential, and there isn't one. Nothing was read.";
|
|
888
|
+
readonly notConnectedFixLabel: "Connect first:";
|
|
889
|
+
/** `grants.json` is present and unreadable: every repo with a remote is denied, so there is nothing honest to offer. */
|
|
890
|
+
readonly grantsUnreadableWhat: "Backfill can't run: ~/.vibecommit/grants.json can't be read.";
|
|
891
|
+
readonly grantsUnreadableWhy: "Capture is stopped on this machine for every repository that has a remote until the file is readable. Nothing was read and nothing was uploaded.";
|
|
892
|
+
readonly grantsUnreadableFixLabel: "Fix the file or move it aside, then run:";
|
|
893
|
+
/** Exit 2. A prompt that proceeds when nobody can answer it is not a prompt. */
|
|
894
|
+
readonly nonInteractiveWhat: "`backfill` needs an interactive terminal.";
|
|
895
|
+
readonly nonInteractiveWhy: "Standard input is not a terminal, so the question before uploading cannot be answered. Nothing was read and nothing was uploaded.";
|
|
896
|
+
readonly nonInteractiveFix: "Run this in a terminal:";
|
|
897
|
+
/** The credential was rejected mid-run (a 401): the same block `finalize` shows, in this verb's words. */
|
|
898
|
+
readonly credentialStoppedWhat: "Upload stopped: this machine's credential is no longer accepted.";
|
|
899
|
+
readonly credentialStoppedWhy: "Nothing already sent is lost, and a re-run offers the sessions not yet uploaded.";
|
|
900
|
+
readonly credentialStoppedFixLabel: "Renew it, then run backfill again:";
|
|
901
|
+
readonly usageWhat: "That is not something `vibecommit backfill` understands.";
|
|
902
|
+
readonly usageWhy: "Nothing was read and nothing was uploaded. `backfill` takes no arguments.";
|
|
903
|
+
};
|
|
904
|
+
/**
|
|
905
|
+
* `vibecommit connect` from any folder — the picker, the grant block, the hooks step and the endings (0.7.0, PR 3).
|
|
906
|
+
* Style guide §10.12, copied from the merged guide and the design doc; the design doc wins where they differ.
|
|
907
|
+
*/
|
|
908
|
+
export declare const PICKER: {
|
|
909
|
+
readonly onNow: "on now";
|
|
910
|
+
readonly turnedOff: "turned off";
|
|
911
|
+
/** Why an `on now` row is on (D5 · 1A), so a 0.6.x upgrader sees what is already captured. */
|
|
912
|
+
readonly reasonOwner: "owner";
|
|
913
|
+
readonly reasonRepo: "repo";
|
|
914
|
+
readonly reasonPerClone: "per clone";
|
|
915
|
+
/** The owner row ALWAYS states how many repos `aN` covers (D9), so a hidden repo is never covered unseen. */
|
|
916
|
+
readonly ownerAll: (count: number) => string;
|
|
917
|
+
readonly ownerOnReposHere: (count: number) => string;
|
|
918
|
+
readonly turnOnHint: "choose it to turn it back on";
|
|
919
|
+
/** Where the working folder is a repo, the row is marked so a pre-tick (or a `$HOME` dotfiles repo) is legible. */
|
|
920
|
+
readonly thisRepo: "this repo";
|
|
921
|
+
readonly thisFolder: "this folder";
|
|
922
|
+
readonly moreTyped: (count: number, owner: string) => string;
|
|
923
|
+
readonly moreChecklist: (count: number, owner: string) => string;
|
|
924
|
+
/** The typed prompt (D8). */
|
|
925
|
+
readonly choose: (hasOwners: boolean) => string;
|
|
926
|
+
readonly removeHint: "Remove one with -N, -owner/ or -owner/repo.";
|
|
927
|
+
readonly enterNothing: "Press Enter to change nothing.";
|
|
928
|
+
/** D34 in the typed prompt: the working folder's repo is pre-selected, so Enter leads to the (default No) y/N. */
|
|
929
|
+
readonly enterThisRepo: (slug: string) => string;
|
|
930
|
+
readonly promptMark: "> ";
|
|
931
|
+
/** `tokens` is the already-joined list (`9 (no row 9), acme, corp`): the corpus renders every template with a string. */
|
|
932
|
+
readonly notUnderstood: (tokens: string) => string;
|
|
933
|
+
readonly noRow: (n: string) => string;
|
|
934
|
+
readonly alreadyOn: (token: string, remove: string) => string;
|
|
935
|
+
readonly notOn: (token: string) => string;
|
|
936
|
+
/** The empty screen (D12 · 6A): a new laptop, no agent session on disk at all. */
|
|
937
|
+
readonly emptyNone: "No coding-agent sessions were found on this machine.";
|
|
938
|
+
readonly emptyExpected: "That's expected on a new machine. Type the owners or repos to capture; every clone of them is captured once Claude Code, Codex or Cursor runs in it.";
|
|
939
|
+
readonly emptyType: "Type owner/ or owner/repo, for example alexvibecommit/.";
|
|
940
|
+
/** Sessions exist but none could be listed (the `Not listed here:` block is not empty): scan's own wording. */
|
|
941
|
+
readonly emptyListable: "Type owner/ or owner/repo, for example alexvibecommit/, to capture a repository that is not listed.";
|
|
942
|
+
/** The checklist (D28). */
|
|
943
|
+
readonly hint: "↑↓ move · space choose · enter done · t typed prompt · ctrl+c cancel";
|
|
944
|
+
readonly hintTyped: (connectTyped: string) => string;
|
|
945
|
+
/** The enter-with-nothing lines (D5). */
|
|
946
|
+
readonly nothingGranted: (connect: string) => string;
|
|
947
|
+
readonly noChanges: (summary: string) => string;
|
|
948
|
+
readonly cancelled: "Cancelled. Nothing was changed.";
|
|
949
|
+
/** The grant block (D7 · 3A). */
|
|
950
|
+
readonly chose: "You chose:";
|
|
951
|
+
readonly labelOwners: "owners";
|
|
952
|
+
readonly labelRepos: "repos";
|
|
953
|
+
readonly labelTurnOn: "turn on";
|
|
954
|
+
readonly labelStop: "stop";
|
|
955
|
+
readonly ownerHere: (count: number) => string;
|
|
956
|
+
readonly noCloneHere: "(no clone here yet)";
|
|
957
|
+
readonly questionGrant: "Upload transcripts from these repositories?";
|
|
958
|
+
readonly questionStop: "Stop capturing these repositories?";
|
|
959
|
+
readonly stopped: "Stopped capturing the repositories above.";
|
|
960
|
+
/** "1 owner and 2 repos" — the on-now summary of Enter-with-grants, `auth`'s one line and the status heading. */
|
|
961
|
+
readonly summary: (owners: number, repos: number) => string;
|
|
962
|
+
readonly authStays: (summary: string) => string;
|
|
963
|
+
/** The hooks step (D13 · 7A). */
|
|
964
|
+
readonly hooksBeat: (clones: number) => string;
|
|
965
|
+
readonly hooksDone: "done";
|
|
966
|
+
readonly hooksCount: (added: number, chained: number, notAdded: number) => string;
|
|
967
|
+
readonly hooksNotAdded: (count: number) => string;
|
|
968
|
+
readonly hooksPathReason: "core.hooksPath is set";
|
|
969
|
+
/** A hook write that FAILED is a real exception with its own reason (VQ, item 9): neither dropped nor given `hooksPath`'s fix. */
|
|
970
|
+
readonly hooksFailedReason: "the hook could not be written";
|
|
971
|
+
readonly hooksStillCaptured: "Sessions there are still captured. To record commits too, either:";
|
|
972
|
+
readonly hooksStillCapturedOther: "Sessions there are still captured.";
|
|
973
|
+
readonly hooksFailedFixLabel: "Where the hook could not be written, try again:";
|
|
974
|
+
/** "Capture is on" (D18 · 12A, D19 · 13A). */
|
|
975
|
+
readonly onFor: (summary: string) => string;
|
|
976
|
+
readonly onProof: "The next Claude Code, Codex or Cursor session in any of them is captured. In Claude Code, its first reply then shows \"VibeCommit captured this session.\"";
|
|
977
|
+
readonly stopOne: "To stop one repo, run inside it:";
|
|
978
|
+
/**
|
|
979
|
+
* Alexander's "caveat for other owners" (2026-10-24; amended 17:20), on the "Capture is on" block. It prints for the owners the
|
|
980
|
+
* test capture did NOT check: from `~` that is every granted owner (there is no session to probe), and in a repo it is every
|
|
981
|
+
* granted owner except the one whose delta the server answered with a 2xx. For an owner that is not the signed-in person's own
|
|
982
|
+
* account the client cannot know whether an org is yet to approve capture, so it says one may be. Never printed when every
|
|
983
|
+
* such owner is the user's own account.
|
|
984
|
+
*/
|
|
985
|
+
readonly ownerApproval: (status: string) => string;
|
|
986
|
+
readonly onNewLaptop: (names: string) => string;
|
|
987
|
+
readonly onNewLaptopProof: "No clone of it is here yet. Clone one and open a coding agent in it; that session is captured.";
|
|
988
|
+
};
|
|
611
989
|
/** `vibecommit off`. */
|
|
612
990
|
export declare const OFF: {
|
|
613
991
|
readonly done: "Capture is off for this repository.";
|
|
992
|
+
/**
|
|
993
|
+
* 0.7.0, a claims-register row. A repo with a remote is turned off BY SLUG, which reaches every clone of it on this
|
|
994
|
+
* machine. Slice 2 extends the sentence to the other machines once they sync; until then it says only what is true.
|
|
995
|
+
*/
|
|
996
|
+
readonly doneSlug: (slug: string) => string;
|
|
997
|
+
/** D31: bare `off` outside a repository. The picker is where an owner or another repo is unticked. */
|
|
998
|
+
readonly outsideRepoWhat: "`off` turns off the repository you're in.";
|
|
999
|
+
readonly outsideRepoFixLabel: "To stop capturing an owner or another repo, untick it in the picker:";
|
|
1000
|
+
/** `grants.json` is unreadable, so the exclusion could not be recorded. The clone's own consent was still withdrawn. */
|
|
1001
|
+
readonly grantsUnreadableWhat: "The turn-off could not be recorded: ~/.vibecommit/grants.json can't be read.";
|
|
1002
|
+
readonly grantsUnreadableWhy: "Capture is already stopped for this repository while the file can't be read, and this clone's own consent was withdrawn.";
|
|
1003
|
+
readonly grantsUnreadableFixLabel: "Fix the file or move it aside, then run:";
|
|
614
1004
|
readonly alreadyOff: "Capture was already off for this repository.";
|
|
615
1005
|
readonly note: "Sessions already recorded are unaffected.";
|
|
616
1006
|
readonly unrecognizedArgWhat: "That is not something `vibecommit off` understands.";
|
|
@@ -892,7 +1282,10 @@ export declare const WHY: {
|
|
|
892
1282
|
*/
|
|
893
1283
|
readonly skewWhat: "The record service sent an answer this version is too old to show.";
|
|
894
1284
|
readonly skewWhy: "The service described this commit in a way this build does not recognise. The record itself is fine — this copy of the client cannot render it, so it showed nothing rather than guessing at part of it.";
|
|
1285
|
+
/** The PLUGIN channel's remedy (`COMMANDS.pluginInstall`). */
|
|
895
1286
|
readonly skewFix: "Reinstall the VibeCommit plugin to pick up the current client, then run this again:";
|
|
1287
|
+
/** The npm channel's remedy (`COMMANDS.npmUpdate`): an npm install has no plugin to reinstall. */
|
|
1288
|
+
readonly skewFixNpm: "Update VibeCommit to pick up the current client, then run this again:";
|
|
896
1289
|
/** The bearer is dead after one refresh and one retry. Exit 3, not 1. */
|
|
897
1290
|
readonly signedOutWhat: "This machine is not signed in to VibeCommit.";
|
|
898
1291
|
readonly signedOutWhy: "Reading a record needs a signed-in user, and no usable sign-in was found on this machine.";
|
|
@@ -1277,20 +1670,42 @@ export declare const ABSENCE: {
|
|
|
1277
1670
|
* know were bound: `closed` says the last turn is recorded, not that any commit matched it.
|
|
1278
1671
|
*/
|
|
1279
1672
|
export declare const FINALIZE: {
|
|
1280
|
-
readonly needTarget: "Say which session to close
|
|
1673
|
+
readonly needTarget: "Say which session to close.";
|
|
1674
|
+
readonly needTargetFix: "Name one, or take the latest:";
|
|
1281
1675
|
readonly badSessionId: "That is not a session id (letters, digits, dot, dash and underscore only).";
|
|
1282
|
-
readonly noRecentSession: "No session in this repository has delivered anything in the last 24 hours.
|
|
1283
|
-
readonly
|
|
1676
|
+
readonly noRecentSession: "No session in this repository has delivered anything in the last 24 hours.";
|
|
1677
|
+
readonly noRecentSessionFix: "Name a session:";
|
|
1678
|
+
readonly severalRecent: "More than one session in this repository is recent.";
|
|
1679
|
+
readonly severalRecentFix: "Name one:";
|
|
1680
|
+
/** `finalize --session <id>` for a session that is known, e.g. the one whose delivery just failed. */
|
|
1681
|
+
readonly commandSession: (id: string) => string;
|
|
1682
|
+
/** The same with the placeholder, for a fix line written before a session is known. */
|
|
1683
|
+
readonly commandSessionAny: "vibecommit finalize --session <id>";
|
|
1684
|
+
/** The command without its id, for a sentence that names the id itself (`status`'s held-idle line). */
|
|
1685
|
+
readonly commandSessionBase: "vibecommit finalize --session";
|
|
1686
|
+
readonly commandSessionForce: (id: string) => string;
|
|
1284
1687
|
readonly recentRow: (id: string, minutesAgo: number) => string;
|
|
1285
1688
|
readonly unknownSession: (id: string) => string;
|
|
1286
1689
|
readonly transcriptMissing: (id: string) => string;
|
|
1287
|
-
readonly stillWriting: "That session's transcript changed a moment ago.
|
|
1690
|
+
readonly stillWriting: "That session's transcript changed a moment ago.";
|
|
1691
|
+
readonly stillWritingFix: "Wait for the session to finish, or if it is over, run:";
|
|
1288
1692
|
readonly closed: (id: string) => string;
|
|
1289
1693
|
readonly alreadyClosed: (id: string) => string;
|
|
1290
1694
|
readonly notAcknowledged: "The server accepted the data but did not confirm that it closed the session; it may predate this command. The last turn may still be open.";
|
|
1291
|
-
readonly refused: "The server declined to close the session on this attempt.
|
|
1292
|
-
readonly
|
|
1293
|
-
readonly
|
|
1695
|
+
readonly refused: "The server declined to close the session on this attempt.";
|
|
1696
|
+
readonly retryFix: "Run it again:";
|
|
1697
|
+
readonly notDelivered: "Could not deliver the session. Nothing was closed.";
|
|
1698
|
+
readonly credentialStopped: "VibeCommit stopped sending for this credential.";
|
|
1699
|
+
readonly credentialStoppedFix: "Replace it:";
|
|
1700
|
+
/**
|
|
1701
|
+
* PR 7 (Q2, VQ's wording): the ingest address in the environment (`VIBECOMMIT_INGEST_URL`) is one this client refuses to
|
|
1702
|
+
* send to, so retrying cannot help. Shared by `finalize` and `backfill`, so the `why` says only "Nothing was sent": it must
|
|
1703
|
+
* not claim a session was or was not closed. The VALUE is never echoed (a URL can carry a secret).
|
|
1704
|
+
*/
|
|
1705
|
+
readonly ingestUrlWhat: "The address VibeCommit sends sessions to can't be used.";
|
|
1706
|
+
readonly ingestUrlWhy: "VIBECOMMIT_INGEST_URL must be an https address, or an http address on this machine, and it isn't. Nothing was sent.";
|
|
1707
|
+
readonly ingestUrlFix: "Correct it, or remove it to use the default address:";
|
|
1708
|
+
readonly ingestUrlCommand: "unset VIBECOMMIT_INGEST_URL";
|
|
1294
1709
|
/**
|
|
1295
1710
|
* `TODOS[177]` follow-up (VL, 2026-10-08, VG's silent-loss finding) — ONE stderr line for the whole run when
|
|
1296
1711
|
* `finalize` sets any inferred-squash pairs aside (the main delivery, the drain loop, or both, summed). Printed
|
|
@@ -1318,8 +1733,8 @@ export declare const REJECTED: {
|
|
|
1318
1733
|
* command across lines; `unconfirmed` is their join, the sentence the plan wrote.
|
|
1319
1734
|
*/
|
|
1320
1735
|
readonly unconfirmedWhat: "Couldn't confirm this machine's credential with the server.";
|
|
1321
|
-
readonly unconfirmedFix:
|
|
1322
|
-
readonly unconfirmed:
|
|
1736
|
+
readonly unconfirmedFix: (status: string) => string;
|
|
1737
|
+
readonly unconfirmed: (status: string) => string;
|
|
1323
1738
|
};
|
|
1324
1739
|
/** `TODOS[184]`-style one-sentence facts the retire step prints; every one is true whatever the server did. */
|
|
1325
1740
|
export declare const RETIRE: {
|
|
@@ -1351,6 +1766,12 @@ export declare const REPLACE: {
|
|
|
1351
1766
|
readonly questionUnconfirmed: "Upload this machine's transcripts to the workspace you signed in to?";
|
|
1352
1767
|
readonly replacesValue: (org: string) => string;
|
|
1353
1768
|
readonly question: (org: string) => string;
|
|
1769
|
+
/**
|
|
1770
|
+
* 0.7.0, D7 · 3A: on the PICKER path the question names the repos, not the machine, and is the second of at most three
|
|
1771
|
+
* questions in a run. The workspace is cut to 28 columns (not `question`'s 30) so the line stays within 80 with `[y/N]`.
|
|
1772
|
+
*/
|
|
1773
|
+
readonly questionRepos: (org: string) => string;
|
|
1774
|
+
readonly questionReposUnconfirmed: "Upload transcripts from the repos above to your signed-in workspace?";
|
|
1354
1775
|
readonly declined: "Nothing was saved. The approval is discarded.";
|
|
1355
1776
|
/** Ctrl+C at the question (the prompt was aborted): the same outcome as N, said as what it was. */
|
|
1356
1777
|
readonly cancelled: "Cancelled. Nothing was saved.";
|
|
@@ -1445,11 +1866,17 @@ export declare const UPDATE: {
|
|
|
1445
1866
|
readonly plugin: (latest: string) => string;
|
|
1446
1867
|
};
|
|
1447
1868
|
export declare const ERRORS: {
|
|
1448
|
-
readonly notConnected: "This repository is not connected.
|
|
1869
|
+
readonly notConnected: "This repository is not connected.";
|
|
1870
|
+
/** PR 7 (Q7): the remedy was a sentence inside the `what` line; it is a command now, so it moves to the fix block. */
|
|
1871
|
+
readonly notConnectedFix: "Connect it:";
|
|
1449
1872
|
readonly networkLater: "Could not reach VibeCommit. This session will be recorded on the next turn.";
|
|
1450
1873
|
readonly authFatal: "This machine's credential is no longer accepted.";
|
|
1451
1874
|
readonly payloadNever: "This session was too large to record and has been skipped.";
|
|
1452
1875
|
readonly notAGitRepo: "Not a git repository.";
|
|
1876
|
+
/** PR 7 (VQ): names the folder, tilde-shortened and cut from the LEFT by the caller (`truncatePath`, §13.4). */
|
|
1877
|
+
readonly notAGitRepoWhy: (folder: string) => string;
|
|
1878
|
+
/** A fix with no command to give: the remedy is where to run it, so the block has a label and no commands. */
|
|
1879
|
+
readonly notAGitRepoFix: "Run it again inside a git repository.";
|
|
1453
1880
|
};
|
|
1454
1881
|
/**
|
|
1455
1882
|
* The interactive top-level catch (CR-022).
|
|
@@ -1469,7 +1896,7 @@ export declare const INTERNAL: {
|
|
|
1469
1896
|
readonly unexpectedWhat: "VibeCommit stopped on an unexpected error.";
|
|
1470
1897
|
readonly unexpectedWhy: "The command did not finish.";
|
|
1471
1898
|
readonly unexpectedFix: "Run it again with the error detail shown:";
|
|
1472
|
-
readonly unexpectedDebugCommand:
|
|
1899
|
+
readonly unexpectedDebugCommand: (command: string) => string;
|
|
1473
1900
|
};
|
|
1474
1901
|
/**
|
|
1475
1902
|
* Credential-loading failures (CR-016).
|
|
@@ -1497,6 +1924,10 @@ export declare const CREDENTIAL: {
|
|
|
1497
1924
|
readonly insecureFileModeLabel: "mode";
|
|
1498
1925
|
readonly insecureFileWhy: "It was not read. A credential file must be readable only by its owner.";
|
|
1499
1926
|
readonly insecureFileFix: "Restore the mode, then reconnect:";
|
|
1927
|
+
/** The FOLDER (`~/.vibecommit`) is open to other accounts, not the file: same code, its own what, why and `chmod`. */
|
|
1928
|
+
readonly insecureDirWhat: "The folder that holds the credential file is open to other accounts on this machine.";
|
|
1929
|
+
readonly insecureDirWhyLabel: "folder";
|
|
1930
|
+
readonly insecureDirWhy: "The credential was not read. This folder must be accessible only to its owner.";
|
|
1500
1931
|
readonly unreadableWhat: "The credential file could not be read.";
|
|
1501
1932
|
readonly unreadableWhy: "It exists but does not contain a credential in the expected form.";
|
|
1502
1933
|
/** `CR-216/U4`. Was "Replace it by reconnecting:" — see `wrongClassFix` above. */
|
|
@@ -1530,15 +1961,26 @@ export declare const AUTH: {
|
|
|
1530
1961
|
readonly nextCommand: "vibecommit connect";
|
|
1531
1962
|
readonly emptyWhat: "No credential was given.";
|
|
1532
1963
|
readonly emptyWhy: "Nothing was read, so nothing was written.";
|
|
1533
|
-
|
|
1964
|
+
/**
|
|
1965
|
+
* PR 6 item 1. Was "Mint one, then run:" over the URL alone, so the label promised a command and printed a link, and the
|
|
1966
|
+
* non-interactive path was named nowhere. The URL comes FIRST (inside the label, where it cannot be wrapped away from
|
|
1967
|
+
* its sentence) and the commands LAST, so the fix stays last (§13.6). A function because `URLS` is declared below.
|
|
1968
|
+
*/
|
|
1969
|
+
readonly mintFix: (url: string) => string;
|
|
1970
|
+
/**
|
|
1971
|
+
* The two ways to hand it over: piped (a script or an agent), or typed at a terminal. `--stdin` never continues into `connect`
|
|
1972
|
+
* (D32 guard 1). `auth` is `authCommandFor(env, selfPath)`: a plugin-only machine has no `vibecommit` on PATH, so the line names
|
|
1973
|
+
* `node <path> auth` there (README, "Keeping a machine connected"), and handing it `vibecommit auth` would be a new wrong output.
|
|
1974
|
+
*/
|
|
1975
|
+
readonly mintCommands: (auth: string) => readonly string[];
|
|
1534
1976
|
readonly wrongClassWhat: "That is not a VibeCommit ingest credential.";
|
|
1535
1977
|
readonly wrongClassWhy: "An ingest credential begins vcik_. Nothing was written and nothing was sent.";
|
|
1536
|
-
readonly wrongClassFix: "Mint one, then run:";
|
|
1537
1978
|
readonly argvWhat: "A credential must not be passed as an argument.";
|
|
1538
1979
|
readonly argvWhy: "Arguments are written to your shell history and are readable by other processes on this machine while the command runs. Treat the one you just typed as exposed and revoke it.";
|
|
1539
1980
|
readonly argvFix: "Read it from the terminal, or from a pipe:";
|
|
1540
1981
|
readonly argvFixPrompt: "vibecommit auth";
|
|
1541
|
-
|
|
1982
|
+
/** A pipe, so `channelCommand` cannot rewrite it: it takes the channel's `auth` (`authCommandFor`) instead. */
|
|
1983
|
+
readonly argvFixStdin: (auth: string) => string;
|
|
1542
1984
|
/**
|
|
1543
1985
|
* Printed before the request, naming the label the credential will carry in
|
|
1544
1986
|
* `/app/settings` — the list a user revokes from, so the name they will look
|
|
@@ -1628,6 +2070,18 @@ export declare const SYSTEM_MESSAGE: {
|
|
|
1628
2070
|
* users and its hash chain detects post-write tampering").
|
|
1629
2071
|
*/
|
|
1630
2072
|
readonly captureConfirmed: (dashboardUrl: string) => string;
|
|
2073
|
+
/**
|
|
2074
|
+
* States 6-9 — style guide §10.1 (0.7.0, design review D16 · 10A), all emitted by the `SessionStart` hook. One
|
|
2075
|
+
* plain-text line each, ≤120 characters, no SGR. The wording is the design doc's and the merged style guide's,
|
|
2076
|
+
* byte for byte; `test/session-start.test.ts` pins the length of every one.
|
|
2077
|
+
*
|
|
2078
|
+
* 6 — hooks added, once per clone. 7 — `core.hooksPath` is set, once per clone. 8 — the clone has its own
|
|
2079
|
+
* commit hook, once per clone. 9 — `grants.json` is unreadable, once per (machine, day).
|
|
2080
|
+
*/
|
|
2081
|
+
readonly hooksAdded: "VibeCommit added its post-commit and post-rewrite hooks to this clone, so commits can link to sessions.";
|
|
2082
|
+
readonly hooksPathSet: "VibeCommit captures sessions here, not commits: core.hooksPath is set. Run `vibecommit status` here for the fix.";
|
|
2083
|
+
readonly ownCommitHook: "VibeCommit didn't add its commit hook here: this clone has its own. Run `vibecommit connect` here to chain it.";
|
|
2084
|
+
readonly grantsUnreadable: "VibeCommit capture stopped on this machine: ~/.vibecommit/grants.json can't be read. Run `vibecommit status`.";
|
|
1631
2085
|
};
|
|
1632
2086
|
/**
|
|
1633
2087
|
* The out-of-tree redaction marker — `CR-024d`, D57 §OV8d.
|
|
@@ -1658,6 +2112,10 @@ export declare const REDACTION: {
|
|
|
1658
2112
|
/** Commands the copy points at. One definition, so a rename cannot half-land. */
|
|
1659
2113
|
export declare const COMMANDS: {
|
|
1660
2114
|
readonly connect: "vibecommit connect";
|
|
2115
|
+
/** `D33 · 27A`. */
|
|
2116
|
+
readonly scan: "vibecommit scan";
|
|
2117
|
+
/** `D14`/`D15`. */
|
|
2118
|
+
readonly backfill: "vibecommit backfill";
|
|
1661
2119
|
/**
|
|
1662
2120
|
* `CR-216/U2`. The only verb a credential FAULT's fix line may name — it can
|
|
1663
2121
|
* replace the credential from any state. `CR-226` lets `connect` mint one
|
|
@@ -1678,6 +2136,10 @@ export declare const COMMANDS: {
|
|
|
1678
2136
|
/** The ref form, for the detached-HEAD refusal. */
|
|
1679
2137
|
readonly reportRef: "vibecommit report --since 2026-07-08 --ref main";
|
|
1680
2138
|
readonly off: "vibecommit off";
|
|
2139
|
+
/** The picker's screen-reader flag: a FLAG on `connect`, like `signIn`. */
|
|
2140
|
+
readonly connectTyped: "vibecommit connect --typed";
|
|
2141
|
+
/** The git hook's own verb. `hooksPathFixManual` tells a user to add it to a hook they keep. */
|
|
2142
|
+
readonly postCommit: "vibecommit post-commit";
|
|
1681
2143
|
/**
|
|
1682
2144
|
* `CR-086`. The ARGUMENT SHAPE, shown once so the usage error and the retry
|
|
1683
2145
|
* fix line cannot drift apart. There is no argument parser in this package —
|
|
@@ -1688,6 +2150,8 @@ export declare const COMMANDS: {
|
|
|
1688
2150
|
*/
|
|
1689
2151
|
readonly why: "vibecommit why src/auth/session.ts:47";
|
|
1690
2152
|
readonly chmodCredentials: "chmod 600 ~/.vibecommit/credentials.json";
|
|
2153
|
+
/** The folder's remedy, for `CREDENTIAL_FILE_INSECURE` when the folder is the one with the wrong mode. */
|
|
2154
|
+
readonly chmodDirectory: "chmod 700 ~/.vibecommit";
|
|
1691
2155
|
/**
|
|
1692
2156
|
* ⛔ THE INSTALL COMMAND, TRANSCRIBED FROM `claude-plugin/README.md:12` — and
|
|
1693
2157
|
* it is deliberately NOT an invented update verb (`U1`, 2026-08-30).
|
|
@@ -1705,6 +2169,8 @@ export declare const COMMANDS: {
|
|
|
1705
2169
|
* together — the wording and the command are one unit.
|
|
1706
2170
|
*/
|
|
1707
2171
|
readonly pluginInstall: "/plugin install vibecommit@vibecommit-capture";
|
|
2172
|
+
/** The npm channel's way to a newer client: the package's own documented install, at `latest`. */
|
|
2173
|
+
readonly npmUpdate: "npm install -g @vibe-commit/capture@latest";
|
|
1708
2174
|
};
|
|
1709
2175
|
/**
|
|
1710
2176
|
* Every URL the CLI prints. Here rather than inline for the same reason as the
|
|
@@ -1726,6 +2192,8 @@ export declare const URLS: {
|
|
|
1726
2192
|
* deepening this constant is that task's, not a later guess.
|
|
1727
2193
|
*/
|
|
1728
2194
|
readonly commits: "https://vibecommit.ai/app/commits";
|
|
2195
|
+
/** `/app/conversations`: where an uploaded backfill lands (D19). `/app` (`dashboard`) is the ending after a no. */
|
|
2196
|
+
readonly conversations: "https://vibecommit.ai/app/conversations";
|
|
1729
2197
|
/**
|
|
1730
2198
|
* One recorded session — the ending's link when the ingest 2xx carried a `conversation_id` (`DX D8`).
|
|
1731
2199
|
* Verified by file: `vibecommit-web` `app/app/conversations/[id]/page.tsx` exists on `main`, and an
|