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,474 @@
1
+ import { CHUNK_LIMITS, ConfigError, GitError, ApiError } from '../types/index.js';
2
+ import { configManager } from './config.js';
3
+ import { gitManager } from './git.js';
4
+ import { apiManager } from './api.js';
5
+ import { logger } from './logger.js';
6
+ import { tokenManager } from './tokenizer.js';
7
+ import { cacheManager } from './cache.js';
8
+ import { diffFilter } from './diff-filter.js';
9
+ import { confirm, isCancel } from '@clack/prompts';
10
+ import chalk from 'chalk';
11
+ export class CoreOrchestrator {
12
+ config;
13
+ /**
14
+ * Initialize the core orchestrator
15
+ */
16
+ async initialize() {
17
+ try {
18
+ this.config = await configManager.load();
19
+ logger.debug('Configuration loaded successfully');
20
+ }
21
+ catch (error) {
22
+ throw new ConfigError(`Failed to initialize: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
23
+ }
24
+ }
25
+ /**
26
+ * Main entry point for generating and creating commits
27
+ */
28
+ async generateCommit(options) {
29
+ if (!this.config) {
30
+ throw new ConfigError('Core orchestrator not initialized');
31
+ }
32
+ // Set up logger based on options
33
+ const contextualLogger = logger.withOptions({
34
+ verbose: options.verbose || false,
35
+ silent: false
36
+ });
37
+ try {
38
+ // Validate environment
39
+ await this.validateEnvironment(options);
40
+ // Handle cache clearing if requested
41
+ if (options.clearCache) {
42
+ const cacheProgress = contextualLogger.startProgress('Clearing cache...');
43
+ await cacheManager.clear();
44
+ cacheProgress.succeed('Cache cleared');
45
+ }
46
+ // Phase 1: Get staged changes
47
+ console.log(chalk.blue('\nšŸ” Analyzing changes...'));
48
+ const analyzeProgress = contextualLogger.startProgress('Reading staged changes');
49
+ const rawDiff = await gitManager.getStagedDiff({
50
+ maxChunkSize: CHUNK_LIMITS.MAX_CHUNK_SIZE,
51
+ preserveContext: true,
52
+ maxConcurrency: CHUNK_LIMITS.MAX_CONCURRENT_REQUESTS,
53
+ });
54
+ if (rawDiff.files.length === 0) {
55
+ analyzeProgress.fail('No staged changes found');
56
+ contextualLogger.warn('Use `git add` to stage files first.');
57
+ return;
58
+ }
59
+ analyzeProgress.succeed(`Found ${rawDiff.files.length} staged files`);
60
+ // Phase 2: Filter and process
61
+ const filterProgress = contextualLogger.startProgress('Processing and filtering changes');
62
+ let diff = diffFilter.filterDiff(rawDiff, {
63
+ ignoreGenerated: options.ignoreGenerated,
64
+ ignoreWhitespace: options.ignoreWhitespace,
65
+ maxFileSize: 1024 * 1024, // 1MB
66
+ relevancyThreshold: 0.1,
67
+ });
68
+ // Limit files if requested
69
+ if (options.maxFiles && diff.files.length > options.maxFiles) {
70
+ diff = {
71
+ ...diff,
72
+ files: diff.files.slice(0, options.maxFiles)
73
+ };
74
+ contextualLogger.info(`Limited analysis to ${options.maxFiles} most relevant files`);
75
+ }
76
+ if (diff.files.length === 0) {
77
+ filterProgress.fail('No relevant changes found');
78
+ contextualLogger.warn('All changes were filtered out. Try adjusting filter settings.');
79
+ return;
80
+ }
81
+ const filterSummary = diffFilter.getFilteringSummary(rawDiff, diff);
82
+ filterProgress.succeed(`Ready to analyze ${diff.files.length} files`);
83
+ if (filterSummary.filesRemoved > 0) {
84
+ contextualLogger.debug(`Filtered out ${filterSummary.filesRemoved} irrelevant files`);
85
+ }
86
+ // Phase 3: Generate commit message
87
+ console.log(chalk.blue('\nšŸ¤– Generating commit message...'));
88
+ const provider = options.provider || this.config.preferences.defaultProvider;
89
+ contextualLogger.debug(`Using ${provider} provider`);
90
+ // Initialize API client
91
+ apiManager.initializeProvider(provider, this.config);
92
+ // Generate commit message
93
+ const commitMessage = await this.generateCommitMessage(diff, options, provider);
94
+ if (options.dryRun) {
95
+ console.log(chalk.blue('\nšŸ“ Generated commit message (dry run):'));
96
+ console.log(chalk.gray('——————————————————'));
97
+ console.log(commitMessage);
98
+ console.log(chalk.gray('——————————————————\n'));
99
+ return;
100
+ }
101
+ // Confirm or auto-commit
102
+ const shouldCommit = await this.confirmCommit(commitMessage, options);
103
+ if (shouldCommit) {
104
+ console.log(chalk.blue('\nšŸ’¾ Creating commit...'));
105
+ const commitProgress = contextualLogger.startProgress('Committing changes');
106
+ await gitManager.createCommit(commitMessage);
107
+ commitProgress.succeed('Commit created');
108
+ console.log(chalk.green('āœ“ Commit: ') + chalk.white(commitMessage));
109
+ // Phase 4: Handle push
110
+ if (options.autoPush) {
111
+ console.log(chalk.blue('\nšŸš€ Auto-pushing to remote...'));
112
+ await this.performPush(contextualLogger);
113
+ }
114
+ else if (options.push) {
115
+ console.log(chalk.blue('\nšŸš€ Pushing to remote...'));
116
+ await this.performPush(contextualLogger);
117
+ }
118
+ else if (!options.yes && await gitManager.hasUnpushedCommits()) {
119
+ // Ask user if they want to push (only if not in auto mode)
120
+ try {
121
+ console.log(''); // Add some space
122
+ const shouldPush = await confirm({
123
+ message: 'Do you want to push to remote?'
124
+ });
125
+ if (isCancel(shouldPush)) {
126
+ console.log(chalk.yellow('ℹ Push cancelled'));
127
+ }
128
+ else if (shouldPush) {
129
+ console.log(chalk.blue('\nšŸš€ Pushing to remote...'));
130
+ await this.performPush(contextualLogger);
131
+ }
132
+ else {
133
+ console.log(chalk.gray('šŸ’” Tip: Use --push to automatically push changes in the future'));
134
+ }
135
+ }
136
+ catch (error) {
137
+ // If interactive prompts fail (e.g., in CI), skip push
138
+ console.log(chalk.gray('šŸ’” Tip: Use --push to automatically push changes'));
139
+ }
140
+ }
141
+ else if (await gitManager.hasUnpushedCommits()) {
142
+ // Just inform about unpushed commits
143
+ console.log(chalk.gray('šŸ’” Tip: Use --push to automatically push changes'));
144
+ }
145
+ }
146
+ else {
147
+ contextualLogger.info('Commit cancelled by user');
148
+ }
149
+ }
150
+ catch (error) {
151
+ if (error instanceof ConfigError || error instanceof GitError || error instanceof ApiError) {
152
+ contextualLogger.error(error.message, options.verbose ? error : undefined);
153
+ }
154
+ else {
155
+ contextualLogger.error(`Unexpected error: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : undefined);
156
+ }
157
+ throw error;
158
+ }
159
+ }
160
+ /**
161
+ * Generate commit message from diff
162
+ */
163
+ async generateCommitMessage(diff, options, provider) {
164
+ const progress = logger.startProgress('Generating commit message...');
165
+ try {
166
+ // Create system prompt
167
+ const systemPrompt = this.createSystemPrompt(options);
168
+ // Prepare diff content for processing
169
+ const diffContent = this.prepareDiffContent(diff);
170
+ const model = this.getModel(provider);
171
+ // Check cache first (unless disabled)
172
+ if (!options.noCache) {
173
+ const cachedMessage = await cacheManager.get(diffContent, model, provider, this.config.preferences.temperature);
174
+ if (cachedMessage) {
175
+ progress.succeed('Commit message retrieved from cache');
176
+ return cachedMessage;
177
+ }
178
+ }
179
+ // Get optimal chunk size for the model
180
+ const optimalChunkSize = tokenManager.getOptimalChunkSize(model);
181
+ const systemTokens = tokenManager.estimateSystemTokens(systemPrompt, model);
182
+ const availableTokens = optimalChunkSize - systemTokens;
183
+ // Check if we need to chunk the content based on tokens
184
+ const contentTokens = tokenManager.countTokens(diffContent, model);
185
+ if (contentTokens <= availableTokens) {
186
+ // Single request
187
+ const request = {
188
+ provider,
189
+ model: this.getModel(provider),
190
+ messages: [
191
+ { role: 'system', content: systemPrompt },
192
+ { role: 'user', content: diffContent },
193
+ ],
194
+ maxTokens: this.config.preferences.maxTokens,
195
+ temperature: this.config.preferences.temperature,
196
+ };
197
+ const result = await apiManager.generateCommitMessage(request, provider);
198
+ if (!result.success || !result.data) {
199
+ throw new ApiError(result.error?.message || 'Failed to generate commit message');
200
+ }
201
+ // Cache the result
202
+ if (!options.noCache) {
203
+ await cacheManager.set(diffContent, model, provider, this.config.preferences.temperature, result.data);
204
+ }
205
+ progress.succeed('Commit message generated');
206
+ return result.data;
207
+ }
208
+ else {
209
+ // Multiple chunks processing with token-based splitting
210
+ progress.update('Processing large diff in chunks...');
211
+ const chunks = tokenManager.splitIntoTokenChunks(diffContent, {
212
+ model,
213
+ maxTokens: optimalChunkSize,
214
+ reservedTokens: systemTokens,
215
+ });
216
+ logger.debug(`Split into ${chunks.length} token-based chunks`);
217
+ const baseRequest = {
218
+ provider,
219
+ model,
220
+ maxTokens: this.config.preferences.maxTokens,
221
+ temperature: this.config.preferences.temperature,
222
+ systemPrompt,
223
+ };
224
+ const result = await apiManager.processChunks(chunks, baseRequest, provider);
225
+ if (!result.success || !result.data) {
226
+ throw new ApiError(result.error?.message || 'Failed to process chunks');
227
+ }
228
+ // Combine chunk results into a single commit message
229
+ const finalMessage = this.combineChunkResults(result.data, options);
230
+ progress.succeed('Commit message generated from chunks');
231
+ return finalMessage;
232
+ }
233
+ }
234
+ catch (error) {
235
+ progress.fail('Failed to generate commit message');
236
+ throw error;
237
+ }
238
+ }
239
+ /**
240
+ * Create system prompt based on options and preferences
241
+ */
242
+ createSystemPrompt(options) {
243
+ const format = this.config.preferences.commitFormat;
244
+ const language = this.config.preferences.language;
245
+ let prompt = `You are an expert Git commit message generator. Generate a concise, meaningful commit message based on the provided git diff.
246
+
247
+ Requirements:
248
+ - Write in ${language === 'en' ? 'English' : language}
249
+ - Use ${format === 'conventional' ? 'Conventional Commits format' : 'simple descriptive format'}
250
+ - Focus on the most significant changes
251
+ - Be specific and actionable
252
+
253
+ `;
254
+ // Formatting constraints
255
+ if (options.oneLine) {
256
+ prompt += `- Generate a single-line commit message only\n`;
257
+ }
258
+ else {
259
+ prompt += `- Keep subject line under 72 characters\n- Add body if needed for complex changes\n`;
260
+ }
261
+ if (options.descriptionLength) {
262
+ prompt += `- Limit description to ${options.descriptionLength} characters\n`;
263
+ }
264
+ if (options.emoji) {
265
+ prompt += `- Include appropriate emoji at the start of the commit message\n`;
266
+ }
267
+ if (format === 'conventional') {
268
+ prompt += `\nConventional Commits format:
269
+ <type>[optional scope]: <description>
270
+
271
+ Types: feat, fix, docs, style, refactor, test, chore, perf, ci, build, revert
272
+ `;
273
+ if (options.emoji) {
274
+ prompt += `Emoji mapping:
275
+ - feat: ✨
276
+ - fix: šŸ›
277
+ - docs: šŸ“
278
+ - style: šŸ’„
279
+ - refactor: ā™»ļø
280
+ - test: āœ…
281
+ - chore: šŸ”§
282
+ - perf: ⚔
283
+ - ci: šŸ‘·
284
+ - build: šŸ“¦
285
+ - revert: āŖ
286
+ `;
287
+ }
288
+ }
289
+ if (options.type) {
290
+ prompt += `\nRequired type: ${options.type}`;
291
+ }
292
+ if (options.scope) {
293
+ prompt += `\nRequired scope: ${options.scope}`;
294
+ }
295
+ if (options.breaking) {
296
+ prompt += `\nThis is a BREAKING CHANGE - include "BREAKING CHANGE:" in the commit message.`;
297
+ }
298
+ prompt += `\nGenerate only the commit message, no additional text or explanation.`;
299
+ return prompt;
300
+ }
301
+ /**
302
+ * Prepare diff content for API consumption
303
+ */
304
+ prepareDiffContent(diff) {
305
+ const sections = [];
306
+ // Add summary
307
+ sections.push(`Summary: ${diff.files.length} files changed, ${diff.totalLines} lines modified\n`);
308
+ // Add file changes
309
+ for (const file of diff.files) {
310
+ if (file.isBinary) {
311
+ sections.push(`File: ${file.path} (${file.status}) - Binary file`);
312
+ continue;
313
+ }
314
+ sections.push(`File: ${file.path} (${file.status})`);
315
+ for (const chunk of file.chunks) {
316
+ if (chunk.context) {
317
+ sections.push(`Context: ${chunk.context}`);
318
+ }
319
+ const relevantLines = chunk.lines
320
+ .filter(line => line.type === 'added' || line.type === 'removed')
321
+ .slice(0, 20) // Limit lines per chunk
322
+ .map(line => `${line.type === 'added' ? '+' : '-'}${line.content}`)
323
+ .join('\n');
324
+ if (relevantLines) {
325
+ sections.push(relevantLines);
326
+ }
327
+ }
328
+ sections.push(''); // Empty line between files
329
+ }
330
+ return sections.join('\n');
331
+ }
332
+ /**
333
+ * Split large diff content into manageable chunks
334
+ */
335
+ splitDiffIntoChunks(content) {
336
+ const chunks = [];
337
+ const lines = content.split('\n');
338
+ let currentChunk = [];
339
+ let currentSize = 0;
340
+ for (const line of lines) {
341
+ const lineSize = line.length + 1; // +1 for newline
342
+ if (currentSize + lineSize > CHUNK_LIMITS.MAX_CHUNK_SIZE && currentChunk.length > 0) {
343
+ chunks.push(currentChunk.join('\n'));
344
+ currentChunk = [];
345
+ currentSize = 0;
346
+ }
347
+ currentChunk.push(line);
348
+ currentSize += lineSize;
349
+ }
350
+ if (currentChunk.length > 0) {
351
+ chunks.push(currentChunk.join('\n'));
352
+ }
353
+ return chunks;
354
+ }
355
+ /**
356
+ * Combine results from multiple chunks into a single commit message
357
+ */
358
+ combineChunkResults(results, options) {
359
+ if (results.length === 1) {
360
+ return results[0];
361
+ }
362
+ // Find the most comprehensive result or combine them intelligently
363
+ const longestResult = results.reduce((longest, current) => current.length > longest.length ? current : longest);
364
+ // If we have a type preference, ensure it's reflected
365
+ if (options.type && !longestResult.toLowerCase().includes(options.type)) {
366
+ const typePrefix = options.scope ? `${options.type}(${options.scope}):` : `${options.type}:`;
367
+ return `${typePrefix} ${longestResult.replace(/^[a-z]+(\([^)]+\))?\s*:\s*/i, '')}`;
368
+ }
369
+ return longestResult;
370
+ }
371
+ /**
372
+ * Get the appropriate model for the provider
373
+ */
374
+ getModel(provider) {
375
+ const configuredModel = this.config.providers[provider].model;
376
+ if (configuredModel) {
377
+ return configuredModel;
378
+ }
379
+ // Default models
380
+ return provider === 'openrouter'
381
+ ? 'anthropic/claude-3-haiku:beta'
382
+ : 'gpt-3.5-turbo';
383
+ }
384
+ /**
385
+ * Confirm commit with user (unless auto-confirm is enabled)
386
+ */
387
+ async confirmCommit(message, options) {
388
+ if (options.yes || this.config.preferences.autoConfirm) {
389
+ return true;
390
+ }
391
+ // For now, we'll implement a simple console confirmation
392
+ // In a full implementation, you might want to use a library like inquirer
393
+ console.log(`\nProposed commit message:\n${message}\n`);
394
+ // Simple readline implementation for confirmation
395
+ const readline = await import('readline');
396
+ const rl = readline.createInterface({
397
+ input: process.stdin,
398
+ output: process.stdout,
399
+ });
400
+ return new Promise((resolve) => {
401
+ rl.question('Create this commit? (y/N): ', (answer) => {
402
+ rl.close();
403
+ resolve(answer.toLowerCase().startsWith('y'));
404
+ });
405
+ });
406
+ }
407
+ /**
408
+ * Validate environment before processing
409
+ */
410
+ async validateEnvironment(options) {
411
+ // Check if in git repository
412
+ const isGitRepo = await gitManager.isGitRepository();
413
+ if (!isGitRepo) {
414
+ throw new GitError('Not in a git repository');
415
+ }
416
+ // Check if there are staged changes
417
+ const stagedFiles = await gitManager.getStagedFiles();
418
+ if (stagedFiles.length === 0) {
419
+ throw new GitError('No staged changes found. Use `git add` to stage files first.');
420
+ }
421
+ // Validate API configuration
422
+ const provider = options.provider || this.config.preferences.defaultProvider;
423
+ const isConfigValid = await configManager.validateConfig(provider);
424
+ if (!isConfigValid) {
425
+ throw new ConfigError(`API key not configured for ${provider}. Use 'orc config set ${provider} <api-key>' to set it.`);
426
+ }
427
+ logger.debug('Environment validation passed', {
428
+ provider,
429
+ stagedFiles: stagedFiles.length
430
+ });
431
+ }
432
+ /**
433
+ * Perform push operation with proper messaging
434
+ */
435
+ async performPush(contextualLogger) {
436
+ const hasUpstream = await gitManager.hasUpstream();
437
+ const currentBranch = await gitManager.getCurrentBranch();
438
+ const pushMessage = hasUpstream
439
+ ? `Pushing to ${currentBranch}`
440
+ : `Setting upstream and pushing to ${currentBranch}`;
441
+ const pushProgress = contextualLogger.startProgress(pushMessage);
442
+ try {
443
+ await gitManager.pushToRemote(true); // Set upstream if needed
444
+ const successMessage = hasUpstream
445
+ ? `Pushed to ${currentBranch}`
446
+ : `Upstream set and pushed to ${currentBranch}`;
447
+ pushProgress.succeed(successMessage);
448
+ console.log(chalk.green('āœ“ Changes pushed successfully'));
449
+ }
450
+ catch (error) {
451
+ pushProgress.fail(`Push failed`);
452
+ console.log(chalk.red(`āœ— Error: ${error.message}`));
453
+ console.log(chalk.gray('šŸ’” You can try pushing manually: git push'));
454
+ }
455
+ }
456
+ /**
457
+ * Determine if we should push changes
458
+ */
459
+ async shouldPush(options) {
460
+ // If auto-push is enabled, always push
461
+ if (options.autoPush) {
462
+ return true;
463
+ }
464
+ // If push flag is set but not yes flag, we might want to ask
465
+ if (options.push && !options.yes) {
466
+ // For now, just return true. In future, could add interactive confirmation
467
+ return true;
468
+ }
469
+ return options.push || false;
470
+ }
471
+ }
472
+ // Singleton instance
473
+ export const coreOrchestrator = new CoreOrchestrator();
474
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/modules/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { GitDiff } from '../types/index.js';
2
+ export interface FilterOptions {
3
+ ignoreWhitespace?: boolean;
4
+ ignoreGenerated?: boolean;
5
+ ignoreFormatterNoise?: boolean;
6
+ ignoreLockFiles?: boolean;
7
+ maxFileSize?: number;
8
+ relevancyThreshold?: number;
9
+ }
10
+ export interface RelevancyScore {
11
+ file: string;
12
+ score: number;
13
+ reasons: string[];
14
+ }
15
+ export declare class DiffFilter {
16
+ private readonly defaultOptions;
17
+ private readonly generatedFilePatterns;
18
+ private readonly formatterPatterns;
19
+ private readonly highValuePatterns;
20
+ /**
21
+ * Filter diff based on relevancy and noise reduction
22
+ */
23
+ filterDiff(diff: GitDiff, options?: Partial<FilterOptions>): GitDiff;
24
+ /**
25
+ * Filter individual file
26
+ */
27
+ private filterFile;
28
+ /**
29
+ * Filter individual chunk
30
+ */
31
+ private filterChunk;
32
+ /**
33
+ * Check if file is generated
34
+ */
35
+ private isGeneratedFile;
36
+ /**
37
+ * Check if file is a lock file
38
+ */
39
+ private isLockFile;
40
+ /**
41
+ * Check if line is whitespace-only change
42
+ */
43
+ private isWhitespaceOnlyLine;
44
+ /**
45
+ * Check if line is formatter noise
46
+ */
47
+ private isFormatterNoise;
48
+ /**
49
+ * Score files by relevancy
50
+ */
51
+ private scoreFiles;
52
+ /**
53
+ * Get relevancy score based on file type
54
+ */
55
+ private getFileTypeScore;
56
+ /**
57
+ * Generate context for filtered chunk
58
+ */
59
+ private generateChunkContext;
60
+ /**
61
+ * Get summary of filtering actions
62
+ */
63
+ getFilteringSummary(original: GitDiff, filtered: GitDiff): {
64
+ filesRemoved: number;
65
+ linesRemoved: number;
66
+ sizeReduction: string;
67
+ topRemovedReasons: string[];
68
+ };
69
+ }
70
+ export declare const diffFilter: DiffFilter;
71
+ //# sourceMappingURL=diff-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-filter.d.ts","sourceRoot":"","sources":["../../src/modules/diff-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA8B,MAAM,mBAAmB,CAAC;AAGxE,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAO7B;IAGF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CA4BpC;IAGF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAiBhC;IAGF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAahC;IAEF;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,OAAO;IAwCxE;;OAEG;IACH,OAAO,CAAC,UAAU;IAmClB;;OAEG;IACH,OAAO,CAAC,WAAW;IAmCnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoElB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG;QACzD,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;KAC7B;CAqBF;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC"}