@git.zone/tsdoc 1.8.3 → 1.9.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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/aidocs_classes/commit.js +26 -7
- package/dist_ts/context/diff-processor.d.ts +72 -0
- package/dist_ts/context/diff-processor.js +275 -0
- package/dist_ts/context/index.d.ts +4 -3
- package/dist_ts/context/index.js +3 -2
- package/dist_ts/context/types.d.ts +1 -0
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/aidocs_classes/commit.ts +29 -9
- package/ts/context/diff-processor.ts +341 -0
- package/ts/context/index.ts +10 -2
- package/ts/context/types.ts +4 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tsdoc',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.9.0',
|
|
7
7
|
description: 'A comprehensive TypeScript documentation tool that leverages AI to generate and enhance project documentation, including dynamic README creation, API docs via TypeDoc, and smart commit message generation.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDhNQUE4TTtDQUM1TixDQUFBIn0=
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import { AiDoc } from '../classes.aidoc.js';
|
|
3
3
|
import { ProjectContext } from './projectcontext.js';
|
|
4
|
+
import { DiffProcessor } from '../context/diff-processor.js';
|
|
4
5
|
export class Commit {
|
|
5
6
|
constructor(aiDocsRef, projectDirArg) {
|
|
6
7
|
this.aiDocsRef = aiDocsRef;
|
|
@@ -50,26 +51,44 @@ export class Commit {
|
|
|
50
51
|
];
|
|
51
52
|
// Pass glob patterns directly to smartgit - it handles matching internally
|
|
52
53
|
const diffStringArray = await gitRepo.getUncommittedDiff(excludePatterns);
|
|
53
|
-
//
|
|
54
|
+
// Process diffs intelligently using DiffProcessor
|
|
55
|
+
let processedDiffString;
|
|
54
56
|
if (diffStringArray.length > 0) {
|
|
57
|
+
// Diagnostic logging for raw diff statistics
|
|
55
58
|
const totalChars = diffStringArray.join('\n\n').length;
|
|
56
59
|
const estimatedTokens = Math.ceil(totalChars / 4);
|
|
57
|
-
console.log(`📊
|
|
60
|
+
console.log(`📊 Raw git diff statistics:`);
|
|
58
61
|
console.log(` Files changed: ${diffStringArray.length}`);
|
|
59
62
|
console.log(` Total characters: ${totalChars.toLocaleString()}`);
|
|
60
63
|
console.log(` Estimated tokens: ${estimatedTokens.toLocaleString()}`);
|
|
61
64
|
console.log(` Exclusion patterns: ${excludePatterns.length}`);
|
|
65
|
+
// Use DiffProcessor to intelligently handle large diffs
|
|
66
|
+
const diffProcessor = new DiffProcessor({
|
|
67
|
+
maxDiffTokens: 100000, // Reserve 100k tokens for diffs
|
|
68
|
+
smallFileLines: 50, // Include files <= 50 lines fully
|
|
69
|
+
mediumFileLines: 200, // Summarize files <= 200 lines
|
|
70
|
+
sampleHeadLines: 20, // Show first 20 lines
|
|
71
|
+
sampleTailLines: 20, // Show last 20 lines
|
|
72
|
+
});
|
|
73
|
+
const processedDiff = diffProcessor.processDiffs(diffStringArray);
|
|
74
|
+
processedDiffString = diffProcessor.formatForContext(processedDiff);
|
|
75
|
+
console.log(`📝 Processed diff statistics:`);
|
|
76
|
+
console.log(` Full diffs: ${processedDiff.fullDiffs.length} files`);
|
|
77
|
+
console.log(` Summarized: ${processedDiff.summarizedDiffs.length} files`);
|
|
78
|
+
console.log(` Metadata only: ${processedDiff.metadataOnly.length} files`);
|
|
79
|
+
console.log(` Final tokens: ${processedDiff.totalTokens.toLocaleString()}`);
|
|
62
80
|
if (estimatedTokens > 50000) {
|
|
63
|
-
console.
|
|
64
|
-
console.warn(` This may indicate build artifacts or large files in the diff.`);
|
|
65
|
-
console.warn(` Consider reviewing uncommitted changes or improving exclusion patterns.`);
|
|
81
|
+
console.log(`✅ DiffProcessor reduced token usage: ${estimatedTokens.toLocaleString()} → ${processedDiff.totalTokens.toLocaleString()}`);
|
|
66
82
|
}
|
|
67
83
|
}
|
|
84
|
+
else {
|
|
85
|
+
processedDiffString = 'No changes.';
|
|
86
|
+
}
|
|
68
87
|
// Use the new TaskContextFactory for optimized context
|
|
69
88
|
const taskContextFactory = new (await import('../context/index.js')).TaskContextFactory(this.projectDir, this.aiDocsRef.openaiInstance);
|
|
70
89
|
await taskContextFactory.initialize();
|
|
71
90
|
// Generate context specifically for commit task
|
|
72
|
-
const contextResult = await taskContextFactory.createContextForCommit(
|
|
91
|
+
const contextResult = await taskContextFactory.createContextForCommit(processedDiffString);
|
|
73
92
|
// Get the optimized context string
|
|
74
93
|
let contextString = contextResult.context;
|
|
75
94
|
// Log token usage statistics
|
|
@@ -159,4 +178,4 @@ ${JSON.stringify(commitMessages, null, 2)}
|
|
|
159
178
|
return resultObject;
|
|
160
179
|
}
|
|
161
180
|
}
|
|
162
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvY29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBVzdELE1BQU0sT0FBTyxNQUFNO0lBSWpCLFlBQVksU0FBZ0IsRUFBRSxhQUFxQjtRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLHFCQUFxQjtRQUNoQyxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6RCxNQUFNLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQy9ELGdCQUFnQixFQUNoQixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1FBRUYsMENBQTBDO1FBQzFDLGtEQUFrRDtRQUNsRCxNQUFNLGVBQWUsR0FBRztZQUN0QixhQUFhO1lBQ2IsZ0JBQWdCO1lBQ2hCLG1CQUFtQjtZQUNuQixxQkFBcUI7WUFDckIsV0FBVztZQUNYLFdBQVc7WUFDWCxXQUFXO1lBRVgsa0RBQWtEO1lBQ2xELFNBQVM7WUFDVCxXQUFXLEVBQVksMEJBQTBCO1lBQ2pELFVBQVU7WUFDVixVQUFVO1lBQ1YsUUFBUTtZQUNSLGdCQUFnQjtZQUVoQix5QkFBeUI7WUFDekIsYUFBYTtZQUNiLGVBQWU7WUFDZixh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
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent git diff processor that handles large diffs by sampling and prioritization
|
|
3
|
+
* instead of blind truncation.
|
|
4
|
+
*/
|
|
5
|
+
export interface IDiffFileInfo {
|
|
6
|
+
filepath: string;
|
|
7
|
+
status: 'added' | 'modified' | 'deleted';
|
|
8
|
+
linesAdded: number;
|
|
9
|
+
linesRemoved: number;
|
|
10
|
+
totalLines: number;
|
|
11
|
+
estimatedTokens: number;
|
|
12
|
+
diffContent: string;
|
|
13
|
+
}
|
|
14
|
+
export interface IProcessedDiff {
|
|
15
|
+
summary: string;
|
|
16
|
+
fullDiffs: string[];
|
|
17
|
+
summarizedDiffs: string[];
|
|
18
|
+
metadataOnly: string[];
|
|
19
|
+
totalFiles: number;
|
|
20
|
+
totalTokens: number;
|
|
21
|
+
}
|
|
22
|
+
export interface IDiffProcessorOptions {
|
|
23
|
+
maxDiffTokens?: number;
|
|
24
|
+
smallFileLines?: number;
|
|
25
|
+
mediumFileLines?: number;
|
|
26
|
+
sampleHeadLines?: number;
|
|
27
|
+
sampleTailLines?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class DiffProcessor {
|
|
30
|
+
private options;
|
|
31
|
+
constructor(options?: IDiffProcessorOptions);
|
|
32
|
+
/**
|
|
33
|
+
* Process an array of git diffs into a structured, token-efficient format
|
|
34
|
+
*/
|
|
35
|
+
processDiffs(diffStringArray: string[]): IProcessedDiff;
|
|
36
|
+
/**
|
|
37
|
+
* Format the processed diff for inclusion in context
|
|
38
|
+
*/
|
|
39
|
+
formatForContext(processed: IProcessedDiff): string;
|
|
40
|
+
/**
|
|
41
|
+
* Parse a single git diff string into file information
|
|
42
|
+
*/
|
|
43
|
+
private parseDiffFile;
|
|
44
|
+
/**
|
|
45
|
+
* Prioritize files by importance (source files before build artifacts)
|
|
46
|
+
*/
|
|
47
|
+
private prioritizeFiles;
|
|
48
|
+
/**
|
|
49
|
+
* Calculate importance score for a file path
|
|
50
|
+
*/
|
|
51
|
+
private getFileImportanceScore;
|
|
52
|
+
/**
|
|
53
|
+
* Extract head and tail lines from a diff, omitting the middle
|
|
54
|
+
*/
|
|
55
|
+
private extractDiffSample;
|
|
56
|
+
/**
|
|
57
|
+
* Get file status prefix with emoji
|
|
58
|
+
*/
|
|
59
|
+
private getFileStatusPrefix;
|
|
60
|
+
/**
|
|
61
|
+
* Extract filepath from diff content
|
|
62
|
+
*/
|
|
63
|
+
private extractFilepathFromDiff;
|
|
64
|
+
/**
|
|
65
|
+
* Format file info as metadata only
|
|
66
|
+
*/
|
|
67
|
+
private formatMetadataOnly;
|
|
68
|
+
/**
|
|
69
|
+
* Generate human-readable summary of processed diff
|
|
70
|
+
*/
|
|
71
|
+
private generateSummary;
|
|
72
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent git diff processor that handles large diffs by sampling and prioritization
|
|
3
|
+
* instead of blind truncation.
|
|
4
|
+
*/
|
|
5
|
+
export class DiffProcessor {
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
this.options = {
|
|
8
|
+
maxDiffTokens: options.maxDiffTokens ?? 100000,
|
|
9
|
+
smallFileLines: options.smallFileLines ?? 50,
|
|
10
|
+
mediumFileLines: options.mediumFileLines ?? 200,
|
|
11
|
+
sampleHeadLines: options.sampleHeadLines ?? 20,
|
|
12
|
+
sampleTailLines: options.sampleTailLines ?? 20,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Process an array of git diffs into a structured, token-efficient format
|
|
17
|
+
*/
|
|
18
|
+
processDiffs(diffStringArray) {
|
|
19
|
+
// Parse all diffs into file info objects
|
|
20
|
+
const fileInfos = diffStringArray
|
|
21
|
+
.map(diffString => this.parseDiffFile(diffString))
|
|
22
|
+
.filter(info => info !== null);
|
|
23
|
+
// Prioritize files (source files first, build artifacts last)
|
|
24
|
+
const prioritized = this.prioritizeFiles(fileInfos);
|
|
25
|
+
const result = {
|
|
26
|
+
summary: '',
|
|
27
|
+
fullDiffs: [],
|
|
28
|
+
summarizedDiffs: [],
|
|
29
|
+
metadataOnly: [],
|
|
30
|
+
totalFiles: prioritized.length,
|
|
31
|
+
totalTokens: 0,
|
|
32
|
+
};
|
|
33
|
+
let tokensUsed = 0;
|
|
34
|
+
const tokenBudget = this.options.maxDiffTokens;
|
|
35
|
+
// Categorize and include files based on size and token budget
|
|
36
|
+
for (const fileInfo of prioritized) {
|
|
37
|
+
const remainingBudget = tokenBudget - tokensUsed;
|
|
38
|
+
if (remainingBudget <= 0) {
|
|
39
|
+
// Budget exhausted - rest are metadata only
|
|
40
|
+
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (fileInfo.totalLines <= this.options.smallFileLines) {
|
|
44
|
+
// Small file - include fully if budget allows
|
|
45
|
+
if (fileInfo.estimatedTokens <= remainingBudget) {
|
|
46
|
+
const statusPrefix = this.getFileStatusPrefix(fileInfo);
|
|
47
|
+
result.fullDiffs.push(`${statusPrefix}${fileInfo.diffContent}`);
|
|
48
|
+
tokensUsed += fileInfo.estimatedTokens;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (fileInfo.totalLines <= this.options.mediumFileLines) {
|
|
55
|
+
// Medium file - try to include summary with head/tail
|
|
56
|
+
const summary = this.extractDiffSample(fileInfo, this.options.sampleHeadLines, this.options.sampleTailLines);
|
|
57
|
+
const summaryTokens = Math.ceil(summary.length / 4); // Rough estimate
|
|
58
|
+
if (summaryTokens <= remainingBudget) {
|
|
59
|
+
result.summarizedDiffs.push(summary);
|
|
60
|
+
tokensUsed += summaryTokens;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Large file - metadata only
|
|
68
|
+
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
result.totalTokens = tokensUsed;
|
|
72
|
+
result.summary = this.generateSummary(result);
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Format the processed diff for inclusion in context
|
|
77
|
+
*/
|
|
78
|
+
formatForContext(processed) {
|
|
79
|
+
const sections = [];
|
|
80
|
+
// Summary section
|
|
81
|
+
sections.push('====== GIT DIFF SUMMARY ======');
|
|
82
|
+
sections.push(processed.summary);
|
|
83
|
+
sections.push('');
|
|
84
|
+
// Full diffs section
|
|
85
|
+
if (processed.fullDiffs.length > 0) {
|
|
86
|
+
sections.push(`====== FULL DIFFS (${processed.fullDiffs.length} files) ======`);
|
|
87
|
+
sections.push(processed.fullDiffs.join('\n\n'));
|
|
88
|
+
sections.push('');
|
|
89
|
+
}
|
|
90
|
+
// Summarized diffs section
|
|
91
|
+
if (processed.summarizedDiffs.length > 0) {
|
|
92
|
+
sections.push(`====== SUMMARIZED DIFFS (${processed.summarizedDiffs.length} files) ======`);
|
|
93
|
+
sections.push(processed.summarizedDiffs.join('\n\n'));
|
|
94
|
+
sections.push('');
|
|
95
|
+
}
|
|
96
|
+
// Metadata only section
|
|
97
|
+
if (processed.metadataOnly.length > 0) {
|
|
98
|
+
sections.push(`====== METADATA ONLY (${processed.metadataOnly.length} files) ======`);
|
|
99
|
+
sections.push(processed.metadataOnly.join('\n'));
|
|
100
|
+
sections.push('');
|
|
101
|
+
}
|
|
102
|
+
sections.push('====== END OF GIT DIFF ======');
|
|
103
|
+
return sections.join('\n');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Parse a single git diff string into file information
|
|
107
|
+
*/
|
|
108
|
+
parseDiffFile(diffString) {
|
|
109
|
+
if (!diffString || diffString.trim().length === 0) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const lines = diffString.split('\n');
|
|
113
|
+
let filepath = '';
|
|
114
|
+
let status = 'modified';
|
|
115
|
+
let linesAdded = 0;
|
|
116
|
+
let linesRemoved = 0;
|
|
117
|
+
// Parse diff header to extract filepath and status
|
|
118
|
+
for (const line of lines) {
|
|
119
|
+
if (line.startsWith('--- a/')) {
|
|
120
|
+
filepath = line.substring(6);
|
|
121
|
+
}
|
|
122
|
+
else if (line.startsWith('+++ b/')) {
|
|
123
|
+
const newPath = line.substring(6);
|
|
124
|
+
if (newPath === '/dev/null') {
|
|
125
|
+
status = 'deleted';
|
|
126
|
+
}
|
|
127
|
+
else if (filepath === '/dev/null') {
|
|
128
|
+
status = 'added';
|
|
129
|
+
filepath = newPath;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
filepath = newPath;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
136
|
+
linesAdded++;
|
|
137
|
+
}
|
|
138
|
+
else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
139
|
+
linesRemoved++;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const totalLines = linesAdded + linesRemoved;
|
|
143
|
+
const estimatedTokens = Math.ceil(diffString.length / 4);
|
|
144
|
+
return {
|
|
145
|
+
filepath,
|
|
146
|
+
status,
|
|
147
|
+
linesAdded,
|
|
148
|
+
linesRemoved,
|
|
149
|
+
totalLines,
|
|
150
|
+
estimatedTokens,
|
|
151
|
+
diffContent: diffString,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Prioritize files by importance (source files before build artifacts)
|
|
156
|
+
*/
|
|
157
|
+
prioritizeFiles(files) {
|
|
158
|
+
return files.sort((a, b) => {
|
|
159
|
+
const scoreA = this.getFileImportanceScore(a.filepath);
|
|
160
|
+
const scoreB = this.getFileImportanceScore(b.filepath);
|
|
161
|
+
return scoreB - scoreA; // Higher score first
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Calculate importance score for a file path
|
|
166
|
+
*/
|
|
167
|
+
getFileImportanceScore(filepath) {
|
|
168
|
+
// Source files - highest priority
|
|
169
|
+
if (filepath.match(/^(src|lib|app|components|pages|api)\//)) {
|
|
170
|
+
return 100;
|
|
171
|
+
}
|
|
172
|
+
// Test files - high priority
|
|
173
|
+
if (filepath.match(/\.(test|spec)\.(ts|js|tsx|jsx)$/) || filepath.startsWith('test/')) {
|
|
174
|
+
return 80;
|
|
175
|
+
}
|
|
176
|
+
// Configuration files - medium-high priority
|
|
177
|
+
if (filepath.match(/\.(json|yaml|yml|toml|config\.(ts|js))$/)) {
|
|
178
|
+
return 60;
|
|
179
|
+
}
|
|
180
|
+
// Documentation - medium priority
|
|
181
|
+
if (filepath.match(/\.(md|txt|rst)$/)) {
|
|
182
|
+
return 40;
|
|
183
|
+
}
|
|
184
|
+
// Build artifacts - low priority
|
|
185
|
+
if (filepath.match(/^(dist|build|out|\.next|public\/dist)\//)) {
|
|
186
|
+
return 10;
|
|
187
|
+
}
|
|
188
|
+
// Everything else - default priority
|
|
189
|
+
return 50;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Extract head and tail lines from a diff, omitting the middle
|
|
193
|
+
*/
|
|
194
|
+
extractDiffSample(fileInfo, headLines, tailLines) {
|
|
195
|
+
const lines = fileInfo.diffContent.split('\n');
|
|
196
|
+
const totalLines = lines.length;
|
|
197
|
+
if (totalLines <= headLines + tailLines) {
|
|
198
|
+
// File is small enough to include fully
|
|
199
|
+
return fileInfo.diffContent;
|
|
200
|
+
}
|
|
201
|
+
// Extract file metadata from diff header
|
|
202
|
+
const headerLines = [];
|
|
203
|
+
let bodyStartIndex = 0;
|
|
204
|
+
for (let i = 0; i < lines.length; i++) {
|
|
205
|
+
if (lines[i].startsWith('@@')) {
|
|
206
|
+
headerLines.push(...lines.slice(0, i + 1));
|
|
207
|
+
bodyStartIndex = i + 1;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const bodyLines = lines.slice(bodyStartIndex);
|
|
212
|
+
const head = bodyLines.slice(0, headLines);
|
|
213
|
+
const tail = bodyLines.slice(-tailLines);
|
|
214
|
+
const omittedLines = bodyLines.length - headLines - tailLines;
|
|
215
|
+
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
216
|
+
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
217
|
+
const parts = [];
|
|
218
|
+
parts.push(`${statusEmoji} FILE: ${fileInfo.filepath}`);
|
|
219
|
+
parts.push(`CHANGES: +${fileInfo.linesAdded} lines, -${fileInfo.linesRemoved} lines (${fileInfo.totalLines} total)`);
|
|
220
|
+
parts.push('');
|
|
221
|
+
parts.push(...headerLines);
|
|
222
|
+
parts.push(...head);
|
|
223
|
+
parts.push('');
|
|
224
|
+
parts.push(`[... ${omittedLines} lines omitted - use Read tool to see full file ...]`);
|
|
225
|
+
parts.push('');
|
|
226
|
+
parts.push(...tail);
|
|
227
|
+
return parts.join('\n');
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get file status prefix with emoji
|
|
231
|
+
*/
|
|
232
|
+
getFileStatusPrefix(fileInfo) {
|
|
233
|
+
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
234
|
+
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
235
|
+
return `${statusEmoji} `;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Extract filepath from diff content
|
|
239
|
+
*/
|
|
240
|
+
extractFilepathFromDiff(diffContent) {
|
|
241
|
+
const lines = diffContent.split('\n');
|
|
242
|
+
for (const line of lines) {
|
|
243
|
+
if (line.startsWith('+++ b/')) {
|
|
244
|
+
return line.substring(6);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return 'unknown';
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Format file info as metadata only
|
|
251
|
+
*/
|
|
252
|
+
formatMetadataOnly(fileInfo) {
|
|
253
|
+
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
254
|
+
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
255
|
+
return `${statusEmoji} ${fileInfo.filepath} (+${fileInfo.linesAdded}, -${fileInfo.linesRemoved})`;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Generate human-readable summary of processed diff
|
|
259
|
+
*/
|
|
260
|
+
generateSummary(result) {
|
|
261
|
+
const parts = [];
|
|
262
|
+
parts.push(`Files changed: ${result.totalFiles} total`);
|
|
263
|
+
parts.push(`- ${result.fullDiffs.length} included in full`);
|
|
264
|
+
parts.push(`- ${result.summarizedDiffs.length} summarized (head/tail shown)`);
|
|
265
|
+
parts.push(`- ${result.metadataOnly.length} metadata only`);
|
|
266
|
+
parts.push(`Estimated tokens: ~${result.totalTokens.toLocaleString()}`);
|
|
267
|
+
if (result.metadataOnly.length > 0) {
|
|
268
|
+
parts.push('');
|
|
269
|
+
parts.push('NOTE: Some files excluded to stay within token budget.');
|
|
270
|
+
parts.push('Use Read tool with specific file paths to see full content.');
|
|
271
|
+
}
|
|
272
|
+
return parts.join('\n');
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L2RpZmYtcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQTZCSCxNQUFNLE9BQU8sYUFBYTtJQUd4QixZQUFZLFVBQWlDLEVBQUU7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxJQUFJLE1BQU07WUFDOUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRTtZQUM1QyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsSUFBSSxHQUFHO1lBQy9DLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZSxJQUFJLEVBQUU7WUFDOUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlLElBQUksRUFBRTtTQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLGVBQXlCO1FBQzNDLHlDQUF5QztRQUN6QyxNQUFNLFNBQVMsR0FBb0IsZUFBZTthQUMvQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQW9CLENBQUM7UUFFcEQsOERBQThEO1FBQzlELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEQsTUFBTSxNQUFNLEdBQW1CO1lBQzdCLE9BQU8sRUFBRSxFQUFFO1lBQ1gsU0FBUyxFQUFFLEVBQUU7WUFDYixlQUFlLEVBQUUsRUFBRTtZQUNuQixZQUFZLEVBQUUsRUFBRTtZQUNoQixVQUFVLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDOUIsV0FBVyxFQUFFLENBQUM7U0FDZixDQUFDO1FBRUYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxD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
|
|
@@ -5,6 +5,7 @@ import { ContextTrimmer } from './context-trimmer.js';
|
|
|
5
5
|
import { LazyFileLoader } from './lazy-file-loader.js';
|
|
6
6
|
import { ContextCache } from './context-cache.js';
|
|
7
7
|
import { ContextAnalyzer } from './context-analyzer.js';
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
export
|
|
8
|
+
import { DiffProcessor } from './diff-processor.js';
|
|
9
|
+
import type { ContextMode, IContextConfig, IContextResult, IFileInfo, ITrimConfig, ITaskConfig, TaskType, ICacheConfig, IAnalyzerConfig, IPrioritizationWeights, ITierConfig, ITierSettings, IFileMetadata, ICacheEntry, IFileDependencies, IFileAnalysis, IAnalysisResult, IIterativeConfig, IIterativeContextResult, IDiffFileInfo, IProcessedDiff, IDiffProcessorOptions } from './types.js';
|
|
10
|
+
export { EnhancedContext, TaskContextFactory, ConfigManager, ContextTrimmer, LazyFileLoader, ContextCache, ContextAnalyzer, DiffProcessor, };
|
|
11
|
+
export type { ContextMode, IContextConfig, IContextResult, IFileInfo, ITrimConfig, ITaskConfig, TaskType, ICacheConfig, IAnalyzerConfig, IPrioritizationWeights, ITierConfig, ITierSettings, IFileMetadata, ICacheEntry, IFileDependencies, IFileAnalysis, IAnalysisResult, IIterativeConfig, IIterativeContextResult, IDiffFileInfo, IProcessedDiff, IDiffProcessorOptions };
|
package/dist_ts/context/index.js
CHANGED
|
@@ -5,7 +5,8 @@ import { ContextTrimmer } from './context-trimmer.js';
|
|
|
5
5
|
import { LazyFileLoader } from './lazy-file-loader.js';
|
|
6
6
|
import { ContextCache } from './context-cache.js';
|
|
7
7
|
import { ContextAnalyzer } from './context-analyzer.js';
|
|
8
|
+
import { DiffProcessor } from './diff-processor.js';
|
|
8
9
|
export {
|
|
9
10
|
// Classes
|
|
10
|
-
EnhancedContext, TaskContextFactory, ConfigManager, ContextTrimmer, LazyFileLoader, ContextCache, ContextAnalyzer, };
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
EnhancedContext, TaskContextFactory, ConfigManager, ContextTrimmer, LazyFileLoader, ContextCache, ContextAnalyzer, DiffProcessor, };
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQTBCcEQsT0FBTztBQUNMLFVBQVU7QUFDVixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixjQUFjLEVBQ2QsY0FBYyxFQUNkLFlBQVksRUFDWixlQUFlLEVBQ2YsYUFBYSxHQUNkLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tsdoc",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A comprehensive TypeScript documentation tool that leverages AI to generate and enhance project documentation, including dynamic README creation, API docs via TypeDoc, and smart commit message generation.",
|
|
6
6
|
"type": "module",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tsdoc',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.9.0',
|
|
7
7
|
description: 'A comprehensive TypeScript documentation tool that leverages AI to generate and enhance project documentation, including dynamic README creation, API docs via TypeDoc, and smart commit message generation.'
|
|
8
8
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import { AiDoc } from '../classes.aidoc.js';
|
|
3
3
|
import { ProjectContext } from './projectcontext.js';
|
|
4
|
+
import { DiffProcessor } from '../context/diff-processor.js';
|
|
4
5
|
|
|
5
6
|
export interface INextCommitObject {
|
|
6
7
|
recommendedNextVersionLevel: 'fix' | 'feat' | 'BREAKING CHANGE'; // the recommended next version level of the project
|
|
@@ -74,22 +75,43 @@ export class Commit {
|
|
|
74
75
|
// Pass glob patterns directly to smartgit - it handles matching internally
|
|
75
76
|
const diffStringArray = await gitRepo.getUncommittedDiff(excludePatterns);
|
|
76
77
|
|
|
77
|
-
//
|
|
78
|
+
// Process diffs intelligently using DiffProcessor
|
|
79
|
+
let processedDiffString: string;
|
|
80
|
+
|
|
78
81
|
if (diffStringArray.length > 0) {
|
|
82
|
+
// Diagnostic logging for raw diff statistics
|
|
79
83
|
const totalChars = diffStringArray.join('\n\n').length;
|
|
80
84
|
const estimatedTokens = Math.ceil(totalChars / 4);
|
|
81
85
|
|
|
82
|
-
console.log(`📊
|
|
86
|
+
console.log(`📊 Raw git diff statistics:`);
|
|
83
87
|
console.log(` Files changed: ${diffStringArray.length}`);
|
|
84
88
|
console.log(` Total characters: ${totalChars.toLocaleString()}`);
|
|
85
89
|
console.log(` Estimated tokens: ${estimatedTokens.toLocaleString()}`);
|
|
86
90
|
console.log(` Exclusion patterns: ${excludePatterns.length}`);
|
|
87
91
|
|
|
92
|
+
// Use DiffProcessor to intelligently handle large diffs
|
|
93
|
+
const diffProcessor = new DiffProcessor({
|
|
94
|
+
maxDiffTokens: 100000, // Reserve 100k tokens for diffs
|
|
95
|
+
smallFileLines: 50, // Include files <= 50 lines fully
|
|
96
|
+
mediumFileLines: 200, // Summarize files <= 200 lines
|
|
97
|
+
sampleHeadLines: 20, // Show first 20 lines
|
|
98
|
+
sampleTailLines: 20, // Show last 20 lines
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const processedDiff = diffProcessor.processDiffs(diffStringArray);
|
|
102
|
+
processedDiffString = diffProcessor.formatForContext(processedDiff);
|
|
103
|
+
|
|
104
|
+
console.log(`📝 Processed diff statistics:`);
|
|
105
|
+
console.log(` Full diffs: ${processedDiff.fullDiffs.length} files`);
|
|
106
|
+
console.log(` Summarized: ${processedDiff.summarizedDiffs.length} files`);
|
|
107
|
+
console.log(` Metadata only: ${processedDiff.metadataOnly.length} files`);
|
|
108
|
+
console.log(` Final tokens: ${processedDiff.totalTokens.toLocaleString()}`);
|
|
109
|
+
|
|
88
110
|
if (estimatedTokens > 50000) {
|
|
89
|
-
console.
|
|
90
|
-
console.warn(` This may indicate build artifacts or large files in the diff.`);
|
|
91
|
-
console.warn(` Consider reviewing uncommitted changes or improving exclusion patterns.`);
|
|
111
|
+
console.log(`✅ DiffProcessor reduced token usage: ${estimatedTokens.toLocaleString()} → ${processedDiff.totalTokens.toLocaleString()}`);
|
|
92
112
|
}
|
|
113
|
+
} else {
|
|
114
|
+
processedDiffString = 'No changes.';
|
|
93
115
|
}
|
|
94
116
|
|
|
95
117
|
// Use the new TaskContextFactory for optimized context
|
|
@@ -98,11 +120,9 @@ export class Commit {
|
|
|
98
120
|
this.aiDocsRef.openaiInstance
|
|
99
121
|
);
|
|
100
122
|
await taskContextFactory.initialize();
|
|
101
|
-
|
|
123
|
+
|
|
102
124
|
// Generate context specifically for commit task
|
|
103
|
-
const contextResult = await taskContextFactory.createContextForCommit(
|
|
104
|
-
diffStringArray[0] ? diffStringArray.join('\n\n') : 'No changes.'
|
|
105
|
-
);
|
|
125
|
+
const contextResult = await taskContextFactory.createContextForCommit(processedDiffString);
|
|
106
126
|
|
|
107
127
|
// Get the optimized context string
|
|
108
128
|
let contextString = contextResult.context;
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent git diff processor that handles large diffs by sampling and prioritization
|
|
3
|
+
* instead of blind truncation.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface IDiffFileInfo {
|
|
7
|
+
filepath: string;
|
|
8
|
+
status: 'added' | 'modified' | 'deleted';
|
|
9
|
+
linesAdded: number;
|
|
10
|
+
linesRemoved: number;
|
|
11
|
+
totalLines: number;
|
|
12
|
+
estimatedTokens: number;
|
|
13
|
+
diffContent: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface IProcessedDiff {
|
|
17
|
+
summary: string; // Human-readable overview
|
|
18
|
+
fullDiffs: string[]; // Small files included fully
|
|
19
|
+
summarizedDiffs: string[]; // Medium files with head/tail
|
|
20
|
+
metadataOnly: string[]; // Large files, just stats
|
|
21
|
+
totalFiles: number;
|
|
22
|
+
totalTokens: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface IDiffProcessorOptions {
|
|
26
|
+
maxDiffTokens?: number; // Maximum tokens for entire diff section (default: 100000)
|
|
27
|
+
smallFileLines?: number; // Files <= this are included fully (default: 50)
|
|
28
|
+
mediumFileLines?: number; // Files <= this are summarized (default: 200)
|
|
29
|
+
sampleHeadLines?: number; // Lines to show at start of medium files (default: 20)
|
|
30
|
+
sampleTailLines?: number; // Lines to show at end of medium files (default: 20)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class DiffProcessor {
|
|
34
|
+
private options: Required<IDiffProcessorOptions>;
|
|
35
|
+
|
|
36
|
+
constructor(options: IDiffProcessorOptions = {}) {
|
|
37
|
+
this.options = {
|
|
38
|
+
maxDiffTokens: options.maxDiffTokens ?? 100000,
|
|
39
|
+
smallFileLines: options.smallFileLines ?? 50,
|
|
40
|
+
mediumFileLines: options.mediumFileLines ?? 200,
|
|
41
|
+
sampleHeadLines: options.sampleHeadLines ?? 20,
|
|
42
|
+
sampleTailLines: options.sampleTailLines ?? 20,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Process an array of git diffs into a structured, token-efficient format
|
|
48
|
+
*/
|
|
49
|
+
public processDiffs(diffStringArray: string[]): IProcessedDiff {
|
|
50
|
+
// Parse all diffs into file info objects
|
|
51
|
+
const fileInfos: IDiffFileInfo[] = diffStringArray
|
|
52
|
+
.map(diffString => this.parseDiffFile(diffString))
|
|
53
|
+
.filter(info => info !== null) as IDiffFileInfo[];
|
|
54
|
+
|
|
55
|
+
// Prioritize files (source files first, build artifacts last)
|
|
56
|
+
const prioritized = this.prioritizeFiles(fileInfos);
|
|
57
|
+
|
|
58
|
+
const result: IProcessedDiff = {
|
|
59
|
+
summary: '',
|
|
60
|
+
fullDiffs: [],
|
|
61
|
+
summarizedDiffs: [],
|
|
62
|
+
metadataOnly: [],
|
|
63
|
+
totalFiles: prioritized.length,
|
|
64
|
+
totalTokens: 0,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
let tokensUsed = 0;
|
|
68
|
+
const tokenBudget = this.options.maxDiffTokens;
|
|
69
|
+
|
|
70
|
+
// Categorize and include files based on size and token budget
|
|
71
|
+
for (const fileInfo of prioritized) {
|
|
72
|
+
const remainingBudget = tokenBudget - tokensUsed;
|
|
73
|
+
|
|
74
|
+
if (remainingBudget <= 0) {
|
|
75
|
+
// Budget exhausted - rest are metadata only
|
|
76
|
+
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (fileInfo.totalLines <= this.options.smallFileLines) {
|
|
81
|
+
// Small file - include fully if budget allows
|
|
82
|
+
if (fileInfo.estimatedTokens <= remainingBudget) {
|
|
83
|
+
const statusPrefix = this.getFileStatusPrefix(fileInfo);
|
|
84
|
+
result.fullDiffs.push(`${statusPrefix}${fileInfo.diffContent}`);
|
|
85
|
+
tokensUsed += fileInfo.estimatedTokens;
|
|
86
|
+
} else {
|
|
87
|
+
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
88
|
+
}
|
|
89
|
+
} else if (fileInfo.totalLines <= this.options.mediumFileLines) {
|
|
90
|
+
// Medium file - try to include summary with head/tail
|
|
91
|
+
const summary = this.extractDiffSample(
|
|
92
|
+
fileInfo,
|
|
93
|
+
this.options.sampleHeadLines,
|
|
94
|
+
this.options.sampleTailLines
|
|
95
|
+
);
|
|
96
|
+
const summaryTokens = Math.ceil(summary.length / 4); // Rough estimate
|
|
97
|
+
|
|
98
|
+
if (summaryTokens <= remainingBudget) {
|
|
99
|
+
result.summarizedDiffs.push(summary);
|
|
100
|
+
tokensUsed += summaryTokens;
|
|
101
|
+
} else {
|
|
102
|
+
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
// Large file - metadata only
|
|
106
|
+
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
result.totalTokens = tokensUsed;
|
|
111
|
+
result.summary = this.generateSummary(result);
|
|
112
|
+
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Format the processed diff for inclusion in context
|
|
118
|
+
*/
|
|
119
|
+
public formatForContext(processed: IProcessedDiff): string {
|
|
120
|
+
const sections: string[] = [];
|
|
121
|
+
|
|
122
|
+
// Summary section
|
|
123
|
+
sections.push('====== GIT DIFF SUMMARY ======');
|
|
124
|
+
sections.push(processed.summary);
|
|
125
|
+
sections.push('');
|
|
126
|
+
|
|
127
|
+
// Full diffs section
|
|
128
|
+
if (processed.fullDiffs.length > 0) {
|
|
129
|
+
sections.push(`====== FULL DIFFS (${processed.fullDiffs.length} files) ======`);
|
|
130
|
+
sections.push(processed.fullDiffs.join('\n\n'));
|
|
131
|
+
sections.push('');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Summarized diffs section
|
|
135
|
+
if (processed.summarizedDiffs.length > 0) {
|
|
136
|
+
sections.push(`====== SUMMARIZED DIFFS (${processed.summarizedDiffs.length} files) ======`);
|
|
137
|
+
sections.push(processed.summarizedDiffs.join('\n\n'));
|
|
138
|
+
sections.push('');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Metadata only section
|
|
142
|
+
if (processed.metadataOnly.length > 0) {
|
|
143
|
+
sections.push(`====== METADATA ONLY (${processed.metadataOnly.length} files) ======`);
|
|
144
|
+
sections.push(processed.metadataOnly.join('\n'));
|
|
145
|
+
sections.push('');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
sections.push('====== END OF GIT DIFF ======');
|
|
149
|
+
|
|
150
|
+
return sections.join('\n');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Parse a single git diff string into file information
|
|
155
|
+
*/
|
|
156
|
+
private parseDiffFile(diffString: string): IDiffFileInfo | null {
|
|
157
|
+
if (!diffString || diffString.trim().length === 0) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const lines = diffString.split('\n');
|
|
162
|
+
let filepath = '';
|
|
163
|
+
let status: 'added' | 'modified' | 'deleted' = 'modified';
|
|
164
|
+
let linesAdded = 0;
|
|
165
|
+
let linesRemoved = 0;
|
|
166
|
+
|
|
167
|
+
// Parse diff header to extract filepath and status
|
|
168
|
+
for (const line of lines) {
|
|
169
|
+
if (line.startsWith('--- a/')) {
|
|
170
|
+
filepath = line.substring(6);
|
|
171
|
+
} else if (line.startsWith('+++ b/')) {
|
|
172
|
+
const newPath = line.substring(6);
|
|
173
|
+
if (newPath === '/dev/null') {
|
|
174
|
+
status = 'deleted';
|
|
175
|
+
} else if (filepath === '/dev/null') {
|
|
176
|
+
status = 'added';
|
|
177
|
+
filepath = newPath;
|
|
178
|
+
} else {
|
|
179
|
+
filepath = newPath;
|
|
180
|
+
}
|
|
181
|
+
} else if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
182
|
+
linesAdded++;
|
|
183
|
+
} else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
184
|
+
linesRemoved++;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const totalLines = linesAdded + linesRemoved;
|
|
189
|
+
const estimatedTokens = Math.ceil(diffString.length / 4);
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
filepath,
|
|
193
|
+
status,
|
|
194
|
+
linesAdded,
|
|
195
|
+
linesRemoved,
|
|
196
|
+
totalLines,
|
|
197
|
+
estimatedTokens,
|
|
198
|
+
diffContent: diffString,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Prioritize files by importance (source files before build artifacts)
|
|
204
|
+
*/
|
|
205
|
+
private prioritizeFiles(files: IDiffFileInfo[]): IDiffFileInfo[] {
|
|
206
|
+
return files.sort((a, b) => {
|
|
207
|
+
const scoreA = this.getFileImportanceScore(a.filepath);
|
|
208
|
+
const scoreB = this.getFileImportanceScore(b.filepath);
|
|
209
|
+
return scoreB - scoreA; // Higher score first
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Calculate importance score for a file path
|
|
215
|
+
*/
|
|
216
|
+
private getFileImportanceScore(filepath: string): number {
|
|
217
|
+
// Source files - highest priority
|
|
218
|
+
if (filepath.match(/^(src|lib|app|components|pages|api)\//)) {
|
|
219
|
+
return 100;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Test files - high priority
|
|
223
|
+
if (filepath.match(/\.(test|spec)\.(ts|js|tsx|jsx)$/) || filepath.startsWith('test/')) {
|
|
224
|
+
return 80;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Configuration files - medium-high priority
|
|
228
|
+
if (filepath.match(/\.(json|yaml|yml|toml|config\.(ts|js))$/)) {
|
|
229
|
+
return 60;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Documentation - medium priority
|
|
233
|
+
if (filepath.match(/\.(md|txt|rst)$/)) {
|
|
234
|
+
return 40;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Build artifacts - low priority
|
|
238
|
+
if (filepath.match(/^(dist|build|out|\.next|public\/dist)\//)) {
|
|
239
|
+
return 10;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Everything else - default priority
|
|
243
|
+
return 50;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Extract head and tail lines from a diff, omitting the middle
|
|
248
|
+
*/
|
|
249
|
+
private extractDiffSample(fileInfo: IDiffFileInfo, headLines: number, tailLines: number): string {
|
|
250
|
+
const lines = fileInfo.diffContent.split('\n');
|
|
251
|
+
const totalLines = lines.length;
|
|
252
|
+
|
|
253
|
+
if (totalLines <= headLines + tailLines) {
|
|
254
|
+
// File is small enough to include fully
|
|
255
|
+
return fileInfo.diffContent;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Extract file metadata from diff header
|
|
259
|
+
const headerLines: string[] = [];
|
|
260
|
+
let bodyStartIndex = 0;
|
|
261
|
+
for (let i = 0; i < lines.length; i++) {
|
|
262
|
+
if (lines[i].startsWith('@@')) {
|
|
263
|
+
headerLines.push(...lines.slice(0, i + 1));
|
|
264
|
+
bodyStartIndex = i + 1;
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const bodyLines = lines.slice(bodyStartIndex);
|
|
270
|
+
const head = bodyLines.slice(0, headLines);
|
|
271
|
+
const tail = bodyLines.slice(-tailLines);
|
|
272
|
+
const omittedLines = bodyLines.length - headLines - tailLines;
|
|
273
|
+
|
|
274
|
+
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
275
|
+
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
276
|
+
|
|
277
|
+
const parts: string[] = [];
|
|
278
|
+
parts.push(`${statusEmoji} FILE: ${fileInfo.filepath}`);
|
|
279
|
+
parts.push(`CHANGES: +${fileInfo.linesAdded} lines, -${fileInfo.linesRemoved} lines (${fileInfo.totalLines} total)`);
|
|
280
|
+
parts.push('');
|
|
281
|
+
parts.push(...headerLines);
|
|
282
|
+
parts.push(...head);
|
|
283
|
+
parts.push('');
|
|
284
|
+
parts.push(`[... ${omittedLines} lines omitted - use Read tool to see full file ...]`);
|
|
285
|
+
parts.push('');
|
|
286
|
+
parts.push(...tail);
|
|
287
|
+
|
|
288
|
+
return parts.join('\n');
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Get file status prefix with emoji
|
|
293
|
+
*/
|
|
294
|
+
private getFileStatusPrefix(fileInfo: IDiffFileInfo): string {
|
|
295
|
+
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
296
|
+
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
297
|
+
return `${statusEmoji} `;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Extract filepath from diff content
|
|
302
|
+
*/
|
|
303
|
+
private extractFilepathFromDiff(diffContent: string): string {
|
|
304
|
+
const lines = diffContent.split('\n');
|
|
305
|
+
for (const line of lines) {
|
|
306
|
+
if (line.startsWith('+++ b/')) {
|
|
307
|
+
return line.substring(6);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return 'unknown';
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Format file info as metadata only
|
|
315
|
+
*/
|
|
316
|
+
private formatMetadataOnly(fileInfo: IDiffFileInfo): string {
|
|
317
|
+
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
318
|
+
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
319
|
+
return `${statusEmoji} ${fileInfo.filepath} (+${fileInfo.linesAdded}, -${fileInfo.linesRemoved})`;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Generate human-readable summary of processed diff
|
|
324
|
+
*/
|
|
325
|
+
private generateSummary(result: IProcessedDiff): string {
|
|
326
|
+
const parts: string[] = [];
|
|
327
|
+
parts.push(`Files changed: ${result.totalFiles} total`);
|
|
328
|
+
parts.push(`- ${result.fullDiffs.length} included in full`);
|
|
329
|
+
parts.push(`- ${result.summarizedDiffs.length} summarized (head/tail shown)`);
|
|
330
|
+
parts.push(`- ${result.metadataOnly.length} metadata only`);
|
|
331
|
+
parts.push(`Estimated tokens: ~${result.totalTokens.toLocaleString()}`);
|
|
332
|
+
|
|
333
|
+
if (result.metadataOnly.length > 0) {
|
|
334
|
+
parts.push('');
|
|
335
|
+
parts.push('NOTE: Some files excluded to stay within token budget.');
|
|
336
|
+
parts.push('Use Read tool with specific file paths to see full content.');
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return parts.join('\n');
|
|
340
|
+
}
|
|
341
|
+
}
|
package/ts/context/index.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { ContextTrimmer } from './context-trimmer.js';
|
|
|
5
5
|
import { LazyFileLoader } from './lazy-file-loader.js';
|
|
6
6
|
import { ContextCache } from './context-cache.js';
|
|
7
7
|
import { ContextAnalyzer } from './context-analyzer.js';
|
|
8
|
+
import { DiffProcessor } from './diff-processor.js';
|
|
8
9
|
import type {
|
|
9
10
|
ContextMode,
|
|
10
11
|
IContextConfig,
|
|
@@ -24,7 +25,10 @@ import type {
|
|
|
24
25
|
IFileAnalysis,
|
|
25
26
|
IAnalysisResult,
|
|
26
27
|
IIterativeConfig,
|
|
27
|
-
IIterativeContextResult
|
|
28
|
+
IIterativeContextResult,
|
|
29
|
+
IDiffFileInfo,
|
|
30
|
+
IProcessedDiff,
|
|
31
|
+
IDiffProcessorOptions
|
|
28
32
|
} from './types.js';
|
|
29
33
|
|
|
30
34
|
export {
|
|
@@ -36,6 +40,7 @@ export {
|
|
|
36
40
|
LazyFileLoader,
|
|
37
41
|
ContextCache,
|
|
38
42
|
ContextAnalyzer,
|
|
43
|
+
DiffProcessor,
|
|
39
44
|
};
|
|
40
45
|
|
|
41
46
|
// Types
|
|
@@ -58,5 +63,8 @@ export type {
|
|
|
58
63
|
IFileAnalysis,
|
|
59
64
|
IAnalysisResult,
|
|
60
65
|
IIterativeConfig,
|
|
61
|
-
IIterativeContextResult
|
|
66
|
+
IIterativeContextResult,
|
|
67
|
+
IDiffFileInfo,
|
|
68
|
+
IProcessedDiff,
|
|
69
|
+
IDiffProcessorOptions
|
|
62
70
|
};
|
package/ts/context/types.ts
CHANGED
|
@@ -318,4 +318,7 @@ export interface IIterativeContextResult extends IContextResult {
|
|
|
318
318
|
apiCallCount: number;
|
|
319
319
|
/** Total duration in ms */
|
|
320
320
|
totalDuration: number;
|
|
321
|
-
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Export DiffProcessor types
|
|
324
|
+
export type { IDiffFileInfo, IProcessedDiff, IDiffProcessorOptions } from './diff-processor.js';
|