bmalph 2.7.5 → 2.7.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.
Files changed (53) hide show
  1. package/README.md +20 -5
  2. package/dist/commands/doctor-runtime-checks.js +104 -86
  3. package/dist/commands/doctor-runtime-checks.js.map +1 -1
  4. package/dist/installer/bmad-assets.js +182 -0
  5. package/dist/installer/bmad-assets.js.map +1 -0
  6. package/dist/installer/commands.js +324 -0
  7. package/dist/installer/commands.js.map +1 -0
  8. package/dist/installer/install.js +42 -0
  9. package/dist/installer/install.js.map +1 -0
  10. package/dist/installer/metadata.js +56 -0
  11. package/dist/installer/metadata.js.map +1 -0
  12. package/dist/installer/project-files.js +169 -0
  13. package/dist/installer/project-files.js.map +1 -0
  14. package/dist/installer/ralph-assets.js +91 -0
  15. package/dist/installer/ralph-assets.js.map +1 -0
  16. package/dist/installer/template-files.js +168 -0
  17. package/dist/installer/template-files.js.map +1 -0
  18. package/dist/installer/types.js +2 -0
  19. package/dist/installer/types.js.map +1 -0
  20. package/dist/installer.js +5 -843
  21. package/dist/installer.js.map +1 -1
  22. package/dist/transition/artifact-loading.js +91 -0
  23. package/dist/transition/artifact-loading.js.map +1 -0
  24. package/dist/transition/context-output.js +85 -0
  25. package/dist/transition/context-output.js.map +1 -0
  26. package/dist/transition/fix-plan-sync.js +119 -0
  27. package/dist/transition/fix-plan-sync.js.map +1 -0
  28. package/dist/transition/orchestration.js +25 -362
  29. package/dist/transition/orchestration.js.map +1 -1
  30. package/dist/transition/specs-sync.js +78 -2
  31. package/dist/transition/specs-sync.js.map +1 -1
  32. package/dist/utils/ralph-runtime-state.js +222 -0
  33. package/dist/utils/ralph-runtime-state.js.map +1 -0
  34. package/dist/utils/state.js +17 -16
  35. package/dist/utils/state.js.map +1 -1
  36. package/dist/utils/validate.js +16 -0
  37. package/dist/utils/validate.js.map +1 -1
  38. package/dist/watch/renderer.js +48 -6
  39. package/dist/watch/renderer.js.map +1 -1
  40. package/dist/watch/state-reader.js +79 -44
  41. package/dist/watch/state-reader.js.map +1 -1
  42. package/package.json +1 -1
  43. package/ralph/RALPH-REFERENCE.md +33 -13
  44. package/ralph/drivers/claude-code.sh +25 -0
  45. package/ralph/drivers/codex.sh +11 -0
  46. package/ralph/drivers/copilot.sh +11 -0
  47. package/ralph/drivers/cursor.sh +11 -0
  48. package/ralph/lib/circuit_breaker.sh +3 -3
  49. package/ralph/lib/date_utils.sh +28 -9
  50. package/ralph/lib/response_analyzer.sh +127 -7
  51. package/ralph/ralph_loop.sh +464 -121
  52. package/ralph/templates/PROMPT.md +5 -0
  53. package/ralph/templates/ralphrc.template +14 -4
@@ -1,372 +1,35 @@
1
- import { readFile, rm, rename } from "node:fs/promises";
2
- import { join, relative } from "node:path";
3
- import { debug, info, warn } from "../utils/logger.js";
4
- import { isEnoent, formatError } from "../utils/errors.js";
5
- import { atomicWriteFile, exists, getFilesRecursive } from "../utils/file-system.js";
6
- import { readConfig } from "../utils/config.js";
1
+ import { join } from "node:path";
2
+ import { info } from "../utils/logger.js";
7
3
  import { readState, writeState } from "../utils/state.js";
8
- import { parseStoriesWithWarnings } from "./story-parsing.js";
9
- import { generateFixPlan, parseFixPlan, mergeFixPlanProgress, detectOrphanedCompletedStories, detectRenumberedStories, buildCompletedTitleMap, normalizeTitle, } from "./fix-plan.js";
10
- import { detectTechStack, customizeAgentMd } from "./tech-stack.js";
11
- import { findArtifactsDir, resolvePlanningSpecsSubpath } from "./artifacts.js";
12
- import { runPreflight, PreflightValidationError } from "./preflight.js";
13
- import { collectTransitionArtifacts, combineArtifactContents } from "./artifact-collection.js";
14
- import { compareStoryIds } from "./story-id.js";
15
- import { extractProjectContext, generateProjectContextMd, generatePrompt, detectTruncation, } from "./context.js";
16
- import { generateSpecsChangelog, formatChangelog } from "./specs-changelog.js";
17
- import { generateSpecsIndex, formatSpecsIndexMd } from "./specs-index.js";
18
- import { parseSprintStatus } from "./sprint-status.js";
19
- import { prepareSpecsDirectory } from "./specs-sync.js";
20
- async function swapSpecsDirectory(specsDir, specsTmpDir) {
21
- const specsOldDir = `${specsDir}.old`;
22
- let hasBackup = false;
23
- if (await exists(specsDir)) {
24
- await rm(specsOldDir, { recursive: true, force: true });
25
- await rename(specsDir, specsOldDir);
26
- hasBackup = true;
27
- }
28
- else if (await exists(specsOldDir)) {
29
- hasBackup = true;
30
- debug("Found existing .ralph/specs.old from previous failed transition, preserving backup");
31
- }
32
- else {
33
- debug("No existing .ralph/specs to preserve (first transition)");
34
- }
35
- try {
36
- await rename(specsTmpDir, specsDir);
37
- }
38
- catch (err) {
39
- if (hasBackup) {
40
- debug(`Specs swap failed, restoring original: ${formatError(err)}`);
41
- try {
42
- await rename(specsOldDir, specsDir);
43
- }
44
- catch (restoreErr) {
45
- if (!isEnoent(restoreErr)) {
46
- debug(`Could not restore .ralph/specs.old: ${formatError(restoreErr)}`);
47
- }
48
- }
49
- }
50
- throw err;
51
- }
52
- if (hasBackup) {
53
- await rm(specsOldDir, { recursive: true, force: true });
54
- }
55
- }
56
- function ensureUniqueStoryIds(stories) {
57
- const sourceById = new Map();
58
- for (const story of stories) {
59
- const existingSource = sourceById.get(story.id);
60
- if (existingSource) {
61
- throw new Error(`Duplicate story ID "${story.id}" found in ${existingSource} and ${story.sourceFile}`);
62
- }
63
- sourceById.set(story.id, story.sourceFile);
64
- }
65
- }
66
- async function resolveSprintStatusSource(projectDir, artifactsDir, collectedArtifacts, artifactContents) {
67
- const canonicalCandidates = [
68
- "_bmad-output/implementation-artifacts/sprint-status.yaml",
69
- "_bmad-output/implementation_artifacts/sprint-status.yaml",
70
- ];
71
- for (const candidate of canonicalCandidates) {
72
- const candidatePath = join(projectDir, candidate);
73
- if (!(await exists(candidatePath))) {
74
- continue;
75
- }
76
- try {
77
- return {
78
- displayPath: candidate,
79
- content: await readFile(candidatePath, "utf-8"),
80
- };
81
- }
82
- catch (err) {
83
- return {
84
- displayPath: candidate,
85
- content: null,
86
- readError: formatError(err),
87
- };
88
- }
89
- }
90
- if (!collectedArtifacts.sprintStatusFile) {
91
- return null;
92
- }
93
- const artifactsRelativeDir = relative(projectDir, artifactsDir).replace(/\\/g, "/");
94
- return {
95
- displayPath: `${artifactsRelativeDir}/${collectedArtifacts.sprintStatusFile}`,
96
- content: artifactContents.get(collectedArtifacts.sprintStatusFile) ?? null,
97
- };
98
- }
4
+ import { loadTransitionInputs } from "./artifact-loading.js";
5
+ import { generateContextOutputs } from "./context-output.js";
6
+ import { syncFixPlan } from "./fix-plan-sync.js";
7
+ import { prepareSpecsDirectory, syncPreparedSpecsDirectory } from "./specs-sync.js";
99
8
  export async function runTransition(projectDir, options) {
100
- info("Locating BMAD artifacts...");
101
- const artifactsDir = await findArtifactsDir(projectDir);
102
- if (!artifactsDir) {
103
- throw new Error("No BMAD artifacts found. Run BMAD planning phases first (at minimum: Create PRD, Create Architecture, Create Epics and Stories).");
104
- }
105
- const files = await getFilesRecursive(artifactsDir);
106
- const collectedArtifacts = collectTransitionArtifacts(files);
107
- // Read artifact contents early for preflight validation and later use
108
- const artifactContents = new Map();
109
- for (const file of collectedArtifacts.files) {
110
- if (!/\.(?:md|ya?ml)$/i.test(file)) {
111
- continue;
112
- }
113
- try {
114
- const content = await readFile(join(artifactsDir, file), "utf-8");
115
- artifactContents.set(file, content);
116
- }
117
- catch (err) {
118
- warn(`Could not read artifact ${file}: ${formatError(err)}`);
119
- }
120
- }
121
- if (collectedArtifacts.storyFiles.length === 0) {
122
- debug(`Files in artifacts dir: ${collectedArtifacts.files.join(", ")}`);
123
- throw new Error(`No epics/stories file found in ${artifactsDir}. Available files: ${collectedArtifacts.files.join(", ")}. Run 'CE' (Create Epics and Stories) first.`);
124
- }
125
- debug(`Using stories files: ${collectedArtifacts.storyFiles.join(", ")}`);
126
- info("Parsing stories...");
127
- const stories = [];
128
- const parseWarnings = [];
129
- for (const storyFile of collectedArtifacts.storyFiles) {
130
- const storiesContent = artifactContents.get(storyFile);
131
- if (!storiesContent) {
132
- warn(`Could not read stories artifact ${storyFile}`);
133
- continue;
134
- }
135
- const parsedStories = parseStoriesWithWarnings(storiesContent, storyFile);
136
- stories.push(...parsedStories.stories);
137
- parseWarnings.push(...parsedStories.warnings);
138
- }
139
- ensureUniqueStoryIds(stories);
140
- stories.sort((left, right) => compareStoryIds(left.id, right.id) ||
141
- left.sourceFile.localeCompare(right.sourceFile) ||
142
- left.title.localeCompare(right.title));
143
- if (stories.length === 0) {
144
- throw new Error("No stories parsed from the epics files. Ensure stories follow the format: ### Story N.M: Title");
145
- }
146
- // Pre-flight validation
147
- info("Pre-flight validation...");
148
- const preflightResult = runPreflight(artifactContents, collectedArtifacts.files, stories, parseWarnings);
149
- const preflightIssues = options?.force
150
- ? preflightResult.issues.map((issue) => issue.severity === "error" ? { ...issue, severity: "warning" } : issue)
151
- : preflightResult.issues;
152
- if (!preflightResult.pass) {
153
- if (options?.force) {
154
- warn("Pre-flight validation has errors but --force was used, continuing...");
155
- }
156
- else {
157
- throw new PreflightValidationError(preflightResult.issues);
158
- }
159
- }
160
- // Track generated files for summary output
9
+ const inputs = await loadTransitionInputs(projectDir, options);
161
10
  const generatedFiles = [];
162
- // Check existing fix_plan for completed items (smart merge)
163
- let completedIds = new Set();
164
- let existingItems = [];
165
- let orphanWarnings = [];
166
- let renumberWarnings = [];
167
- const completionWarnings = [];
168
- let useTitleBasedMerge = true;
169
- let fixPlanPreserved = false;
170
- const fixPlanPath = join(projectDir, ".ralph/@fix_plan.md");
171
- const fixPlanExisted = await exists(fixPlanPath);
172
- try {
173
- const existingFixPlan = await readFile(fixPlanPath, "utf-8");
174
- existingItems = parseFixPlan(existingFixPlan);
175
- debug(`Found ${existingItems.filter((item) => item.completed).length} completed stories in existing fix_plan`);
176
- }
177
- catch (err) {
178
- if (isEnoent(err)) {
179
- debug("No existing fix_plan found, starting fresh");
180
- }
181
- else {
182
- warn(`Could not read existing fix_plan: ${formatError(err)}`);
183
- }
184
- }
185
- const sprintStatusSource = await resolveSprintStatusSource(projectDir, artifactsDir, collectedArtifacts, artifactContents);
186
- if (sprintStatusSource) {
187
- useTitleBasedMerge = false;
188
- if (sprintStatusSource.readError) {
189
- completionWarnings.push(`Sprint status file "${sprintStatusSource.displayPath}" could not be read: ${sprintStatusSource.readError}. All stories were left unchecked.`);
190
- }
191
- else if (!sprintStatusSource.content) {
192
- completionWarnings.push(`Sprint status file "${sprintStatusSource.displayPath}" could not be read. All stories were left unchecked.`);
193
- }
194
- else {
195
- const sprintStatus = parseSprintStatus(sprintStatusSource.content);
196
- completionWarnings.push(...sprintStatus.warnings);
197
- if (sprintStatus.valid) {
198
- completedIds = new Set(stories
199
- .filter((story) => sprintStatus.storyStatusById.get(story.id) === "done")
200
- .map((story) => story.id));
201
- fixPlanPreserved = completedIds.size > 0;
202
- for (const story of stories) {
203
- if (!sprintStatus.storyStatusById.has(story.id)) {
204
- completionWarnings.push(`Sprint status is missing story ${story.id} (${story.title}); leaving it unchecked.`);
205
- }
206
- }
207
- }
208
- }
209
- }
210
- else {
211
- completedIds = new Set(existingItems.filter((item) => item.completed).map((item) => item.id));
212
- fixPlanPreserved = completedIds.size > 0;
213
- // Detect orphaned completed stories (Bug #2)
214
- const newStoryIds = new Set(stories.map((story) => story.id));
215
- orphanWarnings = detectOrphanedCompletedStories(existingItems, newStoryIds);
216
- // Build title maps for title-based merge (Gap 3: renumbered story preservation)
217
- const completedTitles = buildCompletedTitleMap(existingItems);
218
- const newTitleMap = new Map(stories.map((story) => [story.id, story.title]));
219
- // Detect which stories were preserved via title match (for renumber warning suppression)
220
- const preservedIds = new Set();
221
- for (const [id, title] of newTitleMap) {
222
- if (!completedIds.has(id) && completedTitles.has(normalizeTitle(title))) {
223
- preservedIds.add(id);
224
- }
225
- }
226
- // Detect renumbered stories (Bug #3), skipping auto-preserved ones
227
- renumberWarnings = detectRenumberedStories(existingItems, stories, preservedIds);
228
- }
229
- const completedTitles = buildCompletedTitleMap(existingItems);
230
- const newTitleMap = new Map(stories.map((story) => [story.id, story.title]));
231
- // Generate new fix_plan from current stories, preserving completion status
232
- info(`Generating fix plan for ${stories.length} stories...`);
233
- const planningSpecsSubpath = resolvePlanningSpecsSubpath(projectDir, artifactsDir);
234
- const newFixPlan = generateFixPlan(stories, undefined, planningSpecsSubpath);
235
- const mergedFixPlan = mergeFixPlanProgress(newFixPlan, completedIds, useTitleBasedMerge ? newTitleMap : undefined, useTitleBasedMerge ? completedTitles : undefined);
236
- await atomicWriteFile(fixPlanPath, mergedFixPlan);
237
- generatedFiles.push({
238
- path: ".ralph/@fix_plan.md",
239
- action: fixPlanExisted ? "updated" : "created",
240
- });
11
+ const fixPlanSync = await syncFixPlan(projectDir, inputs);
12
+ generatedFiles.push(fixPlanSync.generatedFile);
241
13
  const specsDir = join(projectDir, ".ralph/specs");
242
14
  const specsTmpDir = join(projectDir, ".ralph/specs.new");
243
15
  info("Preparing specs tree...");
244
- await prepareSpecsDirectory(projectDir, artifactsDir, collectedArtifacts.files, specsTmpDir);
245
- try {
246
- const changes = await generateSpecsChangelog(specsDir, specsTmpDir);
247
- if (changes.length > 0) {
248
- const changelog = formatChangelog(changes, new Date().toISOString());
249
- await atomicWriteFile(join(projectDir, ".ralph/SPECS_CHANGELOG.md"), changelog);
250
- generatedFiles.push({ path: ".ralph/SPECS_CHANGELOG.md", action: "updated" });
251
- debug(`Generated SPECS_CHANGELOG.md with ${changes.length} changes`);
252
- }
253
- }
254
- catch (err) {
255
- warn(`Could not generate SPECS_CHANGELOG.md: ${formatError(err)}`);
256
- }
257
- info("Copying specs to .ralph/specs/...");
258
- await swapSpecsDirectory(specsDir, specsTmpDir);
259
- generatedFiles.push({ path: ".ralph/specs/", action: "updated" });
260
- // Generate SPECS_INDEX.md for intelligent spec reading
261
- info("Generating SPECS_INDEX.md...");
262
- const specsIndexPath = join(projectDir, ".ralph/SPECS_INDEX.md");
263
- const specsIndexExisted = await exists(specsIndexPath);
264
- try {
265
- const specsIndex = await generateSpecsIndex(specsDir);
266
- if (specsIndex.totalFiles > 0) {
267
- await atomicWriteFile(specsIndexPath, formatSpecsIndexMd(specsIndex));
268
- generatedFiles.push({
269
- path: ".ralph/SPECS_INDEX.md",
270
- action: specsIndexExisted ? "updated" : "created",
271
- });
272
- debug(`Generated SPECS_INDEX.md with ${specsIndex.totalFiles} files`);
273
- }
274
- }
275
- catch (err) {
276
- warn(`Could not generate SPECS_INDEX.md: ${formatError(err)}`);
277
- }
278
- // Generate PROJECT_CONTEXT.md from planning artifacts
279
- let projectName = "project";
280
- try {
281
- const config = await readConfig(projectDir);
282
- if (config?.name) {
283
- projectName = config.name;
284
- }
285
- }
286
- catch (err) {
287
- debug(`Could not read config for project name: ${formatError(err)}`);
288
- }
289
- // Extract project context for both PROJECT_CONTEXT.md and PROMPT.md
290
- info("Generating PROJECT_CONTEXT.md...");
291
- const projectContextPath = join(projectDir, ".ralph/PROJECT_CONTEXT.md");
292
- const projectContextExisted = await exists(projectContextPath);
293
- let projectContext = null;
294
- let truncationWarnings = [];
295
- if (artifactContents.size > 0) {
296
- const { context, truncated } = extractProjectContext(artifactContents);
297
- projectContext = context;
298
- truncationWarnings = detectTruncation(truncated);
299
- const contextMd = generateProjectContextMd(projectContext, projectName);
300
- await atomicWriteFile(projectContextPath, contextMd);
301
- generatedFiles.push({
302
- path: ".ralph/PROJECT_CONTEXT.md",
303
- action: projectContextExisted ? "updated" : "created",
304
- });
305
- debug("Generated PROJECT_CONTEXT.md");
306
- }
307
- // Generate PROMPT.md with embedded context
308
- info("Generating PROMPT.md...");
309
- // Try to preserve rich PROMPT.md template if it has the placeholder
310
- let prompt;
311
- let promptExisted = false;
312
- try {
313
- const existingPrompt = await readFile(join(projectDir, ".ralph/PROMPT.md"), "utf-8");
314
- promptExisted = true;
315
- if (existingPrompt.includes("[YOUR PROJECT NAME]")) {
316
- prompt = existingPrompt.replace(/\[YOUR PROJECT NAME\]/g, projectName);
317
- }
318
- else {
319
- // Pass context to embed critical specs directly in PROMPT.md
320
- prompt = generatePrompt(projectName, projectContext ?? undefined);
321
- }
322
- }
323
- catch (err) {
324
- if (isEnoent(err)) {
325
- debug("No existing PROMPT.md found, generating from template");
326
- }
327
- else {
328
- warn(`Could not read existing PROMPT.md: ${formatError(err)}`);
329
- }
330
- prompt = generatePrompt(projectName, projectContext ?? undefined);
331
- }
332
- await atomicWriteFile(join(projectDir, ".ralph/PROMPT.md"), prompt);
333
- generatedFiles.push({ path: ".ralph/PROMPT.md", action: promptExisted ? "updated" : "created" });
334
- // Customize @AGENT.md based on detected tech stack from architecture
335
- const combinedArchitectureContent = combineArtifactContents(collectedArtifacts.architectureFiles, artifactContents);
336
- if (combinedArchitectureContent) {
337
- try {
338
- const stack = detectTechStack(combinedArchitectureContent);
339
- if (stack) {
340
- const agentPath = join(projectDir, ".ralph/@AGENT.md");
341
- const agentTemplate = await readFile(agentPath, "utf-8");
342
- const customized = customizeAgentMd(agentTemplate, stack);
343
- await atomicWriteFile(agentPath, customized);
344
- generatedFiles.push({ path: ".ralph/@AGENT.md", action: "updated" });
345
- debug("Customized @AGENT.md with detected tech stack");
346
- }
347
- }
348
- catch (err) {
349
- warn(`Could not customize @AGENT.md: ${formatError(err)}`);
350
- }
351
- }
352
- // Collect warnings from all sources
353
- const preflightWarnings = preflightIssues
354
- .filter((i) => i.severity === "warning")
355
- .map((i) => i.message);
356
- // Keep parse warnings not already covered by preflight.
357
- const nonPreflightParseWarnings = parseWarnings.filter((w) => !/malformed story id/i.test(w) &&
358
- !/has no acceptance criteria/i.test(w) &&
359
- !/has no description/i.test(w) &&
360
- !/not under an epic/i.test(w));
16
+ await prepareSpecsDirectory(projectDir, inputs.artifactsDir, inputs.collectedArtifacts.files, specsTmpDir);
17
+ generatedFiles.push(...(await syncPreparedSpecsDirectory(projectDir, specsDir, specsTmpDir)));
18
+ const contextOutput = await generateContextOutputs(projectDir, inputs);
19
+ generatedFiles.push(...contextOutput.generatedFiles);
20
+ const preflightWarnings = inputs.preflightIssues
21
+ .filter((issue) => issue.severity === "warning")
22
+ .map((issue) => issue.message);
23
+ const nonPreflightParseWarnings = inputs.parseWarnings.filter((warning) => !/malformed story id/i.test(warning) &&
24
+ !/has no acceptance criteria/i.test(warning) &&
25
+ !/has no description/i.test(warning) &&
26
+ !/not under an epic/i.test(warning));
361
27
  const warnings = [
362
28
  ...preflightWarnings,
363
29
  ...nonPreflightParseWarnings,
364
- ...completionWarnings,
365
- ...orphanWarnings,
366
- ...renumberWarnings,
367
- ...truncationWarnings,
30
+ ...fixPlanSync.warnings,
31
+ ...contextOutput.warnings,
368
32
  ];
369
- // Update phase state to 4 (Implementation) - Bug #1
370
33
  const now = new Date().toISOString();
371
34
  const currentState = await readState(projectDir);
372
35
  const newState = {
@@ -378,10 +41,10 @@ export async function runTransition(projectDir, options) {
378
41
  await writeState(projectDir, newState);
379
42
  info("Transition complete: phase 4 (implementing)");
380
43
  return {
381
- storiesCount: stories.length,
44
+ storiesCount: inputs.stories.length,
382
45
  warnings,
383
- fixPlanPreserved,
384
- preflightIssues,
46
+ fixPlanPreserved: fixPlanSync.fixPlanPreserved,
47
+ preflightIssues: inputs.preflightIssues,
385
48
  generatedFiles,
386
49
  };
387
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"orchestration.js","sourceRoot":"","sources":["../../src/transition/orchestration.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestration.js","sourceRoot":"","sources":["../../src/transition/orchestration.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
- import { access, cp, mkdir, rm } from "node:fs/promises";
1
+ import { access, cp, mkdir, rename, rm } from "node:fs/promises";
2
2
  import { dirname, join } from "node:path";
3
- import { exists } from "../utils/file-system.js";
3
+ import { debug, info, warn } from "../utils/logger.js";
4
+ import { atomicWriteFile, exists } from "../utils/file-system.js";
5
+ import { formatError, isEnoent } from "../utils/errors.js";
4
6
  import { resolvePlanningSpecsSubpath } from "./artifacts.js";
7
+ import { generateSpecsChangelog, formatChangelog } from "./specs-changelog.js";
8
+ import { generateSpecsIndex, formatSpecsIndexMd } from "./specs-index.js";
5
9
  export async function prepareSpecsDirectory(projectDir, artifactsDir, artifactFiles, specsTmpDir) {
6
10
  const bmadOutputDir = join(projectDir, "_bmad-output");
7
11
  const bmadOutputExists = await exists(bmadOutputDir);
@@ -20,4 +24,76 @@ export async function prepareSpecsDirectory(projectDir, artifactsDir, artifactFi
20
24
  }
21
25
  await access(specsTmpDir);
22
26
  }
27
+ export async function syncPreparedSpecsDirectory(projectDir, specsDir, specsTmpDir) {
28
+ const generatedFiles = [];
29
+ try {
30
+ const changes = await generateSpecsChangelog(specsDir, specsTmpDir);
31
+ if (changes.length > 0) {
32
+ const changelog = formatChangelog(changes, new Date().toISOString());
33
+ await atomicWriteFile(join(projectDir, ".ralph/SPECS_CHANGELOG.md"), changelog);
34
+ generatedFiles.push({ path: ".ralph/SPECS_CHANGELOG.md", action: "updated" });
35
+ debug(`Generated SPECS_CHANGELOG.md with ${changes.length} changes`);
36
+ }
37
+ }
38
+ catch (err) {
39
+ warn(`Could not generate SPECS_CHANGELOG.md: ${formatError(err)}`);
40
+ }
41
+ info("Copying specs to .ralph/specs/...");
42
+ await swapSpecsDirectory(specsDir, specsTmpDir);
43
+ generatedFiles.push({ path: ".ralph/specs/", action: "updated" });
44
+ info("Generating SPECS_INDEX.md...");
45
+ const specsIndexPath = join(projectDir, ".ralph/SPECS_INDEX.md");
46
+ const specsIndexExisted = await exists(specsIndexPath);
47
+ try {
48
+ const specsIndex = await generateSpecsIndex(specsDir);
49
+ if (specsIndex.totalFiles > 0) {
50
+ await atomicWriteFile(specsIndexPath, formatSpecsIndexMd(specsIndex));
51
+ generatedFiles.push({
52
+ path: ".ralph/SPECS_INDEX.md",
53
+ action: specsIndexExisted ? "updated" : "created",
54
+ });
55
+ debug(`Generated SPECS_INDEX.md with ${specsIndex.totalFiles} files`);
56
+ }
57
+ }
58
+ catch (err) {
59
+ warn(`Could not generate SPECS_INDEX.md: ${formatError(err)}`);
60
+ }
61
+ return generatedFiles;
62
+ }
63
+ export async function swapSpecsDirectory(specsDir, specsTmpDir) {
64
+ const specsOldDir = `${specsDir}.old`;
65
+ let hasBackup = false;
66
+ if (await exists(specsDir)) {
67
+ await rm(specsOldDir, { recursive: true, force: true });
68
+ await rename(specsDir, specsOldDir);
69
+ hasBackup = true;
70
+ }
71
+ else if (await exists(specsOldDir)) {
72
+ hasBackup = true;
73
+ debug("Found existing .ralph/specs.old from previous failed transition, preserving backup");
74
+ }
75
+ else {
76
+ debug("No existing .ralph/specs to preserve (first transition)");
77
+ }
78
+ try {
79
+ await rename(specsTmpDir, specsDir);
80
+ }
81
+ catch (err) {
82
+ if (hasBackup) {
83
+ debug(`Specs swap failed, restoring original: ${formatError(err)}`);
84
+ try {
85
+ await rename(specsOldDir, specsDir);
86
+ }
87
+ catch (restoreErr) {
88
+ if (!isEnoent(restoreErr)) {
89
+ debug(`Could not restore .ralph/specs.old: ${formatError(restoreErr)}`);
90
+ }
91
+ }
92
+ }
93
+ throw err;
94
+ }
95
+ if (hasBackup) {
96
+ await rm(specsOldDir, { recursive: true, force: true });
97
+ }
98
+ }
23
99
  //# sourceMappingURL=specs-sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"specs-sync.js","sourceRoot":"","sources":["../../src/transition/specs-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAkB,EAClB,YAAoB,EACpB,aAAgC,EAChC,WAAmB;IAEnB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAEnF,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,eAAe,EAAE;YAClD,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"specs-sync.js","sourceRoot":"","sources":["../../src/transition/specs-sync.ts"],"names":[],"mappings":"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"}