bemadralphy 0.3.4 → 0.3.6

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/README.md CHANGED
@@ -509,6 +509,12 @@ node dist/cli.js --help
509
509
  - If auto-install/update fails, `init` still completes with warnings and reports actionable install hints.
510
510
  - Use `bemadralphy doctor` to check readiness before full pipeline runs.
511
511
 
512
+ Planning fallback behavior:
513
+
514
+ - If BMAD install/update enters an interactive prompt and cannot run unattended, BeMadRalphy generates minimal fallback planning artifacts so the pipeline can continue.
515
+ - If BMAD exits successfully but still leaves missing/empty planning artifacts, the same fallback is generated.
516
+ - Fallback files include explicit markers indicating BMAD automation needs to be rerun when non-interactive BMAD workflows are available.
517
+
512
518
  Typical recovery flow:
513
519
 
514
520
  ```bash
@@ -1,4 +1,4 @@
1
- import { mkdir } from 'node:fs/promises';
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { assertCommandExists, runCommand } from '../utils/exec.js';
4
4
  import { logInfo } from '../utils/logging.js';
@@ -18,20 +18,85 @@ export async function runPlanning(ctx) {
18
18
  return;
19
19
  }
20
20
  await assertCommandExists('bmad', 'Install with: npm install -g bmad-method');
21
- await runCommand('bmad', [
22
- 'install',
23
- '--action',
24
- 'quick-update',
25
- '--directory',
26
- ctx.projectRoot,
27
- '--output-folder',
28
- '_bmad-output',
29
- '--tools',
30
- 'none',
31
- '--yes',
32
- ], ctx.projectRoot);
33
- logInfo('planning: BMAD install/update completed');
34
- await validateBmadOutputs(outputs);
21
+ let usedFallback = false;
22
+ try {
23
+ await runCommand('bmad', [
24
+ 'install',
25
+ '--action',
26
+ 'quick-update',
27
+ '--directory',
28
+ ctx.projectRoot,
29
+ '--output-folder',
30
+ '_bmad-output',
31
+ '--tools',
32
+ 'none',
33
+ '--yes',
34
+ ], ctx.projectRoot);
35
+ logInfo('planning: BMAD install/update completed');
36
+ }
37
+ catch (error) {
38
+ const message = error.message;
39
+ if (isLikelyInteractiveInstallError(message)) {
40
+ logInfo('planning: BMAD install appears interactive; generating fallback planning artifacts');
41
+ await writeFallbackPlanningOutputs(ctx.projectRoot, outputs, 'BMAD install required interactive input.');
42
+ usedFallback = true;
43
+ }
44
+ else {
45
+ throw error;
46
+ }
47
+ }
48
+ try {
49
+ await validateBmadOutputs(outputs);
50
+ }
51
+ catch (error) {
52
+ const message = error.message;
53
+ if (!usedFallback && isMissingOrEmptyPlanningOutputError(message)) {
54
+ logInfo('planning: BMAD did not produce required outputs; generating fallback planning artifacts');
55
+ await writeFallbackPlanningOutputs(ctx.projectRoot, outputs, 'BMAD command completed without generating required planning artifacts.');
56
+ await validateBmadOutputs(outputs);
57
+ }
58
+ else {
59
+ throw error;
60
+ }
61
+ }
35
62
  logInfo('planning: BMAD outputs validated');
36
63
  }
64
+ function isLikelyInteractiveInstallError(message) {
65
+ const lowered = message.toLowerCase();
66
+ return (lowered.includes('install to this directory') ||
67
+ lowered.includes('yes / no') ||
68
+ lowered.includes('prompt') ||
69
+ lowered.includes('tty') ||
70
+ lowered.includes('interactive'));
71
+ }
72
+ async function writeFallbackPlanningOutputs(projectRoot, outputs, reason) {
73
+ const idea = await readIdea(projectRoot);
74
+ await Promise.all([
75
+ writeFile(outputs.productBriefPath, ['# Product Brief', '', `> Generated fallback: ${reason}`, '', idea].join('\n'), 'utf-8'),
76
+ writeFile(outputs.prdPath, ['# PRD', '', `> Generated fallback: ${reason}`, '', idea].join('\n'), 'utf-8'),
77
+ writeFile(outputs.architecturePath, [
78
+ '# Architecture',
79
+ '',
80
+ `> Generated fallback: ${reason}`,
81
+ '',
82
+ '## Initial Constraints',
83
+ '- Refine architecture after BMAD becomes available.',
84
+ ].join('\n'), 'utf-8'),
85
+ writeFile(outputs.storiesPath, ['# Epics', '', '## Epic 1: Bootstrap', '### Story 1.1: Replace fallback planning outputs with BMAD outputs.'].join('\n'), 'utf-8'),
86
+ ]);
87
+ }
88
+ async function readIdea(projectRoot) {
89
+ try {
90
+ const raw = await readFile(path.join(projectRoot, 'idea.md'), 'utf-8');
91
+ const trimmed = raw.trim();
92
+ return trimmed.length > 0 ? trimmed : 'No idea.md content found.';
93
+ }
94
+ catch {
95
+ return 'No idea.md found.';
96
+ }
97
+ }
98
+ function isMissingOrEmptyPlanningOutputError(message) {
99
+ const lowered = message.toLowerCase();
100
+ return lowered.includes('missing') || lowered.includes('empty');
101
+ }
37
102
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/planning/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAoB;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG;QACd,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC;QAC1D,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;QACvC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;QACzD,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;KAC/C,CAAC;IAEF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,CAAC,6CAA6C,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,MAAM,mBAAmB,CAAC,MAAM,EAAE,0CAA0C,CAAC,CAAC;IAC9E,MAAM,UAAU,CACd,MAAM,EACN;QACE,SAAS;QACT,UAAU;QACV,cAAc;QACd,aAAa;QACb,GAAG,CAAC,WAAW;QACf,iBAAiB;QACjB,cAAc;QACd,SAAS;QACT,MAAM;QACN,OAAO;KACR,EACD,GAAG,CAAC,WAAW,CAChB,CAAC;IACF,OAAO,CAAC,yCAAyC,CAAC,CAAC;IAEnD,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,kCAAkC,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/planning/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bemadralphy",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "description": "CLI-only orchestrator merging BMAD, Beads, Ralphy, and OpenSpec into an end-to-end automated coding pipeline.",
5
5
  "license": "MIT",
6
6
  "type": "module",