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.
- package/bin/setup.js +42 -13
- 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
|
-
//
|
|
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}
|
|
310
|
-
for (
|
|
311
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
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",
|