@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
package/dist/picker.js
ADDED
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `connect` picker — style guide §10.12, design review D5-D35; capture 0.7.0, PR 3.
|
|
3
|
+
*
|
|
4
|
+
* Which repositories does the person want captured? This module is the PURE half: it turns a `scan` result and the
|
|
5
|
+
* grants already on disk into rows, parses what the person types, renders the typed screen and the `You chose:` block,
|
|
6
|
+
* and says what a choice changes. It reads no file, opens no transcript and writes nothing — `connect` supplies the
|
|
7
|
+
* facts and applies the change, and `picker_checklist.ts` is the arrow-key driver over the same model.
|
|
8
|
+
*
|
|
9
|
+
* ## What the rows are
|
|
10
|
+
*
|
|
11
|
+
* on now grants and per-clone consents that are already admitting capture. REMOVABLE (D31): unticking one, or
|
|
12
|
+
* typing `-N`, deletes the grant. It is not an exclusion (`off` is), so the repo can be chosen again.
|
|
13
|
+
* owners one group per owner NOT yet granted, its repos behind an `aN` "all, including repos you clone later"
|
|
14
|
+
* row (D9: at most 8 repos before `+ N more`).
|
|
15
|
+
* turned off slugs in `excluded`. Choosing one is a re-include; the grant block names it on a `turn on` row, inside
|
|
16
|
+
* the same y/N (D7 · 3A), and only a yes clears the exclusion.
|
|
17
|
+
* on your account (slice 2) what the account grants that this machine has not named. Unticked until chosen, like any
|
|
18
|
+
* row: choosing one is an ordinary addition, so it goes through the same disclosure and y/N (R3-8, R3-9).
|
|
19
|
+
*
|
|
20
|
+
* ⛔ **A pre-tick is not a consent** (D34): the working folder's repo starts ticked, and Enter on it leads to the naming
|
|
21
|
+
* y/N, which defaults to N. It is an ADDITION to the diff, never part of the baseline.
|
|
22
|
+
*/
|
|
23
|
+
import { ownerOfSlug, normalizeSlug, normalizeOwner, isLocalSlug } from "./consent.js";
|
|
24
|
+
import { AGENT_HOOKS, SCAN, PICKER, shortDate } from "./copy/index.js";
|
|
25
|
+
import { LABEL_GUTTER, paint, truncateMiddle, wrap } from "./term.js";
|
|
26
|
+
/** D9: each owner group shows at most this many repos before the `+ N more` row. */
|
|
27
|
+
export const GROUP_CAP = 8;
|
|
28
|
+
/** The gap between the name column and the counts, as `scan`'s screen has it. */
|
|
29
|
+
const GAP = 3;
|
|
30
|
+
/** The width of the lead before a name: a right-aligned number and two spaces, or a cursor and a tick box. */
|
|
31
|
+
const LEAD = 8;
|
|
32
|
+
const AGENT_ORDER = ["claude-code", "codex-cli", "cursor"];
|
|
33
|
+
export const NO_CHANGE = {
|
|
34
|
+
addOwners: [],
|
|
35
|
+
addRepos: [],
|
|
36
|
+
turnOn: [],
|
|
37
|
+
stopOwners: [],
|
|
38
|
+
stopRepos: [],
|
|
39
|
+
stopClones: [],
|
|
40
|
+
};
|
|
41
|
+
export function isNoChange(change) {
|
|
42
|
+
return (change.addOwners.length === 0 &&
|
|
43
|
+
change.addRepos.length === 0 &&
|
|
44
|
+
change.turnOn.length === 0 &&
|
|
45
|
+
change.stopOwners.length === 0 &&
|
|
46
|
+
change.stopRepos.length === 0 &&
|
|
47
|
+
change.stopClones.length === 0);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* What Enter means when the working folder's repo is pre-selected (D34): choosing it, which leads to the y/N and never to
|
|
51
|
+
* a grant. `null` when nothing is pre-selected, where Enter changes nothing (D5).
|
|
52
|
+
*/
|
|
53
|
+
export function preChange(model) {
|
|
54
|
+
const repo = model.owners.flatMap((g) => g.repos).find((r) => r.pre);
|
|
55
|
+
if (repo !== undefined)
|
|
56
|
+
return { ...NO_CHANGE, addRepos: [repo.slug] };
|
|
57
|
+
const off = model.turnedOff.find((r) => r.pre);
|
|
58
|
+
return off === undefined ? null : { ...NO_CHANGE, turnOn: [off.slug] };
|
|
59
|
+
}
|
|
60
|
+
/** Anything the person is ADDING needs the D65 disclosure; removals alone do not. */
|
|
61
|
+
export function hasAdditions(change) {
|
|
62
|
+
return change.addOwners.length + change.addRepos.length + change.turnOn.length > 0;
|
|
63
|
+
}
|
|
64
|
+
function splitSlug(slug) {
|
|
65
|
+
const owner = ownerOfSlug(slug);
|
|
66
|
+
return { owner, name: owner === "" ? slug : slug.slice(owner.length + 1) };
|
|
67
|
+
}
|
|
68
|
+
function emptyAgents() {
|
|
69
|
+
return { "claude-code": 0, "codex-cli": 0, cursor: 0 };
|
|
70
|
+
}
|
|
71
|
+
export function buildModel(input) {
|
|
72
|
+
const { grants } = input;
|
|
73
|
+
const excluded = new Set(grants.excluded);
|
|
74
|
+
const coveredByGrant = (slug) => grants.repos.includes(slug) || grants.owners.includes(ownerOfSlug(slug));
|
|
75
|
+
const repos = new Map();
|
|
76
|
+
for (const repo of input.repos) {
|
|
77
|
+
const slug = normalizeSlug(repo.slug);
|
|
78
|
+
const { owner, name } = splitSlug(slug);
|
|
79
|
+
repos.set(slug, {
|
|
80
|
+
slug,
|
|
81
|
+
owner,
|
|
82
|
+
name,
|
|
83
|
+
sessions: repo.sessions,
|
|
84
|
+
sinceMs: repo.sinceMs,
|
|
85
|
+
latestMs: repo.latestMs,
|
|
86
|
+
agents: repo.agents,
|
|
87
|
+
clones: repo.clones,
|
|
88
|
+
here: null,
|
|
89
|
+
pre: false,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// This repo's row comes from the working folder, not the scan: a repo no agent has run in yet still appears (D34).
|
|
93
|
+
if (input.here !== null) {
|
|
94
|
+
const slug = normalizeSlug(input.here.slug);
|
|
95
|
+
const found = repos.get(slug);
|
|
96
|
+
const { owner, name } = splitSlug(slug);
|
|
97
|
+
const base = found ?? {
|
|
98
|
+
slug,
|
|
99
|
+
owner,
|
|
100
|
+
name,
|
|
101
|
+
sessions: 0,
|
|
102
|
+
sinceMs: 0,
|
|
103
|
+
latestMs: 0,
|
|
104
|
+
agents: emptyAgents(),
|
|
105
|
+
clones: [{ path: input.here.toplevel, hooksPath: null }],
|
|
106
|
+
here: null,
|
|
107
|
+
pre: false,
|
|
108
|
+
};
|
|
109
|
+
repos.set(slug, { ...base, here: input.here.kind, pre: input.here.kind === "repo" });
|
|
110
|
+
}
|
|
111
|
+
const perCloneSlugs = new Map();
|
|
112
|
+
for (const entry of input.perClone) {
|
|
113
|
+
if (entry.slug === null)
|
|
114
|
+
continue;
|
|
115
|
+
const slug = normalizeSlug(entry.slug);
|
|
116
|
+
if (isLocalSlug(slug))
|
|
117
|
+
continue;
|
|
118
|
+
perCloneSlugs.set(slug, [...(perCloneSlugs.get(slug) ?? []), entry.commonDir]);
|
|
119
|
+
}
|
|
120
|
+
const countsOf = (slug) => {
|
|
121
|
+
const r = repos.get(slug);
|
|
122
|
+
return r === undefined || r.sessions === 0 ? null : r;
|
|
123
|
+
};
|
|
124
|
+
const onNow = [];
|
|
125
|
+
for (const owner of grants.owners) {
|
|
126
|
+
const reposHere = [...repos.values()].filter((r) => r.owner === owner).length;
|
|
127
|
+
onNow.push({ kind: "owner", key: owner, reason: PICKER.reasonOwner, counts: null, reposHere, commonDirs: [] });
|
|
128
|
+
}
|
|
129
|
+
for (const slug of grants.repos) {
|
|
130
|
+
if (excluded.has(slug) || grants.owners.includes(ownerOfSlug(slug)))
|
|
131
|
+
continue;
|
|
132
|
+
onNow.push({ kind: "repo", key: slug, reason: PICKER.reasonRepo, counts: countsOf(slug), reposHere: 0, commonDirs: [] });
|
|
133
|
+
}
|
|
134
|
+
for (const [slug, commonDirs] of perCloneSlugs) {
|
|
135
|
+
if (excluded.has(slug) || coveredByGrant(slug))
|
|
136
|
+
continue;
|
|
137
|
+
onNow.push({ kind: "clone", key: slug, reason: PICKER.reasonPerClone, counts: countsOf(slug), reposHere: 0, commonDirs });
|
|
138
|
+
}
|
|
139
|
+
const isOn = (slug) => coveredByGrant(slug) || perCloneSlugs.has(slug);
|
|
140
|
+
const byOwner = new Map();
|
|
141
|
+
for (const repo of repos.values()) {
|
|
142
|
+
if (excluded.has(repo.slug) || isOn(repo.slug))
|
|
143
|
+
continue;
|
|
144
|
+
byOwner.set(repo.owner, [...(byOwner.get(repo.owner) ?? []), repo]);
|
|
145
|
+
}
|
|
146
|
+
const groups = [...byOwner.entries()]
|
|
147
|
+
.map(([owner, list]) => ({
|
|
148
|
+
owner,
|
|
149
|
+
list: [...list].sort((a, b) => b.latestMs - a.latestMs || (a.slug < b.slug ? -1 : 1)),
|
|
150
|
+
}))
|
|
151
|
+
.sort((a, b) => b.list[0].latestMs - a.list[0].latestMs || (a.owner < b.owner ? -1 : 1));
|
|
152
|
+
const owners = groups.map((g, i) => ({ owner: g.owner, token: `a${i + 1}`, repos: g.list }));
|
|
153
|
+
const hereSlug = input.here?.kind === "repo" ? normalizeSlug(input.here.slug) : null;
|
|
154
|
+
const turnedOff = [...excluded]
|
|
155
|
+
.sort()
|
|
156
|
+
.map((slug) => ({ slug, counts: countsOf(slug), pre: slug === hereSlug }));
|
|
157
|
+
// ⛔ THE SCAN ROW WINS: an owner that already has a group above, and a repo already listed under one, are not repeated under "on
|
|
158
|
+
// your account" — choosing the scan row is the same change, and one row per thing is what a person can read.
|
|
159
|
+
const shownOwners = new Set(owners.map((group) => group.owner));
|
|
160
|
+
const shownRepos = new Set(owners.flatMap((group) => group.repos.map((repo) => repo.slug)));
|
|
161
|
+
const account = (input.accountNotHere ?? [])
|
|
162
|
+
.map((name) => name.endsWith("/")
|
|
163
|
+
? { kind: "owner", key: normalizeOwner(name.slice(0, -1)) }
|
|
164
|
+
: { kind: "repo", key: normalizeSlug(name) })
|
|
165
|
+
.filter((row) => (row.kind === "owner" ? !shownOwners.has(row.key) : !shownRepos.has(row.key)));
|
|
166
|
+
return {
|
|
167
|
+
onNow,
|
|
168
|
+
owners,
|
|
169
|
+
account,
|
|
170
|
+
turnedOff,
|
|
171
|
+
notListed: input.notListed,
|
|
172
|
+
found: input.repos.length,
|
|
173
|
+
sawNothing: input.sawNothing,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* The numbered rows in screen order. `showAll` is the `more` token: every repo is shown and numbered afresh. Without it
|
|
178
|
+
* each owner shows `GROUP_CAP` repos and the rest are reachable only by typing `owner/repo` or `more`.
|
|
179
|
+
*/
|
|
180
|
+
export function numberedRows(model, showAll) {
|
|
181
|
+
const rows = model.onNow.map((row) => ({ kind: "on", row }));
|
|
182
|
+
for (const group of model.owners) {
|
|
183
|
+
const shown = showAll ? group.repos : group.repos.slice(0, GROUP_CAP);
|
|
184
|
+
for (const repo of shown)
|
|
185
|
+
rows.push({ kind: "repo", repo });
|
|
186
|
+
}
|
|
187
|
+
for (const row of model.account)
|
|
188
|
+
rows.push({ kind: "account", row });
|
|
189
|
+
for (const row of model.turnedOff)
|
|
190
|
+
rows.push({ kind: "off", row });
|
|
191
|
+
return rows;
|
|
192
|
+
}
|
|
193
|
+
const OWNER_TOKEN = /^[^\s/]+(?:\/[^\s/]+)*\/$/u;
|
|
194
|
+
const REPO_TOKEN = /^[^\s/]+(?:\/[^\s/]+)*\/[^\s/]+$/u;
|
|
195
|
+
/**
|
|
196
|
+
* Parse one typed answer (D8 · 4A). ⛔ **Never applies part of an answer:** any token that is not understood returns
|
|
197
|
+
* `error` naming each such token, and nothing is chosen. `owner/` and `owner/repo` are always accepted, a clone here or
|
|
198
|
+
* not, because a new laptop needs them; the grant block flags `(no clone here yet)`.
|
|
199
|
+
*
|
|
200
|
+
* ⛔ **`g` STANDS ALONE** (exception 3, R3-12): where `offerAccount` is true, `g` alone is the account's grants, and `g` mixed with
|
|
201
|
+
* any other token is refused with nothing applied, so the y/N after it always names a single list. Where it was not offered `g` is
|
|
202
|
+
* an ordinary token nobody understands.
|
|
203
|
+
*/
|
|
204
|
+
export function parseTyped(input, model, showAll, offerAccount = false) {
|
|
205
|
+
const tokens = input.split(/[\s,]+/u).filter((t) => t !== "");
|
|
206
|
+
if (tokens.length === 0)
|
|
207
|
+
return { kind: "empty" };
|
|
208
|
+
if (tokens.length === 1 && tokens[0].toLowerCase() === "more")
|
|
209
|
+
return { kind: "more" };
|
|
210
|
+
if (offerAccount && tokens.some((t) => t.toLowerCase() === "g")) {
|
|
211
|
+
return tokens.length === 1 ? { kind: "account" } : { kind: "error", tokens: [PICKER.gMixedToken] };
|
|
212
|
+
}
|
|
213
|
+
const rows = numberedRows(model, showAll);
|
|
214
|
+
const bad = [];
|
|
215
|
+
const addOwners = new Set();
|
|
216
|
+
const addRepos = new Set();
|
|
217
|
+
const turnOn = new Set();
|
|
218
|
+
const stopOwners = new Set();
|
|
219
|
+
const stopRepos = new Set();
|
|
220
|
+
const stopClones = new Set();
|
|
221
|
+
const grantedOwners = new Set(model.onNow.filter((r) => r.kind === "owner").map((r) => r.key));
|
|
222
|
+
const grantedRepos = new Set(model.onNow.filter((r) => r.kind === "repo").map((r) => r.key));
|
|
223
|
+
const cloneSlugs = new Set(model.onNow.filter((r) => r.kind === "clone").map((r) => r.key));
|
|
224
|
+
const offSlugs = new Set(model.turnedOff.map((r) => r.slug));
|
|
225
|
+
const stop = (row) => {
|
|
226
|
+
if (row.kind === "owner")
|
|
227
|
+
stopOwners.add(row.key);
|
|
228
|
+
else if (row.kind === "repo")
|
|
229
|
+
stopRepos.add(row.key);
|
|
230
|
+
else
|
|
231
|
+
stopClones.add(row.key);
|
|
232
|
+
};
|
|
233
|
+
const addSlug = (slug, token) => {
|
|
234
|
+
if (offSlugs.has(slug))
|
|
235
|
+
turnOn.add(slug);
|
|
236
|
+
else if (grantedRepos.has(slug) || cloneSlugs.has(slug) || grantedOwners.has(ownerOfSlug(slug))) {
|
|
237
|
+
bad.push(PICKER.alreadyOn(token, `-${token}`));
|
|
238
|
+
}
|
|
239
|
+
else
|
|
240
|
+
addRepos.add(slug);
|
|
241
|
+
};
|
|
242
|
+
for (const token of tokens) {
|
|
243
|
+
const owner = /^a(\d+)$/iu.exec(token);
|
|
244
|
+
const remove = token.startsWith("-") && token.length > 1 ? token.slice(1) : null;
|
|
245
|
+
if (owner !== null) {
|
|
246
|
+
const group = model.owners.find((g) => g.token === `a${Number(owner[1])}`);
|
|
247
|
+
if (group === undefined)
|
|
248
|
+
bad.push(PICKER.noRow(token));
|
|
249
|
+
else
|
|
250
|
+
addOwners.add(normalizeOwner(group.owner));
|
|
251
|
+
}
|
|
252
|
+
else if (/^\d+$/u.test(token)) {
|
|
253
|
+
const row = rows[Number(token) - 1];
|
|
254
|
+
if (row === undefined)
|
|
255
|
+
bad.push(PICKER.noRow(token));
|
|
256
|
+
else if (row.kind === "on")
|
|
257
|
+
bad.push(PICKER.alreadyOn(token, `-${token}`));
|
|
258
|
+
else if (row.kind === "off")
|
|
259
|
+
turnOn.add(row.row.slug);
|
|
260
|
+
else if (row.kind === "account") {
|
|
261
|
+
if (row.row.kind === "owner")
|
|
262
|
+
addOwners.add(row.row.key);
|
|
263
|
+
else
|
|
264
|
+
addSlug(row.row.key, token);
|
|
265
|
+
}
|
|
266
|
+
else
|
|
267
|
+
addSlug(row.repo.slug, token);
|
|
268
|
+
}
|
|
269
|
+
else if (remove !== null) {
|
|
270
|
+
const n = /^\d+$/u.test(remove) ? rows[Number(remove) - 1] : undefined;
|
|
271
|
+
if (/^\d+$/u.test(remove)) {
|
|
272
|
+
if (n === undefined)
|
|
273
|
+
bad.push(PICKER.noRow(remove));
|
|
274
|
+
else if (n.kind === "on")
|
|
275
|
+
stop(n.row);
|
|
276
|
+
else
|
|
277
|
+
bad.push(PICKER.notOn(token));
|
|
278
|
+
}
|
|
279
|
+
else if (OWNER_TOKEN.test(remove)) {
|
|
280
|
+
const name = normalizeOwner(remove);
|
|
281
|
+
if (grantedOwners.has(name))
|
|
282
|
+
stopOwners.add(name);
|
|
283
|
+
else
|
|
284
|
+
bad.push(PICKER.notOn(token));
|
|
285
|
+
}
|
|
286
|
+
else if (REPO_TOKEN.test(remove)) {
|
|
287
|
+
const name = normalizeSlug(remove);
|
|
288
|
+
if (grantedRepos.has(name))
|
|
289
|
+
stopRepos.add(name);
|
|
290
|
+
else if (cloneSlugs.has(name))
|
|
291
|
+
stopClones.add(name);
|
|
292
|
+
else
|
|
293
|
+
bad.push(PICKER.notOn(token));
|
|
294
|
+
}
|
|
295
|
+
else
|
|
296
|
+
bad.push(token);
|
|
297
|
+
}
|
|
298
|
+
else if (OWNER_TOKEN.test(token)) {
|
|
299
|
+
const name = normalizeOwner(token);
|
|
300
|
+
if (grantedOwners.has(name))
|
|
301
|
+
bad.push(PICKER.alreadyOn(token, `-${token}`));
|
|
302
|
+
else
|
|
303
|
+
addOwners.add(name);
|
|
304
|
+
}
|
|
305
|
+
else if (REPO_TOKEN.test(token)) {
|
|
306
|
+
addSlug(normalizeSlug(token), token);
|
|
307
|
+
}
|
|
308
|
+
else
|
|
309
|
+
bad.push(token);
|
|
310
|
+
}
|
|
311
|
+
if (bad.length > 0)
|
|
312
|
+
return { kind: "error", tokens: bad };
|
|
313
|
+
// Typed owners/repos with no clone on this machine are accepted and flagged in the grant block.
|
|
314
|
+
const known = new Set(model.owners.map((g) => normalizeOwner(g.owner)));
|
|
315
|
+
const knownRepos = new Set(model.owners.flatMap((g) => g.repos.map((r) => r.slug)));
|
|
316
|
+
const noClone = [
|
|
317
|
+
...[...addOwners].filter((o) => !known.has(o) && !model.onNow.some((r) => r.kind === "owner" && r.key === o)).map((o) => `${o}/`),
|
|
318
|
+
...[...addRepos].filter((r) => !knownRepos.has(r)),
|
|
319
|
+
];
|
|
320
|
+
return {
|
|
321
|
+
kind: "change",
|
|
322
|
+
noClone,
|
|
323
|
+
change: {
|
|
324
|
+
addOwners: [...addOwners],
|
|
325
|
+
addRepos: [...addRepos].filter((slug) => ![...addOwners].includes(ownerOfSlug(slug))),
|
|
326
|
+
turnOn: [...turnOn],
|
|
327
|
+
stopOwners: [...stopOwners],
|
|
328
|
+
stopRepos: [...stopRepos],
|
|
329
|
+
stopClones: [...stopClones],
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function countsText(counts, nowMs) {
|
|
334
|
+
if (counts === null)
|
|
335
|
+
return "";
|
|
336
|
+
return `${SCAN.sessions(counts.sessions)} · ${SCAN.since(shortDate(counts.sinceMs, nowMs))}`;
|
|
337
|
+
}
|
|
338
|
+
function agentsText(counts) {
|
|
339
|
+
if (counts === null)
|
|
340
|
+
return "";
|
|
341
|
+
const used = AGENT_ORDER.filter((agent) => counts.agents[agent] > 0);
|
|
342
|
+
return used.length > 1 ? used.map((agent) => SCAN.agent[agent]).join(", ") : "";
|
|
343
|
+
}
|
|
344
|
+
function joinMeta(...parts) {
|
|
345
|
+
return parts.filter((p) => p !== "").join(" · ");
|
|
346
|
+
}
|
|
347
|
+
function onNowDisplay(row, nowMs) {
|
|
348
|
+
if (row.kind === "owner") {
|
|
349
|
+
return { name: `${row.key}/`, meta: joinMeta(row.reason, PICKER.ownerOnReposHere(row.reposHere)), agents: "" };
|
|
350
|
+
}
|
|
351
|
+
return {
|
|
352
|
+
name: row.key,
|
|
353
|
+
meta: joinMeta(row.reason, countsText(row.counts, nowMs)),
|
|
354
|
+
agents: agentsText(row.counts),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
function repoDisplay(repo, nowMs) {
|
|
358
|
+
const flag = repo.here === "repo" ? PICKER.thisRepo : repo.here === "folder" ? PICKER.thisFolder : "";
|
|
359
|
+
return {
|
|
360
|
+
name: repo.name,
|
|
361
|
+
meta: joinMeta(countsText(repo.sessions === 0 ? null : repo, nowMs), flag),
|
|
362
|
+
agents: agentsText(repo.sessions === 0 ? null : repo),
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* The name column and the cut names (D27 · 21A). A name is cut in the MIDDLE to the widest column whose counts still fit
|
|
367
|
+
* in 80 columns; the agent-names suffix is dropped before any name is cut; an owner is never cut (it is in the group
|
|
368
|
+
* heading, and an on-now/turned-off row keeps its owner and cuts only the repo part).
|
|
369
|
+
*/
|
|
370
|
+
function layout(rows) {
|
|
371
|
+
const longestMeta = rows.reduce((n, r) => Math.max(n, r.meta.length), 0);
|
|
372
|
+
const longestName = rows.reduce((n, r) => Math.max(n, r.name.length), 0);
|
|
373
|
+
const room = 80 - LEAD - GAP - longestMeta;
|
|
374
|
+
const column = Math.max(12, Math.min(longestName, room));
|
|
375
|
+
const cut = (name) => {
|
|
376
|
+
if (name.length <= column)
|
|
377
|
+
return name;
|
|
378
|
+
const slash = name.lastIndexOf("/");
|
|
379
|
+
if (slash >= 0 && slash + 1 < column) {
|
|
380
|
+
return `${name.slice(0, slash + 1)}${truncateMiddle(name.slice(slash + 1), column - slash - 1)}`;
|
|
381
|
+
}
|
|
382
|
+
return truncateMiddle(name, column);
|
|
383
|
+
};
|
|
384
|
+
const withAgents = (row) => row.agents !== "" && LEAD + column + GAP + row.meta.length + 3 + row.agents.length <= 80
|
|
385
|
+
? `${row.meta} · ${row.agents}`
|
|
386
|
+
: row.meta;
|
|
387
|
+
return { column, cut, withAgents };
|
|
388
|
+
}
|
|
389
|
+
/** ` alexvibecommit/ a1 all 3 repos here, including repos you clone later` */
|
|
390
|
+
function ownerLine(group, colour) {
|
|
391
|
+
return ` ${paint(colour, "text", `${group.owner}/`)} ${paint(colour, "text", group.token)} ${paint(colour, "text", PICKER.ownerAll(group.repos.length))}`;
|
|
392
|
+
}
|
|
393
|
+
/** The `Not listed here:` block, muted, or nothing. */
|
|
394
|
+
export function notListedBlock(model, colour) {
|
|
395
|
+
if (model.notListed.length === 0)
|
|
396
|
+
return [];
|
|
397
|
+
return [
|
|
398
|
+
"",
|
|
399
|
+
paint(colour, "muted", ` ${SCAN.notListed}`),
|
|
400
|
+
...model.notListed.map((line) => paint(colour, "muted", ` ${line}`)),
|
|
401
|
+
];
|
|
402
|
+
}
|
|
403
|
+
/** The screen above the prompt, as lines — the typed picker (§10.12 "The picker, typed"). */
|
|
404
|
+
export function renderTyped(model, options) {
|
|
405
|
+
const { colour, nowMs, showAll } = options;
|
|
406
|
+
const lines = [""];
|
|
407
|
+
if (model.found === 0 &&
|
|
408
|
+
model.onNow.length === 0 &&
|
|
409
|
+
model.turnedOff.length === 0 &&
|
|
410
|
+
model.owners.length === 0 &&
|
|
411
|
+
model.account.length === 0) {
|
|
412
|
+
return [
|
|
413
|
+
...lines,
|
|
414
|
+
...wrap(model.sawNothing ? PICKER.emptyNone : SCAN.noneListable, 2).map((l) => paint(colour, "strong", l)),
|
|
415
|
+
...(model.sawNothing ? [...wrap(PICKER.emptyExpected, 2), ...wrap(AGENT_HOOKS.codexTrust, 2)] : []),
|
|
416
|
+
...notListedBlock(model, colour),
|
|
417
|
+
"",
|
|
418
|
+
...wrap(model.sawNothing ? PICKER.emptyType : PICKER.emptyListable, 2),
|
|
419
|
+
...(options.offerAccount === true ? wrap(PICKER.gLine, 2) : []),
|
|
420
|
+
` ${PICKER.enterNothing}`,
|
|
421
|
+
];
|
|
422
|
+
}
|
|
423
|
+
lines.push(...wrap(SCAN.found(model.found), 2).map((l) => paint(colour, "strong", l)), "");
|
|
424
|
+
const onNow = model.onNow.map((row) => onNowDisplay(row, nowMs));
|
|
425
|
+
const shown = (g) => (showAll ? g.repos : g.repos.slice(0, GROUP_CAP));
|
|
426
|
+
const repoRows = model.owners.flatMap((g) => shown(g).map((r) => repoDisplay(r, nowMs)));
|
|
427
|
+
const account = model.account.map((row) => ({
|
|
428
|
+
name: row.kind === "owner" ? `${row.key}/` : row.key,
|
|
429
|
+
meta: PICKER.onAccountHint,
|
|
430
|
+
agents: "",
|
|
431
|
+
}));
|
|
432
|
+
const off = model.turnedOff.map((row) => ({
|
|
433
|
+
name: row.slug,
|
|
434
|
+
meta: PICKER.turnOnHint,
|
|
435
|
+
agents: "",
|
|
436
|
+
}));
|
|
437
|
+
const { cut, column, withAgents } = layout([...onNow, ...repoRows, ...account, ...off]);
|
|
438
|
+
const row = (n, display) => `${String(n).padStart(6)} ${paint(colour, "text", cut(display.name).padEnd(column))}${" ".repeat(GAP)}${paint(colour, "muted", withAgents(display))}`;
|
|
439
|
+
let n = 0;
|
|
440
|
+
if (model.onNow.length > 0) {
|
|
441
|
+
lines.push(paint(colour, "muted", ` ${PICKER.onNow}`));
|
|
442
|
+
for (const d of onNow)
|
|
443
|
+
lines.push(row(++n, d));
|
|
444
|
+
}
|
|
445
|
+
for (const group of model.owners) {
|
|
446
|
+
lines.push(ownerLine(group, colour));
|
|
447
|
+
for (const repo of shown(group))
|
|
448
|
+
lines.push(row(++n, repoDisplay(repo, nowMs)));
|
|
449
|
+
const hidden = group.repos.length - shown(group).length;
|
|
450
|
+
if (hidden > 0) {
|
|
451
|
+
lines.push(paint(colour, "muted", ` + ${PICKER.moreTyped(hidden, group.owner)}`));
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
if (account.length > 0) {
|
|
455
|
+
lines.push(paint(colour, "muted", ` ${PICKER.onAccount}`));
|
|
456
|
+
for (const d of account)
|
|
457
|
+
lines.push(row(++n, d));
|
|
458
|
+
}
|
|
459
|
+
if (model.turnedOff.length > 0) {
|
|
460
|
+
lines.push(paint(colour, "muted", ` ${PICKER.turnedOff}`));
|
|
461
|
+
for (const d of off)
|
|
462
|
+
lines.push(row(++n, d));
|
|
463
|
+
}
|
|
464
|
+
lines.push(...notListedBlock(model, colour), "");
|
|
465
|
+
lines.push(` ${paint(colour, "text", PICKER.choose(model.owners.length > 0))}`);
|
|
466
|
+
if (options.offerAccount === true)
|
|
467
|
+
lines.push(...wrap(PICKER.gLine, 2).map((l) => paint(colour, "text", l)));
|
|
468
|
+
if (model.onNow.length > 0)
|
|
469
|
+
lines.push(` ${paint(colour, "text", PICKER.removeHint)}`);
|
|
470
|
+
const pre = preChange(model);
|
|
471
|
+
const preSlug = pre === null ? null : (pre.addRepos[0] ?? pre.turnOn[0] ?? null);
|
|
472
|
+
lines.push(` ${paint(colour, "text", preSlug === null ? PICKER.enterNothing : PICKER.enterThisRepo(preSlug))}`);
|
|
473
|
+
return lines;
|
|
474
|
+
}
|
|
475
|
+
/** The `Not understood:` line the prompt prints before it asks again. */
|
|
476
|
+
export function notUnderstoodLines(tokens) {
|
|
477
|
+
return wrap(PICKER.notUnderstood(tokens.join(", ")), 2);
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* The `You chose:` block — the thing the y/N is asking about (D7 · 3A), on the §13.5 label gutter. One label per kind of
|
|
481
|
+
* change; an owner row says how many repos are here and that later clones are covered, and a typed name with no clone
|
|
482
|
+
* on this machine says so, so a typo shows BEFORE the question.
|
|
483
|
+
*/
|
|
484
|
+
export function renderGrantBlock(change, facts, colour,
|
|
485
|
+
/** `You chose:` for the person's picks; the account's own list (`g`, screen 1b) is headed `Your account grants:`. */
|
|
486
|
+
heading = PICKER.chose) {
|
|
487
|
+
const lines = [` ${paint(colour, "strong", heading)}`];
|
|
488
|
+
const rows = [
|
|
489
|
+
[
|
|
490
|
+
PICKER.labelOwners,
|
|
491
|
+
change.addOwners.map((o) => {
|
|
492
|
+
const here = facts.reposHere.get(o) ?? 0;
|
|
493
|
+
return `${o}/ ${here > 0 ? PICKER.ownerHere(here) : PICKER.noCloneHere}`;
|
|
494
|
+
}),
|
|
495
|
+
],
|
|
496
|
+
[
|
|
497
|
+
PICKER.labelRepos,
|
|
498
|
+
change.addRepos.map((r) => (facts.noClone.has(r) ? `${r} ${PICKER.noCloneHere}` : r)),
|
|
499
|
+
],
|
|
500
|
+
[
|
|
501
|
+
PICKER.labelTurnOn,
|
|
502
|
+
change.turnOn.map((slug) => (facts.accountOff?.has(slug) === true ? `${slug} ${PICKER.turnedOffOnAccount}` : slug)),
|
|
503
|
+
],
|
|
504
|
+
[
|
|
505
|
+
PICKER.labelStop,
|
|
506
|
+
[
|
|
507
|
+
...change.stopOwners.map((o) => `${o}/`),
|
|
508
|
+
...change.stopRepos,
|
|
509
|
+
...change.stopClones,
|
|
510
|
+
],
|
|
511
|
+
],
|
|
512
|
+
];
|
|
513
|
+
for (const [label, values] of rows) {
|
|
514
|
+
values.forEach((value, i) => {
|
|
515
|
+
const key = i === 0 ? label.padEnd(LABEL_GUTTER) : " ".repeat(LABEL_GUTTER);
|
|
516
|
+
lines.push(` ${paint(colour, "muted", key)}${paint(colour, "text", value)}`);
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
return lines;
|
|
520
|
+
}
|
|
521
|
+
/** The grant y/N: additions (with or without removals) get the upload question, removals alone the stop question. */
|
|
522
|
+
export function grantQuestion(change, colour, answers) {
|
|
523
|
+
const q = hasAdditions(change) ? PICKER.questionGrant : PICKER.questionStop;
|
|
524
|
+
return ` ${paint(colour, "text", q)} ${paint(colour, "muted", answers)} `;
|
|
525
|
+
}
|
|
526
|
+
//# sourceMappingURL=picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"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"}
|