@boopkit/cli 0.4.0 → 0.4.1

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.
@@ -4,7 +4,7 @@
4
4
  "@boopkit/cap-cloud-storage": "0.4.0",
5
5
  "@boopkit/cap-coding": "0.4.0",
6
6
  "@boopkit/cap-database": "0.4.0",
7
- "@boopkit/cap-email": "0.4.0",
7
+ "@boopkit/cap-email": "0.4.1",
8
8
  "@boopkit/cap-hello": "0.4.0",
9
9
  "@boopkit/cap-noticeboard": "0.4.0",
10
10
  "@boopkit/cap-product-design": "0.4.0",
@@ -12,7 +12,7 @@
12
12
  "@boopkit/cap-services": "0.4.0",
13
13
  "@boopkit/cap-skills": "0.4.0",
14
14
  "@boopkit/cap-testing": "0.4.0",
15
- "@boopkit/cap-users": "0.4.0",
16
- "@boopkit/cap-web": "0.4.0",
15
+ "@boopkit/cap-users": "0.4.1",
16
+ "@boopkit/cap-web": "0.4.1",
17
17
  "@boopkit/logger": "0.4.0"
18
18
  }
@@ -566,10 +566,21 @@ async function runLoop(options) {
566
566
  return;
567
567
  }
568
568
  if (flow && !fs.existsSync(flow)) {
569
- console.error(`\x1b[31mERR\x1b[0m --flow file not found: ${flow}`);
569
+ console.error(`\x1b[31mERR\x1b[0m --flow path not found: ${flow}`);
570
570
  process.exitCode = 1;
571
571
  return;
572
572
  }
573
+ // If --flow points to a directory (e.g. a skill folder), resolve to its SKILL.md
574
+ let resolvedFlow = flow;
575
+ if (flow && fs.statSync(flow).isDirectory()) {
576
+ const skillPath = path.join(flow, 'SKILL.md');
577
+ if (!fs.existsSync(skillPath)) {
578
+ console.error(`\x1b[31mERR\x1b[0m --flow directory has no SKILL.md: ${flow}`);
579
+ process.exitCode = 1;
580
+ return;
581
+ }
582
+ resolvedFlow = skillPath;
583
+ }
573
584
  const dryRun = !options.run;
574
585
  const maxIssues = parseInt(options.max || '0', 10);
575
586
  const budget = options.budget || '5.00';
@@ -586,12 +597,12 @@ async function runLoop(options) {
586
597
  const logDir = path.join(projectDir, 'labs', 'claude-runs');
587
598
  fs.mkdirSync(logDir, { recursive: true });
588
599
  // Planning mode dry-run
589
- if (dryRun && work && flow) {
600
+ if (dryRun && work && resolvedFlow) {
590
601
  const workContent = fs.readFileSync(work, 'utf8');
591
- const flowContent = fs.readFileSync(flow, 'utf8');
602
+ const flowContent = fs.readFileSync(resolvedFlow, 'utf8');
592
603
  console.log('[bd-loop] PLANNING MODE (dry-run)');
593
604
  console.log(`[bd-loop] Work file: ${work}`);
594
- console.log(`[bd-loop] Flow file: ${flow}`);
605
+ console.log(`[bd-loop] Flow file: ${resolvedFlow}${resolvedFlow !== flow ? ` (resolved from ${flow})` : ''}`);
595
606
  console.log('[bd-loop] Planning prompt that would be sent:');
596
607
  console.log('---');
597
608
  console.log(buildPlanningPrompt(workContent, flowContent, prefix));
@@ -600,10 +611,10 @@ async function runLoop(options) {
600
611
  return;
601
612
  }
602
613
  // Planning phase: create feature tree before looping
603
- if (work && flow) {
614
+ if (work && resolvedFlow) {
604
615
  const planResult = await planWork({
605
616
  workPath: work,
606
- flowPath: flow,
617
+ flowPath: resolvedFlow,
607
618
  prefix,
608
619
  budget,
609
620
  model,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boopkit/cli",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "boop: the opinionated bootstrap for founder friendly, AI-first web apps - code plus agent skills, composable from day one.",
5
5
  "main": "dist/cli.js",
6
6
  "workspaces": [