bemadralphy 2.0.3 → 2.0.5
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/dist/beads/adapter.js
CHANGED
|
@@ -5,32 +5,59 @@ export async function storiesToBeads(storyPaths) {
|
|
|
5
5
|
for (const storyPath of storyPaths) {
|
|
6
6
|
const contents = await readFile(storyPath, 'utf-8');
|
|
7
7
|
const lines = contents.split(/\r?\n/);
|
|
8
|
-
let
|
|
8
|
+
let currentTask = null;
|
|
9
|
+
const flushTask = () => {
|
|
10
|
+
if (currentTask) {
|
|
11
|
+
tasks.push({
|
|
12
|
+
storyId: currentTask.storyId,
|
|
13
|
+
title: currentTask.title,
|
|
14
|
+
description: currentTask.descriptionLines.length > 0
|
|
15
|
+
? currentTask.descriptionLines.join('\n').trim()
|
|
16
|
+
: 'No implementation steps provided.',
|
|
17
|
+
dependencies: currentTask.dependencies,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
};
|
|
9
21
|
for (const line of lines) {
|
|
22
|
+
// New story header (### Story X.Y: Title)
|
|
10
23
|
if (line.startsWith('### ')) {
|
|
11
|
-
|
|
24
|
+
flushTask();
|
|
25
|
+
currentTask = {
|
|
12
26
|
storyId: `story-${counter++}`,
|
|
13
27
|
title: line.replace(/^###\s+/, ''),
|
|
14
|
-
|
|
15
|
-
dependencies:
|
|
16
|
-
}
|
|
17
|
-
|
|
28
|
+
descriptionLines: [],
|
|
29
|
+
dependencies: [],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// New epic header (## Epic X) - flush but don't create task for the epic itself
|
|
33
|
+
else if (line.startsWith('## ')) {
|
|
34
|
+
flushTask();
|
|
35
|
+
currentTask = null;
|
|
18
36
|
}
|
|
37
|
+
// Dependency line
|
|
19
38
|
else if (line.trim().toLowerCase().startsWith('- depends on:')) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
39
|
+
if (currentTask) {
|
|
40
|
+
const value = line.split(':', 2)[1]?.trim() ?? '';
|
|
41
|
+
if (value) {
|
|
42
|
+
const parsed = value
|
|
43
|
+
.split(',')
|
|
44
|
+
.map((entry) => entry.trim())
|
|
45
|
+
.filter(Boolean);
|
|
46
|
+
for (const dependency of parsed) {
|
|
47
|
+
if (!currentTask.dependencies.includes(dependency)) {
|
|
48
|
+
currentTask.dependencies.push(dependency);
|
|
49
|
+
}
|
|
29
50
|
}
|
|
30
51
|
}
|
|
31
52
|
}
|
|
32
53
|
}
|
|
54
|
+
// Any other content under a story - capture it as description
|
|
55
|
+
else if (currentTask && line.trim()) {
|
|
56
|
+
currentTask.descriptionLines.push(line);
|
|
57
|
+
}
|
|
33
58
|
}
|
|
59
|
+
// Don't forget the last task
|
|
60
|
+
flushTask();
|
|
34
61
|
}
|
|
35
62
|
return tasks;
|
|
36
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/beads/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAS5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAoB;IACvD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/beads/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAS5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAoB;IACvD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,WAAW,GAAkG,IAAI,CAAC;QAEtH,MAAM,SAAS,GAAG,GAAG,EAAE;YACrB,IAAI,WAAW,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC;oBACT,OAAO,EAAE,WAAW,CAAC,OAAO;oBAC5B,KAAK,EAAE,WAAW,CAAC,KAAK;oBACxB,WAAW,EAAE,WAAW,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;wBAClD,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;wBAChD,CAAC,CAAC,mCAAmC;oBACvC,YAAY,EAAE,WAAW,CAAC,YAAY;iBACvC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,0CAA0C;YAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,SAAS,EAAE,CAAC;gBACZ,WAAW,GAAG;oBACZ,OAAO,EAAE,SAAS,OAAO,EAAE,EAAE;oBAC7B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;oBAClC,gBAAgB,EAAE,EAAE;oBACpB,YAAY,EAAE,EAAE;iBACjB,CAAC;YACJ,CAAC;YACD,gFAAgF;iBAC3E,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,SAAS,EAAE,CAAC;gBACZ,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;YACD,kBAAkB;iBACb,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC/D,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;oBAClD,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,MAAM,GAAG,KAAK;6BACjB,KAAK,CAAC,GAAG,CAAC;6BACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;6BAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;wBACnB,KAAK,MAAM,UAAU,IAAI,MAAM,EAAE,CAAC;4BAChC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gCACnD,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;4BAC5C,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,8DAA8D;iBACzD,IAAI,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACpC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,SAAS,EAAE,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/cli.js
CHANGED
|
File without changes
|
|
@@ -1,7 +1,16 @@
|
|
|
1
|
+
import { copyFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
1
3
|
import { logInfo } from '../utils/logging.js';
|
|
2
4
|
import { assertCommandExists, runCommand } from '../utils/exec.js';
|
|
3
5
|
export async function runClaudeTeamsBatch(projectRoot, maxParallel) {
|
|
4
6
|
logInfo(`swarm: running Claude teams batch (maxParallel=${maxParallel})`);
|
|
7
|
+
// Ralphy expects PRD.md in root, but BeMadRalphy generates in _bmad-output/
|
|
8
|
+
const bmadPrd = path.join(projectRoot, '_bmad-output', 'prd.md');
|
|
9
|
+
const rootPrd = path.join(projectRoot, 'PRD.md');
|
|
10
|
+
if (existsSync(bmadPrd) && !existsSync(rootPrd)) {
|
|
11
|
+
logInfo('swarm: copying _bmad-output/prd.md to PRD.md for ralphy compatibility');
|
|
12
|
+
copyFileSync(bmadPrd, rootPrd);
|
|
13
|
+
}
|
|
5
14
|
await assertCommandExists('ralphy', 'Install with: npm install -g ralphy-cli');
|
|
6
15
|
await runCommand('ralphy', ['--claude', '--parallel', '--max-parallel', String(maxParallel), '--max-iterations', '1'], projectRoot);
|
|
7
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-teams.js","sourceRoot":"","sources":["../../src/swarm/claude-teams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,WAAmB;IAChF,OAAO,CAAC,kDAAkD,WAAW,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-teams.js","sourceRoot":"","sources":["../../src/swarm/claude-teams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,WAAmB;IAChF,OAAO,CAAC,kDAAkD,WAAW,GAAG,CAAC,CAAC;IAE1E,4EAA4E;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,uEAAuE,CAAC,CAAC;QACjF,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,mBAAmB,CAAC,QAAQ,EAAE,yCAAyC,CAAC,CAAC;IAC/E,MAAM,UAAU,CACd,QAAQ,EACR,CAAC,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,EAC1F,WAAW,CACZ,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED