prtape-cli 0.0.0-stage → 0.1.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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +138 -2
  3. package/dist/adapters/claude.d.ts +2 -0
  4. package/dist/adapters/claude.js +309 -0
  5. package/dist/adapters/claude.js.map +1 -0
  6. package/dist/bash-edits.d.ts +41 -0
  7. package/dist/bash-edits.js +440 -0
  8. package/dist/bash-edits.js.map +1 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +214 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/decision.d.ts +7 -0
  13. package/dist/decision.js +224 -0
  14. package/dist/decision.js.map +1 -0
  15. package/dist/discover.d.ts +32 -0
  16. package/dist/discover.js +179 -0
  17. package/dist/discover.js.map +1 -0
  18. package/dist/display.d.ts +28 -0
  19. package/dist/display.js +311 -0
  20. package/dist/display.js.map +1 -0
  21. package/dist/env.d.ts +5 -0
  22. package/dist/env.js +11 -0
  23. package/dist/env.js.map +1 -0
  24. package/dist/gh.d.ts +46 -0
  25. package/dist/gh.js +190 -0
  26. package/dist/gh.js.map +1 -0
  27. package/dist/glance.d.ts +15 -0
  28. package/dist/glance.js +75 -0
  29. package/dist/glance.js.map +1 -0
  30. package/dist/index.d.ts +12 -0
  31. package/dist/index.js +12 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/orphan.d.ts +44 -0
  34. package/dist/orphan.js +152 -0
  35. package/dist/orphan.js.map +1 -0
  36. package/dist/png.d.ts +2 -0
  37. package/dist/png.js +13 -0
  38. package/dist/png.js.map +1 -0
  39. package/dist/privacy.d.ts +7 -0
  40. package/dist/privacy.js +39 -0
  41. package/dist/privacy.js.map +1 -0
  42. package/dist/redact.d.ts +17 -0
  43. package/dist/redact.js +101 -0
  44. package/dist/redact.js.map +1 -0
  45. package/dist/run.d.ts +48 -0
  46. package/dist/run.js +218 -0
  47. package/dist/run.js.map +1 -0
  48. package/dist/summary.d.ts +7 -0
  49. package/dist/summary.js +134 -0
  50. package/dist/summary.js.map +1 -0
  51. package/dist/tests-detect.d.ts +19 -0
  52. package/dist/tests-detect.js +97 -0
  53. package/dist/tests-detect.js.map +1 -0
  54. package/dist/text.d.ts +8 -0
  55. package/dist/text.js +31 -0
  56. package/dist/text.js.map +1 -0
  57. package/dist/timeline/format.d.ts +28 -0
  58. package/dist/timeline/format.js +127 -0
  59. package/dist/timeline/format.js.map +1 -0
  60. package/dist/timeline/md.d.ts +17 -0
  61. package/dist/timeline/md.js +129 -0
  62. package/dist/timeline/md.js.map +1 -0
  63. package/dist/timeline/svg.d.ts +7 -0
  64. package/dist/timeline/svg.js +260 -0
  65. package/dist/timeline/svg.js.map +1 -0
  66. package/dist/timeline/wrap.d.ts +7 -0
  67. package/dist/timeline/wrap.js +77 -0
  68. package/dist/timeline/wrap.js.map +1 -0
  69. package/dist/types.d.ts +96 -0
  70. package/dist/types.js +5 -0
  71. package/dist/types.js.map +1 -0
  72. package/dist/version.d.ts +1 -0
  73. package/dist/version.js +2 -0
  74. package/dist/version.js.map +1 -0
  75. package/package.json +57 -4
@@ -0,0 +1,440 @@
1
+ import { isScratchPath } from "./privacy.js";
2
+ import { isTestCommand } from "./tests-detect.js";
3
+ const READERS = new Set(["cat", "head", "tail", "less", "more", "bat", "nl"]);
4
+ const SEARCHERS = new Set(["rg", "grep", "egrep", "fgrep"]);
5
+ /** In-place `sed` replacements, in command order. Used to describe what the edit changed. */
6
+ export function bashSubstitutions(command) {
7
+ const found = [];
8
+ for (const segment of splitSegments(command)) {
9
+ const words = shellWords(stripLead(segment));
10
+ if ((words[0] ?? "") !== "sed")
11
+ continue;
12
+ const files = sedTargets(words).filter((file) => !isScratchPath(file));
13
+ const script = sedScript(words);
14
+ const replacement = script ? parseReplacement(script) : undefined;
15
+ if (!replacement)
16
+ continue;
17
+ for (const file of files)
18
+ found.push({ file, old: replacement.old, next: replacement.next });
19
+ }
20
+ return found;
21
+ }
22
+ function sedScript(words) {
23
+ let expression;
24
+ const positionals = [];
25
+ for (let index = 1; index < words.length; index += 1) {
26
+ const word = words[index] ?? "";
27
+ if (word === "-e" || word === "--expression") {
28
+ expression = words[index + 1] ?? "";
29
+ index += 1;
30
+ continue;
31
+ }
32
+ if (word === "-f" || word === "--file") {
33
+ index += 1;
34
+ continue;
35
+ }
36
+ if (word === "-i" || word === "--in-place" || word.startsWith("-i") || word.startsWith("--in-place")) {
37
+ if (word === "-i" || word === "--in-place") {
38
+ const suffix = words[index + 1];
39
+ if (suffix === "" || (suffix !== undefined && /^\.[A-Za-z0-9._-]+$/.test(suffix)))
40
+ index += 1;
41
+ }
42
+ continue;
43
+ }
44
+ if (word.startsWith("-"))
45
+ continue;
46
+ positionals.push(word);
47
+ }
48
+ if (expression !== undefined)
49
+ return expression || undefined;
50
+ return positionals[0];
51
+ }
52
+ function parseReplacement(script) {
53
+ if (!script.startsWith("s") || script.length < 4)
54
+ return undefined;
55
+ const delim = script[1] ?? "";
56
+ if (!delim || delim === "\\")
57
+ return undefined;
58
+ const parts = [];
59
+ let current = "";
60
+ for (let index = 2; index < script.length; index += 1) {
61
+ const ch = script[index] ?? "";
62
+ if (ch === "\\" && script[index + 1] === delim) {
63
+ current += delim;
64
+ index += 1;
65
+ continue;
66
+ }
67
+ if (ch === delim) {
68
+ parts.push(current);
69
+ current = "";
70
+ if (parts.length === 2)
71
+ break;
72
+ continue;
73
+ }
74
+ current += ch;
75
+ }
76
+ if (parts.length < 2)
77
+ return undefined;
78
+ return { old: parts[0] ?? "", next: parts[1] ?? "" };
79
+ }
80
+ export function bashFileEdits(command) {
81
+ const edits = [];
82
+ for (const event of bashEvents(command)) {
83
+ if (event.kind === "edit")
84
+ remember(edits, event.path, event.action);
85
+ }
86
+ return edits;
87
+ }
88
+ /**
89
+ * Left-to-right actions inside one Bash command.
90
+ * Reads joined with `;` or `&&` before a test stay, in order.
91
+ * A pipe into the test (`cat x | npm test`) is setup, not its own beat.
92
+ */
93
+ export function bashEvents(command) {
94
+ const parts = splitJoined(command);
95
+ const parsed = parts.map((part) => ({ join: part.join, events: segmentEvents(part.text) }));
96
+ const events = [];
97
+ for (let index = 0; index < parsed.length; index += 1) {
98
+ for (const event of parsed[index]?.events ?? []) {
99
+ if (event.kind === "read" && pipedIntoTest(parsed, index))
100
+ continue;
101
+ events.push(event);
102
+ }
103
+ }
104
+ return events;
105
+ }
106
+ function pipedIntoTest(parsed, index) {
107
+ let cursor = index;
108
+ while (cursor + 1 < parsed.length && parsed[cursor + 1]?.join === "|") {
109
+ cursor += 1;
110
+ if (parsed[cursor]?.events.some((event) => event.kind === "test"))
111
+ return true;
112
+ }
113
+ return false;
114
+ }
115
+ function segmentEvents(segment) {
116
+ const body = stripLead(segment);
117
+ if (!body)
118
+ return [];
119
+ const words = shellWords(body);
120
+ const head = commandBase(words[0] ?? "");
121
+ if (!head || head === "tee")
122
+ return [];
123
+ const git = gitEvents(words, head);
124
+ if (git)
125
+ return git;
126
+ if (head === "sed") {
127
+ const edits = sedTargets(words).filter((file) => !isScratchPath(file));
128
+ if (edits.length > 0) {
129
+ return edits.map((file) => ({ kind: "edit", path: file, action: "edit" }));
130
+ }
131
+ return reads(sedReadFiles(words));
132
+ }
133
+ if (head === "perl") {
134
+ return perlTargets(words)
135
+ .filter((file) => !isScratchPath(file))
136
+ .map((file) => ({ kind: "edit", path: file, action: "edit" }));
137
+ }
138
+ if (isTestCommand(body))
139
+ return [{ kind: "test" }];
140
+ const writes = redirectTargets(body).filter((file) => !isScratchPath(file));
141
+ if (writes.length > 0) {
142
+ return writes.map((file) => ({ kind: "edit", path: file, action: "write" }));
143
+ }
144
+ if (SEARCHERS.has(head))
145
+ return reads(searchFiles(words));
146
+ if (head === "ls") {
147
+ const names = readerFiles("ls", words).filter((name) => name !== "." && name !== "..");
148
+ return names.length > 0 ? reads(names) : [];
149
+ }
150
+ if (READERS.has(head))
151
+ return reads(readerFiles(head, words));
152
+ return [];
153
+ }
154
+ function commandBase(word) {
155
+ const base = word.split("/").pop() ?? word;
156
+ return base;
157
+ }
158
+ function gitEvents(words, head) {
159
+ if (head !== "git")
160
+ return undefined;
161
+ const sub = words[1] ?? "";
162
+ if (sub === "commit")
163
+ return [{ kind: "commit", message: commitMessages(words) }];
164
+ if (sub !== "diff" && sub !== "show" && sub !== "status" && sub !== "log")
165
+ return undefined;
166
+ const files = [];
167
+ for (const word of words.slice(2)) {
168
+ if (word === "--" || word.startsWith("-"))
169
+ continue;
170
+ const path = word.includes(":") ? word.slice(word.indexOf(":") + 1) : word;
171
+ if (looksLikeFile(path))
172
+ files.push(path);
173
+ }
174
+ return files.length > 0 ? reads(files) : [{ kind: "read" }];
175
+ }
176
+ function commitMessages(words) {
177
+ const messages = [];
178
+ for (let index = 0; index < words.length; index += 1) {
179
+ const word = words[index] ?? "";
180
+ if (word !== "-m" && word !== "--message")
181
+ continue;
182
+ const message = words[index + 1]?.trim();
183
+ if (message)
184
+ messages.push(message);
185
+ index += 1;
186
+ }
187
+ if (messages.length === 0)
188
+ return undefined;
189
+ return messages.join("\n\n");
190
+ }
191
+ function reads(files) {
192
+ const kept = files.filter((file) => file && !isScratchPath(file));
193
+ if (kept.length === 0)
194
+ return [];
195
+ return kept.map((file) => ({ kind: "read", path: file }));
196
+ }
197
+ function readerFiles(head, words) {
198
+ const positionals = [];
199
+ for (let index = 1; index < words.length; index += 1) {
200
+ const word = words[index] ?? "";
201
+ const takesValue = (head === "head" || head === "tail") && (word === "-n" || word === "-c");
202
+ if (takesValue) {
203
+ index += 1;
204
+ continue;
205
+ }
206
+ if (word.startsWith("-"))
207
+ continue;
208
+ positionals.push(word);
209
+ }
210
+ return positionals;
211
+ }
212
+ function searchFiles(words) {
213
+ let flaggedPattern = false;
214
+ const positionals = [];
215
+ for (let index = 1; index < words.length; index += 1) {
216
+ const word = words[index] ?? "";
217
+ if (word === "-e" || word === "--regexp" || word === "-f" || word === "-m") {
218
+ flaggedPattern = word === "-e" || word === "--regexp" || word === "-f";
219
+ index += 1;
220
+ continue;
221
+ }
222
+ if (word.startsWith("-"))
223
+ continue;
224
+ positionals.push(word);
225
+ }
226
+ const files = flaggedPattern ? positionals : positionals.slice(1);
227
+ return files.filter(looksLikeFile);
228
+ }
229
+ function sedReadFiles(words) {
230
+ let expression = false;
231
+ const positionals = [];
232
+ for (let index = 1; index < words.length; index += 1) {
233
+ const word = words[index] ?? "";
234
+ if (word === "-e" || word === "--expression" || word === "-f" || word === "--file") {
235
+ expression = true;
236
+ index += 1;
237
+ continue;
238
+ }
239
+ if (word.startsWith("-"))
240
+ continue;
241
+ positionals.push(word);
242
+ }
243
+ const files = expression ? positionals : positionals.slice(1);
244
+ return files.filter(looksLikeFile);
245
+ }
246
+ function looksLikeFile(value) {
247
+ if (!value || value === "." || value === ".." || value.startsWith("-"))
248
+ return false;
249
+ return value.includes("/") || value.includes(".");
250
+ }
251
+ function remember(edits, filePath, action) {
252
+ const cleaned = filePath.trim();
253
+ if (!cleaned || cleaned === "&" || isScratchPath(cleaned))
254
+ return;
255
+ if (edits.some((edit) => edit.path === cleaned))
256
+ return;
257
+ edits.push({ path: cleaned, action });
258
+ }
259
+ function splitSegments(command) {
260
+ return splitJoined(command).map((part) => part.text);
261
+ }
262
+ function splitJoined(command) {
263
+ const parts = [];
264
+ let current = "";
265
+ let join = "start";
266
+ let quote = null;
267
+ const push = (next) => {
268
+ const text = current.trim();
269
+ if (text)
270
+ parts.push({ text, join });
271
+ current = "";
272
+ join = next;
273
+ };
274
+ for (let index = 0; index < command.length; index += 1) {
275
+ const ch = command[index] ?? "";
276
+ if (quote) {
277
+ current += ch;
278
+ if (ch === quote)
279
+ quote = null;
280
+ continue;
281
+ }
282
+ if (ch === "'" || ch === '"') {
283
+ quote = ch;
284
+ current += ch;
285
+ continue;
286
+ }
287
+ const next = command[index + 1];
288
+ if (ch === "&" && next === "&") {
289
+ push("&&");
290
+ index += 1;
291
+ continue;
292
+ }
293
+ if (ch === "|" && next === "|") {
294
+ push("||");
295
+ index += 1;
296
+ continue;
297
+ }
298
+ if (ch === "|") {
299
+ push("|");
300
+ continue;
301
+ }
302
+ if (ch === ";" || ch === "\n") {
303
+ push(";");
304
+ continue;
305
+ }
306
+ current += ch;
307
+ }
308
+ push("start");
309
+ return parts;
310
+ }
311
+ /** Repo-relative paths printed in tool output, such as `ls` lines or `cat` file headers. */
312
+ export function pathsInText(text) {
313
+ const found = [];
314
+ const pattern = /(?:^|[\s"'`(=>])((?:[A-Za-z0-9_-]+\/)+[A-Za-z0-9_.-]+\.[A-Za-z0-9]+)(?=$|[\s"'`),:<])/g;
315
+ for (const match of text.matchAll(pattern)) {
316
+ const filePath = match[1] ?? "";
317
+ if (!filePath || filePath.includes("..") || isGlob(filePath))
318
+ continue;
319
+ const directories = filePath.split("/").slice(0, -1);
320
+ if (directories.some((part) => part.includes(".")))
321
+ continue;
322
+ if (!found.includes(filePath))
323
+ found.push(filePath);
324
+ }
325
+ return found;
326
+ }
327
+ /** Expand a simple `*` / `?` read against concrete paths evidenced in the session. */
328
+ export function resolveReadGlobs(events, extra = []) {
329
+ const known = [
330
+ ...extra.filter((filePath) => filePath && !filePath.startsWith("/") && !filePath.includes("..") && !isGlob(filePath)),
331
+ ...events.flatMap((event) => (event.kind === "read" || event.kind === "edit") && event.path && !isGlob(event.path) ? [event.path] : []),
332
+ ];
333
+ const expanded = [];
334
+ for (const event of events) {
335
+ if (event.kind !== "read" || !event.path || !isGlob(event.path)) {
336
+ expanded.push(event);
337
+ continue;
338
+ }
339
+ const matches = [];
340
+ for (const path of known) {
341
+ if (!matches.includes(path) && globMatch(event.path ?? "", path))
342
+ matches.push(path);
343
+ }
344
+ if (matches.length === 0) {
345
+ expanded.push(event);
346
+ continue;
347
+ }
348
+ for (const path of matches)
349
+ expanded.push({ ...event, path });
350
+ }
351
+ return expanded;
352
+ }
353
+ function isGlob(filePath) {
354
+ return filePath.includes("*") || filePath.includes("?");
355
+ }
356
+ function globMatch(pattern, filePath) {
357
+ let source = "^";
358
+ for (const ch of pattern) {
359
+ if (ch === "*")
360
+ source += "[^/]*";
361
+ else if (ch === "?")
362
+ source += "[^/]";
363
+ else if ("\\.^$+()[]{}|".includes(ch))
364
+ source += `\\${ch}`;
365
+ else
366
+ source += ch;
367
+ }
368
+ source += "$";
369
+ return new RegExp(source).test(filePath);
370
+ }
371
+ function stripLead(segment) {
372
+ let rest = segment.trim();
373
+ const env = /^(?:[A-Za-z_][A-Za-z0-9_]*=(?:\"[^\"]*\"|'[^']*'|\S+)\s+)+/;
374
+ rest = rest.replace(env, "");
375
+ const wrapped = rest.match(/^(?:sudo|command|time|nice|nohup)\s+(?:-\S+\s+)*(.*)$/);
376
+ return (wrapped?.[1] ?? rest).trim();
377
+ }
378
+ function shellWords(input) {
379
+ const words = [];
380
+ for (const match of input.matchAll(/"([^"]*)"|'([^']*)'|(\S+)/g)) {
381
+ words.push(match[1] ?? match[2] ?? match[3] ?? "");
382
+ }
383
+ return words;
384
+ }
385
+ function sedTargets(words) {
386
+ let inplace = false;
387
+ let expression = false;
388
+ const positionals = [];
389
+ for (let index = 1; index < words.length; index += 1) {
390
+ const word = words[index] ?? "";
391
+ if (word === "-e" || word === "-f" || word === "--expression" || word === "--file") {
392
+ expression = true;
393
+ index += 1;
394
+ continue;
395
+ }
396
+ if (word === "-i" || word === "--in-place" || word.startsWith("-i") || word.startsWith("--in-place")) {
397
+ inplace = true;
398
+ if (word === "-i" || word === "--in-place") {
399
+ const suffix = words[index + 1];
400
+ if (suffix === "" || (suffix !== undefined && /^\.[A-Za-z0-9._-]+$/.test(suffix)))
401
+ index += 1;
402
+ }
403
+ continue;
404
+ }
405
+ if (word.startsWith("-"))
406
+ continue;
407
+ positionals.push(word);
408
+ }
409
+ if (!inplace)
410
+ return [];
411
+ return expression ? positionals : positionals.slice(1);
412
+ }
413
+ function perlTargets(words) {
414
+ let inplace = false;
415
+ const files = [];
416
+ for (let index = 1; index < words.length; index += 1) {
417
+ const word = words[index] ?? "";
418
+ if (word.startsWith("-") && word.length > 1) {
419
+ if (word === "-i" || word.startsWith("-i") || /^-[pne]*i[pne]*$/.test(word))
420
+ inplace = true;
421
+ if (word === "-e" || word === "-E" || word === "-f" || /^-[pni]*e[pni]*$/.test(word))
422
+ index += 1;
423
+ continue;
424
+ }
425
+ files.push(word);
426
+ }
427
+ return inplace ? files : [];
428
+ }
429
+ function redirectTargets(segment) {
430
+ const unquoted = segment.replace(/"(?:\\.|[^"])*"|'(?:\\.|[^'])*'/g, " ");
431
+ const targets = [];
432
+ for (const match of unquoted.matchAll(/(^|[^&0-9])(>>?)\s*(\S+)/g)) {
433
+ const target = match[3] ?? "";
434
+ if (!target || target.startsWith("&"))
435
+ continue;
436
+ targets.push(target);
437
+ }
438
+ return targets;
439
+ }
440
+ //# sourceMappingURL=bash-edits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-edits.js","sourceRoot":"","sources":["../src/bash-edits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAclD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAa5D,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK;YAAE,SAAS;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,IAAI,CAAC,WAAW;YAAE,SAAS;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,IAAI,UAA8B,CAAC;IACnC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC7C,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvC,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACrG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAChC,IAAI,MAAM,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAAE,KAAK,IAAI,CAAC,CAAC;YAChG,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,IAAI,SAAS,CAAC;IAC7D,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,EAAE,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YAC/C,OAAO,IAAI,KAAK,CAAC;YACjB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YAC9B,SAAS;QACX,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;YAChD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;gBAAE,SAAS;YACpE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,MAA6C,EAAE,KAAa;IACjF,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;QACtE,MAAM,IAAI,CAAC,CAAC;QACZ,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAe,EAAE,CAAC,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,KAAK,CAAC;aACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAe,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAgB,EAAE,CAAC,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;QACvF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAe,EAAE,IAAY;IAC9C,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClF,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC5F,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,IAAI,aAAa,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,cAAc,CAAC,KAAe;IACrC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,WAAW;YAAE,SAAS;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACzC,IAAI,OAAO;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,KAAK,CAAC,KAAe;IAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAe;IAChD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;QAC5F,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,KAAe;IAClC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC3E,cAAc,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC;YACvE,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,KAAe;IACnC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnF,UAAU,GAAG,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACrF,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAiB,EAAE,QAAgB,EAAE,MAA0B;IAC/E,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC;QAAE,OAAO;IAClE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;QAAE,OAAO;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AACxC,CAAC;AAID,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,KAAK,GAAmC,EAAE,CAAC;IACjD,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,IAAI,GAAS,OAAO,CAAC;IACzB,IAAI,KAAK,GAAqB,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,IAAU,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,IAAI,CAAC;IACd,CAAC,CAAC;IACF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,IAAI,EAAE,CAAC;YACd,IAAI,EAAE,KAAK,KAAK;gBAAE,KAAK,GAAG,IAAI,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,KAAK,GAAG,EAAE,CAAC;YACX,OAAO,IAAI,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAChC,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,CAAC;YACX,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,CAAC;YACX,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,SAAS;QACX,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,wFAAwF,CAAC;IACzG,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvE,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,SAAS;QAC7D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,MAAuB,EAAE,QAAkB,EAAE;IAC5E,MAAM,KAAK,GAAG;QACZ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrH,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1B,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAC1G;KACF,CAAC;IACF,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,MAAM,CAAC,QAAgB;IAC9B,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,QAAgB;IAClD,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,EAAE,KAAK,GAAG;YAAE,MAAM,IAAI,OAAO,CAAC;aAC7B,IAAI,EAAE,KAAK,GAAG;YAAE,MAAM,IAAI,MAAM,CAAC;aACjC,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,EAAE,EAAE,CAAC;;YACtD,MAAM,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC;IACd,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,4DAA4D,CAAC;IACzE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACpF,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,KAAe;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnF,UAAU,GAAG,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACrG,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAChC,IAAI,MAAM,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAAE,KAAK,IAAI,CAAC,CAAC;YAChG,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAC,KAAe;IAClC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,GAAG,IAAI,CAAC;YAC5F,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;YACjG,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC;QACnE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAChD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import { runPr, toPublicJson, formatPosted } from "./run.js";
4
+ import { NoSessionError } from "./discover.js";
5
+ import { envValue } from "./env.js";
6
+ import { VERSION } from "./version.js";
7
+ const HELP = `PRtape puts one image on the pull request.
8
+ See what your AI agent actually did. What the agent did, on the PR.
9
+
10
+ Install:
11
+ npm i -g prtape-cli
12
+ npx prtape-cli pr
13
+
14
+ Usage:
15
+ prtape pr [options]
16
+
17
+ Options:
18
+ --cwd <dir> Project directory (default: current directory)
19
+ --session <file> Claude Code JSONL to read
20
+ --pr <number> Comment on this pull request (default: PR for the current branch)
21
+ --source auto|claude Claude Code only for now (default: auto)
22
+ --claude-home <dir> Claude config directory (default: ~/.claude or $CLAUDE_CONFIG_DIR)
23
+ --dry-run Print the comment and do not call gh
24
+ --json Print the redacted summary as JSON on stdout
25
+ --redact-emails Also redact email addresses
26
+ --demo Tag the timeline as a Demo project
27
+ --label demo Same as --demo
28
+ -h, --help Show this help
29
+ -V, --version Show the version
30
+
31
+ Examples:
32
+ prtape pr
33
+ prtape pr --dry-run
34
+ prtape pr --json --dry-run
35
+ prtape pr --session fixtures/claude-session.jsonl --dry-run
36
+
37
+ A real run pushes timeline.png to the orphan ref refs/prtape/<head> and
38
+ the comment leads with github.com/.../raw/<sha>/timeline.png. That ref is not
39
+ your branch. If gh is missing, not authenticated, or the push is denied,
40
+ PRtape prints what failed and how to fix it, then uses the text timeline.
41
+ --dry-run writes the PNG locally and does not push or comment.
42
+ Claude Code only for now.
43
+ `;
44
+ async function main(argv) {
45
+ let args;
46
+ try {
47
+ args = parseArgs(argv);
48
+ }
49
+ catch (error) {
50
+ const message = error instanceof Error ? error.message : String(error);
51
+ process.stderr.write(`${message}\n\n${HELP}`);
52
+ return 1;
53
+ }
54
+ if (args.version) {
55
+ process.stdout.write(`${VERSION}\n`);
56
+ return 0;
57
+ }
58
+ if (args.help || !args.command) {
59
+ process.stdout.write(HELP);
60
+ return args.help || !args.command ? 0 : 1;
61
+ }
62
+ if (args.command !== "pr") {
63
+ process.stderr.write(`Unknown command ${args.command}.\n\n${HELP}`);
64
+ return 1;
65
+ }
66
+ try {
67
+ const result = await runPr({
68
+ cwd: args.cwd ?? process.cwd(),
69
+ sessionPath: args.session,
70
+ source: args.source,
71
+ claudeHome: args.claudeHome,
72
+ dryRun: args.dryRun,
73
+ redactEmails: args.redactEmails,
74
+ prNumber: args.prNumber,
75
+ demo: args.demo,
76
+ });
77
+ writeResult(result, args.json);
78
+ return 0;
79
+ }
80
+ catch (error) {
81
+ const message = error instanceof Error ? error.message : String(error);
82
+ process.stderr.write(`${message}\n`);
83
+ if (envValue("DEBUG") && error instanceof Error && error.stack) {
84
+ process.stderr.write(`${error.stack}\n`);
85
+ }
86
+ return error instanceof NoSessionError ? 1 : 1;
87
+ }
88
+ }
89
+ function writeResult(result, json) {
90
+ const diagnostics = [
91
+ result.sessionNote,
92
+ result.posted ? undefined : result.note,
93
+ `SVG: ${result.svgPath}`,
94
+ result.pngPath ? `PNG: ${result.pngPath}` : undefined,
95
+ ]
96
+ .filter((line) => Boolean(line))
97
+ .join("\n");
98
+ if (json) {
99
+ if (diagnostics)
100
+ process.stderr.write(`${diagnostics}\n`);
101
+ if (result.posted) {
102
+ process.stderr.write(`${result.note}\n`);
103
+ if (result.prUrl)
104
+ process.stderr.write(`${result.prUrl}\n`);
105
+ }
106
+ process.stdout.write(`${JSON.stringify(toPublicJson(result.summary, { imageHosted: result.imageHosted, imageUrl: result.imageUrl }), null, 2)}\n`);
107
+ return;
108
+ }
109
+ if (result.posted) {
110
+ process.stdout.write(formatPosted(result));
111
+ if (result.sessionNote)
112
+ process.stderr.write(`${result.sessionNote}\n`);
113
+ return;
114
+ }
115
+ if (diagnostics)
116
+ process.stderr.write(`${diagnostics}\n`);
117
+ process.stdout.write(result.comment.endsWith("\n") ? result.comment : `${result.comment}\n`);
118
+ }
119
+ function parseArgs(argv) {
120
+ const args = {
121
+ help: false,
122
+ version: false,
123
+ source: "auto",
124
+ dryRun: false,
125
+ json: false,
126
+ redactEmails: false,
127
+ demo: false,
128
+ };
129
+ const rest = argv.slice(2);
130
+ const positional = [];
131
+ for (let index = 0; index < rest.length; index += 1) {
132
+ const token = rest[index];
133
+ if (token === undefined)
134
+ continue;
135
+ const take = () => {
136
+ const value = rest[index + 1];
137
+ if (value === undefined || value.startsWith("-")) {
138
+ throw new Error(`Missing value for ${token}`);
139
+ }
140
+ index += 1;
141
+ return value;
142
+ };
143
+ switch (token) {
144
+ case "-h":
145
+ case "--help":
146
+ args.help = true;
147
+ break;
148
+ case "-V":
149
+ case "--version":
150
+ args.version = true;
151
+ break;
152
+ case "--dry-run":
153
+ args.dryRun = true;
154
+ break;
155
+ case "--json":
156
+ args.json = true;
157
+ break;
158
+ case "--redact-emails":
159
+ args.redactEmails = true;
160
+ break;
161
+ case "--demo":
162
+ args.demo = true;
163
+ break;
164
+ case "--label":
165
+ if (take() === "demo")
166
+ args.demo = true;
167
+ break;
168
+ case "--cwd":
169
+ args.cwd = take();
170
+ break;
171
+ case "--session":
172
+ args.session = take();
173
+ break;
174
+ case "--pr": {
175
+ const value = Number(take());
176
+ if (!Number.isInteger(value) || value <= 0) {
177
+ throw new Error("--pr expects a positive pull request number");
178
+ }
179
+ args.prNumber = value;
180
+ break;
181
+ }
182
+ case "--claude-home":
183
+ args.claudeHome = take();
184
+ break;
185
+ case "--source": {
186
+ const value = take();
187
+ if (value !== "auto" && value !== "claude") {
188
+ throw new Error(`Unknown --source ${value}. Use auto or claude.`);
189
+ }
190
+ args.source = value;
191
+ break;
192
+ }
193
+ default:
194
+ if (token.startsWith("-"))
195
+ throw new Error(`Unknown option ${token}`);
196
+ positional.push(token);
197
+ }
198
+ }
199
+ if (positional.length > 1) {
200
+ throw new Error(`Unexpected argument ${positional.slice(1).join(" ")}`);
201
+ }
202
+ args.command = positional[0];
203
+ if (args.cwd)
204
+ args.cwd = path.resolve(args.cwd);
205
+ return args;
206
+ }
207
+ main(process.argv).then((code) => {
208
+ process.exitCode = code;
209
+ }, (error) => {
210
+ const message = error instanceof Error ? error.message : String(error);
211
+ process.stderr.write(`${message}\n`);
212
+ process.exitCode = 1;
213
+ });
214
+ //# sourceMappingURL=cli.js.map