@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 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 - outputs prompt for Claude Code to execute
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 for Claude Code
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.cyan}${c.bold}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
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
- ${prompt}
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.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
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
- // Show next task
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
- console.log(`
341
- ${c.dim}Progress: ${stats.completed}/${stats.total} tasks (${Math.round(stats.completedPercent)}%)${c.reset}
342
- `);
399
+ // Auto-queue next task
400
+ const nextTask = buildState.getNextTask(projectRoot);
343
401
 
344
402
  if (nextTask) {
345
- console.log(`${c.bold}Next up:${c.reset} ${nextTask.title}`);
346
- console.log(`\n${c.dim}Run ${c.reset}${c.bold}bootspring build${c.reset}${c.dim} to continue${c.reset}\n`);
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
- console.log(`${c.green}${c.bold}🎉 All tasks complete!${c.reset}\n`);
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
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "contractVersion": "v1",
3
3
  "packageName": "@girardmedia/bootspring",
4
- "packageVersion": "2.0.7",
4
+ "packageVersion": "2.0.8",
5
5
  "tools": [
6
6
  {
7
7
  "name": "bootspring_assist",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@girardmedia/bootspring",
3
- "version": "2.0.7",
3
+ "version": "2.0.8",
4
4
  "description": "Development scaffolding with intelligence - AI-powered context, agents, and workflows for any MCP-compatible assistant",
5
5
  "keywords": [
6
6
  "ai",