ghcralph 0.1.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/LICENSE +21 -0
- package/README.md +327 -0
- package/bin/ghcralph.js +2 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +92 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +118 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/index.d.ts +11 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +11 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +116 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/rollback.d.ts +8 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +238 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/run.d.ts +28 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +407 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +399 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/action-executor.d.ts +96 -0
- package/dist/core/action-executor.d.ts.map +1 -0
- package/dist/core/action-executor.js +289 -0
- package/dist/core/action-executor.js.map +1 -0
- package/dist/core/checkpoint-manager.d.ts +94 -0
- package/dist/core/checkpoint-manager.d.ts.map +1 -0
- package/dist/core/checkpoint-manager.js +236 -0
- package/dist/core/checkpoint-manager.js.map +1 -0
- package/dist/core/config-manager.d.ts +62 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +184 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/config-schema.d.ts +74 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +84 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/context-builder.d.ts +116 -0
- package/dist/core/context-builder.d.ts.map +1 -0
- package/dist/core/context-builder.js +388 -0
- package/dist/core/context-builder.js.map +1 -0
- package/dist/core/feedback-builder.d.ts +94 -0
- package/dist/core/feedback-builder.d.ts.map +1 -0
- package/dist/core/feedback-builder.js +226 -0
- package/dist/core/feedback-builder.js.map +1 -0
- package/dist/core/file-safeguard.d.ts +109 -0
- package/dist/core/file-safeguard.d.ts.map +1 -0
- package/dist/core/file-safeguard.js +200 -0
- package/dist/core/file-safeguard.js.map +1 -0
- package/dist/core/git-branch-manager.d.ts +122 -0
- package/dist/core/git-branch-manager.d.ts.map +1 -0
- package/dist/core/git-branch-manager.js +302 -0
- package/dist/core/git-branch-manager.js.map +1 -0
- package/dist/core/github-plan.d.ts +86 -0
- package/dist/core/github-plan.d.ts.map +1 -0
- package/dist/core/github-plan.js +333 -0
- package/dist/core/github-plan.js.map +1 -0
- package/dist/core/index.d.ts +43 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +26 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/local-markdown-plan.d.ts +65 -0
- package/dist/core/local-markdown-plan.d.ts.map +1 -0
- package/dist/core/local-markdown-plan.js +154 -0
- package/dist/core/local-markdown-plan.js.map +1 -0
- package/dist/core/loop-engine.d.ts +133 -0
- package/dist/core/loop-engine.d.ts.map +1 -0
- package/dist/core/loop-engine.js +420 -0
- package/dist/core/loop-engine.js.map +1 -0
- package/dist/core/loop-events.d.ts +48 -0
- package/dist/core/loop-events.d.ts.map +1 -0
- package/dist/core/loop-events.js +24 -0
- package/dist/core/loop-events.js.map +1 -0
- package/dist/core/loop-state.d.ts +51 -0
- package/dist/core/loop-state.d.ts.map +1 -0
- package/dist/core/loop-state.js +48 -0
- package/dist/core/loop-state.js.map +1 -0
- package/dist/core/markdown-parser.d.ts +51 -0
- package/dist/core/markdown-parser.d.ts.map +1 -0
- package/dist/core/markdown-parser.js +122 -0
- package/dist/core/markdown-parser.js.map +1 -0
- package/dist/core/plan-manager.d.ts +61 -0
- package/dist/core/plan-manager.d.ts.map +1 -0
- package/dist/core/plan-manager.js +7 -0
- package/dist/core/plan-manager.js.map +1 -0
- package/dist/core/progress-tracker.d.ts +74 -0
- package/dist/core/progress-tracker.d.ts.map +1 -0
- package/dist/core/progress-tracker.js +198 -0
- package/dist/core/progress-tracker.js.map +1 -0
- package/dist/core/prompt-examples.d.ts +52 -0
- package/dist/core/prompt-examples.d.ts.map +1 -0
- package/dist/core/prompt-examples.js +194 -0
- package/dist/core/prompt-examples.js.map +1 -0
- package/dist/core/response-parser.d.ts +90 -0
- package/dist/core/response-parser.d.ts.map +1 -0
- package/dist/core/response-parser.js +209 -0
- package/dist/core/response-parser.js.map +1 -0
- package/dist/core/verification-hooks.d.ts +103 -0
- package/dist/core/verification-hooks.d.ts.map +1 -0
- package/dist/core/verification-hooks.js +268 -0
- package/dist/core/verification-hooks.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/auth.d.ts +28 -0
- package/dist/integrations/auth.d.ts.map +1 -0
- package/dist/integrations/auth.js +76 -0
- package/dist/integrations/auth.js.map +1 -0
- package/dist/integrations/copilot-agent.d.ts +104 -0
- package/dist/integrations/copilot-agent.d.ts.map +1 -0
- package/dist/integrations/copilot-agent.js +235 -0
- package/dist/integrations/copilot-agent.js.map +1 -0
- package/dist/integrations/index.d.ts +18 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +14 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/mcp-tools.d.ts +129 -0
- package/dist/integrations/mcp-tools.d.ts.map +1 -0
- package/dist/integrations/mcp-tools.js +272 -0
- package/dist/integrations/mcp-tools.js.map +1 -0
- package/dist/integrations/tokens.d.ts +45 -0
- package/dist/integrations/tokens.d.ts.map +1 -0
- package/dist/integrations/tokens.js +50 -0
- package/dist/integrations/tokens.js.map +1 -0
- package/dist/types/index.d.ts +53 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +23 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +37 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/output.d.ts +59 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +96 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/paths.d.ts +34 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +67 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/shell.d.ts +26 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +65 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/validation.d.ts +27 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +43 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Builder
|
|
3
|
+
*
|
|
4
|
+
* Builds rich context for AI agent prompts including relevant files,
|
|
5
|
+
* git history, and previous iteration results.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'node:fs/promises';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { exec } from 'node:child_process';
|
|
10
|
+
import { promisify } from 'node:util';
|
|
11
|
+
import { glob } from 'glob';
|
|
12
|
+
import { debug, warn } from '../utils/index.js';
|
|
13
|
+
import { getExamplesForModel } from './prompt-examples.js';
|
|
14
|
+
const execAsync = promisify(exec);
|
|
15
|
+
/**
|
|
16
|
+
* Default Ralph prompt template (simplified per Ralph pattern)
|
|
17
|
+
* The {output_format} placeholder is replaced with model-appropriate examples
|
|
18
|
+
*/
|
|
19
|
+
const DEFAULT_PROMPT_TEMPLATE = `You are an expert software engineer. Your task is: {task_title}
|
|
20
|
+
|
|
21
|
+
## Task Description
|
|
22
|
+
{task_content}
|
|
23
|
+
|
|
24
|
+
{state_section}
|
|
25
|
+
{context_section}
|
|
26
|
+
{previous_progress}
|
|
27
|
+
{feedback_section}
|
|
28
|
+
|
|
29
|
+
{output_format}
|
|
30
|
+
|
|
31
|
+
## Instructions
|
|
32
|
+
- Make small, focused changes
|
|
33
|
+
- Test your changes with [ACTION:EXECUTE]
|
|
34
|
+
- Use [ACTION:COMPLETE] when tests pass and task is done`;
|
|
35
|
+
/**
|
|
36
|
+
* Legacy prompt template with meta info (for backwards compatibility)
|
|
37
|
+
*/
|
|
38
|
+
const LEGACY_PROMPT_TEMPLATE = `You are an expert software engineer. Your task is: {task_title}
|
|
39
|
+
|
|
40
|
+
## Task Description
|
|
41
|
+
{task_content}
|
|
42
|
+
|
|
43
|
+
## Current State
|
|
44
|
+
- Iteration: {iteration} of {max_iterations}
|
|
45
|
+
- Tokens used: {tokens_used} of {max_tokens}
|
|
46
|
+
|
|
47
|
+
{context_section}
|
|
48
|
+
{previous_progress}
|
|
49
|
+
|
|
50
|
+
## Instructions
|
|
51
|
+
- Make small, focused changes
|
|
52
|
+
- Test your changes when possible
|
|
53
|
+
- Explain your reasoning
|
|
54
|
+
- Stop when the task is complete`;
|
|
55
|
+
/**
|
|
56
|
+
* Default context builder configuration
|
|
57
|
+
*/
|
|
58
|
+
const DEFAULT_CONFIG = {
|
|
59
|
+
maxContextTokens: 8000,
|
|
60
|
+
includeGitDiff: true,
|
|
61
|
+
includeGitHistory: true,
|
|
62
|
+
gitHistoryLimit: 5,
|
|
63
|
+
includeProjectStructure: true,
|
|
64
|
+
freshContextPerIteration: true, // Ralph pattern: rely on filesystem, not history
|
|
65
|
+
includeMetaInfo: false, // Ralph pattern: don't include iteration/token counts
|
|
66
|
+
model: 'gpt-4.1', // Default model (0x cost multiplier)
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Context builder for creating rich AI prompts
|
|
70
|
+
*/
|
|
71
|
+
export class ContextBuilder {
|
|
72
|
+
config;
|
|
73
|
+
cwd;
|
|
74
|
+
constructor(config = {}, cwd) {
|
|
75
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
76
|
+
this.cwd = cwd ?? process.cwd();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Build a complete context prompt for the current iteration
|
|
80
|
+
*/
|
|
81
|
+
async buildContext(task, iteration, maxIterations, tokensUsed, maxTokens, previousIterations = [], feedbackSection) {
|
|
82
|
+
const filesIncluded = [];
|
|
83
|
+
let truncated = false;
|
|
84
|
+
// Select template based on configuration
|
|
85
|
+
let template;
|
|
86
|
+
if (this.config.promptTemplate) {
|
|
87
|
+
template = this.config.promptTemplate;
|
|
88
|
+
}
|
|
89
|
+
else if (this.config.includeMetaInfo) {
|
|
90
|
+
template = LEGACY_PROMPT_TEMPLATE;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
template = DEFAULT_PROMPT_TEMPLATE;
|
|
94
|
+
}
|
|
95
|
+
// Build context sections
|
|
96
|
+
const contextParts = [];
|
|
97
|
+
// 1. Add explicit context files first (highest priority)
|
|
98
|
+
if (this.config.contextGlobs && this.config.contextGlobs.length > 0) {
|
|
99
|
+
const explicitContext = await this.getExplicitContextFiles();
|
|
100
|
+
if (explicitContext.content) {
|
|
101
|
+
contextParts.push('## Relevant Files\n' + explicitContext.content);
|
|
102
|
+
filesIncluded.push(...explicitContext.files);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// 2. Add task-relevant files (based on keywords)
|
|
106
|
+
const keywordFiles = await this.findRelevantFiles(task);
|
|
107
|
+
if (keywordFiles.content && !this.exceedsTokenLimit(contextParts.join('\n'), keywordFiles.content)) {
|
|
108
|
+
contextParts.push(keywordFiles.content);
|
|
109
|
+
filesIncluded.push(...keywordFiles.files);
|
|
110
|
+
}
|
|
111
|
+
// 3. Add git diff (current changes) - CRITICAL for Ralph pattern
|
|
112
|
+
// This is the primary way the AI knows what has been done
|
|
113
|
+
if (this.config.includeGitDiff) {
|
|
114
|
+
const gitDiff = await this.getGitDiff();
|
|
115
|
+
if (gitDiff && !this.exceedsTokenLimit(contextParts.join('\n'), gitDiff)) {
|
|
116
|
+
contextParts.push('## Current Changes (git diff)\n```diff\n' + gitDiff + '\n```');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// 4. Add git history
|
|
120
|
+
if (this.config.includeGitHistory) {
|
|
121
|
+
const gitHistory = await this.getGitHistory();
|
|
122
|
+
if (gitHistory && !this.exceedsTokenLimit(contextParts.join('\n'), gitHistory)) {
|
|
123
|
+
contextParts.push('## Recent Git History\n' + gitHistory);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// 5. Add project structure overview
|
|
127
|
+
if (this.config.includeProjectStructure) {
|
|
128
|
+
const structure = await this.getProjectStructure();
|
|
129
|
+
if (structure && !this.exceedsTokenLimit(contextParts.join('\n'), structure)) {
|
|
130
|
+
contextParts.push('## Project Structure\n```\n' + structure + '\n```');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Build previous progress section
|
|
134
|
+
// In fresh context mode (Ralph pattern), we skip this - rely on git diff instead
|
|
135
|
+
let previousProgress = '';
|
|
136
|
+
if (!this.config.freshContextPerIteration) {
|
|
137
|
+
previousProgress = this.buildPreviousProgress(previousIterations);
|
|
138
|
+
}
|
|
139
|
+
// Build state section (only if includeMetaInfo is true)
|
|
140
|
+
let stateSection = '';
|
|
141
|
+
if (this.config.includeMetaInfo) {
|
|
142
|
+
stateSection = `## Current State
|
|
143
|
+
- Iteration: ${iteration} of ${maxIterations}
|
|
144
|
+
- Tokens used: ${tokensUsed} of ${maxTokens}`;
|
|
145
|
+
}
|
|
146
|
+
// Build context section
|
|
147
|
+
const contextSection = contextParts.length > 0
|
|
148
|
+
? '## Context\n' + contextParts.join('\n\n')
|
|
149
|
+
: '';
|
|
150
|
+
// Get model-appropriate output format examples
|
|
151
|
+
const outputFormat = getExamplesForModel(this.config.model ?? 'gpt-4.1');
|
|
152
|
+
// Build the final prompt
|
|
153
|
+
let prompt = template
|
|
154
|
+
.replace('{task_title}', task.title)
|
|
155
|
+
.replace('{task_content}', task.content)
|
|
156
|
+
.replace('{iteration}', String(iteration))
|
|
157
|
+
.replace('{max_iterations}', String(maxIterations))
|
|
158
|
+
.replace('{tokens_used}', String(tokensUsed))
|
|
159
|
+
.replace('{max_tokens}', String(maxTokens))
|
|
160
|
+
.replace('{state_section}', stateSection)
|
|
161
|
+
.replace('{context_section}', contextSection)
|
|
162
|
+
.replace('{previous_progress}', previousProgress)
|
|
163
|
+
.replace('{feedback_section}', feedbackSection ?? '')
|
|
164
|
+
.replace('{output_format}', outputFormat);
|
|
165
|
+
// Clean up multiple consecutive newlines
|
|
166
|
+
prompt = prompt.replace(/\n{3,}/g, '\n\n').trim();
|
|
167
|
+
// Estimate token count
|
|
168
|
+
const estimatedTokens = this.estimateTokens(prompt);
|
|
169
|
+
// Check if we exceeded limits and need to truncate
|
|
170
|
+
if (estimatedTokens > this.config.maxContextTokens) {
|
|
171
|
+
truncated = true;
|
|
172
|
+
prompt = this.truncatePrompt(prompt);
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
prompt,
|
|
176
|
+
estimatedTokens: this.estimateTokens(prompt),
|
|
177
|
+
filesIncluded,
|
|
178
|
+
truncated,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get explicit context files from glob patterns
|
|
183
|
+
*/
|
|
184
|
+
async getExplicitContextFiles() {
|
|
185
|
+
if (!this.config.contextGlobs || this.config.contextGlobs.length === 0) {
|
|
186
|
+
return { content: '', files: [] };
|
|
187
|
+
}
|
|
188
|
+
const files = [];
|
|
189
|
+
const contentParts = [];
|
|
190
|
+
for (const pattern of this.config.contextGlobs) {
|
|
191
|
+
try {
|
|
192
|
+
const matches = await glob(pattern, { cwd: this.cwd, nodir: true });
|
|
193
|
+
for (const file of matches) {
|
|
194
|
+
try {
|
|
195
|
+
const fullPath = path.join(this.cwd, file);
|
|
196
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
197
|
+
// Skip very large files
|
|
198
|
+
if (content.length > 50000) {
|
|
199
|
+
debug(`Skipping large file: ${file}`);
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
files.push(file);
|
|
203
|
+
contentParts.push(`### ${file}\n\`\`\`\n${content}\n\`\`\``);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
debug(`Failed to read file: ${file}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
debug(`Failed to glob pattern: ${pattern}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
content: contentParts.join('\n\n'),
|
|
216
|
+
files,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Find relevant files based on task keywords
|
|
221
|
+
*/
|
|
222
|
+
async findRelevantFiles(task) {
|
|
223
|
+
// Extract keywords from task
|
|
224
|
+
const keywords = this.extractKeywords(task.title + ' ' + task.content);
|
|
225
|
+
if (keywords.length === 0) {
|
|
226
|
+
return { content: '', files: [] };
|
|
227
|
+
}
|
|
228
|
+
const files = [];
|
|
229
|
+
const contentParts = [];
|
|
230
|
+
// Try to find files matching keywords
|
|
231
|
+
for (const keyword of keywords.slice(0, 3)) { // Limit to top 3 keywords
|
|
232
|
+
try {
|
|
233
|
+
// Search for files containing the keyword
|
|
234
|
+
const { stdout } = await execAsync(`git grep -l "${keyword}" 2>/dev/null | head -3`, { cwd: this.cwd });
|
|
235
|
+
const matchedFiles = stdout.trim().split('\n').filter(Boolean);
|
|
236
|
+
for (const file of matchedFiles) {
|
|
237
|
+
if (files.includes(file))
|
|
238
|
+
continue;
|
|
239
|
+
try {
|
|
240
|
+
const fullPath = path.join(this.cwd, file);
|
|
241
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
242
|
+
// Skip large files
|
|
243
|
+
if (content.length > 30000)
|
|
244
|
+
continue;
|
|
245
|
+
files.push(file);
|
|
246
|
+
contentParts.push(`### ${file}\n\`\`\`\n${content.substring(0, 5000)}${content.length > 5000 ? '\n...(truncated)' : ''}\n\`\`\``);
|
|
247
|
+
// Limit total files
|
|
248
|
+
if (files.length >= 5)
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
// Skip files we can't read
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (files.length >= 5)
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// git grep not available or no matches
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (contentParts.length === 0) {
|
|
263
|
+
return { content: '', files: [] };
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
content: '## Relevant Files (keyword matches)\n' + contentParts.join('\n\n'),
|
|
267
|
+
files,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Extract keywords from text
|
|
272
|
+
*/
|
|
273
|
+
extractKeywords(text) {
|
|
274
|
+
// Remove common words and extract meaningful terms
|
|
275
|
+
const stopWords = new Set([
|
|
276
|
+
'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
|
|
277
|
+
'of', 'with', 'by', 'from', 'as', 'is', 'was', 'are', 'were', 'been',
|
|
278
|
+
'be', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
279
|
+
'should', 'may', 'might', 'must', 'shall', 'can', 'need', 'this', 'that',
|
|
280
|
+
'these', 'those', 'it', 'its', 'add', 'update', 'create', 'fix', 'implement',
|
|
281
|
+
]);
|
|
282
|
+
// Extract words
|
|
283
|
+
const words = text
|
|
284
|
+
.toLowerCase()
|
|
285
|
+
.replace(/[^\w\s]/g, ' ')
|
|
286
|
+
.split(/\s+/)
|
|
287
|
+
.filter(w => w.length > 2 && !stopWords.has(w));
|
|
288
|
+
// Return unique words, prioritizing longer ones
|
|
289
|
+
return [...new Set(words)].sort((a, b) => b.length - a.length);
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Get current git diff
|
|
293
|
+
*/
|
|
294
|
+
async getGitDiff() {
|
|
295
|
+
try {
|
|
296
|
+
const { stdout } = await execAsync('git diff --staged HEAD 2>/dev/null || git diff HEAD 2>/dev/null', {
|
|
297
|
+
cwd: this.cwd,
|
|
298
|
+
maxBuffer: 100000,
|
|
299
|
+
});
|
|
300
|
+
const diff = stdout.trim();
|
|
301
|
+
if (!diff)
|
|
302
|
+
return null;
|
|
303
|
+
// Truncate if too long
|
|
304
|
+
if (diff.length > 10000) {
|
|
305
|
+
return diff.substring(0, 10000) + '\n...(truncated)';
|
|
306
|
+
}
|
|
307
|
+
return diff;
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get recent git history
|
|
315
|
+
*/
|
|
316
|
+
async getGitHistory() {
|
|
317
|
+
try {
|
|
318
|
+
const limit = this.config.gitHistoryLimit ?? 5;
|
|
319
|
+
const { stdout } = await execAsync(`git log --oneline -n ${limit} 2>/dev/null`, { cwd: this.cwd });
|
|
320
|
+
return stdout.trim() || null;
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Get project structure overview
|
|
328
|
+
*/
|
|
329
|
+
async getProjectStructure() {
|
|
330
|
+
try {
|
|
331
|
+
// Use find to get directory structure, limited depth
|
|
332
|
+
const { stdout } = await execAsync('find . -type f -not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/dist/*" | head -50', { cwd: this.cwd });
|
|
333
|
+
return stdout.trim() || null;
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Build previous progress section
|
|
341
|
+
*/
|
|
342
|
+
buildPreviousProgress(iterations) {
|
|
343
|
+
const successful = iterations.filter(i => i.success && i.summary);
|
|
344
|
+
if (successful.length === 0) {
|
|
345
|
+
return '';
|
|
346
|
+
}
|
|
347
|
+
const summaries = successful
|
|
348
|
+
.map(i => `- Iteration ${i.iteration}: ${i.summary}`)
|
|
349
|
+
.join('\n');
|
|
350
|
+
return `## Previous Progress\n${summaries}`;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Check if adding content would exceed token limit
|
|
354
|
+
*/
|
|
355
|
+
exceedsTokenLimit(existing, additional) {
|
|
356
|
+
const estimatedTokens = this.estimateTokens(existing + additional);
|
|
357
|
+
return estimatedTokens > this.config.maxContextTokens;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Estimate token count (rough approximation: ~4 chars per token)
|
|
361
|
+
*/
|
|
362
|
+
estimateTokens(text) {
|
|
363
|
+
return Math.ceil(text.length / 4);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Truncate prompt to fit within limits
|
|
367
|
+
*/
|
|
368
|
+
truncatePrompt(prompt) {
|
|
369
|
+
const maxChars = this.config.maxContextTokens * 4;
|
|
370
|
+
if (prompt.length <= maxChars) {
|
|
371
|
+
return prompt;
|
|
372
|
+
}
|
|
373
|
+
warn(`Truncating prompt from ${prompt.length} to ${maxChars} characters`);
|
|
374
|
+
// Keep start and end, truncate middle
|
|
375
|
+
const keepStart = Math.floor(maxChars * 0.7);
|
|
376
|
+
const keepEnd = Math.floor(maxChars * 0.25);
|
|
377
|
+
return prompt.substring(0, keepStart) +
|
|
378
|
+
'\n\n...(context truncated due to size limits)...\n\n' +
|
|
379
|
+
prompt.substring(prompt.length - keepEnd);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Create a context builder with custom configuration
|
|
384
|
+
*/
|
|
385
|
+
export function createContextBuilder(config, cwd) {
|
|
386
|
+
return new ContextBuilder(config, cwd);
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=context-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../src/core/context-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Builder
|
|
3
|
+
*
|
|
4
|
+
* Builds feedback prompts to show the AI the results of its actions.
|
|
5
|
+
* This is a core component of the Ralph pattern - the AI must see
|
|
6
|
+
* actual results (test output, errors, git diff) to iterate effectively.
|
|
7
|
+
*/
|
|
8
|
+
import type { ExecutionResult } from './action-executor.js';
|
|
9
|
+
import type { VerificationResult } from './verification-hooks.js';
|
|
10
|
+
/**
|
|
11
|
+
* Feedback section types
|
|
12
|
+
*/
|
|
13
|
+
export type FeedbackSectionType = 'actions' | 'verification' | 'git-diff' | 'error' | 'suggestion';
|
|
14
|
+
/**
|
|
15
|
+
* A section of feedback
|
|
16
|
+
*/
|
|
17
|
+
export interface FeedbackSection {
|
|
18
|
+
type: FeedbackSectionType;
|
|
19
|
+
title: string;
|
|
20
|
+
content: string;
|
|
21
|
+
success: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Complete feedback for the next iteration
|
|
25
|
+
*/
|
|
26
|
+
export interface IterationFeedback {
|
|
27
|
+
/** All feedback sections */
|
|
28
|
+
sections: FeedbackSection[];
|
|
29
|
+
/** Overall success status */
|
|
30
|
+
overallSuccess: boolean;
|
|
31
|
+
/** Whether task should be marked complete */
|
|
32
|
+
taskComplete: boolean;
|
|
33
|
+
/** Formatted feedback for prompt */
|
|
34
|
+
formatted: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Feedback builder configuration
|
|
38
|
+
*/
|
|
39
|
+
export interface FeedbackBuilderConfig {
|
|
40
|
+
/** Working directory */
|
|
41
|
+
cwd: string;
|
|
42
|
+
/** Maximum lines of output to include per section */
|
|
43
|
+
maxOutputLines: number;
|
|
44
|
+
/** Whether to include git diff */
|
|
45
|
+
includeGitDiff: boolean;
|
|
46
|
+
/** Maximum git diff size in characters */
|
|
47
|
+
maxDiffSize: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Feedback Builder
|
|
51
|
+
*
|
|
52
|
+
* Creates structured feedback for the AI based on what happened
|
|
53
|
+
* in the previous iteration.
|
|
54
|
+
*/
|
|
55
|
+
export declare class FeedbackBuilder {
|
|
56
|
+
private config;
|
|
57
|
+
constructor(config?: Partial<FeedbackBuilderConfig>);
|
|
58
|
+
/**
|
|
59
|
+
* Build feedback from action execution results
|
|
60
|
+
*/
|
|
61
|
+
buildFromActions(executionResult: ExecutionResult): FeedbackSection;
|
|
62
|
+
/**
|
|
63
|
+
* Build feedback from verification results
|
|
64
|
+
*/
|
|
65
|
+
buildFromVerification(results: VerificationResult[]): FeedbackSection;
|
|
66
|
+
/**
|
|
67
|
+
* Build feedback from current git diff
|
|
68
|
+
*/
|
|
69
|
+
buildFromGitDiff(): Promise<FeedbackSection | null>;
|
|
70
|
+
/**
|
|
71
|
+
* Build an error feedback section
|
|
72
|
+
*/
|
|
73
|
+
buildError(error: Error | string): FeedbackSection;
|
|
74
|
+
/**
|
|
75
|
+
* Build a suggestion section
|
|
76
|
+
*/
|
|
77
|
+
buildSuggestion(suggestion: string): FeedbackSection;
|
|
78
|
+
/**
|
|
79
|
+
* Combine sections into complete iteration feedback
|
|
80
|
+
*/
|
|
81
|
+
buildComplete(actionResult: ExecutionResult | null, verificationResults: VerificationResult[], options?: {
|
|
82
|
+
includeGitDiff?: boolean;
|
|
83
|
+
suggestion?: string;
|
|
84
|
+
}): Promise<IterationFeedback>;
|
|
85
|
+
/**
|
|
86
|
+
* Format feedback sections for inclusion in prompt
|
|
87
|
+
*/
|
|
88
|
+
formatForPrompt(sections: FeedbackSection[], taskComplete: boolean): string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a feedback builder with custom configuration
|
|
92
|
+
*/
|
|
93
|
+
export declare function createFeedbackBuilder(config?: Partial<FeedbackBuilderConfig>): FeedbackBuilder;
|
|
94
|
+
//# sourceMappingURL=feedback-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-builder.d.ts","sourceRoot":"","sources":["../../src/core/feedback-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,cAAc,GACd,UAAU,GACV,OAAO,GACP,YAAY,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,6BAA6B;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,6CAA6C;IAC7C,YAAY,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;CACrB;AASD;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIvD;;OAEG;IACH,gBAAgB,CAAC,eAAe,EAAE,eAAe,GAAG,eAAe;IAiCnE;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,eAAe;IAyCrE;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAuCzD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe;IAUlD;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe;IASpD;;OAEG;IACG,aAAa,CACjB,YAAY,EAAE,eAAe,GAAG,IAAI,EACpC,mBAAmB,EAAE,kBAAkB,EAAE,EACzC,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9D,OAAO,CAAC,iBAAiB,CAAC;IA2C7B;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,OAAO,GAAG,MAAM;CAwB5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACtC,eAAe,CAEjB"}
|