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.
Files changed (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +468 -0
  3. package/dist/beads/adapter.d.ts +5 -0
  4. package/dist/beads/adapter.js +16 -0
  5. package/dist/beads/adapter.js.map +1 -0
  6. package/dist/beads/index.d.ts +3 -0
  7. package/dist/beads/index.js +4 -0
  8. package/dist/beads/index.js.map +1 -0
  9. package/dist/beads/parse-tasks.d.ts +2 -0
  10. package/dist/beads/parse-tasks.js +12 -0
  11. package/dist/beads/parse-tasks.js.map +1 -0
  12. package/dist/beads/tasks-md.d.ts +6 -0
  13. package/dist/beads/tasks-md.js +8 -0
  14. package/dist/beads/tasks-md.js.map +1 -0
  15. package/dist/beads/writer.d.ts +12 -0
  16. package/dist/beads/writer.js +60 -0
  17. package/dist/beads/writer.js.map +1 -0
  18. package/dist/cli.d.ts +2 -0
  19. package/dist/cli.js +43 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/cost.d.ts +6 -0
  22. package/dist/cost.js +18 -0
  23. package/dist/cost.js.map +1 -0
  24. package/dist/docs/pr-body.d.ts +8 -0
  25. package/dist/docs/pr-body.js +11 -0
  26. package/dist/docs/pr-body.js.map +1 -0
  27. package/dist/engines/claude.d.ts +1 -0
  28. package/dist/engines/claude.js +11 -0
  29. package/dist/engines/claude.js.map +1 -0
  30. package/dist/engines/cli-adapter.d.ts +12 -0
  31. package/dist/engines/cli-adapter.js +36 -0
  32. package/dist/engines/cli-adapter.js.map +1 -0
  33. package/dist/engines/cli.d.ts +14 -0
  34. package/dist/engines/cli.js +72 -0
  35. package/dist/engines/cli.js.map +1 -0
  36. package/dist/engines/codex.d.ts +1 -0
  37. package/dist/engines/codex.js +10 -0
  38. package/dist/engines/codex.js.map +1 -0
  39. package/dist/engines/copilot.d.ts +1 -0
  40. package/dist/engines/copilot.js +10 -0
  41. package/dist/engines/copilot.js.map +1 -0
  42. package/dist/engines/cursor.d.ts +1 -0
  43. package/dist/engines/cursor.js +10 -0
  44. package/dist/engines/cursor.js.map +1 -0
  45. package/dist/engines/gemini.d.ts +1 -0
  46. package/dist/engines/gemini.js +10 -0
  47. package/dist/engines/gemini.js.map +1 -0
  48. package/dist/engines/index.d.ts +2 -0
  49. package/dist/engines/index.js +21 -0
  50. package/dist/engines/index.js.map +1 -0
  51. package/dist/engines/kimi.d.ts +1 -0
  52. package/dist/engines/kimi.js +10 -0
  53. package/dist/engines/kimi.js.map +1 -0
  54. package/dist/engines/opencode.d.ts +1 -0
  55. package/dist/engines/opencode.js +10 -0
  56. package/dist/engines/opencode.js.map +1 -0
  57. package/dist/engines/prompt-template.d.ts +2 -0
  58. package/dist/engines/prompt-template.js +96 -0
  59. package/dist/engines/prompt-template.js.map +1 -0
  60. package/dist/engines/qwen.d.ts +1 -0
  61. package/dist/engines/qwen.js +10 -0
  62. package/dist/engines/qwen.js.map +1 -0
  63. package/dist/engines/ralphy.d.ts +1 -0
  64. package/dist/engines/ralphy.js +10 -0
  65. package/dist/engines/ralphy.js.map +1 -0
  66. package/dist/engines/stub.d.ts +2 -0
  67. package/dist/engines/stub.js +17 -0
  68. package/dist/engines/stub.js.map +1 -0
  69. package/dist/engines/types.d.ts +21 -0
  70. package/dist/engines/types.js +2 -0
  71. package/dist/engines/types.js.map +1 -0
  72. package/dist/errors.d.ts +12 -0
  73. package/dist/errors.js +13 -0
  74. package/dist/errors.js.map +1 -0
  75. package/dist/git/worktrees.d.ts +11 -0
  76. package/dist/git/worktrees.js +63 -0
  77. package/dist/git/worktrees.js.map +1 -0
  78. package/dist/index.d.ts +2 -0
  79. package/dist/index.js +2 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/locks.d.ts +10 -0
  82. package/dist/locks.js +23 -0
  83. package/dist/locks.js.map +1 -0
  84. package/dist/orchestrator.d.ts +17 -0
  85. package/dist/orchestrator.js +99 -0
  86. package/dist/orchestrator.js.map +1 -0
  87. package/dist/permissions.d.ts +5 -0
  88. package/dist/permissions.js +19 -0
  89. package/dist/permissions.js.map +1 -0
  90. package/dist/phases/execute.d.ts +2 -0
  91. package/dist/phases/execute.js +78 -0
  92. package/dist/phases/execute.js.map +1 -0
  93. package/dist/phases/explore.d.ts +1 -0
  94. package/dist/phases/explore.js +5 -0
  95. package/dist/phases/explore.js.map +1 -0
  96. package/dist/phases/index.d.ts +10 -0
  97. package/dist/phases/index.js +10 -0
  98. package/dist/phases/index.js.map +1 -0
  99. package/dist/phases/intake.d.ts +2 -0
  100. package/dist/phases/intake.js +67 -0
  101. package/dist/phases/intake.js.map +1 -0
  102. package/dist/phases/planning.d.ts +2 -0
  103. package/dist/phases/planning.js +8 -0
  104. package/dist/phases/planning.js.map +1 -0
  105. package/dist/phases/post.d.ts +2 -0
  106. package/dist/phases/post.js +21 -0
  107. package/dist/phases/post.js.map +1 -0
  108. package/dist/phases/scaffold.d.ts +2 -0
  109. package/dist/phases/scaffold.js +6 -0
  110. package/dist/phases/scaffold.js.map +1 -0
  111. package/dist/phases/steering.d.ts +2 -0
  112. package/dist/phases/steering.js +10 -0
  113. package/dist/phases/steering.js.map +1 -0
  114. package/dist/phases/sync.d.ts +2 -0
  115. package/dist/phases/sync.js +25 -0
  116. package/dist/phases/sync.js.map +1 -0
  117. package/dist/phases/types.d.ts +22 -0
  118. package/dist/phases/types.js +2 -0
  119. package/dist/phases/types.js.map +1 -0
  120. package/dist/phases/verify.d.ts +2 -0
  121. package/dist/phases/verify.js +8 -0
  122. package/dist/phases/verify.js.map +1 -0
  123. package/dist/planning/bmad.d.ts +3 -0
  124. package/dist/planning/bmad.js +20 -0
  125. package/dist/planning/bmad.js.map +1 -0
  126. package/dist/planning/index.d.ts +2 -0
  127. package/dist/planning/index.js +37 -0
  128. package/dist/planning/index.js.map +1 -0
  129. package/dist/planning/validate.d.ts +7 -0
  130. package/dist/planning/validate.js +20 -0
  131. package/dist/planning/validate.js.map +1 -0
  132. package/dist/pr/create.d.ts +2 -0
  133. package/dist/pr/create.js +65 -0
  134. package/dist/pr/create.js.map +1 -0
  135. package/dist/quality/gates.d.ts +12 -0
  136. package/dist/quality/gates.js +54 -0
  137. package/dist/quality/gates.js.map +1 -0
  138. package/dist/release.d.ts +3 -0
  139. package/dist/release.js +88 -0
  140. package/dist/release.js.map +1 -0
  141. package/dist/specs/archive.d.ts +1 -0
  142. package/dist/specs/archive.js +12 -0
  143. package/dist/specs/archive.js.map +1 -0
  144. package/dist/specs/changes.d.ts +7 -0
  145. package/dist/specs/changes.js +20 -0
  146. package/dist/specs/changes.js.map +1 -0
  147. package/dist/specs/delta.d.ts +1 -0
  148. package/dist/specs/delta.js +8 -0
  149. package/dist/specs/delta.js.map +1 -0
  150. package/dist/specs/generate.d.ts +1 -0
  151. package/dist/specs/generate.js +8 -0
  152. package/dist/specs/generate.js.map +1 -0
  153. package/dist/specs/index.d.ts +3 -0
  154. package/dist/specs/index.js +4 -0
  155. package/dist/specs/index.js.map +1 -0
  156. package/dist/specs/merge-summary.d.ts +2 -0
  157. package/dist/specs/merge-summary.js +19 -0
  158. package/dist/specs/merge-summary.js.map +1 -0
  159. package/dist/state.d.ts +12 -0
  160. package/dist/state.js +20 -0
  161. package/dist/state.js.map +1 -0
  162. package/dist/steering/index.d.ts +2 -0
  163. package/dist/steering/index.js +115 -0
  164. package/dist/steering/index.js.map +1 -0
  165. package/dist/swarm/claude-teams.d.ts +1 -0
  166. package/dist/swarm/claude-teams.js +8 -0
  167. package/dist/swarm/claude-teams.js.map +1 -0
  168. package/dist/swarm/codex-sdk.d.ts +1 -0
  169. package/dist/swarm/codex-sdk.js +8 -0
  170. package/dist/swarm/codex-sdk.js.map +1 -0
  171. package/dist/swarm/detector.d.ts +3 -0
  172. package/dist/swarm/detector.js +16 -0
  173. package/dist/swarm/detector.js.map +1 -0
  174. package/dist/swarm/index.d.ts +5 -0
  175. package/dist/swarm/index.js +5 -0
  176. package/dist/swarm/index.js.map +1 -0
  177. package/dist/swarm/kimi-parl.d.ts +1 -0
  178. package/dist/swarm/kimi-parl.js +8 -0
  179. package/dist/swarm/kimi-parl.js.map +1 -0
  180. package/dist/swarm/native.d.ts +14 -0
  181. package/dist/swarm/native.js +112 -0
  182. package/dist/swarm/native.js.map +1 -0
  183. package/dist/swarm/parse.d.ts +5 -0
  184. package/dist/swarm/parse.js +20 -0
  185. package/dist/swarm/parse.js.map +1 -0
  186. package/dist/swarm/types.d.ts +5 -0
  187. package/dist/swarm/types.js +2 -0
  188. package/dist/swarm/types.js.map +1 -0
  189. package/dist/tasks/output.d.ts +7 -0
  190. package/dist/tasks/output.js +15 -0
  191. package/dist/tasks/output.js.map +1 -0
  192. package/dist/utils/exec.d.ts +18 -0
  193. package/dist/utils/exec.js +52 -0
  194. package/dist/utils/exec.js.map +1 -0
  195. package/dist/utils/failures.d.ts +2 -0
  196. package/dist/utils/failures.js +22 -0
  197. package/dist/utils/failures.js.map +1 -0
  198. package/dist/utils/logging.d.ts +1 -0
  199. package/dist/utils/logging.js +5 -0
  200. package/dist/utils/logging.js.map +1 -0
  201. package/dist/utils/resume.d.ts +1 -0
  202. package/dist/utils/resume.js +14 -0
  203. package/dist/utils/resume.js.map +1 -0
  204. package/dist/utils/retry.d.ts +1 -0
  205. package/dist/utils/retry.js +19 -0
  206. package/dist/utils/retry.js.map +1 -0
  207. package/package.json +81 -0
@@ -0,0 +1,25 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { storiesToBeads } from '../beads/adapter.js';
4
+ import { renderTasksMarkdown } from '../beads/tasks-md.js';
5
+ import { BeadsWriter } from '../beads/writer.js';
6
+ import { assertCommandExists } from '../utils/exec.js';
7
+ import { logInfo } from '../utils/logging.js';
8
+ export async function syncPhase(ctx) {
9
+ logInfo('Phase 5 (sync): convert stories to Beads issues');
10
+ const storyPath = path.join(ctx.projectRoot, '_bmad-output', 'stories', 'epics.md');
11
+ const tasks = await storiesToBeads([storyPath]);
12
+ if (tasks.length === 0) {
13
+ throw new Error('sync: no tasks parsed from stories file');
14
+ }
15
+ const tasksMd = renderTasksMarkdown(tasks.map((task) => ({ id: task.id, title: task.title, status: 'ready' })));
16
+ await writeFile(path.join(ctx.projectRoot, 'tasks.md'), tasksMd, 'utf-8');
17
+ await assertCommandExists('bd', 'Install with: npm install -g @beads/bd');
18
+ const writer = new BeadsWriter(ctx.projectRoot);
19
+ await writer.init();
20
+ for (const task of tasks) {
21
+ await writer.create(task.title, 'Generated from BMAD stories');
22
+ }
23
+ return ctx;
24
+ }
25
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/phases/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAoB;IAClD,OAAO,CAAC,iDAAiD,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,OAAO,GAAG,mBAAmB,CACjC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAC3E,CAAC;IACF,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,mBAAmB,CAAC,IAAI,EAAE,wCAAwC,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type PipelineMode = 'auto' | 'hybrid' | 'supervised';
2
+ export type IntakeData = {
3
+ sourceFile: string;
4
+ frontmatter: Record<string, unknown>;
5
+ body: string;
6
+ createdAt: string;
7
+ };
8
+ export type PipelineContext = {
9
+ runId: string;
10
+ mode: PipelineMode;
11
+ dryRun: boolean;
12
+ projectRoot: string;
13
+ intakePath?: string;
14
+ intake?: IntakeData;
15
+ engine?: string;
16
+ planningEngine?: string;
17
+ maxParallel?: number;
18
+ budget?: number;
19
+ brownfield?: boolean;
20
+ swarm?: 'native' | 'process' | 'off';
21
+ createPr?: boolean;
22
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/phases/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { PipelineContext } from './types.js';
2
+ export declare function verifyPhase(ctx: PipelineContext): Promise<PipelineContext>;
@@ -0,0 +1,8 @@
1
+ import { logInfo } from '../utils/logging.js';
2
+ import { mergeSpecDeltas } from '../specs/index.js';
3
+ export async function verifyPhase(ctx) {
4
+ logInfo('Phase 7 (verify): semantic verification');
5
+ await mergeSpecDeltas(ctx.projectRoot);
6
+ return ctx;
7
+ }
8
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/phases/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAoB;IACpD,OAAO,CAAC,yCAAyC,CAAC,CAAC;IACnD,MAAM,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BmadOutputs } from './validate.js';
2
+ export declare function shouldInvokeBmad(): boolean;
3
+ export declare function runBmadSteps(outputs: BmadOutputs): Promise<void>;
@@ -0,0 +1,20 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import { runCommand } from '../utils/exec.js';
3
+ import { logInfo } from '../utils/logging.js';
4
+ const BMAD_MODE = 'BEMADRALPHY_BMAD_MODE';
5
+ export function shouldInvokeBmad() {
6
+ const mode = process.env[BMAD_MODE]?.toLowerCase();
7
+ return mode === 'cli';
8
+ }
9
+ export async function runBmadSteps(outputs) {
10
+ logInfo(`planning: invoking BMAD CLI (set ${BMAD_MODE}=cli to enable; this is experimental).`);
11
+ const brief = await runCommand('bmad', ['product-brief']);
12
+ const prd = await runCommand('bmad', ['create-prd']);
13
+ const architecture = await runCommand('bmad', ['create-architecture']);
14
+ const stories = await runCommand('bmad', ['create-epics-and-stories']);
15
+ await writeFile(outputs.productBriefPath, brief.stdout || brief.stderr, 'utf-8');
16
+ await writeFile(outputs.prdPath, prd.stdout || prd.stderr, 'utf-8');
17
+ await writeFile(outputs.architecturePath, architecture.stdout || architecture.stderr, 'utf-8');
18
+ await writeFile(outputs.storiesPath, stories.stdout || stories.stderr, 'utf-8');
19
+ }
20
+ //# sourceMappingURL=bmad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bmad.js","sourceRoot":"","sources":["../../src/planning/bmad.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9C,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAE1C,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IACnD,OAAO,IAAI,KAAK,KAAK,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAoB;IACrD,OAAO,CACL,oCAAoC,SAAS,wCAAwC,CACtF,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAEvE,MAAM,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjF,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/F,MAAM,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { PipelineContext } from '../phases/types.js';
2
+ export declare function runPlanning(ctx: PipelineContext): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import { mkdir } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { assertCommandExists, runCommand } from '../utils/exec.js';
4
+ import { logInfo } from '../utils/logging.js';
5
+ import { validateBmadOutputs } from './validate.js';
6
+ export async function runPlanning(ctx) {
7
+ const outputDir = path.join(ctx.projectRoot, '_bmad-output');
8
+ const storiesDir = path.join(outputDir, 'stories');
9
+ await mkdir(storiesDir, { recursive: true });
10
+ const outputs = {
11
+ productBriefPath: path.join(outputDir, 'product-brief.md'),
12
+ prdPath: path.join(outputDir, 'prd.md'),
13
+ architecturePath: path.join(outputDir, 'architecture.md'),
14
+ storiesPath: path.join(storiesDir, 'epics.md'),
15
+ };
16
+ if (ctx.dryRun) {
17
+ logInfo('planning: dry-run, skipping BMAD invocation');
18
+ return;
19
+ }
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);
35
+ logInfo('planning: BMAD outputs validated');
36
+ }
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,7 @@
1
+ export type BmadOutputs = {
2
+ productBriefPath: string;
3
+ prdPath: string;
4
+ architecturePath: string;
5
+ storiesPath: string;
6
+ };
7
+ export declare function validateBmadOutputs(outputs: BmadOutputs): Promise<void>;
@@ -0,0 +1,20 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ export async function validateBmadOutputs(outputs) {
3
+ await assertFileHasContent(outputs.productBriefPath, 'product brief');
4
+ await assertFileHasContent(outputs.prdPath, 'PRD');
5
+ await assertFileHasContent(outputs.architecturePath, 'architecture');
6
+ await assertFileHasContent(outputs.storiesPath, 'stories');
7
+ }
8
+ async function assertFileHasContent(path, label) {
9
+ try {
10
+ await access(path);
11
+ }
12
+ catch {
13
+ throw new Error(`Missing ${label} output: ${path}`);
14
+ }
15
+ const contents = await readFile(path, 'utf-8');
16
+ if (!contents.trim()) {
17
+ throw new Error(`Empty ${label} output: ${path}`);
18
+ }
19
+ }
20
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/planning/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AASpD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAoB;IAC5D,MAAM,oBAAoB,CAAC,OAAO,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IACtE,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,oBAAoB,CAAC,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IACrE,MAAM,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAY,EAAE,KAAa;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,YAAY,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function maybeCreatePr(projectRoot: string, enabled: boolean): Promise<void>;
2
+ export declare function buildGhArgs(prBodyPath: string): string[];
@@ -0,0 +1,65 @@
1
+ import { access } 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 PR_MODE_ENV = 'BEMADRALPHY_PR_MODE';
6
+ export async function maybeCreatePr(projectRoot, enabled) {
7
+ if (!enabled) {
8
+ return;
9
+ }
10
+ if (process.env[PR_MODE_ENV] !== 'gh') {
11
+ logInfo(`pr: set ${PR_MODE_ENV}=gh to enable gh pr create`);
12
+ return;
13
+ }
14
+ if (!(await commandExists('gh'))) {
15
+ logInfo('pr: gh not available; skipping PR creation');
16
+ return;
17
+ }
18
+ const prBodyPath = path.join(projectRoot, '.bemadralphy', 'pr-body.md');
19
+ if (!(await exists(prBodyPath))) {
20
+ logInfo('pr: pr-body.md not found; skipping PR creation');
21
+ return;
22
+ }
23
+ const args = buildGhArgs(prBodyPath);
24
+ await runCommand('gh', ['pr', 'create', ...args], projectRoot);
25
+ logInfo('pr: gh pr create submitted');
26
+ }
27
+ export function buildGhArgs(prBodyPath) {
28
+ const title = process.env.BEMADRALPHY_PR_TITLE ?? 'Automated changes';
29
+ const base = process.env.BEMADRALPHY_PR_BASE ?? 'main';
30
+ const head = process.env.BEMADRALPHY_PR_HEAD;
31
+ const isDraft = process.env.BEMADRALPHY_PR_DRAFT === '1';
32
+ const labels = parseLabelsEnv(process.env.BEMADRALPHY_PR_LABELS);
33
+ const args = ['--title', title, '--body-file', prBodyPath, '--base', base];
34
+ if (head) {
35
+ args.push('--head', head);
36
+ }
37
+ if (isDraft) {
38
+ args.push('--draft');
39
+ }
40
+ if (labels.length > 0) {
41
+ for (const label of labels) {
42
+ args.push('--label', label);
43
+ }
44
+ }
45
+ return args;
46
+ }
47
+ function parseLabelsEnv(raw) {
48
+ if (!raw) {
49
+ return [];
50
+ }
51
+ return raw
52
+ .split(',')
53
+ .map((label) => label.trim())
54
+ .filter(Boolean);
55
+ }
56
+ async function exists(targetPath) {
57
+ try {
58
+ await access(targetPath);
59
+ return true;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/pr/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type QualityGate = {
2
+ name: 'tests' | 'lint';
3
+ command: string;
4
+ args: string[];
5
+ };
6
+ export type GateResult = {
7
+ ok: boolean;
8
+ failedGate?: string;
9
+ error?: string;
10
+ };
11
+ export declare function getQualityGates(): QualityGate[];
12
+ export declare function runQualityGates(cwd: string): Promise<GateResult>;
@@ -0,0 +1,54 @@
1
+ import { runCommand } from '../utils/exec.js';
2
+ export function getQualityGates() {
3
+ const gates = [];
4
+ const testGate = buildGate('tests', 'BEMADRALPHY_TEST_CMD', 'BEMADRALPHY_TEST_ARGS');
5
+ const lintGate = buildGate('lint', 'BEMADRALPHY_LINT_CMD', 'BEMADRALPHY_LINT_ARGS');
6
+ if (testGate) {
7
+ gates.push(testGate);
8
+ }
9
+ if (lintGate) {
10
+ gates.push(lintGate);
11
+ }
12
+ return gates;
13
+ }
14
+ export async function runQualityGates(cwd) {
15
+ const gates = getQualityGates();
16
+ for (const gate of gates) {
17
+ try {
18
+ await runCommand(gate.command, gate.args, cwd);
19
+ }
20
+ catch (error) {
21
+ const message = error instanceof Error ? error.message : String(error);
22
+ return { ok: false, failedGate: gate.name, error: message };
23
+ }
24
+ }
25
+ return { ok: true };
26
+ }
27
+ function buildGate(name, cmdEnv, argsEnv) {
28
+ const command = process.env[cmdEnv];
29
+ if (!command) {
30
+ return null;
31
+ }
32
+ const args = parseArgsEnv(process.env[argsEnv]) ?? [];
33
+ return { name, command, args };
34
+ }
35
+ function parseArgsEnv(raw) {
36
+ if (!raw || !raw.trim()) {
37
+ return null;
38
+ }
39
+ const trimmed = raw.trim();
40
+ if (trimmed.startsWith('[')) {
41
+ try {
42
+ const parsed = JSON.parse(trimmed);
43
+ if (Array.isArray(parsed)) {
44
+ return parsed.map((item) => String(item));
45
+ }
46
+ return null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ return trimmed.split(/\s+/).filter(Boolean);
53
+ }
54
+ //# sourceMappingURL=gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gates.js","sourceRoot":"","sources":["../../src/quality/gates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAc9C,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,sBAAsB,EAAE,uBAAuB,CAAC,CAAC;IACpF,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,SAAS,CAChB,IAAyB,EACzB,MAAc,EACd,OAAe;IAEf,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;YAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function maybeTagRelease(projectRoot: string, dryRun: boolean): Promise<void>;
2
+ export declare function maybeCreateGhRelease(projectRoot: string, dryRun: boolean): Promise<void>;
3
+ export declare function buildGhReleaseArgs(tag: string, notesPath: string): string[];
@@ -0,0 +1,88 @@
1
+ import { access, readFile } 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 RELEASE_TAG_MODE = 'BEMADRALPHY_RELEASE_TAG';
6
+ const RELEASE_MODE = 'BEMADRALPHY_RELEASE_MODE';
7
+ export async function maybeTagRelease(projectRoot, dryRun) {
8
+ const version = await readPackageVersion(projectRoot);
9
+ if (!version) {
10
+ logInfo('release: no package.json found; skipping tag');
11
+ return;
12
+ }
13
+ if (dryRun) {
14
+ logInfo(`release: dry-run, skipping tag v${version}`);
15
+ return;
16
+ }
17
+ if (process.env[RELEASE_TAG_MODE] !== '1') {
18
+ logInfo(`release: tagging disabled; set ${RELEASE_TAG_MODE}=1 to enable`);
19
+ return;
20
+ }
21
+ await runCommand('git', ['tag', `v${version}`], projectRoot);
22
+ logInfo(`release: created git tag v${version}`);
23
+ }
24
+ export async function maybeCreateGhRelease(projectRoot, dryRun) {
25
+ const version = await readPackageVersion(projectRoot);
26
+ if (!version) {
27
+ logInfo('release: no package.json found; skipping gh release');
28
+ return;
29
+ }
30
+ if (dryRun) {
31
+ logInfo(`release: dry-run, skipping gh release v${version}`);
32
+ return;
33
+ }
34
+ if (process.env[RELEASE_MODE] !== 'gh') {
35
+ logInfo(`release: set ${RELEASE_MODE}=gh to enable gh release`);
36
+ return;
37
+ }
38
+ if (process.env[RELEASE_TAG_MODE] !== '1') {
39
+ logInfo(`release: tagging disabled; set ${RELEASE_TAG_MODE}=1 before gh release`);
40
+ return;
41
+ }
42
+ if (!(await commandExists('gh'))) {
43
+ logInfo('release: gh not available; skipping release creation');
44
+ return;
45
+ }
46
+ const notesPath = path.join(projectRoot, 'RELEASE_NOTES.md');
47
+ if (!(await exists(notesPath))) {
48
+ logInfo('release: RELEASE_NOTES.md not found; skipping release creation');
49
+ return;
50
+ }
51
+ const args = buildGhReleaseArgs(`v${version}`, notesPath);
52
+ await runCommand('gh', ['release', 'create', ...args], projectRoot);
53
+ logInfo(`release: gh release created v${version}`);
54
+ }
55
+ export function buildGhReleaseArgs(tag, notesPath) {
56
+ const title = process.env.BEMADRALPHY_RELEASE_TITLE ?? tag;
57
+ const isDraft = process.env.BEMADRALPHY_RELEASE_DRAFT === '1';
58
+ const isPrerelease = process.env.BEMADRALPHY_RELEASE_PRERELEASE === '1';
59
+ const args = ['--title', title, '--notes-file', notesPath, tag];
60
+ if (isDraft) {
61
+ args.push('--draft');
62
+ }
63
+ if (isPrerelease) {
64
+ args.push('--prerelease');
65
+ }
66
+ return args;
67
+ }
68
+ async function readPackageVersion(projectRoot) {
69
+ try {
70
+ const pkgPath = path.join(projectRoot, 'package.json');
71
+ const raw = await readFile(pkgPath, 'utf-8');
72
+ const parsed = JSON.parse(raw);
73
+ return parsed.version ?? null;
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ async function exists(targetPath) {
80
+ try {
81
+ await access(targetPath);
82
+ return true;
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ //# sourceMappingURL=release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","sourceRoot":"","sources":["../src/release.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function archiveSpecChange(projectRoot: string, changeName?: string): Promise<void>;
@@ -0,0 +1,12 @@
1
+ import { logInfo } from '../utils/logging.js';
2
+ import { assertCommandExists, runCommand } from '../utils/exec.js';
3
+ export async function archiveSpecChange(projectRoot, changeName) {
4
+ await assertCommandExists('openspec', 'Install with: npm install -g @fission-ai/openspec');
5
+ const args = ['archive', '-y'];
6
+ if (changeName) {
7
+ args.push(changeName);
8
+ }
9
+ await runCommand('openspec', args, projectRoot);
10
+ logInfo('specs: openspec archive completed');
11
+ }
12
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/specs/archive.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,iBAAiB,CAAC,WAAmB,EAAE,UAAmB;IAC9E,MAAM,mBAAmB,CAAC,UAAU,EAAE,mDAAmD,CAAC,CAAC;IAE3F,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/B,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAChD,OAAO,CAAC,mCAAmC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type SpecChangeResult = {
2
+ id: string;
3
+ title?: string;
4
+ status: 'success' | 'failed' | 'skipped';
5
+ error?: string;
6
+ };
7
+ export declare function writeSpecChanges(projectRoot: string, results: SpecChangeResult[]): Promise<void>;
@@ -0,0 +1,20 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ export async function writeSpecChanges(projectRoot, results) {
4
+ if (results.length === 0) {
5
+ return;
6
+ }
7
+ const changesDir = path.join(projectRoot, 'openspec', 'changes');
8
+ await mkdir(changesDir, { recursive: true });
9
+ const changePath = path.join(changesDir, 'current.md');
10
+ const lines = ['# Spec Changes', ''];
11
+ lines.push(`Generated: ${new Date().toISOString()}`, '');
12
+ lines.push('## Tasks', '');
13
+ for (const result of results) {
14
+ const title = result.title ? `: ${result.title}` : '';
15
+ const error = result.error ? ` (${result.error})` : '';
16
+ lines.push(`- ${result.id}${title} [${result.status}]${error}`);
17
+ }
18
+ await writeFile(changePath, `${lines.join('\n')}\n`, 'utf-8');
19
+ }
20
+ //# sourceMappingURL=changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/specs/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,OAA2B;IAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACjE,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAa,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,EAAE,GAAG,KAAK,KAAK,MAAM,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function mergeSpecDeltas(projectRoot: string): 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 mergeSpecDeltas(projectRoot) {
4
+ await assertCommandExists('openspec', 'Install with: npm install -g @fission-ai/openspec');
5
+ await runCommand('openspec', ['validate', '--all', '--no-interactive'], projectRoot);
6
+ logInfo('specs: openspec validation completed');
7
+ }
8
+ //# sourceMappingURL=delta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta.js","sourceRoot":"","sources":["../../src/specs/delta.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,eAAe,CAAC,WAAmB;IACvD,MAAM,mBAAmB,CAAC,UAAU,EAAE,mDAAmD,CAAC,CAAC;IAC3F,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,WAAW,CAAC,CAAC;IACrF,OAAO,CAAC,sCAAsC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function generateSpecs(projectRoot: string): 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 generateSpecs(projectRoot) {
4
+ await assertCommandExists('openspec', 'Install with: npm install -g @fission-ai/openspec');
5
+ await runCommand('openspec', ['init', projectRoot, '--tools', 'none'], projectRoot);
6
+ logInfo('specs: openspec initialized');
7
+ }
8
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/specs/generate.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,aAAa,CAAC,WAAmB;IACrD,MAAM,mBAAmB,CAAC,UAAU,EAAE,mDAAmD,CAAC,CAAC;IAC3F,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;IACpF,OAAO,CAAC,6BAA6B,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { archiveSpecChange } from './archive.js';
2
+ export { mergeSpecDeltas } from './delta.js';
3
+ export { generateSpecs } from './generate.js';
@@ -0,0 +1,4 @@
1
+ export { archiveSpecChange } from './archive.js';
2
+ export { mergeSpecDeltas } from './delta.js';
3
+ export { generateSpecs } from './generate.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/specs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { SpecMergeSummary } from './delta.js';
2
+ export declare function writeSpecMergeSummary(projectRoot: string, summary: SpecMergeSummary): Promise<void>;
@@ -0,0 +1,19 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ export async function writeSpecMergeSummary(projectRoot, summary) {
4
+ const dir = path.join(projectRoot, '.bemadralphy');
5
+ await mkdir(dir, { recursive: true });
6
+ const lines = [
7
+ '# OpenSpec Merge Summary',
8
+ '',
9
+ `- Merged at: ${summary.mergedAt}`,
10
+ `- Archived path: ${summary.archivedPath}`,
11
+ '',
12
+ '## Preview',
13
+ '',
14
+ summary.preview,
15
+ '',
16
+ ];
17
+ await writeFile(path.join(dir, 'spec-merge.md'), `${lines.join('\n')}\n`, 'utf-8');
18
+ }
19
+ //# sourceMappingURL=merge-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-summary.js","sourceRoot":"","sources":["../../src/specs/merge-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,OAAyB;IAEzB,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,KAAK,GAAG;QACZ,0BAA0B;QAC1B,EAAE;QACF,gBAAgB,OAAO,CAAC,QAAQ,EAAE;QAClC,oBAAoB,OAAO,CAAC,YAAY,EAAE;QAC1C,EAAE;QACF,YAAY;QACZ,EAAE;QACF,OAAO,CAAC,OAAO;QACf,EAAE;KACH,CAAC;IACF,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrF,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type PipelineState = {
2
+ phase: string;
3
+ mode: 'auto' | 'hybrid' | 'supervised';
4
+ engine?: string;
5
+ lastGate?: string;
6
+ tasksCompleted?: number;
7
+ tasksTotal?: number;
8
+ costUsd?: number;
9
+ startedAt?: string;
10
+ };
11
+ export declare function loadState(projectRoot: string): Promise<PipelineState | null>;
12
+ export declare function saveState(projectRoot: string, state: PipelineState): Promise<void>;
package/dist/state.js ADDED
@@ -0,0 +1,20 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { parse, stringify } from 'yaml';
4
+ export async function loadState(projectRoot) {
5
+ const statePath = path.join(projectRoot, '.bemadralphy', 'state.yaml');
6
+ try {
7
+ const raw = await readFile(statePath, 'utf-8');
8
+ return parse(raw) ?? null;
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ export async function saveState(projectRoot, state) {
15
+ const dir = path.join(projectRoot, '.bemadralphy');
16
+ await mkdir(dir, { recursive: true });
17
+ const statePath = path.join(dir, 'state.yaml');
18
+ await writeFile(statePath, stringify(state), 'utf-8');
19
+ }
20
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAaxC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAmB;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAQ,KAAK,CAAC,GAAG,CAAmB,IAAI,IAAI,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAmB,EAAE,KAAoB;IACvE,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,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC/C,MAAM,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { PipelineContext } from '../phases/types.js';
2
+ export declare function generateSteeringFiles(ctx: PipelineContext): Promise<void>;