bemadralphy 0.1.0
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/LICENSE +21 -0
- package/README.md +468 -0
- package/dist/beads/adapter.d.ts +5 -0
- package/dist/beads/adapter.js +16 -0
- package/dist/beads/adapter.js.map +1 -0
- package/dist/beads/index.d.ts +3 -0
- package/dist/beads/index.js +4 -0
- package/dist/beads/index.js.map +1 -0
- package/dist/beads/parse-tasks.d.ts +2 -0
- package/dist/beads/parse-tasks.js +12 -0
- package/dist/beads/parse-tasks.js.map +1 -0
- package/dist/beads/tasks-md.d.ts +6 -0
- package/dist/beads/tasks-md.js +8 -0
- package/dist/beads/tasks-md.js.map +1 -0
- package/dist/beads/writer.d.ts +12 -0
- package/dist/beads/writer.js +60 -0
- package/dist/beads/writer.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/cost.d.ts +6 -0
- package/dist/cost.js +18 -0
- package/dist/cost.js.map +1 -0
- package/dist/docs/pr-body.d.ts +8 -0
- package/dist/docs/pr-body.js +11 -0
- package/dist/docs/pr-body.js.map +1 -0
- package/dist/engines/claude.d.ts +1 -0
- package/dist/engines/claude.js +11 -0
- package/dist/engines/claude.js.map +1 -0
- package/dist/engines/cli-adapter.d.ts +12 -0
- package/dist/engines/cli-adapter.js +36 -0
- package/dist/engines/cli-adapter.js.map +1 -0
- package/dist/engines/cli.d.ts +14 -0
- package/dist/engines/cli.js +72 -0
- package/dist/engines/cli.js.map +1 -0
- package/dist/engines/codex.d.ts +1 -0
- package/dist/engines/codex.js +10 -0
- package/dist/engines/codex.js.map +1 -0
- package/dist/engines/copilot.d.ts +1 -0
- package/dist/engines/copilot.js +10 -0
- package/dist/engines/copilot.js.map +1 -0
- package/dist/engines/cursor.d.ts +1 -0
- package/dist/engines/cursor.js +10 -0
- package/dist/engines/cursor.js.map +1 -0
- package/dist/engines/gemini.d.ts +1 -0
- package/dist/engines/gemini.js +10 -0
- package/dist/engines/gemini.js.map +1 -0
- package/dist/engines/index.d.ts +2 -0
- package/dist/engines/index.js +21 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/kimi.d.ts +1 -0
- package/dist/engines/kimi.js +10 -0
- package/dist/engines/kimi.js.map +1 -0
- package/dist/engines/opencode.d.ts +1 -0
- package/dist/engines/opencode.js +10 -0
- package/dist/engines/opencode.js.map +1 -0
- package/dist/engines/prompt-template.d.ts +2 -0
- package/dist/engines/prompt-template.js +96 -0
- package/dist/engines/prompt-template.js.map +1 -0
- package/dist/engines/qwen.d.ts +1 -0
- package/dist/engines/qwen.js +10 -0
- package/dist/engines/qwen.js.map +1 -0
- package/dist/engines/ralphy.d.ts +1 -0
- package/dist/engines/ralphy.js +10 -0
- package/dist/engines/ralphy.js.map +1 -0
- package/dist/engines/stub.d.ts +2 -0
- package/dist/engines/stub.js +17 -0
- package/dist/engines/stub.js.map +1 -0
- package/dist/engines/types.d.ts +21 -0
- package/dist/engines/types.js +2 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/git/worktrees.d.ts +11 -0
- package/dist/git/worktrees.js +63 -0
- package/dist/git/worktrees.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/locks.d.ts +10 -0
- package/dist/locks.js +23 -0
- package/dist/locks.js.map +1 -0
- package/dist/orchestrator.d.ts +17 -0
- package/dist/orchestrator.js +99 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/permissions.d.ts +5 -0
- package/dist/permissions.js +19 -0
- package/dist/permissions.js.map +1 -0
- package/dist/phases/execute.d.ts +2 -0
- package/dist/phases/execute.js +78 -0
- package/dist/phases/execute.js.map +1 -0
- package/dist/phases/explore.d.ts +1 -0
- package/dist/phases/explore.js +5 -0
- package/dist/phases/explore.js.map +1 -0
- package/dist/phases/index.d.ts +10 -0
- package/dist/phases/index.js +10 -0
- package/dist/phases/index.js.map +1 -0
- package/dist/phases/intake.d.ts +2 -0
- package/dist/phases/intake.js +67 -0
- package/dist/phases/intake.js.map +1 -0
- package/dist/phases/planning.d.ts +2 -0
- package/dist/phases/planning.js +8 -0
- package/dist/phases/planning.js.map +1 -0
- package/dist/phases/post.d.ts +2 -0
- package/dist/phases/post.js +21 -0
- package/dist/phases/post.js.map +1 -0
- package/dist/phases/scaffold.d.ts +2 -0
- package/dist/phases/scaffold.js +6 -0
- package/dist/phases/scaffold.js.map +1 -0
- package/dist/phases/steering.d.ts +2 -0
- package/dist/phases/steering.js +10 -0
- package/dist/phases/steering.js.map +1 -0
- package/dist/phases/sync.d.ts +2 -0
- package/dist/phases/sync.js +25 -0
- package/dist/phases/sync.js.map +1 -0
- package/dist/phases/types.d.ts +22 -0
- package/dist/phases/types.js +2 -0
- package/dist/phases/types.js.map +1 -0
- package/dist/phases/verify.d.ts +2 -0
- package/dist/phases/verify.js +8 -0
- package/dist/phases/verify.js.map +1 -0
- package/dist/planning/bmad.d.ts +3 -0
- package/dist/planning/bmad.js +20 -0
- package/dist/planning/bmad.js.map +1 -0
- package/dist/planning/index.d.ts +2 -0
- package/dist/planning/index.js +37 -0
- package/dist/planning/index.js.map +1 -0
- package/dist/planning/validate.d.ts +7 -0
- package/dist/planning/validate.js +20 -0
- package/dist/planning/validate.js.map +1 -0
- package/dist/pr/create.d.ts +2 -0
- package/dist/pr/create.js +65 -0
- package/dist/pr/create.js.map +1 -0
- package/dist/quality/gates.d.ts +12 -0
- package/dist/quality/gates.js +54 -0
- package/dist/quality/gates.js.map +1 -0
- package/dist/release.d.ts +3 -0
- package/dist/release.js +88 -0
- package/dist/release.js.map +1 -0
- package/dist/specs/archive.d.ts +1 -0
- package/dist/specs/archive.js +12 -0
- package/dist/specs/archive.js.map +1 -0
- package/dist/specs/changes.d.ts +7 -0
- package/dist/specs/changes.js +20 -0
- package/dist/specs/changes.js.map +1 -0
- package/dist/specs/delta.d.ts +1 -0
- package/dist/specs/delta.js +8 -0
- package/dist/specs/delta.js.map +1 -0
- package/dist/specs/generate.d.ts +1 -0
- package/dist/specs/generate.js +8 -0
- package/dist/specs/generate.js.map +1 -0
- package/dist/specs/index.d.ts +3 -0
- package/dist/specs/index.js +4 -0
- package/dist/specs/index.js.map +1 -0
- package/dist/specs/merge-summary.d.ts +2 -0
- package/dist/specs/merge-summary.js +19 -0
- package/dist/specs/merge-summary.js.map +1 -0
- package/dist/state.d.ts +12 -0
- package/dist/state.js +20 -0
- package/dist/state.js.map +1 -0
- package/dist/steering/index.d.ts +2 -0
- package/dist/steering/index.js +115 -0
- package/dist/steering/index.js.map +1 -0
- package/dist/swarm/claude-teams.d.ts +1 -0
- package/dist/swarm/claude-teams.js +8 -0
- package/dist/swarm/claude-teams.js.map +1 -0
- package/dist/swarm/codex-sdk.d.ts +1 -0
- package/dist/swarm/codex-sdk.js +8 -0
- package/dist/swarm/codex-sdk.js.map +1 -0
- package/dist/swarm/detector.d.ts +3 -0
- package/dist/swarm/detector.js +16 -0
- package/dist/swarm/detector.js.map +1 -0
- package/dist/swarm/index.d.ts +5 -0
- package/dist/swarm/index.js +5 -0
- package/dist/swarm/index.js.map +1 -0
- package/dist/swarm/kimi-parl.d.ts +1 -0
- package/dist/swarm/kimi-parl.js +8 -0
- package/dist/swarm/kimi-parl.js.map +1 -0
- package/dist/swarm/native.d.ts +14 -0
- package/dist/swarm/native.js +112 -0
- package/dist/swarm/native.js.map +1 -0
- package/dist/swarm/parse.d.ts +5 -0
- package/dist/swarm/parse.js +20 -0
- package/dist/swarm/parse.js.map +1 -0
- package/dist/swarm/types.d.ts +5 -0
- package/dist/swarm/types.js +2 -0
- package/dist/swarm/types.js.map +1 -0
- package/dist/tasks/output.d.ts +7 -0
- package/dist/tasks/output.js +15 -0
- package/dist/tasks/output.js.map +1 -0
- package/dist/utils/exec.d.ts +18 -0
- package/dist/utils/exec.js +52 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/failures.d.ts +2 -0
- package/dist/utils/failures.js +22 -0
- package/dist/utils/failures.js.map +1 -0
- package/dist/utils/logging.d.ts +1 -0
- package/dist/utils/logging.js +5 -0
- package/dist/utils/logging.js.map +1 -0
- package/dist/utils/resume.d.ts +1 -0
- package/dist/utils/resume.js +14 -0
- package/dist/utils/resume.js.map +1 -0
- package/dist/utils/retry.d.ts +1 -0
- package/dist/utils/retry.js +19 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export async function generateSteeringFiles(ctx) {
|
|
4
|
+
const root = ctx.projectRoot;
|
|
5
|
+
const projectName = path.basename(root);
|
|
6
|
+
await write(root, 'AGENTS.md', agentsMd(projectName));
|
|
7
|
+
await write(root, '.cursorrules', cursorRules());
|
|
8
|
+
await write(root, 'CLAUDE.md', claudeMd());
|
|
9
|
+
await write(root, '.windsurfrules', windsurfRules());
|
|
10
|
+
await write(root, '.clinerules', clineRules());
|
|
11
|
+
await write(root, '.github/copilot-instructions.md', copilotInstructions());
|
|
12
|
+
await write(root, '.env.example', envExample(ctx));
|
|
13
|
+
await write(root, '.cursor/rules/project/steering.mdc', cursorProjectRule());
|
|
14
|
+
await write(root, '.cursor/skills/default.md', cursorSkill());
|
|
15
|
+
await write(root, '.kiro/rules/base.md', kiroRule());
|
|
16
|
+
}
|
|
17
|
+
async function write(root, relativePath, contents) {
|
|
18
|
+
const filePath = path.join(root, relativePath);
|
|
19
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
20
|
+
await writeFile(filePath, contents, 'utf-8');
|
|
21
|
+
}
|
|
22
|
+
function agentsMd(projectName) {
|
|
23
|
+
return `# AGENTS: ${projectName}
|
|
24
|
+
|
|
25
|
+
## Mission
|
|
26
|
+
Build and maintain ${projectName} according to the plan and BeMadRalphy conventions.
|
|
27
|
+
|
|
28
|
+
## Task Source
|
|
29
|
+
- Beads (\`bd ready\`) is the single source of truth for tasks.
|
|
30
|
+
- Only mark tasks complete after tests pass.
|
|
31
|
+
|
|
32
|
+
## Code Standards
|
|
33
|
+
- Add TSDoc/JSDoc for all exported symbols.
|
|
34
|
+
- Prefer clear, explicit naming over cleverness.
|
|
35
|
+
- Keep modules focused and composable.
|
|
36
|
+
|
|
37
|
+
## Git Strategy
|
|
38
|
+
- Branch-per-task: \`bemadralphy/<task-slug>\`
|
|
39
|
+
- Commit-per-task with Beads ID in message.
|
|
40
|
+
- Never force-push to \`main\`.
|
|
41
|
+
|
|
42
|
+
## Environment
|
|
43
|
+
- Never commit \`.env\`.
|
|
44
|
+
- Use \`.env.example\` for required variables.
|
|
45
|
+
|
|
46
|
+
## Testing
|
|
47
|
+
- Run lint + typecheck + tests before marking tasks complete.
|
|
48
|
+
`;
|
|
49
|
+
}
|
|
50
|
+
function cursorRules() {
|
|
51
|
+
return `# Cursor Rules
|
|
52
|
+
|
|
53
|
+
- Follow AGENTS.md for all coding conventions.
|
|
54
|
+
- Keep changes minimal and focused.
|
|
55
|
+
- Add tests when behavior changes.
|
|
56
|
+
`;
|
|
57
|
+
}
|
|
58
|
+
function claudeMd() {
|
|
59
|
+
return `# CLAUDE Rules
|
|
60
|
+
|
|
61
|
+
- Follow AGENTS.md for conventions.
|
|
62
|
+
- Use Beads (\`bd ready\`, \`bd close\`) for task tracking.
|
|
63
|
+
- Do not commit \`.env\`.
|
|
64
|
+
`;
|
|
65
|
+
}
|
|
66
|
+
function windsurfRules() {
|
|
67
|
+
return `# Windsurf Rules
|
|
68
|
+
|
|
69
|
+
- Follow AGENTS.md for conventions and task policy.
|
|
70
|
+
`;
|
|
71
|
+
}
|
|
72
|
+
function clineRules() {
|
|
73
|
+
return `# Cline Rules
|
|
74
|
+
|
|
75
|
+
- Follow AGENTS.md for conventions and task policy.
|
|
76
|
+
`;
|
|
77
|
+
}
|
|
78
|
+
function copilotInstructions() {
|
|
79
|
+
return `# GitHub Copilot Instructions
|
|
80
|
+
|
|
81
|
+
- Follow AGENTS.md.
|
|
82
|
+
- Keep changes scoped to the current task.
|
|
83
|
+
- Add tests for behavior changes.
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
function cursorProjectRule() {
|
|
87
|
+
return `# Project Rules
|
|
88
|
+
|
|
89
|
+
Follow AGENTS.md. This project uses Beads for task tracking and a branch-per-task workflow.
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
92
|
+
function cursorSkill() {
|
|
93
|
+
return `# Default Skill
|
|
94
|
+
|
|
95
|
+
You are an agent working on a CLI-only TypeScript project.
|
|
96
|
+
Follow AGENTS.md, keep changes small, and add tests as needed.
|
|
97
|
+
`;
|
|
98
|
+
}
|
|
99
|
+
function kiroRule() {
|
|
100
|
+
return `# Kiro Rule
|
|
101
|
+
|
|
102
|
+
Follow AGENTS.md for conventions and task policy.
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
105
|
+
function envExample(ctx) {
|
|
106
|
+
const lines = ['# Example environment variables', 'EXAMPLE_VAR=change-me'];
|
|
107
|
+
if (ctx.intake?.frontmatter && Object.keys(ctx.intake.frontmatter).length > 0) {
|
|
108
|
+
lines.push('', '# Intake decisions (for reference)');
|
|
109
|
+
for (const [key, value] of Object.entries(ctx.intake.frontmatter)) {
|
|
110
|
+
lines.push(`# ${key}: ${String(value)}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return `${lines.join('\n')}\n`;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/steering/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runClaudeTeamsBatch(projectRoot: string, maxParallel: number): Promise<void>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { logInfo } from '../utils/logging.js';
|
|
2
|
+
import { assertCommandExists, runCommand } from '../utils/exec.js';
|
|
3
|
+
export async function runClaudeTeamsBatch(projectRoot, maxParallel) {
|
|
4
|
+
logInfo(`swarm: running Claude teams batch (maxParallel=${maxParallel})`);
|
|
5
|
+
await assertCommandExists('ralphy', 'Install with: npm install -g ralphy-cli');
|
|
6
|
+
await runCommand('ralphy', ['--claude', '--parallel', '--max-parallel', String(maxParallel), '--max-iterations', '1'], projectRoot);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=claude-teams.js.map
|
|
@@ -0,0 +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;IAC1E,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runCodexAgentsBatch(projectRoot: string, maxParallel: number): Promise<void>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { logInfo } from '../utils/logging.js';
|
|
2
|
+
import { assertCommandExists, runCommand } from '../utils/exec.js';
|
|
3
|
+
export async function runCodexAgentsBatch(projectRoot, maxParallel) {
|
|
4
|
+
logInfo(`swarm: running Codex batch (maxParallel=${maxParallel})`);
|
|
5
|
+
await assertCommandExists('ralphy', 'Install with: npm install -g ralphy-cli');
|
|
6
|
+
await runCommand('ralphy', ['--codex', '--parallel', '--max-parallel', String(maxParallel), '--max-iterations', '1'], projectRoot);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=codex-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-sdk.js","sourceRoot":"","sources":["../../src/swarm/codex-sdk.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,2CAA2C,WAAW,GAAG,CAAC,CAAC;IACnE,MAAM,mBAAmB,CAAC,QAAQ,EAAE,yCAAyC,CAAC,CAAC;IAC/E,MAAM,UAAU,CACd,QAAQ,EACR,CAAC,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,EACzF,WAAW,CACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { engineAdapters } from '../engines/index.js';
|
|
2
|
+
export function detectSwarmCapability(engineName) {
|
|
3
|
+
const adapter = engineAdapters[engineName];
|
|
4
|
+
if (!adapter) {
|
|
5
|
+
return { supportsNative: false, reason: 'unknown engine' };
|
|
6
|
+
}
|
|
7
|
+
return { supportsNative: adapter.hasNativeSwarm };
|
|
8
|
+
}
|
|
9
|
+
export function resolveSwarmMode(engineName, override) {
|
|
10
|
+
if (override) {
|
|
11
|
+
return override;
|
|
12
|
+
}
|
|
13
|
+
const capability = detectSwarmCapability(engineName);
|
|
14
|
+
return capability.supportsNative ? 'native' : 'process';
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/swarm/detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,QAAoB;IACvE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACrD,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { runClaudeTeamsBatch } from './claude-teams.js';
|
|
2
|
+
export { runCodexAgentsBatch } from './codex-sdk.js';
|
|
3
|
+
export { detectSwarmCapability, resolveSwarmMode } from './detector.js';
|
|
4
|
+
export { runKimiParlBatch } from './kimi-parl.js';
|
|
5
|
+
export type { SwarmCapability, SwarmMode } from './types.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { runClaudeTeamsBatch } from './claude-teams.js';
|
|
2
|
+
export { runCodexAgentsBatch } from './codex-sdk.js';
|
|
3
|
+
export { detectSwarmCapability, resolveSwarmMode } from './detector.js';
|
|
4
|
+
export { runKimiParlBatch } from './kimi-parl.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swarm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runKimiParlBatch(projectRoot: string, maxParallel: number): Promise<void>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { logInfo } from '../utils/logging.js';
|
|
2
|
+
import { assertCommandExists, runCommand } from '../utils/exec.js';
|
|
3
|
+
export async function runKimiParlBatch(projectRoot, maxParallel) {
|
|
4
|
+
logInfo(`swarm: running Kimi batch (maxParallel=${maxParallel})`);
|
|
5
|
+
await assertCommandExists('kimi', 'Install Kimi CLI and ensure it is on PATH.');
|
|
6
|
+
await runCommand('kimi', ['--parallel', '--max-parallel', String(maxParallel)], projectRoot);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=kimi-parl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi-parl.js","sourceRoot":"","sources":["../../src/swarm/kimi-parl.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,gBAAgB,CAAC,WAAmB,EAAE,WAAmB;IAC7E,OAAO,CAAC,0CAA0C,WAAW,GAAG,CAAC,CAAC;IAClE,MAAM,mBAAmB,CAAC,MAAM,EAAE,4CAA4C,CAAC,CAAC;IAChF,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type SwarmTask = {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function runNativeSwarm(projectRoot: string, engineName: string, tasks: SwarmTask[]): Promise<{
|
|
6
|
+
ok: boolean;
|
|
7
|
+
error?: string;
|
|
8
|
+
} | null>;
|
|
9
|
+
export declare function resolveSwarmArgs(argsEnv: string, tasksPath: string): string[];
|
|
10
|
+
export declare function buildSwarmPayload(engineName: string, tasks: SwarmTask[]): {
|
|
11
|
+
engine: string;
|
|
12
|
+
tasks: SwarmTask[];
|
|
13
|
+
};
|
|
14
|
+
export declare function buildSwarmHeaders(token?: string): Record<string, string>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { commandExists, runCommand } from '../utils/exec.js';
|
|
4
|
+
import { logInfo } from '../utils/logging.js';
|
|
5
|
+
const SWARM_CONFIGS = {
|
|
6
|
+
claude: {
|
|
7
|
+
cmdEnv: 'BEMADRALPHY_CLAUDE_SWARM_CMD',
|
|
8
|
+
argsEnv: 'BEMADRALPHY_CLAUDE_SWARM_ARGS',
|
|
9
|
+
urlEnv: 'BEMADRALPHY_CLAUDE_SWARM_URL',
|
|
10
|
+
tokenEnv: 'BEMADRALPHY_CLAUDE_SWARM_TOKEN',
|
|
11
|
+
},
|
|
12
|
+
kimi: {
|
|
13
|
+
cmdEnv: 'BEMADRALPHY_KIMI_SWARM_CMD',
|
|
14
|
+
argsEnv: 'BEMADRALPHY_KIMI_SWARM_ARGS',
|
|
15
|
+
urlEnv: 'BEMADRALPHY_KIMI_SWARM_URL',
|
|
16
|
+
tokenEnv: 'BEMADRALPHY_KIMI_SWARM_TOKEN',
|
|
17
|
+
},
|
|
18
|
+
codex: {
|
|
19
|
+
cmdEnv: 'BEMADRALPHY_CODEX_SWARM_CMD',
|
|
20
|
+
argsEnv: 'BEMADRALPHY_CODEX_SWARM_ARGS',
|
|
21
|
+
urlEnv: 'BEMADRALPHY_CODEX_SWARM_URL',
|
|
22
|
+
tokenEnv: 'BEMADRALPHY_CODEX_SWARM_TOKEN',
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
export async function runNativeSwarm(projectRoot, engineName, tasks) {
|
|
26
|
+
const config = SWARM_CONFIGS[engineName];
|
|
27
|
+
if (!config) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const command = process.env[config.cmdEnv];
|
|
31
|
+
if (!command) {
|
|
32
|
+
const url = process.env[config.urlEnv];
|
|
33
|
+
if (!url) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return runSwarmHttp(engineName, tasks, url, process.env[config.tokenEnv]);
|
|
37
|
+
}
|
|
38
|
+
if (!(await commandExists(command))) {
|
|
39
|
+
logInfo(`swarm: command "${command}" not available`);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const swarmDir = path.join(projectRoot, '.bemadralphy', 'swarm');
|
|
43
|
+
await mkdir(swarmDir, { recursive: true });
|
|
44
|
+
const tasksPath = path.join(swarmDir, `${engineName}-tasks.json`);
|
|
45
|
+
const outputPath = path.join(swarmDir, `${engineName}-output.log`);
|
|
46
|
+
await writeFile(tasksPath, JSON.stringify({ tasks }, null, 2), 'utf-8');
|
|
47
|
+
const args = resolveSwarmArgs(config.argsEnv, tasksPath);
|
|
48
|
+
try {
|
|
49
|
+
const { stdout, stderr } = await runCommand(command, args, projectRoot);
|
|
50
|
+
await writeFile(outputPath, stdout.trim() ? stdout : stderr, 'utf-8');
|
|
51
|
+
return { ok: true };
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
55
|
+
logInfo(`swarm: native command failed (${message}); falling back`);
|
|
56
|
+
return { ok: false, error: message };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function resolveSwarmArgs(argsEnv, tasksPath) {
|
|
60
|
+
const raw = process.env[argsEnv];
|
|
61
|
+
const args = parseArgsEnv(raw) ?? ['--tasks-file', '{tasksFile}'];
|
|
62
|
+
return args.map((arg) => arg.replaceAll('{tasksFile}', tasksPath));
|
|
63
|
+
}
|
|
64
|
+
export function buildSwarmPayload(engineName, tasks) {
|
|
65
|
+
return { engine: engineName, tasks };
|
|
66
|
+
}
|
|
67
|
+
export function buildSwarmHeaders(token) {
|
|
68
|
+
const headers = {
|
|
69
|
+
'content-type': 'application/json',
|
|
70
|
+
};
|
|
71
|
+
if (token) {
|
|
72
|
+
headers.authorization = `Bearer ${token}`;
|
|
73
|
+
}
|
|
74
|
+
return headers;
|
|
75
|
+
}
|
|
76
|
+
function parseArgsEnv(raw) {
|
|
77
|
+
if (!raw || !raw.trim()) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const trimmed = raw.trim();
|
|
81
|
+
if (trimmed.startsWith('[')) {
|
|
82
|
+
try {
|
|
83
|
+
const parsed = JSON.parse(trimmed);
|
|
84
|
+
if (Array.isArray(parsed)) {
|
|
85
|
+
return parsed.map((item) => String(item));
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return trimmed.split(/\s+/).filter(Boolean);
|
|
94
|
+
}
|
|
95
|
+
async function runSwarmHttp(engineName, tasks, url, token) {
|
|
96
|
+
try {
|
|
97
|
+
const response = await fetch(url, {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
headers: buildSwarmHeaders(token),
|
|
100
|
+
body: JSON.stringify(buildSwarmPayload(engineName, tasks)),
|
|
101
|
+
});
|
|
102
|
+
if (!response.ok) {
|
|
103
|
+
return { ok: false, error: `HTTP ${response.status}` };
|
|
104
|
+
}
|
|
105
|
+
return { ok: true };
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
109
|
+
return { ok: false, error: message };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/swarm/native.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function parseSwarmOutput(contents, taskIds) {
|
|
2
|
+
const results = new Map();
|
|
3
|
+
const lines = contents.split(/\r?\n/);
|
|
4
|
+
const ids = Array.from(new Set(taskIds));
|
|
5
|
+
for (const line of lines) {
|
|
6
|
+
const statusMatch = line.match(/\b(success|failed|skipped)\b(?:\s*:\s*(.+))?/i);
|
|
7
|
+
if (!statusMatch) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
const id = ids.find((candidate) => line.includes(candidate));
|
|
11
|
+
if (!id) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const status = statusMatch[1].toLowerCase();
|
|
15
|
+
const error = statusMatch[2];
|
|
16
|
+
results.set(id, { status, error });
|
|
17
|
+
}
|
|
18
|
+
return results;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/swarm/parse.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,OAAiB;IAEjB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAChF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAA2B,CAAC;QACrE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/swarm/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export async function writeTaskOutput(projectRoot, taskId, result) {
|
|
4
|
+
const dir = path.join(projectRoot, '.bemadralphy', 'tasks');
|
|
5
|
+
await mkdir(dir, { recursive: true });
|
|
6
|
+
const safeId = taskId.replace(/[^a-zA-Z0-9._-]+/g, '_');
|
|
7
|
+
const filePath = path.join(dir, `${safeId}.log`);
|
|
8
|
+
const lines = [
|
|
9
|
+
`status=${result.status}`,
|
|
10
|
+
result.output ? `output=${result.output}` : '',
|
|
11
|
+
result.error ? `error=${result.error}` : '',
|
|
12
|
+
].filter(Boolean);
|
|
13
|
+
await writeFile(filePath, `${lines.join('\n')}\n`, 'utf-8');
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/tasks/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,MAAc,EACd,MAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG;QACZ,UAAU,MAAM,CAAC,MAAM,EAAE;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;KAC5C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type CommandRunner = (command: string, args?: string[], cwd?: string) => Promise<{
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
}>;
|
|
5
|
+
export type CommandExistsRunner = (command: string) => Promise<boolean>;
|
|
6
|
+
type CommandRunners = {
|
|
7
|
+
runCommand: CommandRunner;
|
|
8
|
+
commandExists: CommandExistsRunner;
|
|
9
|
+
};
|
|
10
|
+
export declare function runCommand(command: string, args?: string[], cwd?: string): Promise<{
|
|
11
|
+
stdout: string;
|
|
12
|
+
stderr: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function commandExists(command: string): Promise<boolean>;
|
|
15
|
+
export declare function setCommandRunners(overrides: Partial<CommandRunners>): void;
|
|
16
|
+
export declare function resetCommandRunners(): void;
|
|
17
|
+
export declare function assertCommandExists(command: string, hint?: string): Promise<void>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
const defaultRunners = {
|
|
5
|
+
runCommand: async (command, args = [], cwd) => {
|
|
6
|
+
try {
|
|
7
|
+
const result = await execFileAsync(command, args, { cwd });
|
|
8
|
+
return { stdout: result.stdout ?? '', stderr: result.stderr ?? '' };
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
const err = error;
|
|
12
|
+
const rendered = `${command} ${args.join(' ')}`.trim();
|
|
13
|
+
const details = [err.stderr, err.stdout, err.message].filter(Boolean).join(' | ');
|
|
14
|
+
throw new Error(`Command failed (${rendered})${cwd ? ` in ${cwd}` : ''}` +
|
|
15
|
+
`${err.code ? ` [code=${err.code}]` : ''}: ${details || 'no details'}`);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
commandExists: async (command) => {
|
|
19
|
+
try {
|
|
20
|
+
await execFileAsync('which', [command]);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
let runners = { ...defaultRunners };
|
|
29
|
+
export async function runCommand(command, args = [], cwd) {
|
|
30
|
+
return runners.runCommand(command, args, cwd);
|
|
31
|
+
}
|
|
32
|
+
export async function commandExists(command) {
|
|
33
|
+
return runners.commandExists(command);
|
|
34
|
+
}
|
|
35
|
+
export function setCommandRunners(overrides) {
|
|
36
|
+
runners = {
|
|
37
|
+
...runners,
|
|
38
|
+
...overrides,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function resetCommandRunners() {
|
|
42
|
+
runners = { ...defaultRunners };
|
|
43
|
+
}
|
|
44
|
+
export async function assertCommandExists(command, hint) {
|
|
45
|
+
const exists = await commandExists(command);
|
|
46
|
+
if (!exists) {
|
|
47
|
+
throw new Error(hint
|
|
48
|
+
? `Missing required CLI "${command}". ${hint}`
|
|
49
|
+
: `Missing required CLI "${command}". Install it and ensure it is on PATH.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAe1C,MAAM,cAAc,GAAmB;IACrC,UAAU,EAAE,KAAK,EACf,OAAe,EACf,OAAiB,EAAE,EACnB,GAAY,EACiC,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAKX,CAAC;YACF,MAAM,QAAQ,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClF,MAAM,IAAI,KAAK,CACb,mBAAmB,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBACtD,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,IAAI,YAAY,EAAE,CACzE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,aAAa,EAAE,KAAK,EAAE,OAAe,EAAoB,EAAE;QACzD,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC;AAEF,IAAI,OAAO,GAAmB,EAAE,GAAG,cAAc,EAAE,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,OAAiB,EAAE,EACnB,GAAY;IAEZ,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAkC;IAClE,OAAO,GAAG;QACR,GAAG,OAAO;QACV,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,IAAa;IACtE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,IAAI;YACF,CAAC,CAAC,yBAAyB,OAAO,MAAM,IAAI,EAAE;YAC9C,CAAC,CAAC,yBAAyB,OAAO,yCAAyC,CAC9E,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { appendFile, mkdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export async function logFailure(projectRoot, phase, error) {
|
|
4
|
+
const dir = path.join(projectRoot, '.bemadralphy');
|
|
5
|
+
await mkdir(dir, { recursive: true });
|
|
6
|
+
const logPath = path.join(dir, 'failures.log');
|
|
7
|
+
const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
8
|
+
const line = `[${new Date().toISOString()}] phase=${phase} error=${message}\n`;
|
|
9
|
+
await appendFile(logPath, line, 'utf-8');
|
|
10
|
+
}
|
|
11
|
+
export async function readLastFailure(projectRoot) {
|
|
12
|
+
try {
|
|
13
|
+
const logPath = path.join(projectRoot, '.bemadralphy', 'failures.log');
|
|
14
|
+
const contents = await readFile(logPath, 'utf-8');
|
|
15
|
+
const lines = contents.trim().split('\n');
|
|
16
|
+
return lines.length > 0 ? lines[lines.length - 1] : null;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=failures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failures.js","sourceRoot":"","sources":["../../src/utils/failures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,KAAa,EACb,KAAc;IAEd,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACnD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,UAAU,OAAO,IAAI,CAAC;IAC/E,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function logInfo(message: string): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/utils/logging.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,gFAAgF;IAChF,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getResumeStartIndex(phases: string[], savedPhase?: string): number;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function getResumeStartIndex(phases, savedPhase) {
|
|
2
|
+
if (!savedPhase) {
|
|
3
|
+
return 0;
|
|
4
|
+
}
|
|
5
|
+
const lastIndex = phases.indexOf(savedPhase);
|
|
6
|
+
if (lastIndex === -1) {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
if (lastIndex >= phases.length - 1) {
|
|
10
|
+
return phases.length;
|
|
11
|
+
}
|
|
12
|
+
return lastIndex + 1;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/utils/resume.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,MAAgB,EAAE,UAAmB;IACvE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,SAAS,GAAG,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isRetryableError(message?: string): boolean;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function isRetryableError(message) {
|
|
2
|
+
if (!message) {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
const normalized = message.toLowerCase();
|
|
6
|
+
const patterns = [
|
|
7
|
+
'rate limit',
|
|
8
|
+
'too many requests',
|
|
9
|
+
'timeout',
|
|
10
|
+
'timed out',
|
|
11
|
+
'econnreset',
|
|
12
|
+
'econnrefused',
|
|
13
|
+
'socket hang up',
|
|
14
|
+
'http 429',
|
|
15
|
+
'http 503',
|
|
16
|
+
];
|
|
17
|
+
return patterns.some((pattern) => normalized.includes(pattern));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG;QACf,YAAY;QACZ,mBAAmB;QACnB,SAAS;QACT,WAAW;QACX,YAAY;QACZ,cAAc;QACd,gBAAgB;QAChB,UAAU;QACV,UAAU;KACX,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC"}
|