buildcrew 1.8.2 → 1.8.4

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.
Files changed (2) hide show
  1. package/bin/setup.js +42 -13
  2. package/package.json +1 -1
package/bin/setup.js CHANGED
@@ -303,16 +303,37 @@ ${d.hasAI ? "- AI-generated content treated as untrusted (sanitize before render
303
303
  if (d.apiRoutes.length > 0) log(` ${CYAN}API Routes${RESET} ${d.apiRoutes.length} found`);
304
304
  if (d.locales.length > 0) log(` ${CYAN}Locales${RESET} ${d.locales.join(", ")}`);
305
305
 
306
- // Available extras
306
+ // Interactive: offer remaining templates
307
307
  const remaining = Object.entries(TEMPLATES).filter(([name, t]) => t.file && !autoTemplates.includes(name));
308
308
  if (remaining.length > 0) {
309
- log(`\n ${BOLD}Add more:${RESET}`);
310
- for (const [name, t] of remaining) {
311
- log(` ${DIM}npx buildcrew add ${CYAN}${name}${RESET}`);
309
+ log(`\n ${BOLD}Additional harness files available:${RESET}\n`);
310
+ for (let i = 0; i < remaining.length; i++) {
311
+ const [name, t] = remaining[i];
312
+ log(` ${BOLD}${i + 1})${RESET} ${CYAN}${name}${RESET} — ${DIM}${t.desc}${RESET}`);
313
+ }
314
+ log(` ${BOLD}A)${RESET} All of the above`);
315
+ log(` ${BOLD}S)${RESET} Skip\n`);
316
+
317
+ const answer = await ask(` Which ones? ${DIM}(numbers separated by space, A for all, S to skip)${RESET} `);
318
+
319
+ if (answer === "a" || answer === "all") {
320
+ for (const [name, t] of remaining) {
321
+ await copyFile(join(TEMPLATES_SRC, t.file), join(HARNESS_DIR, `${name}.md`));
322
+ log(` ${GREEN} + ${RESET} ${name}.md`);
323
+ }
324
+ log("");
325
+ } else if (answer && answer !== "s" && answer !== "skip") {
326
+ const nums = answer.split(/[\s,]+/).map(n => parseInt(n) - 1).filter(n => n >= 0 && n < remaining.length);
327
+ for (const idx of nums) {
328
+ const [name, t] = remaining[idx];
329
+ await copyFile(join(TEMPLATES_SRC, t.file), join(HARNESS_DIR, `${name}.md`));
330
+ log(` ${GREEN} + ${RESET} ${name}.md`);
331
+ }
332
+ if (nums.length > 0) log("");
312
333
  }
313
334
  }
314
335
 
315
- log(`\n ${BOLD}Next step:${RESET} Edit ${CYAN}.claude/harness/*.md${RESET} to fill in project-specific details.`);
336
+ log(` ${BOLD}Next step:${RESET} Edit ${CYAN}.claude/harness/*.md${RESET} fill in project-specific details.`);
316
337
  log(` ${DIM}Look for <!-- comments --> — those are the parts to customize.${RESET}\n`);
317
338
  }
318
339
 
@@ -454,16 +475,12 @@ async function runInstall(force) {
454
475
  if (installed > 0 || updated > 0) log(` ${GREEN}${BOLD}Done!${RESET} ${parts.join(", ")}.\n`);
455
476
  else log(` ${GREEN}All agents up-to-date.${RESET} (v${VERSION})\n`);
456
477
 
457
- if (!(await exists(join(HARNESS_DIR, "project.md")))) {
458
- log(` ${CYAN}Next:${RESET} ${BOLD}npx buildcrew init${RESET} — auto-generates project harness from your codebase.\n`);
459
- }
460
-
461
- // Check Playwright MCP (required for browser-qa, design-reviewer, canary-monitor, designer)
478
+ // ─── Step 2: Playwright MCP ───
462
479
  try {
463
480
  const { execSync } = await import("child_process");
464
481
  const mcpList = execSync("claude mcp list 2>/dev/null", { encoding: "utf8" });
465
482
  if (!mcpList.includes("playwright")) {
466
- log(`\n ${YELLOW}Playwright MCP${RESET} is needed for browser testing agents.`);
483
+ log(` ${YELLOW}Playwright MCP${RESET} is needed for browser testing agents.`);
467
484
  log(` ${DIM}Used by: browser-qa, design-reviewer, canary-monitor, designer${RESET}\n`);
468
485
  const answer = await ask(` Install Playwright MCP now? ${BOLD}(Y/n)${RESET} `);
469
486
  if (answer === "" || answer === "y" || answer === "yes") {
@@ -476,14 +493,26 @@ async function runInstall(force) {
476
493
  log(` ${BOLD}claude mcp add playwright -- npx @anthropic-ai/mcp-server-playwright${RESET}\n`);
477
494
  }
478
495
  } else {
479
- log(`\n ${DIM}Skipped. Install later with:${RESET}`);
480
- log(` ${BOLD}claude mcp add playwright -- npx @anthropic-ai/mcp-server-playwright${RESET}\n`);
496
+ log(`\n ${DIM}Skipped. Run later: claude mcp add playwright -- npx @anthropic-ai/mcp-server-playwright${RESET}\n`);
481
497
  }
482
498
  } else {
483
499
  log(` ${GREEN}Playwright MCP:${RESET} installed ✓\n`);
484
500
  }
485
501
  } catch { /* claude CLI not available, skip */ }
486
502
 
503
+ // ─── Step 3: Project harness ───
504
+ if (!(await exists(join(HARNESS_DIR, "project.md")))) {
505
+ const initAnswer = await ask(` Generate project harness? ${DIM}(auto-detects your stack)${RESET} ${BOLD}(Y/n)${RESET} `);
506
+ if (initAnswer === "" || initAnswer === "y" || initAnswer === "yes") {
507
+ log("");
508
+ await runInit(false);
509
+ } else {
510
+ log(`\n ${DIM}Skipped. Run later: npx buildcrew init${RESET}\n`);
511
+ }
512
+ } else {
513
+ log(` ${GREEN}Project harness:${RESET} exists ✓\n`);
514
+ }
515
+
487
516
  log(` ${BOLD}Start:${RESET} @buildcrew [your request]\n`);
488
517
  }
489
518
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "buildcrew",
3
- "version": "1.8.2",
3
+ "version": "1.8.4",
4
4
  "description": "15 AI agents for Claude Code — full development lifecycle from product thinking to production monitoring",
5
5
  "homepage": "https://buildcrew-landing.vercel.app",
6
6
  "author": "z1nun",