orcommit 1.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +318 -0
  3. package/dist/cli.d.ts +70 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +391 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +18 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +21 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/modules/api.d.ts +48 -0
  12. package/dist/modules/api.d.ts.map +1 -0
  13. package/dist/modules/api.js +286 -0
  14. package/dist/modules/api.js.map +1 -0
  15. package/dist/modules/cache.d.ts +74 -0
  16. package/dist/modules/cache.d.ts.map +1 -0
  17. package/dist/modules/cache.js +284 -0
  18. package/dist/modules/cache.js.map +1 -0
  19. package/dist/modules/config.d.ts +53 -0
  20. package/dist/modules/config.d.ts.map +1 -0
  21. package/dist/modules/config.js +180 -0
  22. package/dist/modules/config.js.map +1 -0
  23. package/dist/modules/core.d.ts +54 -0
  24. package/dist/modules/core.d.ts.map +1 -0
  25. package/dist/modules/core.js +474 -0
  26. package/dist/modules/core.js.map +1 -0
  27. package/dist/modules/diff-filter.d.ts +71 -0
  28. package/dist/modules/diff-filter.d.ts.map +1 -0
  29. package/dist/modules/diff-filter.js +332 -0
  30. package/dist/modules/diff-filter.js.map +1 -0
  31. package/dist/modules/git.d.ts +61 -0
  32. package/dist/modules/git.d.ts.map +1 -0
  33. package/dist/modules/git.js +362 -0
  34. package/dist/modules/git.js.map +1 -0
  35. package/dist/modules/logger.d.ts +67 -0
  36. package/dist/modules/logger.d.ts.map +1 -0
  37. package/dist/modules/logger.js +212 -0
  38. package/dist/modules/logger.js.map +1 -0
  39. package/dist/modules/tokenizer.d.ts +43 -0
  40. package/dist/modules/tokenizer.d.ts.map +1 -0
  41. package/dist/modules/tokenizer.js +200 -0
  42. package/dist/modules/tokenizer.js.map +1 -0
  43. package/dist/types/index.d.ts +141 -0
  44. package/dist/types/index.d.ts.map +1 -0
  45. package/dist/types/index.js +70 -0
  46. package/dist/types/index.js.map +1 -0
  47. package/dist/utils/index.d.ts +64 -0
  48. package/dist/utils/index.d.ts.map +1 -0
  49. package/dist/utils/index.js +154 -0
  50. package/dist/utils/index.js.map +1 -0
  51. package/package.json +75 -0
@@ -0,0 +1,362 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { GitError, CHUNK_LIMITS } from '../types/index.js';
4
+ import { logger } from './logger.js';
5
+ const execAsync = promisify(exec);
6
+ export class GitManager {
7
+ /**
8
+ * Check if current directory is a git repository
9
+ */
10
+ async isGitRepository() {
11
+ try {
12
+ await execAsync('git rev-parse --git-dir');
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ /**
20
+ * Get staged changes as a structured diff
21
+ */
22
+ async getStagedDiff(options) {
23
+ const mergedOptions = this.mergeChunkOptions(options);
24
+ try {
25
+ // Check if there are staged changes
26
+ const { stdout: statusOutput } = await execAsync('git diff --cached --name-status');
27
+ if (!statusOutput.trim()) {
28
+ return { files: [], totalLines: 0, totalSize: 0 };
29
+ }
30
+ // Get the raw diff with optimized flags
31
+ const { stdout: diffOutput } = await execAsync('git diff --cached --ignore-space-change --ignore-blank-lines --no-color --no-prefix');
32
+ return this.parseDiff(diffOutput, mergedOptions);
33
+ }
34
+ catch (error) {
35
+ throw new GitError(`Failed to get staged diff: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
36
+ }
37
+ }
38
+ /**
39
+ * Get list of staged files with their status
40
+ */
41
+ async getStagedFiles() {
42
+ try {
43
+ const { stdout } = await execAsync('git diff --cached --name-status');
44
+ return stdout
45
+ .trim()
46
+ .split('\n')
47
+ .filter(line => line.trim().length > 0)
48
+ .map(line => {
49
+ const parts = line.split('\t');
50
+ const status = this.parseFileStatus(parts[0] || '');
51
+ const path = parts[1] || '';
52
+ return { path, status };
53
+ });
54
+ }
55
+ catch (error) {
56
+ throw new GitError(`Failed to get staged files: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
57
+ }
58
+ }
59
+ /**
60
+ * Create a commit with the given message
61
+ */
62
+ async createCommit(message) {
63
+ try {
64
+ const { stdout } = await execAsync(`git commit -m "${message.replace(/"/g, '\\"')}"`);
65
+ logger.debug('Commit created successfully', { output: stdout });
66
+ return stdout;
67
+ }
68
+ catch (error) {
69
+ throw new GitError(`Failed to create commit: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
70
+ }
71
+ }
72
+ /**
73
+ * Check if there are any uncommitted changes
74
+ */
75
+ async hasUncommittedChanges() {
76
+ try {
77
+ const { stdout } = await execAsync('git status --porcelain');
78
+ return stdout.trim().length > 0;
79
+ }
80
+ catch (error) {
81
+ throw new GitError(`Failed to check git status: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
82
+ }
83
+ }
84
+ /**
85
+ * Get the current branch name
86
+ */
87
+ async getCurrentBranch() {
88
+ try {
89
+ const { stdout } = await execAsync('git branch --show-current');
90
+ return stdout.trim();
91
+ }
92
+ catch (error) {
93
+ throw new GitError(`Failed to get current branch: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
94
+ }
95
+ }
96
+ /**
97
+ * Get repository root directory
98
+ */
99
+ async getRepositoryRoot() {
100
+ try {
101
+ const { stdout } = await execAsync('git rev-parse --show-toplevel');
102
+ return stdout.trim();
103
+ }
104
+ catch (error) {
105
+ throw new GitError(`Failed to get repository root: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
106
+ }
107
+ }
108
+ // Private methods
109
+ parseDiff(diffOutput, options) {
110
+ const files = [];
111
+ let totalLines = 0;
112
+ let totalSize = 0;
113
+ // Split diff into file sections
114
+ const fileSections = this.splitDiffIntoFiles(diffOutput);
115
+ for (const section of fileSections) {
116
+ const file = this.parseFileSection(section, options);
117
+ if (file) {
118
+ files.push(file);
119
+ totalLines += file.chunks.reduce((sum, chunk) => sum + chunk.lines.length, 0);
120
+ totalSize += section.length;
121
+ }
122
+ }
123
+ return { files, totalLines, totalSize };
124
+ }
125
+ splitDiffIntoFiles(diffOutput) {
126
+ const sections = [];
127
+ const lines = diffOutput.split('\n');
128
+ let currentSection = [];
129
+ for (const line of lines) {
130
+ if (line.startsWith('diff --git')) {
131
+ if (currentSection.length > 0) {
132
+ sections.push(currentSection.join('\n'));
133
+ currentSection = [];
134
+ }
135
+ }
136
+ currentSection.push(line);
137
+ }
138
+ if (currentSection.length > 0) {
139
+ sections.push(currentSection.join('\n'));
140
+ }
141
+ return sections;
142
+ }
143
+ parseFileSection(section, options) {
144
+ const lines = section.split('\n');
145
+ // Extract file path and status
146
+ const diffLine = lines.find(line => line.startsWith('diff --git'));
147
+ if (!diffLine)
148
+ return null;
149
+ const path = this.extractFilePath(diffLine);
150
+ const status = this.determineFileStatus(lines);
151
+ const isBinary = lines.some(line => line.includes('Binary files'));
152
+ if (isBinary) {
153
+ return {
154
+ path,
155
+ status,
156
+ chunks: [],
157
+ isBinary: true,
158
+ };
159
+ }
160
+ const chunks = this.parseChunks(lines, options);
161
+ return {
162
+ path,
163
+ status,
164
+ chunks,
165
+ isBinary: false,
166
+ };
167
+ }
168
+ extractFilePath(diffLine) {
169
+ // Extract path from "diff --git a/path b/path" format
170
+ const match = diffLine.match(/diff --git (?:a\/)?(.+) (?:b\/)?(.+)/);
171
+ return match ? (match[2] || match[1] || '') : '';
172
+ }
173
+ determineFileStatus(lines) {
174
+ const newFileMode = lines.some(line => line.startsWith('new file mode'));
175
+ const deletedFileMode = lines.some(line => line.startsWith('deleted file mode'));
176
+ const renamedFrom = lines.some(line => line.startsWith('rename from'));
177
+ const copiedFrom = lines.some(line => line.startsWith('copy from'));
178
+ if (newFileMode)
179
+ return 'added';
180
+ if (deletedFileMode)
181
+ return 'deleted';
182
+ if (renamedFrom)
183
+ return 'renamed';
184
+ if (copiedFrom)
185
+ return 'copied';
186
+ return 'modified';
187
+ }
188
+ parseChunks(lines, options) {
189
+ const chunks = [];
190
+ let currentChunk = null;
191
+ let chunkLines = [];
192
+ for (const line of lines) {
193
+ if (line.startsWith('@@')) {
194
+ // Save previous chunk if exists
195
+ if (currentChunk && chunkLines.length > 0) {
196
+ chunks.push({
197
+ ...currentChunk,
198
+ lines: chunkLines,
199
+ context: this.generateChunkContext(chunkLines),
200
+ });
201
+ }
202
+ // Start new chunk
203
+ const chunkHeader = this.parseChunkHeader(line);
204
+ if (chunkHeader) {
205
+ currentChunk = chunkHeader;
206
+ chunkLines = [];
207
+ }
208
+ }
209
+ else if (currentChunk && (line.startsWith(' ') || line.startsWith('+') || line.startsWith('-'))) {
210
+ chunkLines.push(this.parseGitLine(line));
211
+ }
212
+ }
213
+ // Add final chunk
214
+ if (currentChunk && chunkLines.length > 0) {
215
+ chunks.push({
216
+ ...currentChunk,
217
+ lines: chunkLines,
218
+ context: this.generateChunkContext(chunkLines),
219
+ });
220
+ }
221
+ // Split large chunks if necessary
222
+ return this.splitLargeChunks(chunks, options);
223
+ }
224
+ parseChunkHeader(headerLine) {
225
+ // Parse "@@ -start,count +start,count @@" format
226
+ const match = headerLine.match(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
227
+ if (!match)
228
+ return null;
229
+ return {
230
+ header: headerLine,
231
+ oldStart: parseInt(match[1] || '0', 10),
232
+ oldLines: parseInt(match[2] || '1', 10),
233
+ newStart: parseInt(match[3] || '0', 10),
234
+ newLines: parseInt(match[4] || '1', 10),
235
+ };
236
+ }
237
+ parseGitLine(line) {
238
+ const type = line.startsWith('+') ? 'added' :
239
+ line.startsWith('-') ? 'removed' : 'context';
240
+ const content = line.slice(1); // Remove the prefix character
241
+ return { type, content };
242
+ }
243
+ generateChunkContext(lines) {
244
+ // Get context from surrounding lines and function/class definitions
245
+ const contextLines = lines
246
+ .filter(line => line.type === 'context' || line.type === 'added')
247
+ .slice(0, 3)
248
+ .map(line => line.content.trim())
249
+ .filter(content => content.length > 0);
250
+ return contextLines.join(' | ');
251
+ }
252
+ splitLargeChunks(chunks, options) {
253
+ const result = [];
254
+ for (const chunk of chunks) {
255
+ const chunkSize = chunk.lines.reduce((sum, line) => sum + line.content.length, 0);
256
+ if (chunkSize <= options.maxChunkSize) {
257
+ result.push(chunk);
258
+ }
259
+ else {
260
+ result.push(...this.splitSingleChunk(chunk, options));
261
+ }
262
+ }
263
+ return result;
264
+ }
265
+ splitSingleChunk(chunk, options) {
266
+ const subChunks = [];
267
+ const lines = chunk.lines;
268
+ let currentLines = [];
269
+ let currentSize = 0;
270
+ for (const line of lines) {
271
+ const lineSize = line.content.length;
272
+ if (currentSize + lineSize > options.maxChunkSize && currentLines.length > 0) {
273
+ // Create sub-chunk
274
+ subChunks.push({
275
+ ...chunk,
276
+ lines: [...currentLines],
277
+ context: this.generateChunkContext(currentLines),
278
+ });
279
+ currentLines = [];
280
+ currentSize = 0;
281
+ }
282
+ currentLines.push(line);
283
+ currentSize += lineSize;
284
+ }
285
+ // Add remaining lines
286
+ if (currentLines.length > 0) {
287
+ subChunks.push({
288
+ ...chunk,
289
+ lines: currentLines,
290
+ context: this.generateChunkContext(currentLines),
291
+ });
292
+ }
293
+ return subChunks.length > 0 ? subChunks : [chunk];
294
+ }
295
+ parseFileStatus(statusChar) {
296
+ switch (statusChar.charAt(0)) {
297
+ case 'A': return 'added';
298
+ case 'M': return 'modified';
299
+ case 'D': return 'deleted';
300
+ case 'R': return 'renamed';
301
+ case 'C': return 'copied';
302
+ default: return 'modified';
303
+ }
304
+ }
305
+ mergeChunkOptions(options) {
306
+ return {
307
+ maxChunkSize: options?.maxChunkSize ?? CHUNK_LIMITS.MAX_CHUNK_SIZE,
308
+ preserveContext: options?.preserveContext ?? true,
309
+ maxConcurrency: options?.maxConcurrency ?? CHUNK_LIMITS.MAX_CONCURRENT_REQUESTS,
310
+ };
311
+ }
312
+ /**
313
+ * Check if there is an upstream branch configured
314
+ */
315
+ async hasUpstream() {
316
+ try {
317
+ const { stdout } = await execAsync('git rev-parse --abbrev-ref --symbolic-full-name @{u}');
318
+ return stdout.trim().length > 0;
319
+ }
320
+ catch {
321
+ return false;
322
+ }
323
+ }
324
+ /**
325
+ * Push commits to remote repository
326
+ */
327
+ async pushToRemote(setUpstream = false) {
328
+ try {
329
+ const hasUpstreamBranch = await this.hasUpstream();
330
+ if (!hasUpstreamBranch && setUpstream) {
331
+ const currentBranch = await this.getCurrentBranch();
332
+ await execAsync(`git push --set-upstream origin ${currentBranch}`);
333
+ }
334
+ else {
335
+ await execAsync('git push');
336
+ }
337
+ }
338
+ catch (error) {
339
+ throw new GitError('Failed to push to remote repository', error);
340
+ }
341
+ }
342
+ /**
343
+ * Check if there are unpushed commits
344
+ */
345
+ async hasUnpushedCommits() {
346
+ try {
347
+ const hasUpstreamBranch = await this.hasUpstream();
348
+ if (!hasUpstreamBranch) {
349
+ // If no upstream, consider commits as unpushed
350
+ return true;
351
+ }
352
+ const { stdout } = await execAsync('git rev-list --count @{u}..HEAD');
353
+ return parseInt(stdout.trim()) > 0;
354
+ }
355
+ catch {
356
+ return false;
357
+ }
358
+ }
359
+ }
360
+ // Singleton instance
361
+ export const gitManager = new GitManager();
362
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/modules/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'success';
2
+ export interface LoggerOptions {
3
+ verbose?: boolean;
4
+ silent?: boolean;
5
+ prefix?: string;
6
+ }
7
+ export declare class Logger {
8
+ private readonly options;
9
+ constructor(options?: LoggerOptions);
10
+ /**
11
+ * Log debug information (only in verbose mode)
12
+ */
13
+ debug(message: string, data?: unknown): void;
14
+ /**
15
+ * Log general information
16
+ */
17
+ info(message: string): void;
18
+ /**
19
+ * Log warning messages
20
+ */
21
+ warn(message: string): void;
22
+ /**
23
+ * Log error messages
24
+ */
25
+ error(message: string, error?: Error): void;
26
+ /**
27
+ * Log success messages
28
+ */
29
+ success(message: string): void;
30
+ /**
31
+ * Start a progress indicator
32
+ */
33
+ startProgress(message: string): ProgressIndicator;
34
+ /**
35
+ * Log a table of data
36
+ */
37
+ table(data: Record<string, string | number | boolean>): void;
38
+ /**
39
+ * Create a new logger with modified options
40
+ */
41
+ withOptions(options: Partial<LoggerOptions>): Logger;
42
+ private formatMessage;
43
+ private formatPrefix;
44
+ private getLevelIcon;
45
+ private colorizeMessage;
46
+ }
47
+ export declare class ProgressIndicator {
48
+ private readonly message;
49
+ private readonly silent;
50
+ private interval?;
51
+ private timeoutId?;
52
+ private frame;
53
+ private readonly frames;
54
+ private startTime;
55
+ private readonly minDuration;
56
+ private readonly maxDuration;
57
+ private isActive;
58
+ constructor(message: string, silent: boolean);
59
+ private start;
60
+ stop(finalMessage?: string): void;
61
+ succeed(message?: string): void;
62
+ fail(message?: string): void;
63
+ private cleanup;
64
+ update(message: string): void;
65
+ }
66
+ export declare const logger: Logger;
67
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/modules/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,OAAO,GAAE,aAAkB;IAQvC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAW5C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO3B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO3B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAU3C;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO9B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IAQjD;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI;IAgB5D;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM;IAOpD,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,eAAe;CAWxB;AAED,qBAAa,iBAAiB;IAW1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAXzB,OAAO,CAAC,QAAQ,CAAC,CAA6B;IAC9C,OAAO,CAAC,SAAS,CAAC,CAA6B;IAC/C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsD;IAC7E,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAS;gBAGN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO;IAuBlC,OAAO,CAAC,KAAK;IAcb,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAWjC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO/B,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAK5B,OAAO,CAAC,OAAO;IAYf,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAM9B;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -0,0 +1,212 @@
1
+ import chalk from 'chalk';
2
+ export class Logger {
3
+ options;
4
+ constructor(options = {}) {
5
+ this.options = {
6
+ verbose: options.verbose ?? false,
7
+ silent: options.silent ?? false,
8
+ prefix: options.prefix ?? 'orc',
9
+ };
10
+ }
11
+ /**
12
+ * Log debug information (only in verbose mode)
13
+ */
14
+ debug(message, data) {
15
+ if (!this.options.verbose || this.options.silent)
16
+ return;
17
+ const formattedMessage = this.formatMessage('debug', message);
18
+ console.log(formattedMessage);
19
+ if (data !== undefined) {
20
+ console.log(chalk.gray(JSON.stringify(data, null, 2)));
21
+ }
22
+ }
23
+ /**
24
+ * Log general information
25
+ */
26
+ info(message) {
27
+ if (this.options.silent)
28
+ return;
29
+ const formattedMessage = this.formatMessage('info', message);
30
+ console.log(formattedMessage);
31
+ }
32
+ /**
33
+ * Log warning messages
34
+ */
35
+ warn(message) {
36
+ if (this.options.silent)
37
+ return;
38
+ const formattedMessage = this.formatMessage('warn', message);
39
+ console.warn(formattedMessage);
40
+ }
41
+ /**
42
+ * Log error messages
43
+ */
44
+ error(message, error) {
45
+ const formattedMessage = this.formatMessage('error', message);
46
+ console.error(formattedMessage);
47
+ if (error && this.options.verbose) {
48
+ console.error(chalk.red('Error details:'));
49
+ console.error(chalk.red(error.stack || error.message));
50
+ }
51
+ }
52
+ /**
53
+ * Log success messages
54
+ */
55
+ success(message) {
56
+ if (this.options.silent)
57
+ return;
58
+ const formattedMessage = this.formatMessage('success', message);
59
+ console.log(formattedMessage);
60
+ }
61
+ /**
62
+ * Start a progress indicator
63
+ */
64
+ startProgress(message) {
65
+ if (this.options.silent) {
66
+ return new ProgressIndicator(message, true);
67
+ }
68
+ return new ProgressIndicator(message, false);
69
+ }
70
+ /**
71
+ * Log a table of data
72
+ */
73
+ table(data) {
74
+ if (this.options.silent)
75
+ return;
76
+ const maxKeyLength = Math.max(...Object.keys(data).map(key => key.length));
77
+ Object.entries(data).forEach(([key, value]) => {
78
+ const paddedKey = key.padEnd(maxKeyLength);
79
+ const coloredKey = chalk.cyan(paddedKey);
80
+ const coloredValue = typeof value === 'boolean'
81
+ ? (value ? chalk.green('✓') : chalk.red('✗'))
82
+ : chalk.white(String(value));
83
+ console.log(`${coloredKey}: ${coloredValue}`);
84
+ });
85
+ }
86
+ /**
87
+ * Create a new logger with modified options
88
+ */
89
+ withOptions(options) {
90
+ return new Logger({
91
+ ...this.options,
92
+ ...options,
93
+ });
94
+ }
95
+ formatMessage(level, message) {
96
+ const timestamp = new Date().toLocaleTimeString();
97
+ const prefix = this.formatPrefix();
98
+ const levelIcon = this.getLevelIcon(level);
99
+ const coloredMessage = this.colorizeMessage(level, message);
100
+ if (this.options.verbose) {
101
+ return `${chalk.gray(timestamp)} ${prefix} ${levelIcon} ${coloredMessage}`;
102
+ }
103
+ return `${prefix} ${levelIcon} ${coloredMessage}`;
104
+ }
105
+ formatPrefix() {
106
+ return chalk.blue(`[${this.options.prefix}]`);
107
+ }
108
+ getLevelIcon(level) {
109
+ const icons = {
110
+ debug: chalk.gray('⚡'),
111
+ info: chalk.blue('ℹ'),
112
+ warn: chalk.yellow('⚠'),
113
+ error: chalk.red('✗'),
114
+ success: chalk.green('✓'),
115
+ };
116
+ return icons[level];
117
+ }
118
+ colorizeMessage(level, message) {
119
+ const colors = {
120
+ debug: chalk.gray,
121
+ info: chalk.white,
122
+ warn: chalk.yellow,
123
+ error: chalk.red,
124
+ success: chalk.green,
125
+ };
126
+ return colors[level](message);
127
+ }
128
+ }
129
+ export class ProgressIndicator {
130
+ message;
131
+ silent;
132
+ interval;
133
+ timeoutId;
134
+ frame = 0;
135
+ frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
136
+ startTime;
137
+ minDuration = 500; // Wait before showing spinner
138
+ maxDuration = 30000; // 30 second timeout
139
+ isActive = false;
140
+ constructor(message, silent) {
141
+ this.message = message;
142
+ this.silent = silent;
143
+ this.startTime = Date.now();
144
+ if (!this.silent) {
145
+ // Show immediate status without spinner for fast operations
146
+ process.stdout.write(`⏳ ${this.message}`);
147
+ // Show spinner only if operation takes longer than minDuration
148
+ this.timeoutId = setTimeout(() => {
149
+ if (!this.isActive) {
150
+ this.start();
151
+ }
152
+ }, this.minDuration);
153
+ // Auto-timeout after maxDuration
154
+ setTimeout(() => {
155
+ if (this.interval) {
156
+ this.fail('Operation timed out');
157
+ }
158
+ }, this.maxDuration);
159
+ }
160
+ }
161
+ start() {
162
+ if (this.interval || this.isActive)
163
+ return;
164
+ this.isActive = true;
165
+ process.stdout.write('\r\x1b[K'); // Clear current line
166
+ process.stdout.write(`${chalk.cyan(this.frames[0])} ${this.message}`);
167
+ this.interval = setInterval(() => {
168
+ process.stdout.write('\r\x1b[K');
169
+ this.frame = (this.frame + 1) % this.frames.length;
170
+ process.stdout.write(`${chalk.cyan(this.frames[this.frame])} ${this.message}`);
171
+ }, 200); // Even slower for elegance
172
+ }
173
+ stop(finalMessage) {
174
+ this.cleanup();
175
+ if (!this.silent) {
176
+ process.stdout.write('\r\x1b[K'); // Clear current line
177
+ if (finalMessage) {
178
+ console.log(finalMessage);
179
+ }
180
+ }
181
+ }
182
+ succeed(message) {
183
+ const duration = Date.now() - this.startTime;
184
+ const durationText = duration > 1000 ? ` (${(duration / 1000).toFixed(1)}s)` : '';
185
+ const finalMessage = message || this.message;
186
+ this.stop(`${chalk.green('✓')} ${finalMessage}${chalk.gray(durationText)}`);
187
+ }
188
+ fail(message) {
189
+ const finalMessage = message || `${this.message} failed`;
190
+ this.stop(`${chalk.red('✗')} ${finalMessage}`);
191
+ }
192
+ cleanup() {
193
+ if (this.interval) {
194
+ clearInterval(this.interval);
195
+ this.interval = undefined;
196
+ }
197
+ if (this.timeoutId) {
198
+ clearTimeout(this.timeoutId);
199
+ this.timeoutId = undefined;
200
+ }
201
+ this.isActive = false;
202
+ }
203
+ update(message) {
204
+ if (!this.silent && this.interval) {
205
+ process.stdout.write('\r\x1b[K'); // Clear current line
206
+ process.stdout.write(`${chalk.cyan(this.frames[this.frame])} ${message}`);
207
+ }
208
+ }
209
+ }
210
+ // Default logger instance
211
+ export const logger = new Logger();
212
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/modules/logger.ts"],"names":[],"mappings":"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"}