agents-reverse-engineer 0.1.1
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/LICENSE +21 -0
- package/README.md +238 -0
- package/dist/change-detection/detector.d.ts +24 -0
- package/dist/change-detection/detector.d.ts.map +1 -0
- package/dist/change-detection/detector.js +114 -0
- package/dist/change-detection/detector.js.map +1 -0
- package/dist/change-detection/index.d.ts +9 -0
- package/dist/change-detection/index.d.ts.map +1 -0
- package/dist/change-detection/index.js +8 -0
- package/dist/change-detection/index.js.map +1 -0
- package/dist/change-detection/types.d.ts +39 -0
- package/dist/change-detection/types.d.ts.map +1 -0
- package/dist/change-detection/types.js +5 -0
- package/dist/change-detection/types.js.map +1 -0
- package/dist/cli/discover.d.ts +52 -0
- package/dist/cli/discover.d.ts.map +1 -0
- package/dist/cli/discover.js +125 -0
- package/dist/cli/discover.js.map +1 -0
- package/dist/cli/generate.d.ts +41 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +179 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +182 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +38 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +94 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/update.d.ts +28 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +296 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/config/defaults.d.ts +38 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +89 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +66 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +158 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +235 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +80 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/discovery/filters/binary.d.ts +46 -0
- package/dist/discovery/filters/binary.d.ts.map +1 -0
- package/dist/discovery/filters/binary.js +157 -0
- package/dist/discovery/filters/binary.js.map +1 -0
- package/dist/discovery/filters/custom.d.ts +26 -0
- package/dist/discovery/filters/custom.d.ts.map +1 -0
- package/dist/discovery/filters/custom.js +50 -0
- package/dist/discovery/filters/custom.js.map +1 -0
- package/dist/discovery/filters/gitignore.d.ts +24 -0
- package/dist/discovery/filters/gitignore.d.ts.map +1 -0
- package/dist/discovery/filters/gitignore.js +53 -0
- package/dist/discovery/filters/gitignore.js.map +1 -0
- package/dist/discovery/filters/index.d.ts +85 -0
- package/dist/discovery/filters/index.d.ts.map +1 -0
- package/dist/discovery/filters/index.js +98 -0
- package/dist/discovery/filters/index.js.map +1 -0
- package/dist/discovery/filters/vendor.d.ts +30 -0
- package/dist/discovery/filters/vendor.d.ts.map +1 -0
- package/dist/discovery/filters/vendor.js +57 -0
- package/dist/discovery/filters/vendor.js.map +1 -0
- package/dist/discovery/types.d.ts +66 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +8 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/discovery/walker.d.ts +24 -0
- package/dist/discovery/walker.d.ts.map +1 -0
- package/dist/discovery/walker.js +35 -0
- package/dist/discovery/walker.js.map +1 -0
- package/dist/generation/budget/chunker.d.ts +38 -0
- package/dist/generation/budget/chunker.d.ts.map +1 -0
- package/dist/generation/budget/chunker.js +73 -0
- package/dist/generation/budget/chunker.js.map +1 -0
- package/dist/generation/budget/counter.d.ts +26 -0
- package/dist/generation/budget/counter.d.ts.map +1 -0
- package/dist/generation/budget/counter.js +45 -0
- package/dist/generation/budget/counter.js.map +1 -0
- package/dist/generation/budget/index.d.ts +4 -0
- package/dist/generation/budget/index.d.ts.map +1 -0
- package/dist/generation/budget/index.js +4 -0
- package/dist/generation/budget/index.js.map +1 -0
- package/dist/generation/budget/tracker.d.ts +63 -0
- package/dist/generation/budget/tracker.d.ts.map +1 -0
- package/dist/generation/budget/tracker.js +96 -0
- package/dist/generation/budget/tracker.js.map +1 -0
- package/dist/generation/complexity.d.ts +43 -0
- package/dist/generation/complexity.d.ts.map +1 -0
- package/dist/generation/complexity.js +156 -0
- package/dist/generation/complexity.js.map +1 -0
- package/dist/generation/detection/detector.d.ts +23 -0
- package/dist/generation/detection/detector.d.ts.map +1 -0
- package/dist/generation/detection/detector.js +62 -0
- package/dist/generation/detection/detector.js.map +1 -0
- package/dist/generation/detection/patterns.d.ts +21 -0
- package/dist/generation/detection/patterns.d.ts.map +1 -0
- package/dist/generation/detection/patterns.js +115 -0
- package/dist/generation/detection/patterns.js.map +1 -0
- package/dist/generation/executor.d.ts +95 -0
- package/dist/generation/executor.d.ts.map +1 -0
- package/dist/generation/executor.js +352 -0
- package/dist/generation/executor.js.map +1 -0
- package/dist/generation/orchestrator.d.ts +126 -0
- package/dist/generation/orchestrator.d.ts.map +1 -0
- package/dist/generation/orchestrator.js +222 -0
- package/dist/generation/orchestrator.js.map +1 -0
- package/dist/generation/prompts/builder.d.ts +31 -0
- package/dist/generation/prompts/builder.d.ts.map +1 -0
- package/dist/generation/prompts/builder.js +136 -0
- package/dist/generation/prompts/builder.js.map +1 -0
- package/dist/generation/prompts/index.d.ts +5 -0
- package/dist/generation/prompts/index.d.ts.map +1 -0
- package/dist/generation/prompts/index.js +4 -0
- package/dist/generation/prompts/index.js.map +1 -0
- package/dist/generation/prompts/templates.d.ts +11 -0
- package/dist/generation/prompts/templates.d.ts.map +1 -0
- package/dist/generation/prompts/templates.js +247 -0
- package/dist/generation/prompts/templates.js.map +1 -0
- package/dist/generation/prompts/types.d.ts +71 -0
- package/dist/generation/prompts/types.d.ts.map +1 -0
- package/dist/generation/prompts/types.js +23 -0
- package/dist/generation/prompts/types.js.map +1 -0
- package/dist/generation/types.d.ts +72 -0
- package/dist/generation/types.d.ts.map +1 -0
- package/dist/generation/types.js +5 -0
- package/dist/generation/types.js.map +1 -0
- package/dist/generation/writers/agents-md.d.ts +63 -0
- package/dist/generation/writers/agents-md.d.ts.map +1 -0
- package/dist/generation/writers/agents-md.js +235 -0
- package/dist/generation/writers/agents-md.js.map +1 -0
- package/dist/generation/writers/claude-md.d.ts +13 -0
- package/dist/generation/writers/claude-md.d.ts.map +1 -0
- package/dist/generation/writers/claude-md.js +33 -0
- package/dist/generation/writers/claude-md.js.map +1 -0
- package/dist/generation/writers/index.d.ts +5 -0
- package/dist/generation/writers/index.d.ts.map +1 -0
- package/dist/generation/writers/index.js +5 -0
- package/dist/generation/writers/index.js.map +1 -0
- package/dist/generation/writers/sum.d.ts +37 -0
- package/dist/generation/writers/sum.d.ts.map +1 -0
- package/dist/generation/writers/sum.js +98 -0
- package/dist/generation/writers/sum.js.map +1 -0
- package/dist/generation/writers/supplementary.d.ts +53 -0
- package/dist/generation/writers/supplementary.d.ts.map +1 -0
- package/dist/generation/writers/supplementary.js +195 -0
- package/dist/generation/writers/supplementary.js.map +1 -0
- package/dist/integration/detect.d.ts +28 -0
- package/dist/integration/detect.d.ts.map +1 -0
- package/dist/integration/detect.js +64 -0
- package/dist/integration/detect.js.map +1 -0
- package/dist/integration/generate.d.ts +36 -0
- package/dist/integration/generate.d.ts.map +1 -0
- package/dist/integration/generate.js +107 -0
- package/dist/integration/generate.js.map +1 -0
- package/dist/integration/templates.d.ts +42 -0
- package/dist/integration/templates.d.ts.map +1 -0
- package/dist/integration/templates.js +203 -0
- package/dist/integration/templates.js.map +1 -0
- package/dist/integration/types.d.ts +44 -0
- package/dist/integration/types.d.ts.map +1 -0
- package/dist/integration/types.js +8 -0
- package/dist/integration/types.js.map +1 -0
- package/dist/output/logger.d.ts +86 -0
- package/dist/output/logger.d.ts.map +1 -0
- package/dist/output/logger.js +107 -0
- package/dist/output/logger.js.map +1 -0
- package/dist/state/database.d.ts +9 -0
- package/dist/state/database.d.ts.map +1 -0
- package/dist/state/database.js +66 -0
- package/dist/state/database.js.map +1 -0
- package/dist/state/index.d.ts +8 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +7 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/migrations.d.ts +12 -0
- package/dist/state/migrations.d.ts.map +1 -0
- package/dist/state/migrations.js +39 -0
- package/dist/state/migrations.js.map +1 -0
- package/dist/state/types.d.ts +54 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/state/types.js +2 -0
- package/dist/state/types.js.map +1 -0
- package/dist/types/index.d.ts +39 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/update/index.d.ts +10 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +9 -0
- package/dist/update/index.js.map +1 -0
- package/dist/update/orchestrator.d.ts +91 -0
- package/dist/update/orchestrator.d.ts.map +1 -0
- package/dist/update/orchestrator.js +204 -0
- package/dist/update/orchestrator.js.map +1 -0
- package/dist/update/orphan-cleaner.d.ts +30 -0
- package/dist/update/orphan-cleaner.d.ts.map +1 -0
- package/dist/update/orphan-cleaner.js +151 -0
- package/dist/update/orphan-cleaner.js.map +1 -0
- package/dist/update/types.d.ts +59 -0
- package/dist/update/types.d.ts.map +1 -0
- package/dist/update/types.js +2 -0
- package/dist/update/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI update command
|
|
3
|
+
*
|
|
4
|
+
* Updates documentation incrementally based on git changes since last run.
|
|
5
|
+
* Integrates with generation module to analyze changed files and update .sum files.
|
|
6
|
+
* Regenerates AGENTS.md for affected directories.
|
|
7
|
+
*/
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { readFile } from 'node:fs/promises';
|
|
10
|
+
import pc from 'picocolors';
|
|
11
|
+
import { loadConfig } from '../config/loader.js';
|
|
12
|
+
import { createLogger } from '../output/logger.js';
|
|
13
|
+
import { createUpdateOrchestrator, } from '../update/index.js';
|
|
14
|
+
import { detectFileType } from '../generation/detection/detector.js';
|
|
15
|
+
import { countTokens } from '../generation/budget/index.js';
|
|
16
|
+
import { buildPrompt } from '../generation/prompts/index.js';
|
|
17
|
+
import { writeSumFile } from '../generation/writers/sum.js';
|
|
18
|
+
import { writeAgentsMd } from '../generation/writers/agents-md.js';
|
|
19
|
+
import { computeContentHash } from '../change-detection/index.js';
|
|
20
|
+
/**
|
|
21
|
+
* Format cleanup results for display.
|
|
22
|
+
*/
|
|
23
|
+
function formatCleanup(plan) {
|
|
24
|
+
const lines = [];
|
|
25
|
+
if (plan.cleanup.deletedSumFiles.length > 0) {
|
|
26
|
+
lines.push(pc.yellow('Cleanup (deleted .sum files):'));
|
|
27
|
+
for (const file of plan.cleanup.deletedSumFiles) {
|
|
28
|
+
lines.push(` ${pc.red('-')} ${file}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (plan.cleanup.deletedAgentsMd.length > 0) {
|
|
32
|
+
lines.push(pc.yellow('Cleanup (deleted AGENTS.md from empty dirs):'));
|
|
33
|
+
for (const file of plan.cleanup.deletedAgentsMd) {
|
|
34
|
+
lines.push(` ${pc.red('-')} ${file}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return lines;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Format the update plan for display.
|
|
41
|
+
*/
|
|
42
|
+
function formatPlan(plan, verbose) {
|
|
43
|
+
const lines = [];
|
|
44
|
+
// Header
|
|
45
|
+
lines.push('');
|
|
46
|
+
lines.push(pc.bold('=== Update Plan ==='));
|
|
47
|
+
lines.push('');
|
|
48
|
+
// Baseline info
|
|
49
|
+
if (plan.isFirstRun) {
|
|
50
|
+
lines.push(pc.yellow('First run detected. Use "are generate" for initial documentation.'));
|
|
51
|
+
lines.push('');
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
lines.push(`Base commit: ${pc.dim(plan.baseCommit.slice(0, 7))}`);
|
|
55
|
+
lines.push(`Current commit: ${pc.dim(plan.currentCommit.slice(0, 7))}`);
|
|
56
|
+
lines.push('');
|
|
57
|
+
}
|
|
58
|
+
// Summary
|
|
59
|
+
const analyzeCount = plan.filesToAnalyze.length;
|
|
60
|
+
const skipCount = plan.filesToSkip.length;
|
|
61
|
+
const cleanupCount = plan.cleanup.deletedSumFiles.length + plan.cleanup.deletedAgentsMd.length;
|
|
62
|
+
if (analyzeCount === 0 && skipCount === 0 && cleanupCount === 0) {
|
|
63
|
+
lines.push(pc.green('No changes detected since last run.'));
|
|
64
|
+
lines.push('');
|
|
65
|
+
return lines.join('\n');
|
|
66
|
+
}
|
|
67
|
+
lines.push(`Files to analyze: ${pc.cyan(String(analyzeCount))}`);
|
|
68
|
+
lines.push(`Files unchanged: ${pc.dim(String(skipCount))}`);
|
|
69
|
+
if (cleanupCount > 0) {
|
|
70
|
+
lines.push(`Cleanup actions: ${pc.yellow(String(cleanupCount))}`);
|
|
71
|
+
}
|
|
72
|
+
lines.push('');
|
|
73
|
+
// File list with status markers
|
|
74
|
+
if (plan.filesToAnalyze.length > 0) {
|
|
75
|
+
lines.push(pc.cyan('Files to analyze:'));
|
|
76
|
+
for (const file of plan.filesToAnalyze) {
|
|
77
|
+
const status = file.status === 'added' ? pc.green('+') :
|
|
78
|
+
file.status === 'renamed' ? pc.blue('R') :
|
|
79
|
+
pc.yellow('M');
|
|
80
|
+
lines.push(` ${status} ${file.path}`);
|
|
81
|
+
if (file.status === 'renamed' && file.oldPath) {
|
|
82
|
+
lines.push(` ${pc.dim(`(was: ${file.oldPath})`)}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
lines.push('');
|
|
86
|
+
}
|
|
87
|
+
// Show skipped files in verbose mode
|
|
88
|
+
if (verbose && plan.filesToSkip.length > 0) {
|
|
89
|
+
lines.push(pc.dim('Files unchanged (skipped):'));
|
|
90
|
+
for (const file of plan.filesToSkip) {
|
|
91
|
+
lines.push(` ${pc.dim('=')} ${pc.dim(file)}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push('');
|
|
94
|
+
}
|
|
95
|
+
// Cleanup
|
|
96
|
+
lines.push(...formatCleanup(plan));
|
|
97
|
+
// Affected directories
|
|
98
|
+
if (plan.affectedDirs.length > 0 && verbose) {
|
|
99
|
+
lines.push('');
|
|
100
|
+
lines.push(pc.cyan('Directories for AGENTS.md regeneration:'));
|
|
101
|
+
for (const dir of plan.affectedDirs) {
|
|
102
|
+
lines.push(` ${dir}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
lines.push('');
|
|
106
|
+
return lines.join('\n');
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Analyze a single changed file and generate its .sum file.
|
|
110
|
+
*
|
|
111
|
+
* Uses the generation module's prompt builder and sum writer.
|
|
112
|
+
* Note: This generates a placeholder summary since the actual LLM analysis
|
|
113
|
+
* requires host integration. The prompt is generated for potential future use.
|
|
114
|
+
*/
|
|
115
|
+
async function analyzeFile(projectRoot, change, verbose) {
|
|
116
|
+
const filePath = path.join(projectRoot, change.path);
|
|
117
|
+
try {
|
|
118
|
+
// Read file content
|
|
119
|
+
const content = await readFile(filePath, 'utf-8');
|
|
120
|
+
const tokens = countTokens(content);
|
|
121
|
+
// Detect file type and build prompt
|
|
122
|
+
const fileType = detectFileType(filePath, content);
|
|
123
|
+
const prompt = buildPrompt({
|
|
124
|
+
filePath: change.path,
|
|
125
|
+
content,
|
|
126
|
+
fileType,
|
|
127
|
+
});
|
|
128
|
+
// Generate summary content
|
|
129
|
+
// In a full implementation, this would call an LLM with the prompt.
|
|
130
|
+
// For now, we create a structured summary placeholder that captures
|
|
131
|
+
// the file's purpose and key elements.
|
|
132
|
+
const sumContent = {
|
|
133
|
+
summary: `## Purpose\n\nFile at \`${change.path}\`.\n\n## Analysis Pending\n\nThis summary was generated during incremental update. Full analysis requires LLM integration.`,
|
|
134
|
+
metadata: {
|
|
135
|
+
purpose: `File at ${change.path}`,
|
|
136
|
+
publicInterface: [],
|
|
137
|
+
dependencies: [],
|
|
138
|
+
patterns: [],
|
|
139
|
+
},
|
|
140
|
+
fileType,
|
|
141
|
+
generatedAt: new Date().toISOString(),
|
|
142
|
+
};
|
|
143
|
+
// Write .sum file
|
|
144
|
+
await writeSumFile(filePath, sumContent);
|
|
145
|
+
if (verbose) {
|
|
146
|
+
console.log(` ${pc.green('\u2713')} ${change.path} (${tokens} tokens)`);
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
path: change.path,
|
|
150
|
+
success: true,
|
|
151
|
+
tokensUsed: tokens,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
156
|
+
if (verbose) {
|
|
157
|
+
console.log(` ${pc.red('\u2717')} ${change.path}: ${errorMsg}`);
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
path: change.path,
|
|
161
|
+
success: false,
|
|
162
|
+
tokensUsed: 0,
|
|
163
|
+
error: errorMsg,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Regenerate AGENTS.md for affected directories.
|
|
169
|
+
*
|
|
170
|
+
* Reads existing .sum files in each directory and creates/updates AGENTS.md.
|
|
171
|
+
*/
|
|
172
|
+
async function regenerateAgentsMd(projectRoot, directories, verbose) {
|
|
173
|
+
for (const dir of directories) {
|
|
174
|
+
const dirPath = dir === '.' ? projectRoot : path.join(projectRoot, dir);
|
|
175
|
+
try {
|
|
176
|
+
await writeAgentsMd(dirPath, projectRoot);
|
|
177
|
+
if (verbose) {
|
|
178
|
+
console.log(` ${pc.green('\u2713')} AGENTS.md: ${dir || '.'}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
183
|
+
if (verbose) {
|
|
184
|
+
console.log(` ${pc.yellow('!')} AGENTS.md: ${dir || '.'}: ${errorMsg}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Update command - incrementally updates documentation based on git changes.
|
|
191
|
+
*
|
|
192
|
+
* This command:
|
|
193
|
+
* 1. Checks git repository status
|
|
194
|
+
* 2. Detects files changed since last run
|
|
195
|
+
* 3. Cleans up orphaned .sum files
|
|
196
|
+
* 4. Analyzes changed files and generates .sum files
|
|
197
|
+
* 5. Regenerates AGENTS.md for affected directories
|
|
198
|
+
* 6. Records update state for next run
|
|
199
|
+
*/
|
|
200
|
+
export async function updateCommand(targetPath, options) {
|
|
201
|
+
const absolutePath = path.resolve(targetPath);
|
|
202
|
+
const verbose = options.verbose ?? false;
|
|
203
|
+
const quiet = options.quiet ?? false;
|
|
204
|
+
const logger = createLogger({
|
|
205
|
+
colors: true,
|
|
206
|
+
verbose,
|
|
207
|
+
quiet,
|
|
208
|
+
showExcluded: false,
|
|
209
|
+
});
|
|
210
|
+
logger.info(`Checking for updates in: ${absolutePath}`);
|
|
211
|
+
// Load configuration
|
|
212
|
+
const config = await loadConfig(absolutePath);
|
|
213
|
+
// Override budget if specified
|
|
214
|
+
if (options.budget) {
|
|
215
|
+
config.generation.tokenBudget = options.budget;
|
|
216
|
+
}
|
|
217
|
+
// Create orchestrator
|
|
218
|
+
const orchestrator = createUpdateOrchestrator(config, absolutePath);
|
|
219
|
+
try {
|
|
220
|
+
// Prepare update plan
|
|
221
|
+
const plan = await orchestrator.preparePlan({
|
|
222
|
+
includeUncommitted: options.uncommitted,
|
|
223
|
+
dryRun: options.dryRun,
|
|
224
|
+
});
|
|
225
|
+
// Display plan
|
|
226
|
+
if (!quiet) {
|
|
227
|
+
console.log(formatPlan(plan, verbose));
|
|
228
|
+
}
|
|
229
|
+
// Handle first run
|
|
230
|
+
if (plan.isFirstRun) {
|
|
231
|
+
console.log(pc.yellow('Hint: Run "are generate" first to create initial documentation.'));
|
|
232
|
+
console.log(pc.yellow('Then run "are update" after making changes.'));
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
// Handle no changes
|
|
236
|
+
if (plan.filesToAnalyze.length === 0 &&
|
|
237
|
+
plan.cleanup.deletedSumFiles.length === 0 &&
|
|
238
|
+
plan.cleanup.deletedAgentsMd.length === 0) {
|
|
239
|
+
const lastRun = await orchestrator.getLastRun();
|
|
240
|
+
if (lastRun) {
|
|
241
|
+
console.log(pc.dim(`Last run: ${lastRun.completed_at}`));
|
|
242
|
+
console.log(pc.dim(`Commit: ${lastRun.commit_hash.slice(0, 7)}`));
|
|
243
|
+
}
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (options.dryRun) {
|
|
247
|
+
logger.info('Dry run complete. No files written.');
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
// === Execute the update workflow ===
|
|
251
|
+
let totalTokens = 0;
|
|
252
|
+
let filesAnalyzed = 0;
|
|
253
|
+
let filesFailed = 0;
|
|
254
|
+
// Step 1: Analyze changed files and generate .sum files
|
|
255
|
+
if (plan.filesToAnalyze.length > 0) {
|
|
256
|
+
console.log('');
|
|
257
|
+
console.log(pc.bold('=== Analyzing Changed Files ==='));
|
|
258
|
+
for (const change of plan.filesToAnalyze) {
|
|
259
|
+
const result = await analyzeFile(absolutePath, change, verbose);
|
|
260
|
+
if (result.success) {
|
|
261
|
+
filesAnalyzed++;
|
|
262
|
+
totalTokens += result.tokensUsed;
|
|
263
|
+
// Update state for this file
|
|
264
|
+
const contentHash = await computeContentHash(path.join(absolutePath, change.path));
|
|
265
|
+
await orchestrator.recordFileAnalyzed(change.path, contentHash, plan.currentCommit);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
filesFailed++;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Step 2: Regenerate AGENTS.md for affected directories
|
|
273
|
+
if (plan.affectedDirs.length > 0) {
|
|
274
|
+
console.log('');
|
|
275
|
+
console.log(pc.bold('=== Regenerating AGENTS.md ==='));
|
|
276
|
+
await regenerateAgentsMd(absolutePath, plan.affectedDirs, verbose);
|
|
277
|
+
}
|
|
278
|
+
// Step 3: Record completed run
|
|
279
|
+
const filesSkipped = plan.filesToSkip.length;
|
|
280
|
+
await orchestrator.recordRun(plan.currentCommit, filesAnalyzed, filesSkipped);
|
|
281
|
+
// Summary
|
|
282
|
+
console.log('');
|
|
283
|
+
console.log(pc.bold('=== Update Complete ==='));
|
|
284
|
+
console.log(` Files analyzed: ${pc.green(String(filesAnalyzed))}`);
|
|
285
|
+
if (filesFailed > 0) {
|
|
286
|
+
console.log(` Files failed: ${pc.red(String(filesFailed))}`);
|
|
287
|
+
}
|
|
288
|
+
console.log(` Files skipped: ${pc.dim(String(filesSkipped))}`);
|
|
289
|
+
console.log(` Directories updated: ${pc.cyan(String(plan.affectedDirs.length))}`);
|
|
290
|
+
console.log(` Token budget used: ${pc.yellow(totalTokens.toLocaleString())} / ${config.generation.tokenBudget.toLocaleString()}`);
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
orchestrator.close();
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,wBAAwB,GAEzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAuB,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAmB,MAAM,8BAA8B,CAAC;AA4BnF;;GAEG;AACH,SAAS,aAAa,CAAC,IAAgB;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACvD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACtE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,IAAgB,EAAE,OAAgB;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,gBAAgB;IAChB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAAC,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,UAAU;IACV,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;IAE/F,IAAI,YAAY,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,gCAAgC;IAChC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC1C,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC9C,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,qCAAqC;IACrC,IAAI,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnC,uBAAuB;IACvB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAC/D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,WAAW,CACxB,WAAmB,EACnB,MAAkB,EAClB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,oBAAoB;QACpB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpC,oCAAoC;QACpC,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,WAAW,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,IAAI;YACrB,OAAO;YACP,QAAQ;SACT,CAAC,CAAC;QAEH,2BAA2B;QAC3B,oEAAoE;QACpE,oEAAoE;QACpE,uCAAuC;QACvC,MAAM,UAAU,GAAmB;YACjC,OAAO,EAAE,2BAA2B,MAAM,CAAC,IAAI,6HAA6H;YAC5K,QAAQ,EAAE;gBACR,OAAO,EAAE,WAAW,MAAM,CAAC,IAAI,EAAE;gBACjC,eAAe,EAAE,EAAE;gBACnB,YAAY,EAAE,EAAE;gBAChB,QAAQ,EAAE,EAAE;aACb;YACD,QAAQ;YACR,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,kBAAkB;QAClB,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEzC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,UAAU,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,MAAM;SACnB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,QAAQ;SAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAC/B,WAAmB,EACnB,WAAqB,EACrB,OAAgB;IAEhB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC1C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxE,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,OAA6B;IAE7B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,MAAM,EAAE,IAAI;QACZ,OAAO;QACP,KAAK;QACL,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;IAExD,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;IAE9C,+BAA+B;IAC/B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,wBAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC;YAC1C,kBAAkB,EAAE,OAAO,CAAC,WAAW;YACvC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,eAAe;QACf,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iEAAiE,CAAC,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAChD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,sCAAsC;QAEtC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,wDAAwD;QACxD,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAExD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAEhE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,aAAa,EAAE,CAAC;oBAChB,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC;oBAEjC,6BAA6B;oBAC7B,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAC1C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CACrC,CAAC;oBACF,MAAM,YAAY,CAAC,kBAAkB,CACnC,MAAM,CAAC,IAAI,EACX,WAAW,EACX,IAAI,CAAC,aAAa,CACnB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,WAAW,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACvD,MAAM,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC;QAED,+BAA+B;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC7C,MAAM,YAAY,CAAC,SAAS,CAC1B,IAAI,CAAC,aAAa,EAClB,aAAa,EACb,YAAY,CACb,CAAC;QAEF,UAAU;QACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAErI,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default configuration values for agents-reverse
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Default vendor directories to exclude from analysis.
|
|
6
|
+
* These are typically package managers, build outputs, or version control directories.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_VENDOR_DIRS: readonly ["node_modules", "vendor", ".git", "dist", "build", "__pycache__", ".next", "venv", ".venv", "target", ".cargo", ".gradle", ".planning", ".claude", ".opencode"];
|
|
9
|
+
/**
|
|
10
|
+
* Default binary file extensions to exclude from analysis.
|
|
11
|
+
* These files cannot be meaningfully analyzed as text.
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_BINARY_EXTENSIONS: readonly [".png", ".jpg", ".jpeg", ".gif", ".bmp", ".ico", ".webp", ".zip", ".tar", ".gz", ".rar", ".7z", ".exe", ".dll", ".so", ".dylib", ".mp3", ".mp4", ".wav", ".pdf", ".woff", ".woff2", ".ttf", ".eot", ".class", ".pyc"];
|
|
14
|
+
/**
|
|
15
|
+
* Default maximum file size in bytes (1MB).
|
|
16
|
+
* Files larger than this will be skipped with a warning.
|
|
17
|
+
*/
|
|
18
|
+
export declare const DEFAULT_MAX_FILE_SIZE: number;
|
|
19
|
+
/**
|
|
20
|
+
* Default configuration object matching the schema structure.
|
|
21
|
+
* This is used when no config file is present or for missing fields.
|
|
22
|
+
*/
|
|
23
|
+
export declare const DEFAULT_CONFIG: {
|
|
24
|
+
readonly exclude: {
|
|
25
|
+
readonly patterns: string[];
|
|
26
|
+
readonly vendorDirs: readonly ["node_modules", "vendor", ".git", "dist", "build", "__pycache__", ".next", "venv", ".venv", "target", ".cargo", ".gradle", ".planning", ".claude", ".opencode"];
|
|
27
|
+
readonly binaryExtensions: readonly [".png", ".jpg", ".jpeg", ".gif", ".bmp", ".ico", ".webp", ".zip", ".tar", ".gz", ".rar", ".7z", ".exe", ".dll", ".so", ".dylib", ".mp3", ".mp4", ".wav", ".pdf", ".woff", ".woff2", ".ttf", ".eot", ".class", ".pyc"];
|
|
28
|
+
};
|
|
29
|
+
readonly options: {
|
|
30
|
+
readonly followSymlinks: false;
|
|
31
|
+
readonly maxFileSize: number;
|
|
32
|
+
};
|
|
33
|
+
readonly output: {
|
|
34
|
+
readonly colors: true;
|
|
35
|
+
readonly verbose: true;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,2KAiBtB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,yBAAyB,iOAkC5B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,cAAc;;2BAEP,MAAM,EAAE;;;;;;;;;;;;CAYlB,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default configuration values for agents-reverse
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Default vendor directories to exclude from analysis.
|
|
6
|
+
* These are typically package managers, build outputs, or version control directories.
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_VENDOR_DIRS = [
|
|
9
|
+
'node_modules',
|
|
10
|
+
'vendor',
|
|
11
|
+
'.git',
|
|
12
|
+
'dist',
|
|
13
|
+
'build',
|
|
14
|
+
'__pycache__',
|
|
15
|
+
'.next',
|
|
16
|
+
'venv',
|
|
17
|
+
'.venv',
|
|
18
|
+
'target',
|
|
19
|
+
'.cargo',
|
|
20
|
+
'.gradle',
|
|
21
|
+
// AI assistant tooling directories
|
|
22
|
+
'.planning',
|
|
23
|
+
'.claude',
|
|
24
|
+
'.opencode',
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Default binary file extensions to exclude from analysis.
|
|
28
|
+
* These files cannot be meaningfully analyzed as text.
|
|
29
|
+
*/
|
|
30
|
+
export const DEFAULT_BINARY_EXTENSIONS = [
|
|
31
|
+
// Images
|
|
32
|
+
'.png',
|
|
33
|
+
'.jpg',
|
|
34
|
+
'.jpeg',
|
|
35
|
+
'.gif',
|
|
36
|
+
'.bmp',
|
|
37
|
+
'.ico',
|
|
38
|
+
'.webp',
|
|
39
|
+
// Archives
|
|
40
|
+
'.zip',
|
|
41
|
+
'.tar',
|
|
42
|
+
'.gz',
|
|
43
|
+
'.rar',
|
|
44
|
+
'.7z',
|
|
45
|
+
// Executables
|
|
46
|
+
'.exe',
|
|
47
|
+
'.dll',
|
|
48
|
+
'.so',
|
|
49
|
+
'.dylib',
|
|
50
|
+
// Media
|
|
51
|
+
'.mp3',
|
|
52
|
+
'.mp4',
|
|
53
|
+
'.wav',
|
|
54
|
+
// Documents
|
|
55
|
+
'.pdf',
|
|
56
|
+
// Fonts
|
|
57
|
+
'.woff',
|
|
58
|
+
'.woff2',
|
|
59
|
+
'.ttf',
|
|
60
|
+
'.eot',
|
|
61
|
+
// Compiled
|
|
62
|
+
'.class',
|
|
63
|
+
'.pyc',
|
|
64
|
+
];
|
|
65
|
+
/**
|
|
66
|
+
* Default maximum file size in bytes (1MB).
|
|
67
|
+
* Files larger than this will be skipped with a warning.
|
|
68
|
+
*/
|
|
69
|
+
export const DEFAULT_MAX_FILE_SIZE = 1024 * 1024;
|
|
70
|
+
/**
|
|
71
|
+
* Default configuration object matching the schema structure.
|
|
72
|
+
* This is used when no config file is present or for missing fields.
|
|
73
|
+
*/
|
|
74
|
+
export const DEFAULT_CONFIG = {
|
|
75
|
+
exclude: {
|
|
76
|
+
patterns: [],
|
|
77
|
+
vendorDirs: [...DEFAULT_VENDOR_DIRS],
|
|
78
|
+
binaryExtensions: [...DEFAULT_BINARY_EXTENSIONS],
|
|
79
|
+
},
|
|
80
|
+
options: {
|
|
81
|
+
followSymlinks: false,
|
|
82
|
+
maxFileSize: DEFAULT_MAX_FILE_SIZE,
|
|
83
|
+
},
|
|
84
|
+
output: {
|
|
85
|
+
colors: true,
|
|
86
|
+
verbose: true,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,cAAc;IACd,QAAQ;IACR,MAAM;IACN,MAAM;IACN,OAAO;IACP,aAAa;IACb,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,mCAAmC;IACnC,WAAW;IACX,SAAS;IACT,WAAW;CACH,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,WAAW;IACX,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,cAAc;IACd,MAAM;IACN,MAAM;IACN,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,YAAY;IACZ,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,WAAW;IACX,QAAQ;IACR,MAAM;CACE,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE;QACP,QAAQ,EAAE,EAAc;QACxB,UAAU,EAAE,CAAC,GAAG,mBAAmB,CAAC;QACpC,gBAAgB,EAAE,CAAC,GAAG,yBAAyB,CAAC;KACjD;IACD,OAAO,EAAE;QACP,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,qBAAqB;KACnC;IACD,MAAM,EAAE;QACN,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;KACd;CACO,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for agents-reverse
|
|
3
|
+
*
|
|
4
|
+
* Loads and validates configuration from `.agents-reverse/config.yaml`.
|
|
5
|
+
* Returns sensible defaults when no config file exists.
|
|
6
|
+
*/
|
|
7
|
+
import { Config } from './schema.js';
|
|
8
|
+
/** Directory name for agents-reverse-engineer configuration */
|
|
9
|
+
export declare const CONFIG_DIR = ".agents-reverse-engineer";
|
|
10
|
+
/** Configuration file name */
|
|
11
|
+
export declare const CONFIG_FILE = "config.yaml";
|
|
12
|
+
/**
|
|
13
|
+
* Error thrown when configuration parsing or validation fails
|
|
14
|
+
*/
|
|
15
|
+
export declare class ConfigError extends Error {
|
|
16
|
+
readonly filePath: string;
|
|
17
|
+
readonly cause?: Error | undefined;
|
|
18
|
+
constructor(message: string, filePath: string, cause?: Error | undefined);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Load configuration from `.agents-reverse/config.yaml`.
|
|
22
|
+
*
|
|
23
|
+
* If the file doesn't exist, returns default configuration.
|
|
24
|
+
* If the file exists but is invalid, throws a ConfigError with details.
|
|
25
|
+
*
|
|
26
|
+
* @param root - Root directory containing `.agents-reverse/` folder
|
|
27
|
+
* @returns Validated configuration object with all defaults applied
|
|
28
|
+
* @throws ConfigError if the config file exists but is invalid
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const config = await loadConfig('/path/to/project');
|
|
33
|
+
* console.log(config.exclude.vendorDirs);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function loadConfig(root: string): Promise<Config>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a configuration file exists.
|
|
39
|
+
*
|
|
40
|
+
* @param root - Root directory to check
|
|
41
|
+
* @returns true if `.agents-reverse/config.yaml` exists
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* if (!await configExists('.')) {
|
|
46
|
+
* console.log('Run `are init` to create configuration');
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function configExists(root: string): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Write a default configuration file with helpful comments.
|
|
53
|
+
*
|
|
54
|
+
* Creates the `.agents-reverse/` directory if it doesn't exist.
|
|
55
|
+
* The generated file includes comments explaining each option.
|
|
56
|
+
*
|
|
57
|
+
* @param root - Root directory where `.agents-reverse/` will be created
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* await writeDefaultConfig('/path/to/project');
|
|
62
|
+
* // Creates /path/to/project/.agents-reverse/config.yaml
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function writeDefaultConfig(root: string): Promise<void>;
|
|
66
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAgB,MAAM,EAAE,MAAM,aAAa,CAAC;AAGnD,+DAA+D;AAC/D,eAAO,MAAM,UAAU,6BAA6B,CAAC;AAErD,8BAA8B;AAC9B,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAEzC;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;aAGlB,QAAQ,EAAE,MAAM;aAChB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwC9D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CpE"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for agents-reverse
|
|
3
|
+
*
|
|
4
|
+
* Loads and validates configuration from `.agents-reverse/config.yaml`.
|
|
5
|
+
* Returns sensible defaults when no config file exists.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir, access } from 'node:fs/promises';
|
|
8
|
+
import { constants } from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { parse } from 'yaml';
|
|
11
|
+
import { ZodError } from 'zod';
|
|
12
|
+
import { ConfigSchema } from './schema.js';
|
|
13
|
+
import { DEFAULT_VENDOR_DIRS, DEFAULT_BINARY_EXTENSIONS, DEFAULT_MAX_FILE_SIZE } from './defaults.js';
|
|
14
|
+
/** Directory name for agents-reverse-engineer configuration */
|
|
15
|
+
export const CONFIG_DIR = '.agents-reverse-engineer';
|
|
16
|
+
/** Configuration file name */
|
|
17
|
+
export const CONFIG_FILE = 'config.yaml';
|
|
18
|
+
/**
|
|
19
|
+
* Error thrown when configuration parsing or validation fails
|
|
20
|
+
*/
|
|
21
|
+
export class ConfigError extends Error {
|
|
22
|
+
filePath;
|
|
23
|
+
cause;
|
|
24
|
+
constructor(message, filePath, cause) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.filePath = filePath;
|
|
27
|
+
this.cause = cause;
|
|
28
|
+
this.name = 'ConfigError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load configuration from `.agents-reverse/config.yaml`.
|
|
33
|
+
*
|
|
34
|
+
* If the file doesn't exist, returns default configuration.
|
|
35
|
+
* If the file exists but is invalid, throws a ConfigError with details.
|
|
36
|
+
*
|
|
37
|
+
* @param root - Root directory containing `.agents-reverse/` folder
|
|
38
|
+
* @returns Validated configuration object with all defaults applied
|
|
39
|
+
* @throws ConfigError if the config file exists but is invalid
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const config = await loadConfig('/path/to/project');
|
|
44
|
+
* console.log(config.exclude.vendorDirs);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export async function loadConfig(root) {
|
|
48
|
+
const configPath = path.join(root, CONFIG_DIR, CONFIG_FILE);
|
|
49
|
+
try {
|
|
50
|
+
const content = await readFile(configPath, 'utf-8');
|
|
51
|
+
const raw = parse(content);
|
|
52
|
+
try {
|
|
53
|
+
return ConfigSchema.parse(raw);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
if (err instanceof ZodError) {
|
|
57
|
+
const issues = err.issues
|
|
58
|
+
.map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`)
|
|
59
|
+
.join('\n');
|
|
60
|
+
throw new ConfigError(`Invalid configuration in ${configPath}:\n${issues}`, configPath, err);
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
// File not found - return defaults
|
|
67
|
+
if (err.code === 'ENOENT') {
|
|
68
|
+
return ConfigSchema.parse({});
|
|
69
|
+
}
|
|
70
|
+
// Re-throw ConfigError as-is
|
|
71
|
+
if (err instanceof ConfigError) {
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
// YAML parse error
|
|
75
|
+
throw new ConfigError(`Failed to parse ${configPath}: ${err.message}`, configPath, err);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if a configuration file exists.
|
|
80
|
+
*
|
|
81
|
+
* @param root - Root directory to check
|
|
82
|
+
* @returns true if `.agents-reverse/config.yaml` exists
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* if (!await configExists('.')) {
|
|
87
|
+
* console.log('Run `are init` to create configuration');
|
|
88
|
+
* }
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export async function configExists(root) {
|
|
92
|
+
const configPath = path.join(root, CONFIG_DIR, CONFIG_FILE);
|
|
93
|
+
try {
|
|
94
|
+
await access(configPath, constants.F_OK);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Write a default configuration file with helpful comments.
|
|
103
|
+
*
|
|
104
|
+
* Creates the `.agents-reverse/` directory if it doesn't exist.
|
|
105
|
+
* The generated file includes comments explaining each option.
|
|
106
|
+
*
|
|
107
|
+
* @param root - Root directory where `.agents-reverse/` will be created
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* await writeDefaultConfig('/path/to/project');
|
|
112
|
+
* // Creates /path/to/project/.agents-reverse/config.yaml
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export async function writeDefaultConfig(root) {
|
|
116
|
+
const configDir = path.join(root, CONFIG_DIR);
|
|
117
|
+
const configPath = path.join(configDir, CONFIG_FILE);
|
|
118
|
+
// Create directory if needed
|
|
119
|
+
await mkdir(configDir, { recursive: true });
|
|
120
|
+
// Generate config content with comments
|
|
121
|
+
const configContent = `# agents-reverse configuration
|
|
122
|
+
# https://github.com/GeoloeG-IsT/agents-reverse
|
|
123
|
+
|
|
124
|
+
# Exclusion rules for files and directories
|
|
125
|
+
exclude:
|
|
126
|
+
# Custom glob patterns to exclude (e.g., ["*.log", "temp/**"])
|
|
127
|
+
patterns: []
|
|
128
|
+
|
|
129
|
+
# Vendor directories to exclude from analysis
|
|
130
|
+
# These are typically package managers, build outputs, or version control
|
|
131
|
+
vendorDirs:
|
|
132
|
+
${DEFAULT_VENDOR_DIRS.map((dir) => ` - ${dir}`).join('\n')}
|
|
133
|
+
|
|
134
|
+
# Binary file extensions to exclude from analysis
|
|
135
|
+
# These files cannot be meaningfully analyzed as text
|
|
136
|
+
binaryExtensions:
|
|
137
|
+
${DEFAULT_BINARY_EXTENSIONS.map((ext) => ` - ${ext}`).join('\n')}
|
|
138
|
+
|
|
139
|
+
# Discovery options
|
|
140
|
+
options:
|
|
141
|
+
# Whether to follow symbolic links during traversal
|
|
142
|
+
followSymlinks: false
|
|
143
|
+
|
|
144
|
+
# Maximum file size in bytes (files larger than this are skipped)
|
|
145
|
+
# Default: ${DEFAULT_MAX_FILE_SIZE} (1MB)
|
|
146
|
+
maxFileSize: ${DEFAULT_MAX_FILE_SIZE}
|
|
147
|
+
|
|
148
|
+
# Output formatting options
|
|
149
|
+
output:
|
|
150
|
+
# Whether to use colors in terminal output
|
|
151
|
+
colors: true
|
|
152
|
+
|
|
153
|
+
# Whether to show verbose output (each file as processed)
|
|
154
|
+
verbose: true
|
|
155
|
+
`;
|
|
156
|
+
await writeFile(configPath, configContent, 'utf-8');
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=loader.js.map
|