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,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status Command
|
|
3
|
+
*
|
|
4
|
+
* Check the current loop status with rich session information
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs/promises';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { exec } from 'node:child_process';
|
|
9
|
+
import { promisify } from 'node:util';
|
|
10
|
+
import { info, success, heading, dim, code, warn } from '../utils/index.js';
|
|
11
|
+
import { ProgressTracker } from '../core/progress-tracker.js';
|
|
12
|
+
import { getLocalStateDir } from '../utils/paths.js';
|
|
13
|
+
import chalk from 'chalk';
|
|
14
|
+
const execAsync = promisify(exec);
|
|
15
|
+
export function registerStatusCommand(program) {
|
|
16
|
+
program
|
|
17
|
+
.command('status')
|
|
18
|
+
.description('Check current loop status')
|
|
19
|
+
.option('--json', 'Output in JSON format')
|
|
20
|
+
.option('--files', 'Show file operations (created, modified, blocked)')
|
|
21
|
+
.option('--history', 'Show past Ralph sessions')
|
|
22
|
+
.action(async (options) => {
|
|
23
|
+
// Handle --files flag
|
|
24
|
+
if (options.files) {
|
|
25
|
+
await showFileStatus(options.json);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Handle --history flag
|
|
29
|
+
if (options.history) {
|
|
30
|
+
await showHistory(options.json);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
await showCurrentStatus(options.json);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Show current session status with rich information
|
|
38
|
+
*/
|
|
39
|
+
async function showCurrentStatus(jsonOutput) {
|
|
40
|
+
const tracker = new ProgressTracker();
|
|
41
|
+
const progressPath = tracker.getProgressFilePath();
|
|
42
|
+
// Check if progress file exists
|
|
43
|
+
let progressContent = null;
|
|
44
|
+
try {
|
|
45
|
+
progressContent = await fs.readFile(progressPath, 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// No session
|
|
49
|
+
}
|
|
50
|
+
if (!progressContent) {
|
|
51
|
+
if (jsonOutput) {
|
|
52
|
+
console.log(JSON.stringify({ active: false, message: 'No active session' }));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log('');
|
|
56
|
+
success('No active Ralph session');
|
|
57
|
+
console.log('');
|
|
58
|
+
console.log(dim(' Start a new session with:'));
|
|
59
|
+
console.log(` ${code('ghcralph run --task "your task description"')}`);
|
|
60
|
+
console.log('');
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Parse session info from progress file
|
|
65
|
+
const session = parseProgressFile(progressContent);
|
|
66
|
+
// Get branch info
|
|
67
|
+
let branch = '';
|
|
68
|
+
try {
|
|
69
|
+
const { stdout } = await execAsync('git rev-parse --abbrev-ref HEAD');
|
|
70
|
+
branch = stdout.trim();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Not in git repo
|
|
74
|
+
}
|
|
75
|
+
// Get modified files
|
|
76
|
+
const modifiedFiles = await getModifiedFiles();
|
|
77
|
+
if (jsonOutput) {
|
|
78
|
+
console.log(JSON.stringify({
|
|
79
|
+
active: true,
|
|
80
|
+
status: session.status,
|
|
81
|
+
task: session.task,
|
|
82
|
+
branch,
|
|
83
|
+
iteration: session.iteration,
|
|
84
|
+
maxIterations: session.maxIterations,
|
|
85
|
+
tokensUsed: session.tokensUsed,
|
|
86
|
+
started: session.started,
|
|
87
|
+
elapsed: session.elapsed,
|
|
88
|
+
lastCheckpoint: session.lastCheckpoint,
|
|
89
|
+
modifiedFiles,
|
|
90
|
+
progressFile: progressPath,
|
|
91
|
+
stateDir: getLocalStateDir(),
|
|
92
|
+
}, null, 2));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Rich output
|
|
96
|
+
console.log('');
|
|
97
|
+
console.log(heading('📋 Ralph Session Status'));
|
|
98
|
+
console.log(chalk.dim('━'.repeat(40)));
|
|
99
|
+
console.log('');
|
|
100
|
+
// Status indicator
|
|
101
|
+
const statusIcon = getStatusIcon(session.status);
|
|
102
|
+
console.log(` ${dim('Status:')} ${statusIcon} ${session.status}`);
|
|
103
|
+
console.log(` ${dim('Task:')} ${session.task}`);
|
|
104
|
+
if (branch) {
|
|
105
|
+
console.log(` ${dim('Branch:')} ${code(branch)}`);
|
|
106
|
+
}
|
|
107
|
+
console.log(` ${dim('Started:')} ${session.started} (${session.elapsed})`);
|
|
108
|
+
console.log('');
|
|
109
|
+
// Progress bar
|
|
110
|
+
const progressPercent = session.maxIterations > 0 ? session.iteration / session.maxIterations : 0;
|
|
111
|
+
const progressBar = createProgressBar(progressPercent, 20);
|
|
112
|
+
console.log(` ${dim('Progress:')} ${progressBar} ${session.iteration}/${session.maxIterations} iterations`);
|
|
113
|
+
// Token usage
|
|
114
|
+
const tokenDisplay = session.tokensUsed.toLocaleString();
|
|
115
|
+
console.log(` ${dim('Tokens:')} ${tokenDisplay} used`);
|
|
116
|
+
console.log('');
|
|
117
|
+
// Modified files
|
|
118
|
+
if (modifiedFiles.length > 0) {
|
|
119
|
+
console.log(dim(' Modified Files:'));
|
|
120
|
+
for (const file of modifiedFiles.slice(0, 6)) {
|
|
121
|
+
const prefix = file.status === 'A' ? chalk.green('+') :
|
|
122
|
+
file.status === 'D' ? chalk.red('-') :
|
|
123
|
+
chalk.yellow('~');
|
|
124
|
+
console.log(` ${prefix} ${file.path}`);
|
|
125
|
+
}
|
|
126
|
+
if (modifiedFiles.length > 6) {
|
|
127
|
+
console.log(dim(` ...and ${modifiedFiles.length - 6} more files`));
|
|
128
|
+
}
|
|
129
|
+
console.log('');
|
|
130
|
+
}
|
|
131
|
+
// Last commit
|
|
132
|
+
if (session.lastCheckpoint) {
|
|
133
|
+
console.log(` ${dim('Last Commit:')} ${code(session.lastCheckpoint.substring(0, 7))}`);
|
|
134
|
+
console.log('');
|
|
135
|
+
}
|
|
136
|
+
// Helpful tips based on status
|
|
137
|
+
console.log(dim(' 💡 Tips:'));
|
|
138
|
+
if (session.status === 'In Progress' || session.status === 'Paused') {
|
|
139
|
+
console.log(dim(` • Run ${code("ghcralph rollback")} to undo the last iteration`));
|
|
140
|
+
console.log(dim(` • Run ${code("ghcralph status --files")} to see all file changes`));
|
|
141
|
+
}
|
|
142
|
+
else if (session.status === 'Completed') {
|
|
143
|
+
console.log(dim(` • Review changes with ${code("git diff HEAD~" + session.iteration)}`));
|
|
144
|
+
console.log(dim(` • Create a PR with ${code("gh pr create")}`));
|
|
145
|
+
}
|
|
146
|
+
else if (session.status === 'Failed') {
|
|
147
|
+
console.log(dim(` • Check logs: ${code(progressPath)}`));
|
|
148
|
+
console.log(dim(` • Rollback with ${code("ghcralph rollback --all --force")}`));
|
|
149
|
+
}
|
|
150
|
+
console.log('');
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Parse progress.md file into structured data
|
|
154
|
+
*/
|
|
155
|
+
function parseProgressFile(content) {
|
|
156
|
+
const lines = content.split('\n');
|
|
157
|
+
const session = {
|
|
158
|
+
status: 'Unknown',
|
|
159
|
+
task: '',
|
|
160
|
+
iteration: 0,
|
|
161
|
+
maxIterations: 0,
|
|
162
|
+
tokensUsed: 0,
|
|
163
|
+
started: '',
|
|
164
|
+
elapsed: '',
|
|
165
|
+
};
|
|
166
|
+
for (const line of lines) {
|
|
167
|
+
if (line.startsWith('- **Started**:')) {
|
|
168
|
+
session.started = line.replace('- **Started**:', '').trim();
|
|
169
|
+
}
|
|
170
|
+
else if (line.startsWith('- **Task**:')) {
|
|
171
|
+
session.task = line.replace('- **Task**:', '').trim();
|
|
172
|
+
}
|
|
173
|
+
else if (line.startsWith('- **Status**:')) {
|
|
174
|
+
// Remove status emojis and extract text - just keep alpha characters and spaces
|
|
175
|
+
const statusText = line.replace('- **Status**:', '').trim();
|
|
176
|
+
// Extract just the text portion after any emoji
|
|
177
|
+
session.status = statusText.replace(/^[^\w]+/, '').trim() || statusText;
|
|
178
|
+
}
|
|
179
|
+
else if (line.startsWith('- **Iterations**:')) {
|
|
180
|
+
const match = line.match(/(\d+)\/(\d+)/);
|
|
181
|
+
if (match && match[1] && match[2]) {
|
|
182
|
+
session.iteration = parseInt(match[1], 10);
|
|
183
|
+
session.maxIterations = parseInt(match[2], 10);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else if (line.startsWith('- **Tokens Used**:')) {
|
|
187
|
+
session.tokensUsed = parseInt(line.replace('- **Tokens Used**:', '').replace(/,/g, '').trim(), 10) || 0;
|
|
188
|
+
}
|
|
189
|
+
else if (line.startsWith('- **Elapsed**:')) {
|
|
190
|
+
session.elapsed = line.replace('- **Elapsed**:', '').trim();
|
|
191
|
+
}
|
|
192
|
+
else if (line.startsWith('- **Last Checkpoint**:')) {
|
|
193
|
+
session.lastCheckpoint = line.replace('- **Last Checkpoint**:', '').replace(/`/g, '').trim();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return session;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get status icon
|
|
200
|
+
*/
|
|
201
|
+
function getStatusIcon(status) {
|
|
202
|
+
if (status.includes('Progress'))
|
|
203
|
+
return '🟢';
|
|
204
|
+
if (status.includes('Complete'))
|
|
205
|
+
return '✅';
|
|
206
|
+
if (status.includes('Failed'))
|
|
207
|
+
return '🔴';
|
|
208
|
+
if (status.includes('Paused'))
|
|
209
|
+
return '🟡';
|
|
210
|
+
if (status.includes('Stopped'))
|
|
211
|
+
return '⏹️';
|
|
212
|
+
return '❓';
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Create a progress bar
|
|
216
|
+
*/
|
|
217
|
+
function createProgressBar(percent, width) {
|
|
218
|
+
const filled = Math.round(percent * width);
|
|
219
|
+
const empty = width - filled;
|
|
220
|
+
return chalk.green('█'.repeat(filled)) + chalk.dim('░'.repeat(empty));
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get modified files from git
|
|
224
|
+
*/
|
|
225
|
+
async function getModifiedFiles() {
|
|
226
|
+
const files = [];
|
|
227
|
+
try {
|
|
228
|
+
const { stdout } = await execAsync('git status --porcelain');
|
|
229
|
+
const lines = stdout.trim().split('\n').filter(Boolean);
|
|
230
|
+
for (const line of lines) {
|
|
231
|
+
const status = line.substring(0, 2).trim();
|
|
232
|
+
const filePath = line.substring(3).trim();
|
|
233
|
+
files.push({ path: filePath, status: status.charAt(0) || 'M' });
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Git not available
|
|
238
|
+
}
|
|
239
|
+
return files;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Show past Ralph sessions from git log
|
|
243
|
+
*/
|
|
244
|
+
async function showHistory(jsonOutput) {
|
|
245
|
+
try {
|
|
246
|
+
// Find Ralph commits
|
|
247
|
+
const { stdout } = await execAsync('git --no-pager log --oneline --grep="ghcralph:" -n 50');
|
|
248
|
+
const lines = stdout.trim().split('\n').filter(Boolean);
|
|
249
|
+
if (lines.length === 0) {
|
|
250
|
+
if (jsonOutput) {
|
|
251
|
+
console.log(JSON.stringify({ sessions: [] }));
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
info('No past Ralph sessions found in git history');
|
|
255
|
+
}
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
// Group by session (consecutive ralph commits with same prefix)
|
|
259
|
+
const sessions = [];
|
|
260
|
+
for (const line of lines) {
|
|
261
|
+
const [hash, ...msgParts] = line.split(' ');
|
|
262
|
+
if (hash) {
|
|
263
|
+
sessions.push({ hash, message: msgParts.join(' '), date: '' });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Get dates for commits
|
|
267
|
+
for (const session of sessions) {
|
|
268
|
+
try {
|
|
269
|
+
const { stdout: dateOut } = await execAsync(`git --no-pager log -1 --format=%ai ${session.hash}`);
|
|
270
|
+
session.date = dateOut.trim().substring(0, 16); // YYYY-MM-DD HH:MM
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
session.date = 'unknown';
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (jsonOutput) {
|
|
277
|
+
console.log(JSON.stringify({ sessions }, null, 2));
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
console.log('');
|
|
281
|
+
console.log(heading('📜 Past Ralph Sessions'));
|
|
282
|
+
console.log(chalk.dim('━'.repeat(40)));
|
|
283
|
+
console.log('');
|
|
284
|
+
// Group into sessions by detecting gaps
|
|
285
|
+
let lastIteration = 0;
|
|
286
|
+
for (let i = 0; i < Math.min(sessions.length, 20); i++) {
|
|
287
|
+
const sessionItem = sessions[i];
|
|
288
|
+
if (!sessionItem)
|
|
289
|
+
continue;
|
|
290
|
+
const match = sessionItem.message.match(/iteration (\d+)/);
|
|
291
|
+
const iteration = match?.[1] ? parseInt(match[1], 10) : 0;
|
|
292
|
+
// Detect new session (iteration resets or non-consecutive)
|
|
293
|
+
if (i > 0 && (iteration >= lastIteration || Math.abs(iteration - lastIteration) > 1)) {
|
|
294
|
+
console.log('');
|
|
295
|
+
}
|
|
296
|
+
lastIteration = iteration;
|
|
297
|
+
console.log(` ${dim(sessionItem.date)} ${code(sessionItem.hash.substring(0, 7))} ${sessionItem.message}`);
|
|
298
|
+
}
|
|
299
|
+
if (sessions.length > 20) {
|
|
300
|
+
console.log('');
|
|
301
|
+
console.log(dim(` ...and ${sessions.length - 20} more commits`));
|
|
302
|
+
}
|
|
303
|
+
console.log('');
|
|
304
|
+
console.log(dim(' 💡 Use "ghcralph rollback --to <hash>" to restore to a specific commit'));
|
|
305
|
+
console.log('');
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
if (jsonOutput) {
|
|
309
|
+
console.log(JSON.stringify({ error: 'Failed to get git history' }));
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
warn('Failed to get git history');
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
async function showFileStatus(jsonOutput) {
|
|
317
|
+
const baselinePath = path.join(process.cwd(), '.ralph', 'baseline-files.json');
|
|
318
|
+
let baseline = null;
|
|
319
|
+
try {
|
|
320
|
+
const content = await fs.readFile(baselinePath, 'utf-8');
|
|
321
|
+
baseline = JSON.parse(content);
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
// No baseline
|
|
325
|
+
}
|
|
326
|
+
if (!baseline) {
|
|
327
|
+
if (jsonOutput) {
|
|
328
|
+
console.log(JSON.stringify({ hasBaseline: false, message: 'No baseline snapshot found' }));
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
info('No baseline snapshot found. Run a Ralph session to create one.');
|
|
332
|
+
}
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
// Get current git status to find modified/created files
|
|
336
|
+
const modifiedFiles = [];
|
|
337
|
+
const createdFiles = [];
|
|
338
|
+
try {
|
|
339
|
+
const { stdout: statusOut } = await execAsync('git status --porcelain');
|
|
340
|
+
const lines = statusOut.trim().split('\n').filter(Boolean);
|
|
341
|
+
for (const line of lines) {
|
|
342
|
+
const status = line.substring(0, 2).trim();
|
|
343
|
+
const file = line.substring(3).trim();
|
|
344
|
+
if (status === '??' || status === 'A') {
|
|
345
|
+
// Untracked or added
|
|
346
|
+
if (!baseline.files.includes(file)) {
|
|
347
|
+
createdFiles.push(file);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
else if (status === 'M' || status === 'MM') {
|
|
351
|
+
modifiedFiles.push(file);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
// Git not available
|
|
357
|
+
}
|
|
358
|
+
if (jsonOutput) {
|
|
359
|
+
console.log(JSON.stringify({
|
|
360
|
+
hasBaseline: true,
|
|
361
|
+
baselineCreatedAt: baseline.createdAt,
|
|
362
|
+
baselineFileCount: baseline.count,
|
|
363
|
+
createdFiles,
|
|
364
|
+
modifiedFiles,
|
|
365
|
+
}, null, 2));
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
console.log('');
|
|
369
|
+
console.log(heading('📁 File Operations'));
|
|
370
|
+
console.log('');
|
|
371
|
+
console.log(` ${dim('Baseline created:')} ${baseline.createdAt}`);
|
|
372
|
+
console.log(` ${dim('Baseline files:')} ${baseline.count}`);
|
|
373
|
+
console.log('');
|
|
374
|
+
if (createdFiles.length > 0) {
|
|
375
|
+
console.log(dim(' Files created this session:'));
|
|
376
|
+
for (const file of createdFiles.slice(0, 10)) {
|
|
377
|
+
console.log(` + ${file}`);
|
|
378
|
+
}
|
|
379
|
+
if (createdFiles.length > 10) {
|
|
380
|
+
console.log(` ${dim(`...and ${createdFiles.length - 10} more`)}`);
|
|
381
|
+
}
|
|
382
|
+
console.log('');
|
|
383
|
+
}
|
|
384
|
+
if (modifiedFiles.length > 0) {
|
|
385
|
+
console.log(dim(' Files modified:'));
|
|
386
|
+
for (const file of modifiedFiles.slice(0, 10)) {
|
|
387
|
+
console.log(` ~ ${file}`);
|
|
388
|
+
}
|
|
389
|
+
if (modifiedFiles.length > 10) {
|
|
390
|
+
console.log(` ${dim(`...and ${modifiedFiles.length - 10} more`)}`);
|
|
391
|
+
}
|
|
392
|
+
console.log('');
|
|
393
|
+
}
|
|
394
|
+
if (createdFiles.length === 0 && modifiedFiles.length === 0) {
|
|
395
|
+
info('No file changes detected since baseline');
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Executor
|
|
3
|
+
*
|
|
4
|
+
* Executes parsed actions from AI responses.
|
|
5
|
+
* This component bridges the gap between AI intent and filesystem reality.
|
|
6
|
+
*/
|
|
7
|
+
import type { Action, ParseResult } from './response-parser.js';
|
|
8
|
+
/**
|
|
9
|
+
* Result of executing a single action
|
|
10
|
+
*/
|
|
11
|
+
export interface ActionResult {
|
|
12
|
+
/** The action that was executed */
|
|
13
|
+
action: Action;
|
|
14
|
+
/** Whether the action succeeded */
|
|
15
|
+
success: boolean;
|
|
16
|
+
/** Human-readable description of what happened */
|
|
17
|
+
message: string;
|
|
18
|
+
/** Output from command execution (for EXECUTE actions) */
|
|
19
|
+
output?: string;
|
|
20
|
+
/** Error message if failed */
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Result of executing all actions from a response
|
|
25
|
+
*/
|
|
26
|
+
export interface ExecutionResult {
|
|
27
|
+
/** Results for each action */
|
|
28
|
+
results: ActionResult[];
|
|
29
|
+
/** Whether all actions succeeded */
|
|
30
|
+
allSucceeded: boolean;
|
|
31
|
+
/** Whether a COMPLETE action was found */
|
|
32
|
+
taskComplete: boolean;
|
|
33
|
+
/** Completion reason if task is complete */
|
|
34
|
+
completionReason?: string;
|
|
35
|
+
/** Summary of executed actions */
|
|
36
|
+
summary: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Action executor configuration
|
|
40
|
+
*/
|
|
41
|
+
export interface ActionExecutorConfig {
|
|
42
|
+
/** Working directory for file operations */
|
|
43
|
+
cwd: string;
|
|
44
|
+
/** Whether to actually execute actions (false = dry run) */
|
|
45
|
+
execute: boolean;
|
|
46
|
+
/** Timeout for shell commands in ms */
|
|
47
|
+
commandTimeout: number;
|
|
48
|
+
/** File safeguard manager for deletion protection */
|
|
49
|
+
fileSafeguard?: {
|
|
50
|
+
canDelete: (path: string) => boolean;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Action Executor class
|
|
55
|
+
*/
|
|
56
|
+
export declare class ActionExecutor {
|
|
57
|
+
private config;
|
|
58
|
+
constructor(config?: Partial<ActionExecutorConfig>);
|
|
59
|
+
/**
|
|
60
|
+
* Execute all actions from a parsed response
|
|
61
|
+
*/
|
|
62
|
+
executeAll(parseResult: ParseResult): Promise<ExecutionResult>;
|
|
63
|
+
/**
|
|
64
|
+
* Execute a single action
|
|
65
|
+
*/
|
|
66
|
+
executeAction(action: Action): Promise<ActionResult>;
|
|
67
|
+
/**
|
|
68
|
+
* Execute a CREATE action
|
|
69
|
+
*/
|
|
70
|
+
private executeCreate;
|
|
71
|
+
/**
|
|
72
|
+
* Execute an EDIT action
|
|
73
|
+
*/
|
|
74
|
+
private executeEdit;
|
|
75
|
+
/**
|
|
76
|
+
* Execute a DELETE action
|
|
77
|
+
*/
|
|
78
|
+
private executeDelete;
|
|
79
|
+
/**
|
|
80
|
+
* Execute an EXECUTE action (shell command)
|
|
81
|
+
*/
|
|
82
|
+
private executeCommand;
|
|
83
|
+
/**
|
|
84
|
+
* Execute a COMPLETE action (just marks completion)
|
|
85
|
+
*/
|
|
86
|
+
private executeComplete;
|
|
87
|
+
/**
|
|
88
|
+
* Build a human-readable summary of executed actions
|
|
89
|
+
*/
|
|
90
|
+
private buildSummary;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create an action executor with custom configuration
|
|
94
|
+
*/
|
|
95
|
+
export declare function createActionExecutor(config?: Partial<ActionExecutorConfig>): ActionExecutor;
|
|
96
|
+
//# sourceMappingURL=action-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-executor.d.ts","sourceRoot":"","sources":["../../src/core/action-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EACV,MAAM,EAMN,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAI9B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,oCAAoC;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,0CAA0C;IAC1C,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;KACtC,CAAC;CACH;AAQD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAItD;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAsCpE;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA0C1D;;OAEG;YACW,aAAa;IAiC3B;;OAEG;YACW,WAAW;IA+CzB;;OAEG;YACW,aAAa;IA6C3B;;OAEG;YACW,cAAc;IAgC5B;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,YAAY;CAsBrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACrC,cAAc,CAEhB"}
|