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 +6 -0
- package/dist/planning/index.js +80 -15
- package/dist/planning/index.js.map +1 -1
- package/package.json +1 -1
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
|
package/dist/planning/index.js
CHANGED
|
@@ -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
|
-
|
|
22
|
-
|
|
23
|
-
'
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/planning/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED