@vibe-commit/capture 0.6.1 → 0.8.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 +191 -9
- package/dist/account_not_here.d.ts +15 -0
- package/dist/account_not_here.js +25 -0
- package/dist/account_not_here.js.map +1 -0
- 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.d.ts +7 -0
- package/dist/commands/auth.js +52 -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 +6 -2
- package/dist/commands/browser_credential.js +34 -14
- package/dist/commands/browser_credential.js.map +1 -1
- package/dist/commands/connect.d.ts +146 -0
- package/dist/commands/connect.js +216 -117
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect_account.d.ts +135 -0
- package/dist/commands/connect_account.js +321 -0
- package/dist/commands/connect_account.js.map +1 -0
- package/dist/commands/connect_picker.d.ts +27 -0
- package/dist/commands/connect_picker.js +549 -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 +5 -1
- package/dist/commands/device_credential.js +17 -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 +30 -6
- package/dist/commands/finish_mint.js +26 -6
- 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.d.ts +19 -1
- package/dist/commands/status.js +232 -26
- 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 +27 -0
- package/dist/commands/status_machine.js +210 -0
- package/dist/commands/status_machine.js.map +1 -0
- package/dist/commands/sync_reason.d.ts +17 -0
- package/dist/commands/sync_reason.js +25 -0
- package/dist/commands/sync_reason.js.map +1 -0
- package/dist/commands/why.js +44 -31
- package/dist/commands/why.js.map +1 -1
- package/dist/consent.d.ts +217 -0
- package/dist/consent.js +400 -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 +617 -30
- package/dist/copy/strings.js +741 -36
- 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/grants_sync.d.ts +165 -0
- package/dist/grants_sync.js +289 -0
- package/dist/grants_sync.js.map +1 -0
- package/dist/grants_verb.d.ts +70 -0
- package/dist/grants_verb.js +121 -0
- package/dist/grants_verb.js.map +1 -0
- package/dist/hooks/entry.d.ts +18 -1
- package/dist/hooks/entry.js +117 -14
- 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_grants.d.ts +59 -0
- package/dist/hooks/session_grants.js +91 -0
- package/dist/hooks/session_grants.js.map +1 -0
- package/dist/hooks/session_start.d.ts +114 -0
- package/dist/hooks/session_start.js +243 -0
- package/dist/hooks/session_start.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +76 -11
- 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/retire.d.ts +10 -0
- package/dist/oauth/retire.js +13 -0
- package/dist/oauth/retire.js.map +1 -1
- 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 +70 -0
- package/dist/paths.js +90 -0
- package/dist/paths.js.map +1 -1
- package/dist/pending_revoke.d.ts +117 -0
- package/dist/pending_revoke.js +233 -0
- package/dist/pending_revoke.js.map +1 -0
- package/dist/pending_revoke_file.d.ts +55 -0
- package/dist/pending_revoke_file.js +74 -0
- package/dist/pending_revoke_file.js.map +1 -0
- package/dist/picker.d.ts +208 -0
- package/dist/picker.js +526 -0
- package/dist/picker.js.map +1 -0
- package/dist/picker_checklist.d.ts +141 -0
- package/dist/picker_checklist.js +411 -0
- package/dist/picker_checklist.js.map +1 -0
- package/dist/policy.d.ts +70 -1
- package/dist/policy.js +68 -2
- package/dist/policy.js.map +1 -1
- package/dist/post.d.ts +91 -18
- package/dist/post.js +259 -27
- 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 +32 -2
- package/dist/system_message.js +47 -5
- 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
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The arrow-key checklist — style guide §10.12 "The arrow-key checklist", design review D28 · 22B.
|
|
3
|
+
*
|
|
4
|
+
* Two halves, so the interesting one is testable without a terminal:
|
|
5
|
+
*
|
|
6
|
+
* - `initChecklist` / `step` / `renderFrame` are PURE: a state, a key, a frame. `test/picker-checklist.test.ts` drives
|
|
7
|
+
* them with synthetic keys, which is the "keypress-driven state test" the design asks for (the frames themselves are
|
|
8
|
+
* not golden-tested; the static `You chose:` block that replaces them is).
|
|
9
|
+
* - `runChecklist` is the thin driver: raw mode, `keypress` events, the redraw, and the exits.
|
|
10
|
+
*
|
|
11
|
+
* ## ⛔ Raw mode is the one terminal state this changes, and it is restored on EVERY exit path
|
|
12
|
+
*
|
|
13
|
+
* Confirm, Ctrl+C, `t`, a throw inside the handler, `SIGTERM`/`SIGINT`/`SIGHUP`, and a process `exit` that nothing here
|
|
14
|
+
* caused. The last is the net under the others: a raw-mode terminal left behind is a shell that echoes nothing. No
|
|
15
|
+
* hide-cursor, no alternate screen, no position query (DESIGN.md §13.2 `CURSOR` is the whole set), so there is nothing
|
|
16
|
+
* else to undo. ⚠ A signal handler restores first and only THEN lets the default termination run.
|
|
17
|
+
*
|
|
18
|
+
* Redraw happens on a keypress and only on a keypress (§13.8): an idle list emits zero bytes.
|
|
19
|
+
*/
|
|
20
|
+
import type { EventEmitter } from "node:events";
|
|
21
|
+
import type { Writable } from "node:stream";
|
|
22
|
+
import { type AccountRow, type OnNowRow, type OwnerGroup, type PickRepo, type PickerChange, type PickerModel, type TurnedOffRow } from "./picker.js";
|
|
23
|
+
export type ChecklistRow = {
|
|
24
|
+
readonly id: string;
|
|
25
|
+
readonly kind: "on";
|
|
26
|
+
readonly row: OnNowRow;
|
|
27
|
+
} | {
|
|
28
|
+
readonly id: string;
|
|
29
|
+
readonly kind: "all";
|
|
30
|
+
readonly group: OwnerGroup;
|
|
31
|
+
} | {
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly kind: "repo";
|
|
34
|
+
readonly repo: PickRepo;
|
|
35
|
+
readonly group: OwnerGroup;
|
|
36
|
+
} | {
|
|
37
|
+
readonly id: string;
|
|
38
|
+
readonly kind: "more";
|
|
39
|
+
readonly group: OwnerGroup;
|
|
40
|
+
readonly hidden: number;
|
|
41
|
+
} | {
|
|
42
|
+
readonly id: string;
|
|
43
|
+
readonly kind: "account";
|
|
44
|
+
readonly row: AccountRow;
|
|
45
|
+
} | {
|
|
46
|
+
readonly id: string;
|
|
47
|
+
readonly kind: "off";
|
|
48
|
+
readonly row: TurnedOffRow;
|
|
49
|
+
};
|
|
50
|
+
export interface ChecklistState {
|
|
51
|
+
readonly cursor: string;
|
|
52
|
+
/** Ticked row ids. `on:` rows start ticked (D31); a pre-ticked repo is ticked here too, but never in the baseline. */
|
|
53
|
+
readonly ticked: ReadonlySet<string>;
|
|
54
|
+
/** Owners whose `+ N more` row has been expanded in place. */
|
|
55
|
+
readonly expanded: ReadonlySet<string>;
|
|
56
|
+
}
|
|
57
|
+
/** The selectable rows in screen order, given what is expanded. */
|
|
58
|
+
export declare function checklistRows(model: PickerModel, expanded: ReadonlySet<string>): ChecklistRow[];
|
|
59
|
+
export declare function initChecklist(model: PickerModel): ChecklistState;
|
|
60
|
+
export type Key = {
|
|
61
|
+
readonly name: "up" | "down" | "space" | "return" | "t" | "g" | "ctrl-c" | "other";
|
|
62
|
+
};
|
|
63
|
+
export type StepResult = {
|
|
64
|
+
readonly kind: "state";
|
|
65
|
+
readonly state: ChecklistState;
|
|
66
|
+
} | {
|
|
67
|
+
readonly kind: "done";
|
|
68
|
+
readonly change: PickerChange;
|
|
69
|
+
} | {
|
|
70
|
+
readonly kind: "typed";
|
|
71
|
+
}
|
|
72
|
+
/** `g` (slice 2): use the repositories the account already grants. Only where it was offered. */
|
|
73
|
+
| {
|
|
74
|
+
readonly kind: "account";
|
|
75
|
+
} | {
|
|
76
|
+
readonly kind: "cancel";
|
|
77
|
+
};
|
|
78
|
+
/** A repo under a ticked `all` row is covered, so it reads as ticked and is not separately togglable. */
|
|
79
|
+
export declare function isCovered(state: ChecklistState, row: ChecklistRow): boolean;
|
|
80
|
+
export declare function step(model: PickerModel, state: ChecklistState, key: Key,
|
|
81
|
+
/** `g` is a key only where the picker offered it (no credential, a terminal, a browser); anywhere else it does nothing. */
|
|
82
|
+
options?: {
|
|
83
|
+
readonly offerAccount?: boolean;
|
|
84
|
+
}): StepResult;
|
|
85
|
+
/**
|
|
86
|
+
* What the ticks change against the baseline (the `on now` rows, ticked). An `on` row unticked is a removal; an `all` row
|
|
87
|
+
* ticked an owner grant; a repo ticked, with its owner not ticked, a repo grant; an `off` row ticked a re-include. A
|
|
88
|
+
* pre-ticked repo is an addition like any other: Enter on it reaches the y/N, never a grant (D34).
|
|
89
|
+
*/
|
|
90
|
+
export declare function changeOf(model: PickerModel, state: ChecklistState): PickerChange;
|
|
91
|
+
/** The frame, as lines. The cursor row is `strong` and marked `›`; no reverse video, no fill (§13.1). */
|
|
92
|
+
export declare function renderFrame(model: PickerModel, state: ChecklistState, options: {
|
|
93
|
+
readonly colour: boolean;
|
|
94
|
+
readonly nowMs: number;
|
|
95
|
+
readonly typedCommand: string;
|
|
96
|
+
readonly offerAccount?: boolean;
|
|
97
|
+
}): string[];
|
|
98
|
+
/** The slice of a TTY input stream the driver uses. A test supplies a fake. */
|
|
99
|
+
export interface ChecklistInput extends EventEmitter {
|
|
100
|
+
isTTY?: boolean;
|
|
101
|
+
setRawMode?(mode: boolean): unknown;
|
|
102
|
+
resume(): unknown;
|
|
103
|
+
pause(): unknown;
|
|
104
|
+
}
|
|
105
|
+
export interface ChecklistDeps {
|
|
106
|
+
readonly input: ChecklistInput;
|
|
107
|
+
readonly output: Writable;
|
|
108
|
+
/** Signal registration. Default: the process. */
|
|
109
|
+
readonly signals?: {
|
|
110
|
+
on(signal: NodeJS.Signals, handler: () => void): unknown;
|
|
111
|
+
off(signal: NodeJS.Signals, handler: () => void): unknown;
|
|
112
|
+
};
|
|
113
|
+
/** The net under every other exit: a `process` `exit` hook. Default: the process. */
|
|
114
|
+
readonly onExit?: {
|
|
115
|
+
on(event: "exit", handler: () => void): unknown;
|
|
116
|
+
off(event: "exit", handler: () => void): unknown;
|
|
117
|
+
};
|
|
118
|
+
/** What a signal does AFTER the terminal is restored. Default: re-raise it with no handler left, so the default runs. */
|
|
119
|
+
readonly terminate?: (signal: NodeJS.Signals) => void;
|
|
120
|
+
}
|
|
121
|
+
export type ChecklistResult = {
|
|
122
|
+
readonly kind: "done";
|
|
123
|
+
readonly change: PickerChange;
|
|
124
|
+
} | {
|
|
125
|
+
readonly kind: "typed";
|
|
126
|
+
} | {
|
|
127
|
+
readonly kind: "account";
|
|
128
|
+
} | {
|
|
129
|
+
readonly kind: "cancel";
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Run the checklist. Resolves with what the person chose, or that they asked for the typed prompt, or cancelled. The
|
|
133
|
+
* frame is ERASED before returning, so what is left on screen is whatever the caller prints next (the static
|
|
134
|
+
* `You chose:` block), never a half-drawn list.
|
|
135
|
+
*/
|
|
136
|
+
export declare function runChecklist(model: PickerModel, options: {
|
|
137
|
+
readonly colour: boolean;
|
|
138
|
+
readonly nowMs: number;
|
|
139
|
+
readonly typedCommand: string;
|
|
140
|
+
readonly offerAccount?: boolean;
|
|
141
|
+
}, deps: ChecklistDeps): Promise<ChecklistResult>;
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The arrow-key checklist — style guide §10.12 "The arrow-key checklist", design review D28 · 22B.
|
|
3
|
+
*
|
|
4
|
+
* Two halves, so the interesting one is testable without a terminal:
|
|
5
|
+
*
|
|
6
|
+
* - `initChecklist` / `step` / `renderFrame` are PURE: a state, a key, a frame. `test/picker-checklist.test.ts` drives
|
|
7
|
+
* them with synthetic keys, which is the "keypress-driven state test" the design asks for (the frames themselves are
|
|
8
|
+
* not golden-tested; the static `You chose:` block that replaces them is).
|
|
9
|
+
* - `runChecklist` is the thin driver: raw mode, `keypress` events, the redraw, and the exits.
|
|
10
|
+
*
|
|
11
|
+
* ## ⛔ Raw mode is the one terminal state this changes, and it is restored on EVERY exit path
|
|
12
|
+
*
|
|
13
|
+
* Confirm, Ctrl+C, `t`, a throw inside the handler, `SIGTERM`/`SIGINT`/`SIGHUP`, and a process `exit` that nothing here
|
|
14
|
+
* caused. The last is the net under the others: a raw-mode terminal left behind is a shell that echoes nothing. No
|
|
15
|
+
* hide-cursor, no alternate screen, no position query (DESIGN.md §13.2 `CURSOR` is the whole set), so there is nothing
|
|
16
|
+
* else to undo. ⚠ A signal handler restores first and only THEN lets the default termination run.
|
|
17
|
+
*
|
|
18
|
+
* Redraw happens on a keypress and only on a keypress (§13.8): an idle list emits zero bytes.
|
|
19
|
+
*/
|
|
20
|
+
import { emitKeypressEvents } from "node:readline";
|
|
21
|
+
import { GROUP_CAP, notListedBlock, } from "./picker.js";
|
|
22
|
+
import { SCAN, PICKER, shortDate } from "./copy/index.js";
|
|
23
|
+
import { CURSOR, paint, truncateMiddle, wrap } from "./term.js";
|
|
24
|
+
const AGENTS = ["claude-code", "codex-cli", "cursor"];
|
|
25
|
+
const GAP = 3;
|
|
26
|
+
/** ` › [x] ` — a cursor column and a tick box ahead of the name. */
|
|
27
|
+
const LEAD = 8;
|
|
28
|
+
/** The selectable rows in screen order, given what is expanded. */
|
|
29
|
+
export function checklistRows(model, expanded) {
|
|
30
|
+
const rows = model.onNow.map((row) => ({ id: `on:${row.kind}:${row.key}`, kind: "on", row }));
|
|
31
|
+
for (const group of model.owners) {
|
|
32
|
+
rows.push({ id: `all:${group.owner}`, kind: "all", group });
|
|
33
|
+
const shown = expanded.has(group.owner) ? group.repos : group.repos.slice(0, GROUP_CAP);
|
|
34
|
+
for (const repo of shown)
|
|
35
|
+
rows.push({ id: `repo:${repo.slug}`, kind: "repo", repo, group });
|
|
36
|
+
const hidden = group.repos.length - shown.length;
|
|
37
|
+
if (hidden > 0)
|
|
38
|
+
rows.push({ id: `more:${group.owner}`, kind: "more", group, hidden });
|
|
39
|
+
}
|
|
40
|
+
for (const row of model.account)
|
|
41
|
+
rows.push({ id: `account:${row.kind}:${row.key}`, kind: "account", row });
|
|
42
|
+
for (const row of model.turnedOff)
|
|
43
|
+
rows.push({ id: `off:${row.slug}`, kind: "off", row });
|
|
44
|
+
return rows;
|
|
45
|
+
}
|
|
46
|
+
export function initChecklist(model) {
|
|
47
|
+
const ticked = new Set();
|
|
48
|
+
for (const row of model.onNow)
|
|
49
|
+
ticked.add(`on:${row.kind}:${row.key}`);
|
|
50
|
+
for (const group of model.owners) {
|
|
51
|
+
for (const repo of group.repos)
|
|
52
|
+
if (repo.pre)
|
|
53
|
+
ticked.add(`repo:${repo.slug}`);
|
|
54
|
+
}
|
|
55
|
+
for (const row of model.turnedOff)
|
|
56
|
+
if (row.pre)
|
|
57
|
+
ticked.add(`off:${row.slug}`);
|
|
58
|
+
const rows = checklistRows(model, new Set());
|
|
59
|
+
// The cursor starts on the pre-ticked row when there is one (the working folder's repo), else on the first row.
|
|
60
|
+
const pre = rows.find((r) => (r.kind === "repo" && r.repo.pre) || (r.kind === "off" && r.row.pre));
|
|
61
|
+
return { cursor: (pre ?? rows[0])?.id ?? "", ticked, expanded: new Set() };
|
|
62
|
+
}
|
|
63
|
+
function withTick(state, id, on) {
|
|
64
|
+
const ticked = new Set(state.ticked);
|
|
65
|
+
if (on)
|
|
66
|
+
ticked.add(id);
|
|
67
|
+
else
|
|
68
|
+
ticked.delete(id);
|
|
69
|
+
return { ...state, ticked };
|
|
70
|
+
}
|
|
71
|
+
/** A repo under a ticked `all` row is covered, so it reads as ticked and is not separately togglable. */
|
|
72
|
+
export function isCovered(state, row) {
|
|
73
|
+
return row.kind === "repo" && state.ticked.has(`all:${row.group.owner}`);
|
|
74
|
+
}
|
|
75
|
+
export function step(model, state, key,
|
|
76
|
+
/** `g` is a key only where the picker offered it (no credential, a terminal, a browser); anywhere else it does nothing. */
|
|
77
|
+
options = {}) {
|
|
78
|
+
const rows = checklistRows(model, state.expanded);
|
|
79
|
+
const at = Math.max(0, rows.findIndex((r) => r.id === state.cursor));
|
|
80
|
+
const current = rows[at];
|
|
81
|
+
switch (key.name) {
|
|
82
|
+
case "up":
|
|
83
|
+
return { kind: "state", state: { ...state, cursor: rows[Math.max(0, at - 1)]?.id ?? state.cursor } };
|
|
84
|
+
case "down":
|
|
85
|
+
return { kind: "state", state: { ...state, cursor: rows[Math.min(rows.length - 1, at + 1)]?.id ?? state.cursor } };
|
|
86
|
+
case "space":
|
|
87
|
+
case "return": {
|
|
88
|
+
if (current === undefined)
|
|
89
|
+
return key.name === "return" ? { kind: "done", change: changeOf(model, state) } : { kind: "state", state };
|
|
90
|
+
if (current.kind === "more") {
|
|
91
|
+
const expanded = new Set(state.expanded).add(current.group.owner);
|
|
92
|
+
return { kind: "state", state: { ...state, expanded } };
|
|
93
|
+
}
|
|
94
|
+
if (key.name === "return")
|
|
95
|
+
return { kind: "done", change: changeOf(model, state) };
|
|
96
|
+
if (isCovered(state, current))
|
|
97
|
+
return { kind: "state", state };
|
|
98
|
+
const next = withTick(state, current.id, !state.ticked.has(current.id));
|
|
99
|
+
if (current.kind === "all" && next.ticked.has(current.id)) {
|
|
100
|
+
// The owner row covers every repo of the owner, hidden ones included: drop their single ticks.
|
|
101
|
+
const ticked = new Set(next.ticked);
|
|
102
|
+
for (const repo of current.group.repos)
|
|
103
|
+
ticked.delete(`repo:${repo.slug}`);
|
|
104
|
+
return { kind: "state", state: { ...next, ticked } };
|
|
105
|
+
}
|
|
106
|
+
return { kind: "state", state: next };
|
|
107
|
+
}
|
|
108
|
+
case "t":
|
|
109
|
+
return { kind: "typed" };
|
|
110
|
+
case "g":
|
|
111
|
+
return options.offerAccount === true ? { kind: "account" } : { kind: "state", state };
|
|
112
|
+
case "ctrl-c":
|
|
113
|
+
return { kind: "cancel" };
|
|
114
|
+
default:
|
|
115
|
+
return { kind: "state", state };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* What the ticks change against the baseline (the `on now` rows, ticked). An `on` row unticked is a removal; an `all` row
|
|
120
|
+
* ticked an owner grant; a repo ticked, with its owner not ticked, a repo grant; an `off` row ticked a re-include. A
|
|
121
|
+
* pre-ticked repo is an addition like any other: Enter on it reaches the y/N, never a grant (D34).
|
|
122
|
+
*/
|
|
123
|
+
export function changeOf(model, state) {
|
|
124
|
+
const change = {
|
|
125
|
+
addOwners: [],
|
|
126
|
+
addRepos: [],
|
|
127
|
+
turnOn: [],
|
|
128
|
+
stopOwners: [],
|
|
129
|
+
stopRepos: [],
|
|
130
|
+
stopClones: [],
|
|
131
|
+
};
|
|
132
|
+
const add = (list, value) => {
|
|
133
|
+
if (!list.includes(value))
|
|
134
|
+
list.push(value);
|
|
135
|
+
};
|
|
136
|
+
for (const row of model.onNow) {
|
|
137
|
+
if (state.ticked.has(`on:${row.kind}:${row.key}`))
|
|
138
|
+
continue;
|
|
139
|
+
if (row.kind === "owner")
|
|
140
|
+
change.stopOwners.push(row.key);
|
|
141
|
+
else if (row.kind === "repo")
|
|
142
|
+
change.stopRepos.push(row.key);
|
|
143
|
+
else
|
|
144
|
+
change.stopClones.push(row.key);
|
|
145
|
+
}
|
|
146
|
+
for (const group of model.owners) {
|
|
147
|
+
if (state.ticked.has(`all:${group.owner}`)) {
|
|
148
|
+
add(change.addOwners, group.owner);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
for (const repo of group.repos)
|
|
152
|
+
if (state.ticked.has(`repo:${repo.slug}`))
|
|
153
|
+
add(change.addRepos, repo.slug);
|
|
154
|
+
}
|
|
155
|
+
// The account's grants (slice 2): an owner row is an owner grant, a repo row a repo grant (unless its owner is chosen too).
|
|
156
|
+
for (const row of model.account) {
|
|
157
|
+
if (!state.ticked.has(`account:${row.kind}:${row.key}`))
|
|
158
|
+
continue;
|
|
159
|
+
if (row.kind === "owner")
|
|
160
|
+
add(change.addOwners, row.key);
|
|
161
|
+
}
|
|
162
|
+
for (const row of model.account) {
|
|
163
|
+
if (row.kind !== "repo" || !state.ticked.has(`account:repo:${row.key}`))
|
|
164
|
+
continue;
|
|
165
|
+
if (!change.addOwners.includes(row.key.slice(0, Math.max(0, row.key.lastIndexOf("/")))))
|
|
166
|
+
add(change.addRepos, row.key);
|
|
167
|
+
}
|
|
168
|
+
for (const row of model.turnedOff)
|
|
169
|
+
if (state.ticked.has(`off:${row.slug}`))
|
|
170
|
+
change.turnOn.push(row.slug);
|
|
171
|
+
return change;
|
|
172
|
+
}
|
|
173
|
+
function counts(c, nowMs) {
|
|
174
|
+
return c === null || c.sessions === 0 ? "" : `${SCAN.sessions(c.sessions)} · ${SCAN.since(shortDate(c.sinceMs, nowMs))}`;
|
|
175
|
+
}
|
|
176
|
+
function agents(c) {
|
|
177
|
+
if (c === null || c.sessions === 0)
|
|
178
|
+
return "";
|
|
179
|
+
const used = AGENTS.filter((a) => c.agents[a] > 0);
|
|
180
|
+
return used.length > 1 ? used.map((a) => SCAN.agent[a]).join(", ") : "";
|
|
181
|
+
}
|
|
182
|
+
/** The frame, as lines. The cursor row is `strong` and marked `›`; no reverse video, no fill (§13.1). */
|
|
183
|
+
export function renderFrame(model, state, options) {
|
|
184
|
+
const { colour, nowMs, typedCommand } = options;
|
|
185
|
+
const rows = checklistRows(model, state.expanded);
|
|
186
|
+
// Name column, as the typed screen sizes it.
|
|
187
|
+
const metaOf = (row) => {
|
|
188
|
+
if (row.kind === "on") {
|
|
189
|
+
const r = row.row;
|
|
190
|
+
return r.kind === "owner"
|
|
191
|
+
? { name: `${r.key}/`, meta: [r.reason, PICKER.ownerOnReposHere(r.reposHere)].join(" · "), agents: "" }
|
|
192
|
+
: { name: r.key, meta: [r.reason, counts(r.counts, nowMs)].filter(Boolean).join(" · "), agents: agents(r.counts) };
|
|
193
|
+
}
|
|
194
|
+
if (row.kind === "repo") {
|
|
195
|
+
const flag = row.repo.here === "repo" ? PICKER.thisRepo : row.repo.here === "folder" ? PICKER.thisFolder : "";
|
|
196
|
+
return {
|
|
197
|
+
name: row.repo.name,
|
|
198
|
+
meta: [counts(row.repo, nowMs), flag].filter(Boolean).join(" · "),
|
|
199
|
+
agents: agents(row.repo),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (row.kind === "off")
|
|
203
|
+
return { name: row.row.slug, meta: PICKER.turnOnHint, agents: "" };
|
|
204
|
+
if (row.kind === "account") {
|
|
205
|
+
return { name: row.row.kind === "owner" ? `${row.row.key}/` : row.row.key, meta: PICKER.onAccountHint, agents: "" };
|
|
206
|
+
}
|
|
207
|
+
return { name: "", meta: "", agents: "" };
|
|
208
|
+
};
|
|
209
|
+
const named = rows.map((r) => ({ row: r, ...metaOf(r) })).filter((r) => r.name !== "");
|
|
210
|
+
const longestMeta = named.reduce((n, r) => Math.max(n, r.meta.length), 0);
|
|
211
|
+
const longestName = named.reduce((n, r) => Math.max(n, r.name.length), 0);
|
|
212
|
+
const column = Math.max(12, Math.min(longestName, 80 - LEAD - GAP - longestMeta));
|
|
213
|
+
const cut = (name) => {
|
|
214
|
+
if (name.length <= column)
|
|
215
|
+
return name;
|
|
216
|
+
const slash = name.lastIndexOf("/");
|
|
217
|
+
return slash >= 0 && slash + 1 < column
|
|
218
|
+
? `${name.slice(0, slash + 1)}${truncateMiddle(name.slice(slash + 1), column - slash - 1)}`
|
|
219
|
+
: truncateMiddle(name, column);
|
|
220
|
+
};
|
|
221
|
+
const line = (row, text, mutedTail) => {
|
|
222
|
+
const here = row.id === state.cursor;
|
|
223
|
+
const lead = here ? " › " : " ";
|
|
224
|
+
// One colour per line: the cursor row is `strong` throughout, the others keep `muted` for their counts.
|
|
225
|
+
return here ? paint(colour, "strong", `${lead}${text}${mutedTail}`) : `${lead}${text}${paint(colour, "muted", mutedTail)}`;
|
|
226
|
+
};
|
|
227
|
+
const box = (row) => state.ticked.has(row.id) || isCovered(state, row) ? "[x]" : "[ ]";
|
|
228
|
+
const out = [""];
|
|
229
|
+
out.push(...wrap(SCAN.found(model.found), 2).map((l) => paint(colour, "strong", l)));
|
|
230
|
+
out.push(paint(colour, "muted", ` ${PICKER.hint}`));
|
|
231
|
+
out.push(paint(colour, "muted", ` ${PICKER.hintTyped(typedCommand)}`));
|
|
232
|
+
// Slice 2, screen 1a: the same sentence the typed prompt carries, where `g` does something.
|
|
233
|
+
if (options.offerAccount === true)
|
|
234
|
+
out.push(...wrap(PICKER.gLine, 2).map((l) => paint(colour, "muted", l)));
|
|
235
|
+
out.push("");
|
|
236
|
+
const seenOwner = new Set();
|
|
237
|
+
let wroteOn = false;
|
|
238
|
+
let wroteAccount = false;
|
|
239
|
+
let wroteOff = false;
|
|
240
|
+
for (const entry of rows) {
|
|
241
|
+
const m = metaOf(entry);
|
|
242
|
+
if (entry.kind === "on") {
|
|
243
|
+
if (!wroteOn) {
|
|
244
|
+
out.push(paint(colour, "muted", ` ${PICKER.onNow}`));
|
|
245
|
+
wroteOn = true;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else if (entry.kind === "all" || entry.kind === "repo" || entry.kind === "more") {
|
|
249
|
+
const owner = entry.group.owner;
|
|
250
|
+
if (!seenOwner.has(owner)) {
|
|
251
|
+
seenOwner.add(owner);
|
|
252
|
+
out.push(` ${paint(colour, "text", `${owner}/`)}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else if (entry.kind === "account" && !wroteAccount) {
|
|
256
|
+
out.push(paint(colour, "muted", ` ${PICKER.onAccount}`));
|
|
257
|
+
wroteAccount = true;
|
|
258
|
+
}
|
|
259
|
+
else if (entry.kind === "off" && !wroteOff) {
|
|
260
|
+
out.push(paint(colour, "muted", ` ${PICKER.turnedOff}`));
|
|
261
|
+
wroteOff = true;
|
|
262
|
+
}
|
|
263
|
+
if (entry.kind === "all") {
|
|
264
|
+
out.push(line(entry, `${box(entry)} ${PICKER.ownerAll(entry.group.repos.length)}`, ""));
|
|
265
|
+
}
|
|
266
|
+
else if (entry.kind === "more") {
|
|
267
|
+
out.push(paint(colour, "muted", `${entry.id === state.cursor ? " › " : " "}+ ${PICKER.moreChecklist(entry.hidden, entry.group.owner)}`));
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
const withAgents = m.agents !== "" && LEAD + column + GAP + m.meta.length + 3 + m.agents.length <= 80
|
|
271
|
+
? `${m.meta} · ${m.agents}`
|
|
272
|
+
: m.meta;
|
|
273
|
+
out.push(line(entry, `${box(entry)} ${cut(m.name).padEnd(column)}`, `${" ".repeat(GAP)}${withAgents}`));
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
out.push(...notListedBlock(model, colour));
|
|
277
|
+
return out;
|
|
278
|
+
}
|
|
279
|
+
const SIGNALS = ["SIGTERM", "SIGINT", "SIGHUP"];
|
|
280
|
+
function keyOf(str, key) {
|
|
281
|
+
if (key?.ctrl === true && key.name === "c")
|
|
282
|
+
return { name: "ctrl-c" };
|
|
283
|
+
switch (key?.name) {
|
|
284
|
+
case "up":
|
|
285
|
+
case "down":
|
|
286
|
+
case "return":
|
|
287
|
+
return { name: key.name };
|
|
288
|
+
case "space":
|
|
289
|
+
return { name: "space" };
|
|
290
|
+
case "t":
|
|
291
|
+
return { name: "t" };
|
|
292
|
+
case "g":
|
|
293
|
+
return { name: "g" };
|
|
294
|
+
default:
|
|
295
|
+
return str === " " ? { name: "space" } : { name: "other" };
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Run the checklist. Resolves with what the person chose, or that they asked for the typed prompt, or cancelled. The
|
|
300
|
+
* frame is ERASED before returning, so what is left on screen is whatever the caller prints next (the static
|
|
301
|
+
* `You chose:` block), never a half-drawn list.
|
|
302
|
+
*/
|
|
303
|
+
export function runChecklist(model, options, deps) {
|
|
304
|
+
const { input, output } = deps;
|
|
305
|
+
const signals = deps.signals ?? process;
|
|
306
|
+
const onExit = deps.onExit ?? process;
|
|
307
|
+
const terminate = deps.terminate ?? ((signal) => void process.kill(process.pid, signal));
|
|
308
|
+
return new Promise((resolve, reject) => {
|
|
309
|
+
let state = initChecklist(model);
|
|
310
|
+
let drawn = 0;
|
|
311
|
+
let raw = false;
|
|
312
|
+
let finished = false;
|
|
313
|
+
const restore = () => {
|
|
314
|
+
if (!raw)
|
|
315
|
+
return;
|
|
316
|
+
raw = false;
|
|
317
|
+
try {
|
|
318
|
+
input.setRawMode?.(false);
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
// The stream is gone; there is no terminal state left to restore.
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
const draw = () => {
|
|
325
|
+
const lines = renderFrame(model, state, options);
|
|
326
|
+
output.write(`${drawn > 0 ? `${CURSOR.up(drawn)}${CURSOR.column1}${CURSOR.clearBelow}` : ""}${lines.join("\n")}\n`);
|
|
327
|
+
drawn = lines.length;
|
|
328
|
+
};
|
|
329
|
+
// ⛔ Never throws: it runs on the error paths, ahead of `cleanup`, and an output that is itself failing (a closed pipe)
|
|
330
|
+
// must not stop the terminal being restored.
|
|
331
|
+
const erase = () => {
|
|
332
|
+
try {
|
|
333
|
+
if (drawn > 0)
|
|
334
|
+
output.write(`${CURSOR.up(drawn)}${CURSOR.column1}${CURSOR.clearBelow}`);
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
// Nothing to erase on a stream that cannot be written.
|
|
338
|
+
}
|
|
339
|
+
drawn = 0;
|
|
340
|
+
};
|
|
341
|
+
const signalHandlers = new Map();
|
|
342
|
+
const exitHook = () => restore();
|
|
343
|
+
const cleanup = () => {
|
|
344
|
+
input.off("keypress", onKey);
|
|
345
|
+
for (const [signal, handler] of signalHandlers)
|
|
346
|
+
signals.off(signal, handler);
|
|
347
|
+
onExit.off("exit", exitHook);
|
|
348
|
+
restore();
|
|
349
|
+
input.pause();
|
|
350
|
+
};
|
|
351
|
+
const finish = (result) => {
|
|
352
|
+
if (finished)
|
|
353
|
+
return;
|
|
354
|
+
finished = true;
|
|
355
|
+
erase();
|
|
356
|
+
cleanup();
|
|
357
|
+
resolve(result);
|
|
358
|
+
};
|
|
359
|
+
function onKey(str, key) {
|
|
360
|
+
if (finished)
|
|
361
|
+
return;
|
|
362
|
+
try {
|
|
363
|
+
const result = step(model, state, keyOf(str, key), { offerAccount: options.offerAccount === true });
|
|
364
|
+
if (result.kind === "state") {
|
|
365
|
+
const before = state;
|
|
366
|
+
state = result.state;
|
|
367
|
+
if (state !== before)
|
|
368
|
+
draw();
|
|
369
|
+
}
|
|
370
|
+
else if (result.kind === "done")
|
|
371
|
+
finish({ kind: "done", change: result.change });
|
|
372
|
+
else
|
|
373
|
+
finish({ kind: result.kind });
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
finished = true;
|
|
377
|
+
erase();
|
|
378
|
+
cleanup();
|
|
379
|
+
reject(error);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
try {
|
|
383
|
+
emitKeypressEvents(input);
|
|
384
|
+
input.setRawMode?.(true);
|
|
385
|
+
raw = true;
|
|
386
|
+
onExit.on("exit", exitHook);
|
|
387
|
+
for (const signal of SIGNALS) {
|
|
388
|
+
const handler = () => {
|
|
389
|
+
// The terminal first, THEN the default action: a process killed in raw mode leaves a shell that echoes nothing.
|
|
390
|
+
if (finished)
|
|
391
|
+
return;
|
|
392
|
+
finished = true;
|
|
393
|
+
erase();
|
|
394
|
+
cleanup();
|
|
395
|
+
terminate(signal);
|
|
396
|
+
};
|
|
397
|
+
signalHandlers.set(signal, handler);
|
|
398
|
+
signals.on(signal, handler);
|
|
399
|
+
}
|
|
400
|
+
input.on("keypress", onKey);
|
|
401
|
+
input.resume();
|
|
402
|
+
draw();
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
finished = true;
|
|
406
|
+
cleanup();
|
|
407
|
+
reject(error);
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=picker_checklist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker_checklist.js","sourceRoot":"","sources":["../src/picker_checklist.ts"],"names":[],"mappings":"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"}
|