@electriccitizen/bolt 0.1.0 → 0.2.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/README.md +93 -14
- package/dist/ai/agent.d.ts +66 -0
- package/dist/ai/agent.js +232 -0
- package/dist/ai/agent.js.map +1 -0
- package/dist/ai/knowledge/composer.md +90 -0
- package/dist/ai/knowledge/config-safety.md +46 -0
- package/dist/ai/knowledge/ddev-operations.md +41 -0
- package/dist/ai/knowledge/drupal-internals.md +52 -0
- package/dist/ai/knowledge/drupal-updates.md +90 -0
- package/dist/ai/knowledge/knowledge/composer.md +90 -0
- package/dist/ai/knowledge/knowledge/config-safety.md +46 -0
- package/dist/ai/knowledge/knowledge/ddev-operations.md +41 -0
- package/dist/ai/knowledge/knowledge/drupal-debugging.md +89 -0
- package/dist/ai/knowledge/knowledge/drupal-internals.md +52 -0
- package/dist/ai/knowledge/knowledge/drupal-updates.md +90 -0
- package/dist/ai/prompts/analyze-ticket.d.ts +30 -0
- package/dist/ai/prompts/analyze-ticket.js +116 -0
- package/dist/ai/prompts/analyze-ticket.js.map +1 -0
- package/dist/ai/prompts/fix-ticket.d.ts +27 -0
- package/dist/ai/prompts/fix-ticket.js +129 -0
- package/dist/ai/prompts/fix-ticket.js.map +1 -0
- package/dist/ai/prompts/pr-description.d.ts +19 -0
- package/dist/ai/prompts/pr-description.js +56 -0
- package/dist/ai/prompts/pr-description.js.map +1 -0
- package/dist/ai/prompts/update-package.d.ts +25 -0
- package/dist/ai/prompts/update-package.js +87 -0
- package/dist/ai/prompts/update-package.js.map +1 -0
- package/dist/ai/prompts/update-plan.d.ts +20 -0
- package/dist/ai/prompts/update-plan.js +66 -0
- package/dist/ai/prompts/update-plan.js.map +1 -0
- package/dist/ai/schemas/analysis-result.d.ts +44 -0
- package/dist/ai/schemas/analysis-result.js +101 -0
- package/dist/ai/schemas/analysis-result.js.map +1 -0
- package/dist/ai/schemas/fix-result.d.ts +34 -0
- package/dist/ai/schemas/fix-result.js +55 -0
- package/dist/ai/schemas/fix-result.js.map +1 -0
- package/dist/ai/schemas/pr-body.d.ts +12 -0
- package/dist/ai/schemas/pr-body.js +18 -0
- package/dist/ai/schemas/pr-body.js.map +1 -0
- package/dist/ai/schemas/update-plan.d.ts +20 -0
- package/dist/ai/schemas/update-plan.js +33 -0
- package/dist/ai/schemas/update-plan.js.map +1 -0
- package/dist/ai/schemas/update-result.d.ts +22 -0
- package/dist/ai/schemas/update-result.js +30 -0
- package/dist/ai/schemas/update-result.js.map +1 -0
- package/dist/cli.js +63 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts +25 -0
- package/dist/commands/analyze.js +377 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/doctor.js +61 -13
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/fix.d.ts +35 -0
- package/dist/commands/fix.js +480 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/init.d.ts +3 -2
- package/dist/commands/init.js +117 -160
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pr.d.ts +4 -0
- package/dist/commands/pr.js +121 -3
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/refresh.js +10 -57
- package/dist/commands/refresh.js.map +1 -1
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.js +463 -64
- package/dist/commands/update.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -1
- package/dist/runner.js +12 -0
- package/dist/runner.js.map +1 -1
- package/dist/safety.d.ts +63 -0
- package/dist/safety.js +192 -0
- package/dist/safety.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/package.json +2 -3
- package/modules/bolt_inspect/bolt_inspect.info.yml +0 -6
- package/modules/bolt_inspect/bolt_inspect.services.yml +0 -22
- package/modules/bolt_inspect/composer.json +0 -16
- package/modules/bolt_inspect/drush.services.yml +0 -10
- package/modules/bolt_inspect/src/Drush/Commands/BoltInspectCommands.php +0 -203
- package/modules/bolt_inspect/src/Service/ContentGenerator.php +0 -586
- package/modules/bolt_inspect/src/Service/SiteProfiler.php +0 -362
- package/modules/bolt_inspect/src/Service/TestEntityTracker.php +0 -98
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bolt fix — autonomous ticket resolution.
|
|
3
|
+
*
|
|
4
|
+
* Runs bolt analyze internally (or reuses existing analysis), then hands
|
|
5
|
+
* the issue to Claude with full tool access to investigate and fix.
|
|
6
|
+
* Supports both autonomous (subprocess) and interactive (live session) modes.
|
|
7
|
+
*/
|
|
8
|
+
import { execFile, spawn } from 'child_process';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
import { readFileSync } from 'fs';
|
|
11
|
+
import { isClaudeAvailable, runAgent, buildPrompt } from '../ai/agent.js';
|
|
12
|
+
import { buildAnalyzeTicketTask } from '../ai/prompts/analyze-ticket.js';
|
|
13
|
+
import { validateAnalysisResult } from '../ai/schemas/analysis-result.js';
|
|
14
|
+
import { buildFixTicketTask } from '../ai/prompts/fix-ticket.js';
|
|
15
|
+
import { validateFixResult } from '../ai/schemas/fix-result.js';
|
|
16
|
+
import { DdevAdapter } from '../adapters/ddev.js';
|
|
17
|
+
import { checkGitState, requireCleanTree, confirm } from '../safety.js';
|
|
18
|
+
const execFileAsync = promisify(execFile);
|
|
19
|
+
function log(msg) {
|
|
20
|
+
process.stderr.write(` ${msg}\n`);
|
|
21
|
+
}
|
|
22
|
+
function logOk(msg) {
|
|
23
|
+
process.stderr.write(` ✓ ${msg}\n`);
|
|
24
|
+
}
|
|
25
|
+
function logFail(msg) {
|
|
26
|
+
process.stderr.write(` ✗ ${msg}\n`);
|
|
27
|
+
}
|
|
28
|
+
function logWarn(msg) {
|
|
29
|
+
process.stderr.write(` ⚠ ${msg}\n`);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the site profile via DDEV adapter.
|
|
33
|
+
*/
|
|
34
|
+
async function getSiteProfile() {
|
|
35
|
+
const adapter = new DdevAdapter();
|
|
36
|
+
try {
|
|
37
|
+
const result = await adapter.drush('bolt-inspect:profile', []);
|
|
38
|
+
if (result.exitCode !== 0)
|
|
39
|
+
return null;
|
|
40
|
+
return JSON.parse(result.stdout);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get the site URL from DDEV.
|
|
48
|
+
*/
|
|
49
|
+
async function getSiteUrl() {
|
|
50
|
+
const adapter = new DdevAdapter();
|
|
51
|
+
return adapter.getSiteUrl();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get recent git log.
|
|
55
|
+
*/
|
|
56
|
+
async function getRecentGitLog() {
|
|
57
|
+
try {
|
|
58
|
+
const { stdout } = await execFileAsync('git', ['log', '--oneline', '-20'], {
|
|
59
|
+
timeout: 10_000,
|
|
60
|
+
});
|
|
61
|
+
return stdout.trim();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return '';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Run bolt analyze internally to get an AnalysisResult.
|
|
69
|
+
*/
|
|
70
|
+
async function runAnalysis(options, profile) {
|
|
71
|
+
// If a saved analysis file is provided, load it.
|
|
72
|
+
if (options.analysis) {
|
|
73
|
+
try {
|
|
74
|
+
const raw = JSON.parse(readFileSync(options.analysis, 'utf-8'));
|
|
75
|
+
const result = validateAnalysisResult(raw);
|
|
76
|
+
if (result) {
|
|
77
|
+
logOk(`Loaded analysis from ${options.analysis}`);
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
logFail('Saved analysis file is invalid.');
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
logFail(`Could not read analysis file: ${options.analysis}`);
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Determine ticket info.
|
|
89
|
+
let ticketKey = options.ticket ?? '';
|
|
90
|
+
let ticketSummary = '';
|
|
91
|
+
let ticketDescription = options.description ?? '';
|
|
92
|
+
let ticketType = 'Bug';
|
|
93
|
+
let ticketPriority = 'Medium';
|
|
94
|
+
let ticketComments;
|
|
95
|
+
if (options.ticket) {
|
|
96
|
+
// Fetch from Jira via analyze's agent.
|
|
97
|
+
log(`Fetching ticket ${ticketKey} from Jira...`);
|
|
98
|
+
const cloudId = options.boltConfig?.analyze?.jira?.cloud_id ?? 'ecitizen.atlassian.net';
|
|
99
|
+
// Use the same Jira fetch as analyze — import dynamically to avoid circular deps.
|
|
100
|
+
const { analyzeCommand: _, ...analyzeModule } = await import('./analyze.js');
|
|
101
|
+
// Simpler: just re-run the analysis via the agent.
|
|
102
|
+
}
|
|
103
|
+
if (!ticketDescription && !options.ticket) {
|
|
104
|
+
logFail('No ticket info. Use --ticket, --description, or --analysis.');
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
// Build and run the analyze task.
|
|
108
|
+
const gitLog = await getRecentGitLog();
|
|
109
|
+
const analyzeCtx = {
|
|
110
|
+
ticketKey,
|
|
111
|
+
ticketSummary: ticketSummary || ticketDescription.slice(0, 100),
|
|
112
|
+
ticketDescription,
|
|
113
|
+
ticketType,
|
|
114
|
+
ticketPriority,
|
|
115
|
+
ticketComments,
|
|
116
|
+
siteProfile: profile,
|
|
117
|
+
recentGitLog: gitLog || undefined,
|
|
118
|
+
};
|
|
119
|
+
// If we have a ticket key but no description yet, use the key as a minimal description.
|
|
120
|
+
// The actual Jira fetch happens inside the analyze agent.
|
|
121
|
+
if (options.ticket && !ticketDescription) {
|
|
122
|
+
analyzeCtx.ticketDescription = `Jira ticket ${options.ticket} — fetch details from Jira to analyze.`;
|
|
123
|
+
analyzeCtx.ticketSummary = `Ticket ${options.ticket}`;
|
|
124
|
+
}
|
|
125
|
+
log('Running analysis...');
|
|
126
|
+
const task = buildAnalyzeTicketTask(analyzeCtx);
|
|
127
|
+
// For ticket-based analysis, give the agent Jira MCP access.
|
|
128
|
+
if (options.ticket) {
|
|
129
|
+
task.allowedTools = [
|
|
130
|
+
'mcp__atlassian__getJiraIssue',
|
|
131
|
+
'mcp__atlassian__getJiraIssueRemoteIssueLinks',
|
|
132
|
+
];
|
|
133
|
+
task.maxTurns = 5;
|
|
134
|
+
}
|
|
135
|
+
const agentResult = await runAgent(task);
|
|
136
|
+
if (!agentResult.success) {
|
|
137
|
+
logFail('Analysis failed.');
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
return validateAnalysisResult(agentResult.output);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Create a fix branch.
|
|
144
|
+
*/
|
|
145
|
+
async function createFixBranch(branchName) {
|
|
146
|
+
try {
|
|
147
|
+
await execFileAsync('git', ['checkout', '-b', branchName], { timeout: 10_000 });
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get changed files from git.
|
|
156
|
+
*/
|
|
157
|
+
async function getChangedFiles() {
|
|
158
|
+
try {
|
|
159
|
+
const { stdout } = await execFileAsync('git', ['diff', '--name-only'], { timeout: 10_000 });
|
|
160
|
+
const { stdout: untracked } = await execFileAsync('git', ['ls-files', '--others', '--exclude-standard'], { timeout: 10_000 });
|
|
161
|
+
const files = [
|
|
162
|
+
...stdout.trim().split('\n').filter(Boolean),
|
|
163
|
+
...untracked.trim().split('\n').filter(Boolean),
|
|
164
|
+
];
|
|
165
|
+
return files;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Show the user what changed and ask for confirmation.
|
|
173
|
+
*/
|
|
174
|
+
async function showChangesAndConfirm(fixResult, changedFiles, yes) {
|
|
175
|
+
process.stderr.write('\n━━━ Changes Made ━━━\n');
|
|
176
|
+
if (fixResult.changes.length > 0) {
|
|
177
|
+
for (const change of fixResult.changes) {
|
|
178
|
+
process.stderr.write(` ${change.type}: ${change.file}\n`);
|
|
179
|
+
if (change.description) {
|
|
180
|
+
process.stderr.write(` → ${change.description}\n`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else if (changedFiles.length > 0) {
|
|
185
|
+
// Fall back to git diff if agent didn't report changes.
|
|
186
|
+
for (const file of changedFiles.slice(0, 20)) {
|
|
187
|
+
process.stderr.write(` modified: ${file}\n`);
|
|
188
|
+
}
|
|
189
|
+
if (changedFiles.length > 20) {
|
|
190
|
+
process.stderr.write(` ... and ${changedFiles.length - 20} more\n`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
process.stderr.write(' (no file changes detected)\n');
|
|
195
|
+
}
|
|
196
|
+
process.stderr.write('\n━━━ Explanation ━━━\n');
|
|
197
|
+
process.stderr.write(` ${fixResult.explanation}\n`);
|
|
198
|
+
if (fixResult.followUp && fixResult.followUp.length > 0) {
|
|
199
|
+
process.stderr.write('\n━━━ Follow-up Required ━━━\n');
|
|
200
|
+
for (const item of fixResult.followUp) {
|
|
201
|
+
process.stderr.write(` - ${item}\n`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
process.stderr.write('\n');
|
|
205
|
+
if (yes)
|
|
206
|
+
return true;
|
|
207
|
+
return confirm('Commit these changes and create PR?');
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Launch an interactive Claude session with fix context pre-loaded.
|
|
211
|
+
*/
|
|
212
|
+
async function runInteractiveFix(analysis, profile, additionalContext, siteUrl) {
|
|
213
|
+
const task = buildFixTicketTask({
|
|
214
|
+
analysis,
|
|
215
|
+
siteProfile: profile,
|
|
216
|
+
additionalContext,
|
|
217
|
+
siteUrl: siteUrl ?? undefined,
|
|
218
|
+
});
|
|
219
|
+
const prompt = buildPrompt(task);
|
|
220
|
+
log('Launching interactive Claude session...');
|
|
221
|
+
log('Claude has the ticket analysis, site profile, and tool access.');
|
|
222
|
+
log('You can converse with Claude to guide the fix.\n');
|
|
223
|
+
// Spawn Claude in interactive mode (no --print).
|
|
224
|
+
const child = spawn('claude', [], {
|
|
225
|
+
env: {
|
|
226
|
+
...process.env,
|
|
227
|
+
},
|
|
228
|
+
stdio: ['pipe', 'inherit', 'inherit'],
|
|
229
|
+
});
|
|
230
|
+
// Write the initial prompt to stdin, then hand control to the user's terminal.
|
|
231
|
+
child.stdin.write(prompt + '\n\n');
|
|
232
|
+
child.stdin.write('Begin investigating and fixing the issue described above. Ask me questions if you need more information.\n');
|
|
233
|
+
// Pipe user's stdin to Claude.
|
|
234
|
+
process.stdin.pipe(child.stdin);
|
|
235
|
+
return new Promise((resolve) => {
|
|
236
|
+
child.on('close', () => {
|
|
237
|
+
process.stdin.unpipe(child.stdin);
|
|
238
|
+
resolve();
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
export async function fixCommand(options) {
|
|
243
|
+
process.stderr.write('\nbolt fix\n');
|
|
244
|
+
process.stderr.write('━'.repeat(50) + '\n\n');
|
|
245
|
+
// --- Require AI ---
|
|
246
|
+
if (options.noAi) {
|
|
247
|
+
logFail('bolt fix requires AI. There is no scripted fallback.');
|
|
248
|
+
process.exit(2);
|
|
249
|
+
}
|
|
250
|
+
const available = await isClaudeAvailable();
|
|
251
|
+
if (!available) {
|
|
252
|
+
logFail('Claude Code not found. Install: https://claude.ai/claude-code');
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
// --- Input validation ---
|
|
256
|
+
if (!options.ticket && !options.description && !options.analysis) {
|
|
257
|
+
logFail('No ticket info. Use --ticket <key>, --description "...", or --analysis <path>.');
|
|
258
|
+
process.exit(2);
|
|
259
|
+
}
|
|
260
|
+
// --- Gather site context ---
|
|
261
|
+
log('Fetching site profile...');
|
|
262
|
+
const profile = await getSiteProfile();
|
|
263
|
+
if (!profile) {
|
|
264
|
+
logFail('Could not fetch site profile. Is DDEV running with bolt_inspect enabled?');
|
|
265
|
+
process.exit(1);
|
|
266
|
+
}
|
|
267
|
+
logOk(`Site profile: ${profile.contentTypes.length} content types, ${profile.enabledModules.length} modules`);
|
|
268
|
+
const siteUrl = await getSiteUrl();
|
|
269
|
+
// --- Analysis phase ---
|
|
270
|
+
const analysis = await runAnalysis(options, profile);
|
|
271
|
+
if (!analysis) {
|
|
272
|
+
logFail('Could not produce analysis. Run `bolt analyze` first for details.');
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
logOk(`Analysis complete: ${analysis.likelyCauses.length} likely causes`);
|
|
276
|
+
// --- Check confidence ---
|
|
277
|
+
if (analysis.confidence) {
|
|
278
|
+
const { canFix, reason } = analysis.confidence;
|
|
279
|
+
if (canFix === 'needs-info' && !options.context) {
|
|
280
|
+
logWarn('Analysis says more information is needed:');
|
|
281
|
+
process.stderr.write(` ${reason}\n\n`);
|
|
282
|
+
log('Provide the missing info with --context "..." and re-run.');
|
|
283
|
+
log('Or use --interactive to discuss with Claude directly.\n');
|
|
284
|
+
process.exit(1);
|
|
285
|
+
}
|
|
286
|
+
if (canFix === 'needs-human' && !options.interactive) {
|
|
287
|
+
logWarn('Analysis says this needs human judgment:');
|
|
288
|
+
process.stderr.write(` ${reason}\n\n`);
|
|
289
|
+
log('Use --interactive to work through this with Claude.\n');
|
|
290
|
+
process.exit(1);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// --- Interactive mode ---
|
|
294
|
+
if (options.interactive) {
|
|
295
|
+
await runInteractiveFix(analysis, profile, options.context, siteUrl);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
// --- Autonomous mode: safety checks ---
|
|
299
|
+
if (!options.dryRun) {
|
|
300
|
+
const gitState = await checkGitState();
|
|
301
|
+
requireCleanTree(gitState);
|
|
302
|
+
}
|
|
303
|
+
// Create fix branch.
|
|
304
|
+
const branchName = options.branch
|
|
305
|
+
?? (analysis.ticket.key !== 'UNKNOWN' && analysis.ticket.key !== 'MANUAL'
|
|
306
|
+
? `fix/${analysis.ticket.key.toLowerCase()}`
|
|
307
|
+
: `fix/${Date.now()}`);
|
|
308
|
+
if (!options.dryRun) {
|
|
309
|
+
log(`Creating branch: ${branchName}`);
|
|
310
|
+
const branchCreated = await createFixBranch(branchName);
|
|
311
|
+
if (!branchCreated) {
|
|
312
|
+
logFail(`Could not create branch ${branchName}. Does it already exist?`);
|
|
313
|
+
log('Use --branch <name> to specify a different branch.\n');
|
|
314
|
+
process.exit(1);
|
|
315
|
+
}
|
|
316
|
+
logOk(`On branch ${branchName}`);
|
|
317
|
+
}
|
|
318
|
+
// --- Run the fix agent ---
|
|
319
|
+
log('Claude is working on the fix...\n');
|
|
320
|
+
const fixTask = buildFixTicketTask({
|
|
321
|
+
analysis,
|
|
322
|
+
siteProfile: profile,
|
|
323
|
+
additionalContext: options.context,
|
|
324
|
+
siteUrl: siteUrl ?? undefined,
|
|
325
|
+
maxTurns: options.boltConfig?.fix?.max_turns,
|
|
326
|
+
timeout: options.boltConfig?.fix?.timeout,
|
|
327
|
+
});
|
|
328
|
+
if (options.dryRun) {
|
|
329
|
+
// In dry-run, don't give file-modification tools.
|
|
330
|
+
fixTask.allowedTools = ['Bash', 'Read', 'Glob', 'Grep'];
|
|
331
|
+
}
|
|
332
|
+
const agentResult = await runAgent(fixTask);
|
|
333
|
+
if (!agentResult.success) {
|
|
334
|
+
logFail('Fix agent failed.');
|
|
335
|
+
if (agentResult.output.error) {
|
|
336
|
+
logFail(String(agentResult.output.error));
|
|
337
|
+
}
|
|
338
|
+
process.exit(1);
|
|
339
|
+
}
|
|
340
|
+
const fixResult = validateFixResult(agentResult.output);
|
|
341
|
+
if (!fixResult) {
|
|
342
|
+
logFail('Fix agent returned invalid result.');
|
|
343
|
+
process.stderr.write(` Raw: ${agentResult.rawResponse.slice(0, 500)}\n`);
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
// --- Show results ---
|
|
347
|
+
const durationSec = (agentResult.duration / 1000).toFixed(1);
|
|
348
|
+
log(`Fix completed in ${durationSec}s (${agentResult.numTurns} turns)`);
|
|
349
|
+
if (fixResult.status === 'failed' || fixResult.status === 'needs-human') {
|
|
350
|
+
logFail(`Status: ${fixResult.status}`);
|
|
351
|
+
process.stderr.write(`\n ${fixResult.explanation}\n\n`);
|
|
352
|
+
if (fixResult.followUp) {
|
|
353
|
+
for (const item of fixResult.followUp) {
|
|
354
|
+
process.stderr.write(` - ${item}\n`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
process.exit(1);
|
|
358
|
+
}
|
|
359
|
+
if (options.dryRun) {
|
|
360
|
+
process.stderr.write('\n━━━ Dry Run — Planned Changes ━━━\n');
|
|
361
|
+
for (const change of fixResult.changes) {
|
|
362
|
+
process.stderr.write(` ${change.type}: ${change.file}\n`);
|
|
363
|
+
if (change.description) {
|
|
364
|
+
process.stderr.write(` → ${change.description}\n`);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
process.stderr.write(`\n ${fixResult.explanation}\n\n`);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
// --- Post-fix test (unless skipped) ---
|
|
371
|
+
if (!options.skipTest) {
|
|
372
|
+
log('Running post-fix tests...');
|
|
373
|
+
try {
|
|
374
|
+
const { stdout } = await execFileAsync('node', [process.argv[1], 'test', '--output=json'], { timeout: 300_000, maxBuffer: 10 * 1024 * 1024 });
|
|
375
|
+
try {
|
|
376
|
+
const report = JSON.parse(stdout);
|
|
377
|
+
const summary = report.summary ?? {};
|
|
378
|
+
fixResult.testResults = {
|
|
379
|
+
passed: summary.passed ?? 0,
|
|
380
|
+
failed: summary.failed ?? 0,
|
|
381
|
+
suppressed: summary.suppressed ?? 0,
|
|
382
|
+
regressions: [],
|
|
383
|
+
};
|
|
384
|
+
logOk(`Tests: ${summary.passed} passed, ${summary.failed} failed, ${summary.suppressed} suppressed`);
|
|
385
|
+
if (summary.failed > 0) {
|
|
386
|
+
logWarn('Some tests failed — review before committing.');
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
logWarn('Could not parse test output.');
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
logWarn('Post-fix tests could not run (non-fatal).');
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// --- Confirmation gate ---
|
|
398
|
+
const changedFiles = await getChangedFiles();
|
|
399
|
+
if (changedFiles.length === 0) {
|
|
400
|
+
logWarn('No file changes detected. The fix may not have modified any files.');
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const confirmed = await showChangesAndConfirm(fixResult, changedFiles, options.yes);
|
|
404
|
+
if (!confirmed) {
|
|
405
|
+
log('Aborted. Changes are still on the branch — review or rollback manually.\n');
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
// --- Commit ---
|
|
409
|
+
const ticketRef = analysis.ticket.key !== 'UNKNOWN' && analysis.ticket.key !== 'MANUAL'
|
|
410
|
+
? analysis.ticket.key
|
|
411
|
+
: '';
|
|
412
|
+
const commitSubject = ticketRef
|
|
413
|
+
? `Fix ${ticketRef}: ${analysis.ticket.summary}`.slice(0, 72)
|
|
414
|
+
: `Fix: ${analysis.ticket.summary}`.slice(0, 72);
|
|
415
|
+
const commitBody = [
|
|
416
|
+
fixResult.explanation,
|
|
417
|
+
'',
|
|
418
|
+
fixResult.testResults
|
|
419
|
+
? `Bolt test: ${fixResult.testResults.passed} passed, ${fixResult.testResults.failed} failed, ${fixResult.testResults.suppressed} suppressed`
|
|
420
|
+
: 'Bolt test: skipped',
|
|
421
|
+
].join('\n');
|
|
422
|
+
try {
|
|
423
|
+
await execFileAsync('git', ['add', ...changedFiles], { timeout: 10_000 });
|
|
424
|
+
await execFileAsync('git', ['commit', '-m', `${commitSubject}\n\n${commitBody}`], { timeout: 10_000 });
|
|
425
|
+
logOk('Changes committed');
|
|
426
|
+
}
|
|
427
|
+
catch (err) {
|
|
428
|
+
logFail(`Commit failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
429
|
+
process.exit(1);
|
|
430
|
+
}
|
|
431
|
+
// --- PR creation (unless skipped) ---
|
|
432
|
+
if (!options.skipPr) {
|
|
433
|
+
log('Creating PR...');
|
|
434
|
+
try {
|
|
435
|
+
// Push branch first.
|
|
436
|
+
await execFileAsync('git', ['push', '-u', 'origin', branchName], { timeout: 30_000 });
|
|
437
|
+
// Create PR via gh CLI.
|
|
438
|
+
const prTitle = commitSubject;
|
|
439
|
+
const prBody = [
|
|
440
|
+
'## Summary',
|
|
441
|
+
'',
|
|
442
|
+
fixResult.explanation,
|
|
443
|
+
'',
|
|
444
|
+
'## Changes',
|
|
445
|
+
'',
|
|
446
|
+
...fixResult.changes.map(c => `- **${c.type}:** \`${c.file}\` — ${c.description}`),
|
|
447
|
+
'',
|
|
448
|
+
fixResult.testResults
|
|
449
|
+
? `## Test Results\n\n${fixResult.testResults.passed} passed, ${fixResult.testResults.failed} failed, ${fixResult.testResults.suppressed} suppressed`
|
|
450
|
+
: '',
|
|
451
|
+
'',
|
|
452
|
+
ticketRef ? `## Ticket\n\n${ticketRef}: ${analysis.ticket.summary}` : '',
|
|
453
|
+
'',
|
|
454
|
+
'---',
|
|
455
|
+
'*Generated by [Bolt](https://github.com/electriccitizen/bolt)*',
|
|
456
|
+
].filter(Boolean).join('\n');
|
|
457
|
+
const baseBranch = options.boltConfig?.pr?.base_branch ?? 'main';
|
|
458
|
+
const { stdout: prUrl } = await execFileAsync('gh', ['pr', 'create', '--title', prTitle, '--body', prBody, '--base', baseBranch], { timeout: 30_000 });
|
|
459
|
+
fixResult.pr = { url: prUrl.trim(), branch: branchName };
|
|
460
|
+
logOk(`PR created: ${prUrl.trim()}`);
|
|
461
|
+
}
|
|
462
|
+
catch (err) {
|
|
463
|
+
logWarn(`PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
464
|
+
log('Branch is pushed. Create the PR manually.');
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
// --- Output summary ---
|
|
468
|
+
process.stderr.write('\n');
|
|
469
|
+
const statusIcon = fixResult.status === 'fixed' ? '✓'
|
|
470
|
+
: fixResult.status === 'partial' ? '~'
|
|
471
|
+
: '✗';
|
|
472
|
+
process.stderr.write(` ${statusIcon} ${fixResult.status}: ${fixResult.explanation.slice(0, 200)}\n`);
|
|
473
|
+
if (fixResult.pr) {
|
|
474
|
+
process.stderr.write(` PR: ${fixResult.pr.url}\n`);
|
|
475
|
+
}
|
|
476
|
+
process.stderr.write('\n');
|
|
477
|
+
// Write JSON to stdout for piping.
|
|
478
|
+
process.stdout.write(JSON.stringify(fixResult, null, 2) + '\n');
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=fix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* bolt init — connect bolt to a client site.
|
|
3
3
|
*
|
|
4
|
-
* Full init:
|
|
5
|
-
* Upgrade mode (--upgrade):
|
|
4
|
+
* Full init: composer require bolt-inspect, enable module, create config.
|
|
5
|
+
* Upgrade mode (--upgrade): composer update bolt-inspect, clear caches.
|
|
6
6
|
*/
|
|
7
7
|
export interface InitOptions {
|
|
8
8
|
skipComposer: boolean;
|
|
9
9
|
skipModule: boolean;
|
|
10
10
|
upgrade: boolean;
|
|
11
|
+
yes: boolean;
|
|
11
12
|
}
|
|
12
13
|
export declare function initCommand(options: InitOptions): Promise<void>;
|