@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.
Files changed (172) hide show
  1. package/README.md +191 -9
  2. package/dist/account_not_here.d.ts +15 -0
  3. package/dist/account_not_here.js +25 -0
  4. package/dist/account_not_here.js.map +1 -0
  5. package/dist/agent_hooks.d.ts +8 -0
  6. package/dist/agent_hooks.js +31 -1
  7. package/dist/agent_hooks.js.map +1 -1
  8. package/dist/agents/claude_code.d.ts +34 -0
  9. package/dist/agents/claude_code.js +141 -8
  10. package/dist/agents/claude_code.js.map +1 -1
  11. package/dist/agents/codex_cli.d.ts +13 -0
  12. package/dist/agents/codex_cli.js +241 -2
  13. package/dist/agents/codex_cli.js.map +1 -1
  14. package/dist/agents/cursor.d.ts +34 -0
  15. package/dist/agents/cursor.js +115 -1
  16. package/dist/agents/cursor.js.map +1 -1
  17. package/dist/agents/session_listing.d.ts +29 -0
  18. package/dist/agents/session_listing.js +49 -0
  19. package/dist/agents/session_listing.js.map +1 -0
  20. package/dist/agents/types.d.ts +118 -8
  21. package/dist/agents/types.js +17 -3
  22. package/dist/agents/types.js.map +1 -1
  23. package/dist/commands/approval_pending.d.ts +9 -0
  24. package/dist/commands/approval_pending.js +23 -0
  25. package/dist/commands/approval_pending.js.map +1 -0
  26. package/dist/commands/auth.d.ts +7 -0
  27. package/dist/commands/auth.js +52 -11
  28. package/dist/commands/auth.js.map +1 -1
  29. package/dist/commands/backfill.d.ts +160 -0
  30. package/dist/commands/backfill.js +748 -0
  31. package/dist/commands/backfill.js.map +1 -0
  32. package/dist/commands/browser_credential.d.ts +6 -2
  33. package/dist/commands/browser_credential.js +34 -14
  34. package/dist/commands/browser_credential.js.map +1 -1
  35. package/dist/commands/connect.d.ts +146 -0
  36. package/dist/commands/connect.js +216 -117
  37. package/dist/commands/connect.js.map +1 -1
  38. package/dist/commands/connect_account.d.ts +135 -0
  39. package/dist/commands/connect_account.js +321 -0
  40. package/dist/commands/connect_account.js.map +1 -0
  41. package/dist/commands/connect_picker.d.ts +27 -0
  42. package/dist/commands/connect_picker.js +549 -0
  43. package/dist/commands/connect_picker.js.map +1 -0
  44. package/dist/commands/context.d.ts +16 -0
  45. package/dist/commands/context.js +27 -0
  46. package/dist/commands/context.js.map +1 -1
  47. package/dist/commands/credential_problem.d.ts +15 -4
  48. package/dist/commands/credential_problem.js +29 -22
  49. package/dist/commands/credential_problem.js.map +1 -1
  50. package/dist/commands/device_credential.d.ts +5 -1
  51. package/dist/commands/device_credential.js +17 -14
  52. package/dist/commands/device_credential.js.map +1 -1
  53. package/dist/commands/finalize.d.ts +95 -0
  54. package/dist/commands/finalize.js +249 -74
  55. package/dist/commands/finalize.js.map +1 -1
  56. package/dist/commands/finish_mint.d.ts +30 -6
  57. package/dist/commands/finish_mint.js +26 -6
  58. package/dist/commands/finish_mint.js.map +1 -1
  59. package/dist/commands/report.js +38 -30
  60. package/dist/commands/report.js.map +1 -1
  61. package/dist/commands/scan.d.ts +162 -0
  62. package/dist/commands/scan.js +507 -0
  63. package/dist/commands/scan.js.map +1 -0
  64. package/dist/commands/status.d.ts +19 -1
  65. package/dist/commands/status.js +232 -26
  66. package/dist/commands/status.js.map +1 -1
  67. package/dist/commands/status_hooks.d.ts +14 -0
  68. package/dist/commands/status_hooks.js +81 -0
  69. package/dist/commands/status_hooks.js.map +1 -0
  70. package/dist/commands/status_machine.d.ts +27 -0
  71. package/dist/commands/status_machine.js +210 -0
  72. package/dist/commands/status_machine.js.map +1 -0
  73. package/dist/commands/sync_reason.d.ts +17 -0
  74. package/dist/commands/sync_reason.js +25 -0
  75. package/dist/commands/sync_reason.js.map +1 -0
  76. package/dist/commands/why.js +44 -31
  77. package/dist/commands/why.js.map +1 -1
  78. package/dist/consent.d.ts +217 -0
  79. package/dist/consent.js +400 -1
  80. package/dist/consent.js.map +1 -1
  81. package/dist/copy/error_codes.d.ts +222 -0
  82. package/dist/copy/error_codes.js +105 -0
  83. package/dist/copy/error_codes.js.map +1 -0
  84. package/dist/copy/index.d.ts +2 -2
  85. package/dist/copy/index.js +2 -2
  86. package/dist/copy/index.js.map +1 -1
  87. package/dist/copy/strings.d.ts +617 -30
  88. package/dist/copy/strings.js +741 -36
  89. package/dist/copy/strings.js.map +1 -1
  90. package/dist/copy/time.d.ts +11 -0
  91. package/dist/copy/time.js +18 -0
  92. package/dist/copy/time.js.map +1 -1
  93. package/dist/credential.d.ts +5 -1
  94. package/dist/credential.js +2 -2
  95. package/dist/credential.js.map +1 -1
  96. package/dist/git.d.ts +43 -0
  97. package/dist/git.js +95 -0
  98. package/dist/git.js.map +1 -1
  99. package/dist/grants_sync.d.ts +165 -0
  100. package/dist/grants_sync.js +289 -0
  101. package/dist/grants_sync.js.map +1 -0
  102. package/dist/grants_verb.d.ts +70 -0
  103. package/dist/grants_verb.js +121 -0
  104. package/dist/grants_verb.js.map +1 -0
  105. package/dist/hooks/entry.d.ts +18 -1
  106. package/dist/hooks/entry.js +117 -14
  107. package/dist/hooks/entry.js.map +1 -1
  108. package/dist/hooks/post_commit.js +3 -3
  109. package/dist/hooks/post_commit.js.map +1 -1
  110. package/dist/hooks/post_rewrite.js +6 -4
  111. package/dist/hooks/post_rewrite.js.map +1 -1
  112. package/dist/hooks/session_grants.d.ts +59 -0
  113. package/dist/hooks/session_grants.js +91 -0
  114. package/dist/hooks/session_grants.js.map +1 -0
  115. package/dist/hooks/session_start.d.ts +114 -0
  116. package/dist/hooks/session_start.js +243 -0
  117. package/dist/hooks/session_start.js.map +1 -0
  118. package/dist/index.d.ts +1 -1
  119. package/dist/index.js +76 -11
  120. package/dist/index.js.map +1 -1
  121. package/dist/install.d.ts +57 -0
  122. package/dist/install.js +54 -20
  123. package/dist/install.js.map +1 -1
  124. package/dist/json.d.ts +32 -9
  125. package/dist/json.js +35 -8
  126. package/dist/json.js.map +1 -1
  127. package/dist/machine_state.d.ts +52 -0
  128. package/dist/machine_state.js +63 -0
  129. package/dist/machine_state.js.map +1 -0
  130. package/dist/oauth/retire.d.ts +10 -0
  131. package/dist/oauth/retire.js +13 -0
  132. package/dist/oauth/retire.js.map +1 -1
  133. package/dist/oauth/session.d.ts +1 -0
  134. package/dist/org_pending.d.ts +52 -0
  135. package/dist/org_pending.js +109 -0
  136. package/dist/org_pending.js.map +1 -0
  137. package/dist/paths.d.ts +70 -0
  138. package/dist/paths.js +90 -0
  139. package/dist/paths.js.map +1 -1
  140. package/dist/pending_revoke.d.ts +117 -0
  141. package/dist/pending_revoke.js +233 -0
  142. package/dist/pending_revoke.js.map +1 -0
  143. package/dist/pending_revoke_file.d.ts +55 -0
  144. package/dist/pending_revoke_file.js +74 -0
  145. package/dist/pending_revoke_file.js.map +1 -0
  146. package/dist/picker.d.ts +208 -0
  147. package/dist/picker.js +526 -0
  148. package/dist/picker.js.map +1 -0
  149. package/dist/picker_checklist.d.ts +141 -0
  150. package/dist/picker_checklist.js +411 -0
  151. package/dist/picker_checklist.js.map +1 -0
  152. package/dist/policy.d.ts +70 -1
  153. package/dist/policy.js +68 -2
  154. package/dist/policy.js.map +1 -1
  155. package/dist/post.d.ts +91 -18
  156. package/dist/post.js +259 -27
  157. package/dist/post.js.map +1 -1
  158. package/dist/state.d.ts +6 -0
  159. package/dist/state.js +38 -1
  160. package/dist/state.js.map +1 -1
  161. package/dist/system_message.d.ts +32 -2
  162. package/dist/system_message.js +47 -5
  163. package/dist/system_message.js.map +1 -1
  164. package/dist/term.d.ts +28 -2
  165. package/dist/term.js +23 -2
  166. package/dist/term.js.map +1 -1
  167. package/dist/verb_help.d.ts +13 -0
  168. package/dist/verb_help.js +40 -0
  169. package/dist/verb_help.js.map +1 -0
  170. package/dist/version.d.ts +1 -1
  171. package/dist/version.js +1 -1
  172. 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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"}