@dongowu/git-ai-cli 1.0.21 → 2.0.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 (82) hide show
  1. package/README.md +200 -157
  2. package/bin/git-ai.cjs +57 -0
  3. package/install.cjs +50 -0
  4. package/package.json +27 -28
  5. package/.claude/settings.local.json +0 -17
  6. package/CHANGELOG.md +0 -46
  7. package/README_EN.md +0 -264
  8. package/dist/cli.d.ts +0 -3
  9. package/dist/cli.d.ts.map +0 -1
  10. package/dist/cli.js +0 -17
  11. package/dist/cli.js.map +0 -1
  12. package/dist/cli_main.d.ts +0 -2
  13. package/dist/cli_main.d.ts.map +0 -1
  14. package/dist/cli_main.js +0 -255
  15. package/dist/cli_main.js.map +0 -1
  16. package/dist/commands/branch.d.ts +0 -11
  17. package/dist/commands/branch.d.ts.map +0 -1
  18. package/dist/commands/branch.js +0 -279
  19. package/dist/commands/branch.js.map +0 -1
  20. package/dist/commands/commit.d.ts +0 -9
  21. package/dist/commands/commit.d.ts.map +0 -1
  22. package/dist/commands/commit.js +0 -326
  23. package/dist/commands/commit.js.map +0 -1
  24. package/dist/commands/config.d.ts +0 -2
  25. package/dist/commands/config.d.ts.map +0 -1
  26. package/dist/commands/config.js +0 -164
  27. package/dist/commands/config.js.map +0 -1
  28. package/dist/commands/config_manage.d.ts +0 -14
  29. package/dist/commands/config_manage.d.ts.map +0 -1
  30. package/dist/commands/config_manage.js +0 -394
  31. package/dist/commands/config_manage.js.map +0 -1
  32. package/dist/commands/hook.d.ts +0 -5
  33. package/dist/commands/hook.d.ts.map +0 -1
  34. package/dist/commands/hook.js +0 -528
  35. package/dist/commands/hook.js.map +0 -1
  36. package/dist/commands/msg.d.ts +0 -20
  37. package/dist/commands/msg.d.ts.map +0 -1
  38. package/dist/commands/msg.js +0 -148
  39. package/dist/commands/msg.js.map +0 -1
  40. package/dist/commands/pr.d.ts +0 -8
  41. package/dist/commands/pr.d.ts.map +0 -1
  42. package/dist/commands/pr.js +0 -96
  43. package/dist/commands/pr.js.map +0 -1
  44. package/dist/commands/release.d.ts +0 -8
  45. package/dist/commands/release.d.ts.map +0 -1
  46. package/dist/commands/release.js +0 -95
  47. package/dist/commands/release.js.map +0 -1
  48. package/dist/commands/report.d.ts +0 -9
  49. package/dist/commands/report.d.ts.map +0 -1
  50. package/dist/commands/report.js +0 -162
  51. package/dist/commands/report.js.map +0 -1
  52. package/dist/types.d.ts +0 -46
  53. package/dist/types.d.ts.map +0 -1
  54. package/dist/types.js +0 -86
  55. package/dist/types.js.map +0 -1
  56. package/dist/utils/agent.d.ts +0 -5
  57. package/dist/utils/agent.d.ts.map +0 -1
  58. package/dist/utils/agent.js +0 -308
  59. package/dist/utils/agent.js.map +0 -1
  60. package/dist/utils/agent_lite.d.ts +0 -5
  61. package/dist/utils/agent_lite.d.ts.map +0 -1
  62. package/dist/utils/agent_lite.js +0 -263
  63. package/dist/utils/agent_lite.js.map +0 -1
  64. package/dist/utils/ai.d.ts +0 -43
  65. package/dist/utils/ai.d.ts.map +0 -1
  66. package/dist/utils/ai.js +0 -1103
  67. package/dist/utils/ai.js.map +0 -1
  68. package/dist/utils/config.d.ts +0 -11
  69. package/dist/utils/config.d.ts.map +0 -1
  70. package/dist/utils/config.js +0 -239
  71. package/dist/utils/config.js.map +0 -1
  72. package/dist/utils/git.d.ts +0 -42
  73. package/dist/utils/git.d.ts.map +0 -1
  74. package/dist/utils/git.js +0 -456
  75. package/dist/utils/git.js.map +0 -1
  76. package/dist/utils/update.d.ts +0 -4
  77. package/dist/utils/update.d.ts.map +0 -1
  78. package/dist/utils/update.js +0 -122
  79. package/dist/utils/update.js.map +0 -1
  80. package/release_notes.md +0 -9
  81. package/scripts/release.sh +0 -34
  82. package/test_agent_feature.ts +0 -1
package/dist/utils/git.js DELETED
@@ -1,456 +0,0 @@
1
- import { execa } from 'execa';
2
- import { readFileSync, existsSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { DIFF_BLACKLIST, MAX_DIFF_LENGTH } from '../types.js';
5
- let cachedIgnoreRules = null;
6
- const MAX_SEARCH_RESULTS = 50;
7
- const MAX_SEARCH_OUTPUT_CHARS = 4000;
8
- function parseBooleanEnv(value) {
9
- if (!value)
10
- return undefined;
11
- const normalized = value.trim().toLowerCase();
12
- if (['1', 'true', 'yes', 'y', 'on'].includes(normalized))
13
- return true;
14
- if (['0', 'false', 'no', 'n', 'off'].includes(normalized))
15
- return false;
16
- return undefined;
17
- }
18
- function getMaxDiffLengthChars() {
19
- const rawChars = process.env.GIT_AI_MAX_DIFF_CHARS;
20
- const parsedChars = rawChars ? Number.parseInt(rawChars, 10) : Number.NaN;
21
- if (Number.isFinite(parsedChars) && parsedChars > 0)
22
- return parsedChars;
23
- // OpenCommit compatibility: approximate tokens -> chars (roughly 4 chars per token).
24
- const rawTokens = process.env.OCO_TOKENS_MAX_INPUT;
25
- const parsedTokens = rawTokens ? Number.parseInt(rawTokens, 10) : Number.NaN;
26
- if (Number.isFinite(parsedTokens) && parsedTokens > 0)
27
- return parsedTokens * 4;
28
- return MAX_DIFF_LENGTH;
29
- }
30
- function normalizePath(path) {
31
- return path.replace(/\\/g, '/');
32
- }
33
- function escapeRegexChar(char) {
34
- return /[.*+?^${}()|[\]\\]/.test(char) ? `\\${char}` : char;
35
- }
36
- function globToRegex(pattern) {
37
- let out = '';
38
- for (let i = 0; i < pattern.length; i++) {
39
- const ch = pattern[i];
40
- if (ch === '*') {
41
- const next = pattern[i + 1];
42
- if (next === '*') {
43
- // Collapse consecutive ** into one.
44
- while (pattern[i + 1] === '*')
45
- i++;
46
- out += '.*';
47
- }
48
- else {
49
- out += '[^/]*';
50
- }
51
- continue;
52
- }
53
- if (ch === '?') {
54
- out += '[^/]';
55
- continue;
56
- }
57
- out += escapeRegexChar(ch);
58
- }
59
- return out;
60
- }
61
- function compileIgnoreRule(rawPattern) {
62
- let pattern = rawPattern.trim();
63
- if (!pattern)
64
- return null;
65
- // Comment handling (support escaped # and !).
66
- if (pattern.startsWith('\\#')) {
67
- pattern = pattern.slice(1);
68
- }
69
- else if (pattern.startsWith('#')) {
70
- return null;
71
- }
72
- let negate = false;
73
- if (pattern.startsWith('\\!')) {
74
- pattern = pattern.slice(1);
75
- }
76
- else if (pattern.startsWith('!')) {
77
- negate = true;
78
- pattern = pattern.slice(1).trim();
79
- if (!pattern)
80
- return null;
81
- }
82
- let anchored = false;
83
- if (pattern.startsWith('/')) {
84
- anchored = true;
85
- pattern = pattern.slice(1);
86
- }
87
- if (pattern.endsWith('/')) {
88
- pattern = pattern.slice(0, -1);
89
- }
90
- const normalized = normalizePath(pattern);
91
- const body = globToRegex(normalized);
92
- const prefix = anchored ? '^' : '(^|.*/)';
93
- const suffix = '(/.*)?$';
94
- try {
95
- return {
96
- raw: rawPattern,
97
- regex: new RegExp(prefix + body + suffix),
98
- negate,
99
- };
100
- }
101
- catch {
102
- return null;
103
- }
104
- }
105
- function getIgnoreRules() {
106
- if (cachedIgnoreRules)
107
- return cachedIgnoreRules;
108
- const patterns = [...DIFF_BLACKLIST];
109
- const ignorePaths = [
110
- join(process.cwd(), '.git-aiignore'),
111
- // OpenCommit compatibility
112
- join(process.cwd(), '.opencommitignore'),
113
- ];
114
- for (const ignorePath of ignorePaths) {
115
- if (!existsSync(ignorePath))
116
- continue;
117
- try {
118
- const content = readFileSync(ignorePath, 'utf-8');
119
- const lines = content.split('\n').map((l) => l.trim());
120
- patterns.push(...lines);
121
- }
122
- catch {
123
- // ignore error
124
- }
125
- }
126
- cachedIgnoreRules = patterns
127
- .map((pattern) => compileIgnoreRule(pattern))
128
- .filter(Boolean);
129
- return cachedIgnoreRules;
130
- }
131
- export async function isGitInstalled() {
132
- try {
133
- await execa('git', ['--version']);
134
- return true;
135
- }
136
- catch {
137
- return false;
138
- }
139
- }
140
- export async function isInGitRepo() {
141
- try {
142
- await execa('git', ['rev-parse', '--is-inside-work-tree']);
143
- return true;
144
- }
145
- catch {
146
- return false;
147
- }
148
- }
149
- export async function getBranchName() {
150
- try {
151
- const { stdout } = await execa('git', ['symbolic-ref', '--short', 'HEAD']);
152
- return stdout.trim();
153
- }
154
- catch {
155
- return '';
156
- }
157
- }
158
- export async function getStagedDiff() {
159
- const { stdout } = await execa('git', ['diff', '--cached']);
160
- return stdout;
161
- }
162
- export async function getStagedFiles() {
163
- const { stdout } = await execa('git', ['diff', '--cached', '--name-only']);
164
- return stdout.split('\n').filter(Boolean);
165
- }
166
- export async function getFileStats() {
167
- try {
168
- const { stdout } = await execa('git', ['diff', '--cached', '--numstat']);
169
- return stdout
170
- .split('\n')
171
- .filter(Boolean)
172
- .map((line) => {
173
- const [insertions, deletions, file] = line.split('\t');
174
- return {
175
- file,
176
- insertions: parseInt(insertions) || 0,
177
- deletions: parseInt(deletions) || 0,
178
- };
179
- });
180
- }
181
- catch {
182
- return [];
183
- }
184
- }
185
- export async function getFileDiff(file) {
186
- try {
187
- const { stdout } = await execa('git', ['diff', '--cached', '--', file]);
188
- return stdout;
189
- }
190
- catch {
191
- return '';
192
- }
193
- }
194
- export function isBlacklisted(filename) {
195
- const rules = getIgnoreRules();
196
- const target = normalizePath(filename);
197
- let ignored = false;
198
- for (const rule of rules) {
199
- if (rule.regex.test(target)) {
200
- ignored = !rule.negate;
201
- }
202
- }
203
- return ignored;
204
- }
205
- function chunkArgsByLength(args, options) {
206
- const batches = [];
207
- let current = [];
208
- let currentChars = 0;
209
- for (const arg of args) {
210
- const argLen = arg.length + 1;
211
- const shouldStartNewBatch = current.length >= options.maxItems || currentChars + argLen > options.maxChars;
212
- if (shouldStartNewBatch) {
213
- if (current.length > 0) {
214
- batches.push(current);
215
- }
216
- current = [];
217
- currentChars = 0;
218
- }
219
- current.push(arg);
220
- currentChars += argLen;
221
- }
222
- if (current.length > 0) {
223
- batches.push(current);
224
- }
225
- return batches;
226
- }
227
- export async function getFilteredDiff(files) {
228
- const ignoredFiles = files.filter(isBlacklisted);
229
- const allowedFiles = files.filter((file) => !isBlacklisted(file));
230
- const diffParts = [];
231
- const fileBatches = chunkArgsByLength(allowedFiles, { maxItems: 50, maxChars: 6000 });
232
- for (const batch of fileBatches) {
233
- try {
234
- const { stdout } = await execa('git', ['diff', '--cached', '--', ...batch]);
235
- if (stdout) {
236
- diffParts.push(stdout);
237
- }
238
- }
239
- catch {
240
- diffParts.push(`[Diff unavailable for ${batch.length} file(s)]`);
241
- }
242
- }
243
- let fullDiff = diffParts.join('\n');
244
- let truncated = false;
245
- const maxLen = getMaxDiffLengthChars();
246
- if (fullDiff.length > maxLen) {
247
- fullDiff = fullDiff.slice(0, maxLen) + '\n\n...[Diff Truncated]';
248
- truncated = true;
249
- }
250
- return { diff: fullDiff, truncated, ignoredFiles };
251
- }
252
- export async function commit(message) {
253
- await execa('git', ['commit', '-m', message]);
254
- }
255
- export async function getUserName() {
256
- try {
257
- const { stdout } = await execa('git', ['config', 'user.name']);
258
- return stdout.trim();
259
- }
260
- catch {
261
- return '';
262
- }
263
- }
264
- export async function getRecentCommits(days) {
265
- return getCommitsInRange({ since: `${days} days ago` });
266
- }
267
- export async function getCommitsInRange(options) {
268
- try {
269
- const author = await getUserName();
270
- const includeAll = parseBooleanEnv(process.env.GIT_AI_RECENT_COMMITS_ALL) === true;
271
- const allowFallback = parseBooleanEnv(process.env.GIT_AI_RECENT_COMMITS_FALLBACK) !== false;
272
- const buildArgs = (withAuthor) => {
273
- const args = [
274
- 'log',
275
- '--pretty=format:%h %cd %s', // Hash Date Subject
276
- '--date=short',
277
- '--no-merges', // Exclude merge commits
278
- ];
279
- if (options.since)
280
- args.push(`--since=${options.since}`);
281
- if (options.until)
282
- args.push(`--until=${options.until}`);
283
- if (withAuthor) {
284
- args.push(`--author=${withAuthor}`);
285
- }
286
- return args;
287
- };
288
- const useAuthor = author && !includeAll ? author : undefined;
289
- let stdout = '';
290
- if (useAuthor) {
291
- const result = await execa('git', buildArgs(useAuthor));
292
- stdout = result.stdout;
293
- if (!stdout && allowFallback) {
294
- const fallback = await execa('git', buildArgs(undefined));
295
- stdout = fallback.stdout;
296
- }
297
- }
298
- else {
299
- const result = await execa('git', buildArgs(undefined));
300
- stdout = result.stdout;
301
- }
302
- return stdout.split('\n').filter((line) => line.trim());
303
- }
304
- catch {
305
- return [];
306
- }
307
- }
308
- export async function getCommitsBetween(base, head) {
309
- try {
310
- const range = `${base}..${head}`;
311
- const { stdout } = await execa('git', [
312
- 'log',
313
- '--pretty=format:%h %cd %s',
314
- '--date=short',
315
- '--no-merges',
316
- range,
317
- ]);
318
- return stdout.split('\n').filter((line) => line.trim());
319
- }
320
- catch {
321
- return [];
322
- }
323
- }
324
- export async function getDiffStat(base, head) {
325
- try {
326
- const range = `${base}..${head}`;
327
- const { stdout } = await execa('git', ['diff', '--stat', range]);
328
- return stdout.trim();
329
- }
330
- catch {
331
- return '';
332
- }
333
- }
334
- async function refExists(ref) {
335
- try {
336
- await execa('git', ['show-ref', '--verify', '--quiet', ref]);
337
- return true;
338
- }
339
- catch {
340
- return false;
341
- }
342
- }
343
- export async function getDefaultBaseBranch() {
344
- try {
345
- const { stdout } = await execa('git', ['symbolic-ref', '--quiet', 'refs/remotes/origin/HEAD']);
346
- const ref = stdout.trim();
347
- if (ref.startsWith('refs/remotes/origin/')) {
348
- return ref.replace('refs/remotes/origin/', 'origin/');
349
- }
350
- }
351
- catch {
352
- // ignore
353
- }
354
- const candidates = ['main', 'master'];
355
- for (const name of candidates) {
356
- if (await refExists(`refs/heads/${name}`))
357
- return name;
358
- if (await refExists(`refs/remotes/origin/${name}`))
359
- return `origin/${name}`;
360
- }
361
- return null;
362
- }
363
- export async function getLastTag() {
364
- try {
365
- const { stdout } = await execa('git', ['describe', '--tags', '--abbrev=0']);
366
- return stdout.trim() || null;
367
- }
368
- catch {
369
- return null;
370
- }
371
- }
372
- export async function isValidBranchName(name) {
373
- try {
374
- await execa('git', ['check-ref-format', '--branch', name]);
375
- return true;
376
- }
377
- catch {
378
- return false;
379
- }
380
- }
381
- export async function branchExists(name) {
382
- try {
383
- await execa('git', ['show-ref', '--verify', '--quiet', `refs/heads/${name}`]);
384
- return true;
385
- }
386
- catch {
387
- return false;
388
- }
389
- }
390
- export async function checkoutBranch(name) {
391
- await execa('git', ['checkout', name]);
392
- }
393
- export async function createBranch(name) {
394
- await execa('git', ['checkout', '-b', name]);
395
- }
396
- export async function searchCode(pattern) {
397
- try {
398
- // Use git grep to search in tracked files (it's faster and respects .gitignore)
399
- const { stdout } = await execa('git', ['grep', '-n', '-e', pattern]);
400
- if (!stdout)
401
- return 'No matches found.';
402
- const lines = stdout.split('\n').filter(Boolean);
403
- let output = lines.join('\n');
404
- if (lines.length > MAX_SEARCH_RESULTS) {
405
- output =
406
- lines.slice(0, MAX_SEARCH_RESULTS).join('\n') +
407
- `\n...[${lines.length - MAX_SEARCH_RESULTS} more matches]`;
408
- }
409
- if (output.length > MAX_SEARCH_OUTPUT_CHARS) {
410
- output = output.slice(0, MAX_SEARCH_OUTPUT_CHARS) + '\n...[Search output truncated]';
411
- }
412
- return output;
413
- }
414
- catch {
415
- return 'No matches found.';
416
- }
417
- }
418
- export async function getUnstagedFiles() {
419
- const entries = await getUnstagedFileEntries();
420
- return entries.map((entry) => entry.path);
421
- }
422
- export async function addFiles(files) {
423
- if (files.length === 0)
424
- return;
425
- await execa('git', ['add', ...files]);
426
- }
427
- export async function getUnstagedFileEntries() {
428
- try {
429
- const { stdout } = await execa('git', ['status', '--porcelain', '-z']);
430
- if (!stdout)
431
- return [];
432
- const parts = stdout.split('\0').filter(Boolean);
433
- const entries = [];
434
- for (let i = 0; i < parts.length; i++) {
435
- const item = parts[i];
436
- if (item.length < 3)
437
- continue;
438
- const status = item.slice(0, 2);
439
- let path = item.slice(3);
440
- // Renames/copies include an extra path field.
441
- if ((status[0] === 'R' || status[0] === 'C') && parts[i + 1]) {
442
- path = parts[i + 1];
443
- i += 1;
444
- }
445
- // Unstaged changes: worktree status not blank, or untracked.
446
- if (status === '??' || status[1] !== ' ') {
447
- entries.push({ path, status });
448
- }
449
- }
450
- return entries;
451
- }
452
- catch {
453
- return [];
454
- }
455
- }
456
- //# sourceMappingURL=git.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ9D,IAAI,iBAAiB,GAAwB,IAAI,CAAC;AAClD,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC,SAAS,eAAe,CAAC,KAAyB;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACnD,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IAC1E,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IAExE,qFAAqF;IACrF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACnD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IAC7E,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC;QAAE,OAAO,YAAY,GAAG,CAAC,CAAC;IAE/E,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,oCAAoC;gBACpC,OAAO,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;oBAAE,CAAC,EAAE,CAAC;gBACnC,GAAG,IAAI,IAAI,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,GAAG,IAAI,OAAO,CAAC;YACjB,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,GAAG,IAAI,MAAM,CAAC;YACd,SAAS;QACX,CAAC;QACD,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,IAAI,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,8CAA8C;IAC9C,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;IAC5B,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC;IAEzB,IAAI,CAAC;QACH,OAAO;YACL,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;YACzC,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,MAAM,QAAQ,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC;QACpC,2BAA2B;QAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC;KACzC,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IAED,iBAAiB,GAAG,QAAQ;SACzB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;SAC5C,MAAM,CAAC,OAAO,CAAiB,CAAC;IAEnC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QACzE,OAAO,MAAM;aACV,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvD,OAAO;gBACL,IAAI;gBACJ,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;gBACrC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;aACpC,CAAC;QACJ,CAAC,CAAC,CAAC;IACP,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAc,EACd,OAA+C;IAE/C,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,MAAM,mBAAmB,GACvB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,IAAI,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEjF,IAAI,mBAAmB,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YACD,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,YAAY,IAAI,MAAM,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAe;IAEf,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,MAAM,WAAW,GAAG,iBAAiB,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACtF,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;YAC5E,IAAI,MAAM,EAAE,CAAC;gBACX,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC7B,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,yBAAyB,CAAC;QACjE,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAe;IAC1C,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,OAAO,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAGvC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,KAAK,IAAI,CAAC;QACnF,MAAM,aAAa,GACjB,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,KAAK,KAAK,CAAC;QAExE,MAAM,SAAS,GAAG,CAAC,UAAmB,EAAY,EAAE;YAClD,MAAM,IAAI,GAAG;gBACX,KAAK;gBACL,2BAA2B,EAAE,oBAAoB;gBACjD,cAAc;gBACd,aAAa,EAAE,wBAAwB;aACxC,CAAC;YACF,IAAI,OAAO,CAAC,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACzD,IAAI,OAAO,CAAC,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACzD,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;YACxD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC1D,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC3B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;YACxD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAY;IAChE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE;YACpC,KAAK;YACL,2BAA2B;YAC3B,cAAc;YACd,aAAa;YACb,KAAK;SACN,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY;IAC1D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC,CAAC;QAC/F,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3C,OAAO,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,MAAM,SAAS,CAAC,cAAc,IAAI,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,MAAM,SAAS,CAAC,uBAAuB,IAAI,EAAE,CAAC;YAAE,OAAO,UAAU,IAAI,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;QAC5E,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,kBAAkB,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,gFAAgF;QAChF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM;YAAE,OAAO,mBAAmB,CAAC;QAExC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACtC,MAAM;gBACJ,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC7C,SAAS,KAAK,CAAC,MAAM,GAAG,kBAAkB,gBAAgB,CAAC;QAC/D,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;YAC5C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,GAAG,gCAAgC,CAAC;QACvF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,mBAAmB,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,OAAO,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAe;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/B,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,OAAO,GAAwB,EAAE,CAAC;QAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEzB,8CAA8C;YAC9C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC7D,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpB,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YAED,6DAA6D;YAC7D,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1,4 +0,0 @@
1
- export declare function checkUpdate(options?: {
2
- allow?: boolean;
3
- }): Promise<void>;
4
- //# sourceMappingURL=update.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/utils/update.ts"],"names":[],"mappings":"AAoDA,wBAAsB,WAAW,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDlF"}
@@ -1,122 +0,0 @@
1
- import https from 'node:https';
2
- import { createRequire } from 'node:module';
3
- import chalk from 'chalk';
4
- import Conf from 'conf';
5
- const require = createRequire(import.meta.url);
6
- const packageJson = require('../../package.json');
7
- const REGISTRY_URL = 'https://registry.npmjs.org/@dongowu/git-ai-cli/latest';
8
- const DEFAULT_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24h
9
- const updateCache = new Conf({
10
- projectName: 'git-ai-cli',
11
- configName: 'update',
12
- });
13
- function parseBooleanEnv(value) {
14
- if (!value)
15
- return undefined;
16
- const normalized = value.trim().toLowerCase();
17
- if (['1', 'true', 'yes', 'y', 'on'].includes(normalized))
18
- return true;
19
- if (['0', 'false', 'no', 'n', 'off'].includes(normalized))
20
- return false;
21
- return undefined;
22
- }
23
- function getCheckIntervalMs() {
24
- const rawHours = process.env.GIT_AI_UPDATE_INTERVAL_HOURS;
25
- const parsed = rawHours ? Number.parseInt(rawHours, 10) : Number.NaN;
26
- if (Number.isFinite(parsed) && parsed > 0) {
27
- return parsed * 60 * 60 * 1000;
28
- }
29
- return DEFAULT_CHECK_INTERVAL_MS;
30
- }
31
- function shouldSkipUpdateCheck() {
32
- const disabled = parseBooleanEnv(process.env.GIT_AI_DISABLE_UPDATE) ??
33
- parseBooleanEnv(process.env.GIT_AI_NO_UPDATE);
34
- if (disabled)
35
- return true;
36
- if (process.env.CI)
37
- return true;
38
- // Avoid noisy output in non-interactive contexts (hooks, pipes, CI).
39
- if (!process.stdout.isTTY)
40
- return true;
41
- return false;
42
- }
43
- export async function checkUpdate(options = {}) {
44
- if (options.allow === false)
45
- return;
46
- if (shouldSkipUpdateCheck())
47
- return;
48
- const now = Date.now();
49
- const intervalMs = getCheckIntervalMs();
50
- const lastChecked = updateCache.get('lastChecked');
51
- if (lastChecked && now - lastChecked < intervalMs)
52
- return;
53
- // Mark as checked before the network call to avoid repeated attempts on failure.
54
- updateCache.set('lastChecked', now);
55
- return new Promise((resolve) => {
56
- const req = https.get(REGISTRY_URL, { timeout: 1000 }, (res) => {
57
- if (res.statusCode !== 200) {
58
- resolve();
59
- return;
60
- }
61
- let data = '';
62
- res.on('data', (chunk) => (data += chunk));
63
- res.on('end', () => {
64
- try {
65
- const { version: latest } = JSON.parse(data);
66
- const current = packageJson.version;
67
- if (latest && current && latest !== current) {
68
- // Simple semantic version check (naive but works for distinct releases)
69
- if (isNewer(latest, current)) {
70
- const lastNotified = updateCache.get('lastNotifiedVersion');
71
- if (lastNotified !== latest) {
72
- printUpdateMessage(current, latest);
73
- updateCache.set('lastNotifiedVersion', latest);
74
- }
75
- }
76
- }
77
- }
78
- catch {
79
- // Ignore parsing errors
80
- }
81
- resolve();
82
- });
83
- });
84
- req.on('error', () => resolve());
85
- req.on('timeout', () => {
86
- req.destroy();
87
- resolve();
88
- });
89
- });
90
- }
91
- function isNewer(latest, current) {
92
- const l = latest.split('.').map(Number);
93
- const c = current.split('.').map(Number);
94
- for (let i = 0; i < 3; i++) {
95
- if (l[i] > c[i])
96
- return true;
97
- if (l[i] < c[i])
98
- return false;
99
- }
100
- return false;
101
- }
102
- function printUpdateMessage(current, latest) {
103
- const boxWidth = 50;
104
- const msg = `Update available ${chalk.gray(current)} → ${chalk.green(latest)}`;
105
- const cmd = `npm install -g @dongowu/git-ai-cli`;
106
- console.log('\n' + chalk.yellow('┌' + '─'.repeat(boxWidth) + '┐'));
107
- console.log(chalk.yellow('│') + center(' ', boxWidth) + chalk.yellow('│'));
108
- console.log(chalk.yellow('│') + center(msg, boxWidth) + chalk.yellow('│'));
109
- console.log(chalk.yellow('│') + center('Run ' + chalk.cyan(cmd) + ' to update', boxWidth) + chalk.yellow('│'));
110
- console.log(chalk.yellow('│') + center(' ', boxWidth) + chalk.yellow('│'));
111
- console.log(chalk.yellow('└' + '─'.repeat(boxWidth) + '┘') + '\n');
112
- }
113
- function center(str, width) {
114
- // Strip ansi codes for length calculation
115
- // eslint-disable-next-line no-control-regex
116
- const visibleLen = str.replace(new RegExp('\\x1b\\[\\d+m', 'g'), '').length;
117
- const padding = Math.max(0, width - visibleLen);
118
- const left = Math.floor(padding / 2);
119
- const right = padding - left;
120
- return ' '.repeat(left) + str + ' '.repeat(right);
121
- }
122
- //# sourceMappingURL=update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/utils/update.ts"],"names":[],"mappings":"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"}
package/release_notes.md DELETED
@@ -1,9 +0,0 @@
1
- ## What's Changed
2
-
3
- - 1.0.21
4
- - feat: add interactive branch command, branch config, and docs
5
- - feat: add rules presets, policy enforcement, pr/release commands, update docs
6
- ### Install
7
- ```bash
8
- npm install -g @dongowu/git-ai-cli
9
- ```
@@ -1,34 +0,0 @@
1
- #!/bin/bash
2
- # release.sh - 自动发布脚本
3
-
4
- set -e
5
-
6
- # 颜色
7
- GREEN='\033[0;32m'
8
- YELLOW='\033[1;33m'
9
- NC='\033[0m'
10
-
11
- # 获取版本类型
12
- VERSION_TYPE=${1:-patch}
13
-
14
- echo -e "${GREEN}🚀 Starting release...${NC}"
15
-
16
- # 1. 构建
17
- echo -e "${YELLOW}📦 Building...${NC}"
18
- npm run build
19
-
20
- # 2. 更新版本
21
- echo -e "${YELLOW}📝 Bumping ${VERSION_TYPE} version...${NC}"
22
- npm version $VERSION_TYPE
23
-
24
- # 3. 推送到 GitHub
25
- echo -e "${YELLOW}📤 Pushing to GitHub...${NC}"
26
- git push
27
- git push --tags
28
-
29
- # 4. 发布到 npm
30
- echo -e "${YELLOW}📦 Publishing to npm...${NC}"
31
- read -p "Enter OTP code: " OTP
32
- npm publish --access=public --otp=$OTP
33
-
34
- echo -e "${GREEN}✅ Release complete!${NC}"
@@ -1 +0,0 @@
1
- console.log('test agent');