@girardmedia/bootspring 2.0.7 → 2.0.8
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/cli/build.js +91 -19
- package/mcp/contracts/mcp-contract.v1.json +1 -1
- package/package.json +1 -1
package/cli/build.js
CHANGED
|
@@ -235,7 +235,7 @@ Some tasks may be blocked. Run ${c.cyan}bootspring build status${c.reset} for de
|
|
|
235
235
|
}
|
|
236
236
|
|
|
237
237
|
/**
|
|
238
|
-
* Build the next task -
|
|
238
|
+
* Build the next task - writes to CURRENT_TASK.md for Claude Code
|
|
239
239
|
*/
|
|
240
240
|
async function buildNextTask(projectRoot, _args = {}) {
|
|
241
241
|
const state = buildState.load(projectRoot);
|
|
@@ -249,29 +249,88 @@ async function buildNextTask(projectRoot, _args = {}) {
|
|
|
249
249
|
|
|
250
250
|
if (!nextTask) {
|
|
251
251
|
console.log(`${c.green}All tasks complete!${c.reset}`);
|
|
252
|
+
clearCurrentTask(projectRoot);
|
|
252
253
|
return;
|
|
253
254
|
}
|
|
254
255
|
|
|
255
256
|
// Mark task as in progress
|
|
256
257
|
buildState.updateProgress(projectRoot, nextTask.id, 'in_progress');
|
|
257
258
|
|
|
258
|
-
// Generate the task prompt
|
|
259
|
+
// Generate the task prompt
|
|
259
260
|
const prompt = generateTaskPrompt(nextTask, projectRoot);
|
|
260
261
|
|
|
262
|
+
// Write to CURRENT_TASK.md for Claude Code to read
|
|
263
|
+
const taskFile = writeCurrentTask(projectRoot, nextTask, prompt);
|
|
264
|
+
|
|
261
265
|
console.log(`
|
|
262
|
-
${c.
|
|
263
|
-
${c.bold}TASK: ${nextTask.title}${c.reset}
|
|
264
|
-
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
266
|
+
${c.green}${c.bold}✓ Task ready for Claude Code${c.reset}
|
|
265
267
|
|
|
266
|
-
${
|
|
268
|
+
${c.bold}Task:${c.reset} ${nextTask.title}
|
|
269
|
+
${c.bold}File:${c.reset} ${path.relative(projectRoot, taskFile)}
|
|
270
|
+
|
|
271
|
+
${c.cyan}${c.bold}Tell Claude Code:${c.reset}
|
|
272
|
+
"Read planning/CURRENT_TASK.md and implement it"
|
|
267
273
|
|
|
268
|
-
${c.
|
|
269
|
-
${c.dim}When complete, run: ${c.reset}${c.bold}bootspring build done${c.reset}
|
|
270
|
-
${c.dim}To skip this task: ${c.reset}${c.bold}bootspring build skip${c.reset}
|
|
271
|
-
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
274
|
+
${c.dim}Or for the loop, select option 2 to run autonomously.${c.reset}
|
|
272
275
|
`);
|
|
273
276
|
}
|
|
274
277
|
|
|
278
|
+
/**
|
|
279
|
+
* Write current task to planning/CURRENT_TASK.md
|
|
280
|
+
*/
|
|
281
|
+
function writeCurrentTask(projectRoot, task, prompt) {
|
|
282
|
+
const planningDir = path.join(projectRoot, 'planning');
|
|
283
|
+
if (!fs.existsSync(planningDir)) {
|
|
284
|
+
fs.mkdirSync(planningDir, { recursive: true });
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const taskFile = path.join(planningDir, 'CURRENT_TASK.md');
|
|
288
|
+
const content = `# Current Task
|
|
289
|
+
|
|
290
|
+
> This file is auto-generated by bootspring. Claude Code should read this and implement the task.
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## ${task.title}
|
|
295
|
+
|
|
296
|
+
${prompt}
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## When Complete
|
|
301
|
+
|
|
302
|
+
Run this command to mark the task done and get the next task:
|
|
303
|
+
|
|
304
|
+
\`\`\`bash
|
|
305
|
+
bootspring build done
|
|
306
|
+
\`\`\`
|
|
307
|
+
|
|
308
|
+
Or to skip this task:
|
|
309
|
+
|
|
310
|
+
\`\`\`bash
|
|
311
|
+
bootspring build skip
|
|
312
|
+
\`\`\`
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
*Task ID: ${task.id}*
|
|
317
|
+
*Generated: ${new Date().toISOString()}*
|
|
318
|
+
`;
|
|
319
|
+
|
|
320
|
+
fs.writeFileSync(taskFile, content);
|
|
321
|
+
return taskFile;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Clear the current task file
|
|
326
|
+
*/
|
|
327
|
+
function clearCurrentTask(projectRoot) {
|
|
328
|
+
const taskFile = path.join(projectRoot, 'planning', 'CURRENT_TASK.md');
|
|
329
|
+
if (fs.existsSync(taskFile)) {
|
|
330
|
+
fs.unlinkSync(taskFile);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
275
334
|
/**
|
|
276
335
|
* Generate a prompt for Claude Code to execute
|
|
277
336
|
*/
|
|
@@ -310,7 +369,7 @@ function generateTaskPrompt(task, projectRoot) {
|
|
|
310
369
|
}
|
|
311
370
|
|
|
312
371
|
/**
|
|
313
|
-
* Mark current task as done
|
|
372
|
+
* Mark current task as done and auto-queue next
|
|
314
373
|
*/
|
|
315
374
|
async function markTaskDone(projectRoot, _args = {}) {
|
|
316
375
|
const state = buildState.load(projectRoot);
|
|
@@ -333,19 +392,32 @@ async function markTaskDone(projectRoot, _args = {}) {
|
|
|
333
392
|
|
|
334
393
|
console.log(`${c.green}✓${c.reset} Completed: ${c.bold}${inProgressTask.title}${c.reset}`);
|
|
335
394
|
|
|
336
|
-
//
|
|
337
|
-
const nextTask = buildState.getNextTask(projectRoot);
|
|
395
|
+
// Get stats
|
|
338
396
|
const stats = buildState.getStats(projectRoot);
|
|
397
|
+
console.log(`${c.dim}Progress: ${stats.completed}/${stats.total} tasks (${Math.round(stats.completedPercent)}%)${c.reset}`);
|
|
339
398
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
`);
|
|
399
|
+
// Auto-queue next task
|
|
400
|
+
const nextTask = buildState.getNextTask(projectRoot);
|
|
343
401
|
|
|
344
402
|
if (nextTask) {
|
|
345
|
-
|
|
346
|
-
|
|
403
|
+
// Mark as in progress and write to CURRENT_TASK.md
|
|
404
|
+
buildState.updateProgress(projectRoot, nextTask.id, 'in_progress');
|
|
405
|
+
const prompt = generateTaskPrompt(nextTask, projectRoot);
|
|
406
|
+
const taskFile = writeCurrentTask(projectRoot, nextTask, prompt);
|
|
407
|
+
|
|
408
|
+
console.log(`
|
|
409
|
+
${c.cyan}${c.bold}Next task ready:${c.reset} ${nextTask.title}
|
|
410
|
+
${c.dim}File: ${path.relative(projectRoot, taskFile)}${c.reset}
|
|
411
|
+
|
|
412
|
+
${c.bold}Continue working on planning/CURRENT_TASK.md${c.reset}
|
|
413
|
+
`);
|
|
347
414
|
} else {
|
|
348
|
-
|
|
415
|
+
clearCurrentTask(projectRoot);
|
|
416
|
+
console.log(`
|
|
417
|
+
${c.green}${c.bold}🎉 All tasks complete!${c.reset}
|
|
418
|
+
|
|
419
|
+
Your MVP build is finished.
|
|
420
|
+
`);
|
|
349
421
|
}
|
|
350
422
|
}
|
|
351
423
|
|
package/package.json
CHANGED