bmalph 2.4.0 → 2.6.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 (166) hide show
  1. package/README.md +93 -47
  2. package/dist/cli.js +17 -2
  3. package/dist/cli.js.map +1 -0
  4. package/dist/commands/check-updates.js +2 -17
  5. package/dist/commands/check-updates.js.map +1 -0
  6. package/dist/commands/doctor.js +6 -57
  7. package/dist/commands/doctor.js.map +1 -0
  8. package/dist/commands/implement.js +6 -4
  9. package/dist/commands/implement.js.map +1 -0
  10. package/dist/commands/init.js +28 -47
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/reset.js +7 -10
  13. package/dist/commands/reset.js.map +1 -0
  14. package/dist/commands/run.js +46 -0
  15. package/dist/commands/run.js.map +1 -0
  16. package/dist/commands/status.js +18 -3
  17. package/dist/commands/status.js.map +1 -0
  18. package/dist/commands/upgrade.js +7 -10
  19. package/dist/commands/upgrade.js.map +1 -0
  20. package/dist/commands/watch.js +19 -0
  21. package/dist/commands/watch.js.map +1 -0
  22. package/dist/installer.js +11 -38
  23. package/dist/installer.js.map +1 -0
  24. package/dist/platform/aider.js +7 -63
  25. package/dist/platform/aider.js.map +1 -0
  26. package/dist/platform/claude-code.js +5 -39
  27. package/dist/platform/claude-code.js.map +1 -0
  28. package/dist/platform/codex.js +7 -59
  29. package/dist/platform/codex.js.map +1 -0
  30. package/dist/platform/copilot.js +10 -65
  31. package/dist/platform/copilot.js.map +1 -0
  32. package/dist/platform/cursor.js +7 -63
  33. package/dist/platform/cursor.js.map +1 -0
  34. package/dist/platform/detect.js +2 -1
  35. package/dist/platform/detect.js.map +1 -0
  36. package/dist/platform/doctor-checks.js +61 -0
  37. package/dist/platform/doctor-checks.js.map +1 -0
  38. package/dist/platform/index.js +1 -0
  39. package/dist/platform/index.js.map +1 -0
  40. package/dist/platform/instructions-snippet.js +75 -0
  41. package/dist/platform/instructions-snippet.js.map +1 -0
  42. package/dist/platform/registry.js +7 -0
  43. package/dist/platform/registry.js.map +1 -0
  44. package/dist/platform/resolve.js +1 -0
  45. package/dist/platform/resolve.js.map +1 -0
  46. package/dist/platform/types.js +1 -0
  47. package/dist/platform/types.js.map +1 -0
  48. package/dist/platform/windsurf.js +7 -63
  49. package/dist/platform/windsurf.js.map +1 -0
  50. package/dist/reset.js +6 -20
  51. package/dist/reset.js.map +1 -0
  52. package/dist/run/ralph-process.js +89 -0
  53. package/dist/run/ralph-process.js.map +1 -0
  54. package/dist/run/run-dashboard.js +104 -0
  55. package/dist/run/run-dashboard.js.map +1 -0
  56. package/dist/run/types.js +2 -0
  57. package/dist/run/types.js.map +1 -0
  58. package/dist/transition/artifact-scan.js +3 -2
  59. package/dist/transition/artifact-scan.js.map +1 -0
  60. package/dist/transition/artifacts.js +2 -28
  61. package/dist/transition/artifacts.js.map +1 -0
  62. package/dist/transition/context.js +1 -0
  63. package/dist/transition/context.js.map +1 -0
  64. package/dist/transition/fix-plan.js +1 -0
  65. package/dist/transition/fix-plan.js.map +1 -0
  66. package/dist/transition/index.js +2 -1
  67. package/dist/transition/index.js.map +1 -0
  68. package/dist/transition/orchestration.js +3 -2
  69. package/dist/transition/orchestration.js.map +1 -0
  70. package/dist/transition/preflight.js +1 -0
  71. package/dist/transition/preflight.js.map +1 -0
  72. package/dist/transition/specs-changelog.js +3 -2
  73. package/dist/transition/specs-changelog.js.map +1 -0
  74. package/dist/transition/specs-index.js +3 -2
  75. package/dist/transition/specs-index.js.map +1 -0
  76. package/dist/transition/story-parsing.js +1 -0
  77. package/dist/transition/story-parsing.js.map +1 -0
  78. package/dist/transition/tech-stack.js +1 -0
  79. package/dist/transition/tech-stack.js.map +1 -0
  80. package/dist/transition/types.js +1 -0
  81. package/dist/transition/types.js.map +1 -0
  82. package/dist/utils/config.js +3 -2
  83. package/dist/utils/config.js.map +1 -0
  84. package/dist/utils/constants.js +8 -49
  85. package/dist/utils/constants.js.map +1 -0
  86. package/dist/utils/dryrun.js +1 -20
  87. package/dist/utils/dryrun.js.map +1 -0
  88. package/dist/utils/errors.js +1 -19
  89. package/dist/utils/errors.js.map +1 -0
  90. package/dist/utils/file-system.js +34 -3
  91. package/dist/utils/file-system.js.map +1 -0
  92. package/dist/utils/github.js +21 -8
  93. package/dist/utils/github.js.map +1 -0
  94. package/dist/utils/json.js +2 -1
  95. package/dist/utils/json.js.map +1 -0
  96. package/dist/utils/logger.js +1 -14
  97. package/dist/utils/logger.js.map +1 -0
  98. package/dist/utils/state.js +3 -2
  99. package/dist/utils/state.js.map +1 -0
  100. package/dist/utils/validate.js +10 -1
  101. package/dist/utils/validate.js.map +1 -0
  102. package/dist/watch/dashboard.js +61 -0
  103. package/dist/watch/dashboard.js.map +1 -0
  104. package/dist/watch/file-watcher.js +30 -0
  105. package/dist/watch/file-watcher.js.map +1 -0
  106. package/dist/watch/renderer.js +242 -0
  107. package/dist/watch/renderer.js.map +1 -0
  108. package/dist/watch/state-reader.js +200 -0
  109. package/dist/watch/state-reader.js.map +1 -0
  110. package/dist/watch/types.js +2 -0
  111. package/dist/watch/types.js.map +1 -0
  112. package/package.json +11 -8
  113. package/ralph/drivers/copilot.sh +89 -0
  114. package/ralph/lib/circuit_breaker.sh +86 -59
  115. package/ralph/lib/enable_core.sh +3 -6
  116. package/ralph/lib/response_analyzer.sh +5 -29
  117. package/ralph/lib/task_sources.sh +45 -11
  118. package/ralph/lib/wizard_utils.sh +9 -0
  119. package/ralph/ralph_import.sh +7 -2
  120. package/ralph/ralph_loop.sh +29 -34
  121. package/ralph/ralph_monitor.sh +4 -0
  122. package/ralph/templates/ralphrc.template +1 -1
  123. package/slash-commands/bmalph-watch.md +22 -0
  124. package/dist/cli.d.ts +0 -1
  125. package/dist/commands/check-updates.d.ts +0 -5
  126. package/dist/commands/doctor.d.ts +0 -51
  127. package/dist/commands/implement.d.ts +0 -6
  128. package/dist/commands/init.d.ts +0 -9
  129. package/dist/commands/reset.d.ts +0 -7
  130. package/dist/commands/status.d.ts +0 -7
  131. package/dist/commands/upgrade.d.ts +0 -7
  132. package/dist/installer.d.ts +0 -39
  133. package/dist/platform/aider.d.ts +0 -2
  134. package/dist/platform/claude-code.d.ts +0 -2
  135. package/dist/platform/codex.d.ts +0 -2
  136. package/dist/platform/copilot.d.ts +0 -2
  137. package/dist/platform/cursor.d.ts +0 -2
  138. package/dist/platform/detect.d.ts +0 -7
  139. package/dist/platform/index.d.ts +0 -4
  140. package/dist/platform/registry.d.ts +0 -4
  141. package/dist/platform/resolve.d.ts +0 -8
  142. package/dist/platform/types.d.ts +0 -41
  143. package/dist/platform/windsurf.d.ts +0 -2
  144. package/dist/reset.d.ts +0 -18
  145. package/dist/transition/artifact-scan.d.ts +0 -27
  146. package/dist/transition/artifacts.d.ts +0 -3
  147. package/dist/transition/context.d.ts +0 -19
  148. package/dist/transition/fix-plan.d.ts +0 -21
  149. package/dist/transition/index.d.ts +0 -9
  150. package/dist/transition/orchestration.d.ts +0 -2
  151. package/dist/transition/preflight.d.ts +0 -6
  152. package/dist/transition/specs-changelog.d.ts +0 -3
  153. package/dist/transition/specs-index.d.ts +0 -22
  154. package/dist/transition/story-parsing.d.ts +0 -7
  155. package/dist/transition/tech-stack.d.ts +0 -3
  156. package/dist/transition/types.d.ts +0 -82
  157. package/dist/utils/config.d.ts +0 -13
  158. package/dist/utils/constants.d.ts +0 -70
  159. package/dist/utils/dryrun.d.ts +0 -7
  160. package/dist/utils/errors.d.ts +0 -63
  161. package/dist/utils/file-system.d.ts +0 -24
  162. package/dist/utils/github.d.ts +0 -83
  163. package/dist/utils/json.d.ts +0 -7
  164. package/dist/utils/logger.d.ts +0 -9
  165. package/dist/utils/state.d.ts +0 -26
  166. package/dist/utils/validate.d.ts +0 -44
@@ -1,71 +1,16 @@
1
- import { readFile } from "fs/promises";
2
- import { join } from "path";
3
- import { isEnoent, formatError } from "../utils/errors.js";
1
+ import { buildPlatformDoctorChecks } from "./doctor-checks.js";
2
+ import { generateFullTierSnippet } from "./instructions-snippet.js";
4
3
  export const copilotPlatform = {
5
4
  id: "copilot",
6
- displayName: "GitHub Copilot",
7
- tier: "instructions-only",
5
+ displayName: "GitHub Copilot CLI",
6
+ tier: "full",
7
+ experimental: true,
8
8
  instructionsFile: ".github/copilot-instructions.md",
9
9
  commandDelivery: { kind: "none" },
10
10
  instructionsSectionMarker: "## BMAD-METHOD Integration",
11
- generateInstructionsSnippet: () => `
12
- ## BMAD-METHOD Integration
13
-
14
- Ask the BMAD master agent to navigate phases. Ask for help to discover all available agents and workflows.
15
-
16
- ### Phases
17
-
18
- | Phase | Focus | Key Agents |
19
- |-------|-------|-----------|
20
- | 1. Analysis | Understand the problem | Analyst agent |
21
- | 2. Planning | Define the solution | Product Manager agent |
22
- | 3. Solutioning | Design the architecture | Architect agent |
23
-
24
- ### Workflow
25
-
26
- Work through Phases 1-3 using BMAD agents and workflows interactively.
27
-
28
- > **Note:** Ralph (Phase 4 — autonomous implementation) is not supported on this platform.
29
-
30
- ### Available Agents
31
-
32
- | Agent | Role |
33
- |-------|------|
34
- | Analyst | Research, briefs, discovery |
35
- | Architect | Technical design, architecture |
36
- | Product Manager | PRDs, epics, stories |
37
- | Scrum Master | Sprint planning, status, coordination |
38
- | Developer | Implementation, coding |
39
- | UX Designer | User experience, wireframes |
40
- | QA Engineer | Test automation, quality assurance |
41
- `,
42
- getDoctorChecks: () => [
43
- {
44
- id: "instructions-file",
45
- label: ".github/copilot-instructions.md contains BMAD snippet",
46
- check: async (projectDir) => {
47
- try {
48
- const content = await readFile(join(projectDir, ".github/copilot-instructions.md"), "utf-8");
49
- if (content.includes("BMAD-METHOD Integration")) {
50
- return { passed: true };
51
- }
52
- return {
53
- passed: false,
54
- detail: "missing BMAD-METHOD Integration section",
55
- hint: "Run: bmalph init",
56
- };
57
- }
58
- catch (err) {
59
- if (isEnoent(err)) {
60
- return {
61
- passed: false,
62
- detail: ".github/copilot-instructions.md not found",
63
- hint: "Run: bmalph init",
64
- };
65
- }
66
- return { passed: false, detail: formatError(err), hint: "Check file permissions" };
67
- }
68
- },
69
- },
70
- ],
11
+ generateInstructionsSnippet: () => generateFullTierSnippet("Ask"),
12
+ getDoctorChecks() {
13
+ return buildPlatformDoctorChecks(this);
14
+ },
71
15
  };
16
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/platform/copilot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,CAAC,MAAM,eAAe,GAAa;IACvC,EAAE,EAAE,SAAS;IACb,WAAW,EAAE,oBAAoB;IACjC,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,IAAI;IAClB,gBAAgB,EAAE,iCAAiC;IACnD,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACjC,yBAAyB,EAAE,4BAA4B;IACvD,2BAA2B,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC;IACjE,eAAe;QACb,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF,CAAC"}
@@ -1,6 +1,5 @@
1
- import { readFile } from "fs/promises";
2
- import { join } from "path";
3
- import { isEnoent, formatError } from "../utils/errors.js";
1
+ import { buildPlatformDoctorChecks } from "./doctor-checks.js";
2
+ import { generateInstructionsOnlySnippet } from "./instructions-snippet.js";
4
3
  export const cursorPlatform = {
5
4
  id: "cursor",
6
5
  displayName: "Cursor",
@@ -8,64 +7,9 @@ export const cursorPlatform = {
8
7
  instructionsFile: ".cursor/rules/bmad.mdc",
9
8
  commandDelivery: { kind: "none" },
10
9
  instructionsSectionMarker: "## BMAD-METHOD Integration",
11
- generateInstructionsSnippet: () => `
12
- ## BMAD-METHOD Integration
13
-
14
- Ask the BMAD master agent to navigate phases. Ask for help to discover all available agents and workflows.
15
-
16
- ### Phases
17
-
18
- | Phase | Focus | Key Agents |
19
- |-------|-------|-----------|
20
- | 1. Analysis | Understand the problem | Analyst agent |
21
- | 2. Planning | Define the solution | Product Manager agent |
22
- | 3. Solutioning | Design the architecture | Architect agent |
23
-
24
- ### Workflow
25
-
26
- Work through Phases 1-3 using BMAD agents and workflows interactively.
27
-
28
- > **Note:** Ralph (Phase 4 — autonomous implementation) is not supported on this platform.
29
-
30
- ### Available Agents
31
-
32
- | Agent | Role |
33
- |-------|------|
34
- | Analyst | Research, briefs, discovery |
35
- | Architect | Technical design, architecture |
36
- | Product Manager | PRDs, epics, stories |
37
- | Scrum Master | Sprint planning, status, coordination |
38
- | Developer | Implementation, coding |
39
- | UX Designer | User experience, wireframes |
40
- | QA Engineer | Test automation, quality assurance |
41
- `,
42
- getDoctorChecks: () => [
43
- {
44
- id: "instructions-file",
45
- label: ".cursor/rules/bmad.mdc contains BMAD snippet",
46
- check: async (projectDir) => {
47
- try {
48
- const content = await readFile(join(projectDir, ".cursor/rules/bmad.mdc"), "utf-8");
49
- if (content.includes("BMAD-METHOD Integration")) {
50
- return { passed: true };
51
- }
52
- return {
53
- passed: false,
54
- detail: "missing BMAD-METHOD Integration section",
55
- hint: "Run: bmalph init",
56
- };
57
- }
58
- catch (err) {
59
- if (isEnoent(err)) {
60
- return {
61
- passed: false,
62
- detail: ".cursor/rules/bmad.mdc not found",
63
- hint: "Run: bmalph init",
64
- };
65
- }
66
- return { passed: false, detail: formatError(err), hint: "Check file permissions" };
67
- }
68
- },
69
- },
70
- ],
10
+ generateInstructionsSnippet: generateInstructionsOnlySnippet,
11
+ getDoctorChecks() {
12
+ return buildPlatformDoctorChecks(this);
13
+ },
71
14
  };
15
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/platform/cursor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,EAAE,EAAE,QAAQ;IACZ,WAAW,EAAE,QAAQ;IACrB,IAAI,EAAE,mBAAmB;IACzB,gBAAgB,EAAE,wBAAwB;IAC1C,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACjC,yBAAyB,EAAE,4BAA4B;IACvD,2BAA2B,EAAE,+BAA+B;IAC5D,eAAe;QACb,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { exists } from "../utils/file-system.js";
2
- import { join } from "path";
2
+ import { join } from "node:path";
3
3
  const DETECTION_MARKERS = [
4
4
  { platform: "claude-code", markers: [".claude"] },
5
5
  { platform: "codex", markers: ["AGENTS.md"] },
@@ -21,3 +21,4 @@ export async function detectPlatform(projectDir) {
21
21
  const detected = candidates.length === 1 ? (candidates[0] ?? null) : null;
22
22
  return { detected, candidates };
23
23
  }
24
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/platform/detect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,iBAAiB,GAAuD;IAC5E,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE;IACjD,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE;IAC7C,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE;IAC5C,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE;IAChD,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,iCAAiC,CAAC,EAAE;IACrE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE;CACpD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,UAAU,GAAiB,EAAE,CAAC;IAEpC,KAAK,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,iBAAiB,EAAE,CAAC;QACtD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC3C,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1B,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { exists } from "../utils/file-system.js";
4
+ import { isEnoent, formatError } from "../utils/errors.js";
5
+ /**
6
+ * Creates the standard instructions-file doctor check for a platform.
7
+ */
8
+ export function createInstructionsFileCheck(platform) {
9
+ const file = platform.instructionsFile;
10
+ return {
11
+ id: "instructions-file",
12
+ label: `${file} contains BMAD snippet`,
13
+ check: async (projectDir) => {
14
+ try {
15
+ const content = await readFile(join(projectDir, file), "utf-8");
16
+ if (content.includes(platform.instructionsSectionMarker)) {
17
+ return { passed: true };
18
+ }
19
+ return {
20
+ passed: false,
21
+ detail: `missing ${platform.instructionsSectionMarker} section`,
22
+ hint: "Run: bmalph init",
23
+ };
24
+ }
25
+ catch (err) {
26
+ if (isEnoent(err)) {
27
+ return { passed: false, detail: `${file} not found`, hint: "Run: bmalph init" };
28
+ }
29
+ return { passed: false, detail: formatError(err), hint: "Check file permissions" };
30
+ }
31
+ },
32
+ };
33
+ }
34
+ /**
35
+ * Creates a slash-command check for directory-based command delivery.
36
+ */
37
+ function createSlashCommandCheck(dir) {
38
+ return {
39
+ id: "slash-command",
40
+ label: `${dir}/bmalph.md present`,
41
+ check: async (projectDir) => {
42
+ if (await exists(join(projectDir, `${dir}/bmalph.md`))) {
43
+ return { passed: true };
44
+ }
45
+ return { passed: false, detail: "not found", hint: "Run: bmalph init" };
46
+ },
47
+ };
48
+ }
49
+ /**
50
+ * Builds the standard set of doctor checks for any platform.
51
+ * Derives checks from the platform's properties.
52
+ */
53
+ export function buildPlatformDoctorChecks(platform) {
54
+ const checks = [];
55
+ if (platform.commandDelivery.kind === "directory") {
56
+ checks.push(createSlashCommandCheck(platform.commandDelivery.dir));
57
+ }
58
+ checks.push(createInstructionsFileCheck(platform));
59
+ return checks;
60
+ }
61
+ //# sourceMappingURL=doctor-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-checks.js","sourceRoot":"","sources":["../../src/platform/doctor-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAG3D;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAkB;IAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAC;IACvC,OAAO;QACL,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,GAAG,IAAI,wBAAwB;QACtC,KAAK,EAAE,KAAK,EAAE,UAAkB,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBAChE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;oBACzD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBAC1B,CAAC;gBACD,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,MAAM,EAAE,WAAW,QAAQ,CAAC,yBAAyB,UAAU;oBAC/D,IAAI,EAAE,kBAAkB;iBACzB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;gBAClF,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;YACrF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,GAAW;IAC1C,OAAO;QACL,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,GAAG,GAAG,oBAAoB;QACjC,KAAK,EAAE,KAAK,EAAE,UAAkB,EAAE,EAAE;YAClC,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC;gBACvD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC1B,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;QAC1E,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAkB;IAC1D,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,IAAI,QAAQ,CAAC,eAAe,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEnD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { getPlatform, getAllPlatforms, isPlatformId } from "./registry.js";
2
2
  export { resolveProjectPlatform } from "./resolve.js";
3
3
  export { detectPlatform } from "./detect.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Shared instructions snippet for full-tier platforms (codex, copilot).
3
+ * @param verb - Opening verb for the first line ("Run" for codex, "Ask" for copilot).
4
+ */
5
+ export function generateFullTierSnippet(verb) {
6
+ return `
7
+ ## BMAD-METHOD Integration
8
+
9
+ ${verb} the BMAD master agent to navigate phases. Ask for help to discover all available agents and workflows.
10
+
11
+ ### Phases
12
+
13
+ | Phase | Focus | Key Agents |
14
+ |-------|-------|-----------|
15
+ | 1. Analysis | Understand the problem | Analyst agent |
16
+ | 2. Planning | Define the solution | Product Manager agent |
17
+ | 3. Solutioning | Design the architecture | Architect agent |
18
+ | 4. Implementation | Build it | Developer agent, then Ralph autonomous loop |
19
+
20
+ ### Workflow
21
+
22
+ 1. Work through Phases 1-3 using BMAD agents and workflows
23
+ 2. Use the bmalph-implement transition to prepare Ralph format, then start Ralph
24
+
25
+ ### Available Agents
26
+
27
+ | Agent | Role |
28
+ |-------|------|
29
+ | Analyst | Research, briefs, discovery |
30
+ | Architect | Technical design, architecture |
31
+ | Product Manager | PRDs, epics, stories |
32
+ | Scrum Master | Sprint planning, status, coordination |
33
+ | Developer | Implementation, coding |
34
+ | UX Designer | User experience, wireframes |
35
+ | QA Engineer | Test automation, quality assurance |
36
+ `;
37
+ }
38
+ /**
39
+ * Shared instructions snippet for instructions-only platforms.
40
+ * Used by: cursor, windsurf, aider.
41
+ */
42
+ export function generateInstructionsOnlySnippet() {
43
+ return `
44
+ ## BMAD-METHOD Integration
45
+
46
+ Ask the BMAD master agent to navigate phases. Ask for help to discover all available agents and workflows.
47
+
48
+ ### Phases
49
+
50
+ | Phase | Focus | Key Agents |
51
+ |-------|-------|-----------|
52
+ | 1. Analysis | Understand the problem | Analyst agent |
53
+ | 2. Planning | Define the solution | Product Manager agent |
54
+ | 3. Solutioning | Design the architecture | Architect agent |
55
+
56
+ ### Workflow
57
+
58
+ Work through Phases 1-3 using BMAD agents and workflows interactively.
59
+
60
+ > **Note:** Ralph (Phase 4 — autonomous implementation) is not supported on this platform.
61
+
62
+ ### Available Agents
63
+
64
+ | Agent | Role |
65
+ |-------|------|
66
+ | Analyst | Research, briefs, discovery |
67
+ | Architect | Technical design, architecture |
68
+ | Product Manager | PRDs, epics, stories |
69
+ | Scrum Master | Sprint planning, status, coordination |
70
+ | Developer | Implementation, coding |
71
+ | UX Designer | User experience, wireframes |
72
+ | QA Engineer | Test automation, quality assurance |
73
+ `;
74
+ }
75
+ //# sourceMappingURL=instructions-snippet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions-snippet.js","sourceRoot":"","sources":["../../src/platform/instructions-snippet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO;;;EAGP,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BL,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BR,CAAC;AACF,CAAC"}
@@ -25,3 +25,10 @@ export function getAllPlatforms() {
25
25
  export function isPlatformId(value) {
26
26
  return PLATFORMS.has(value);
27
27
  }
28
+ export function getFullTierPlatformNames() {
29
+ return getAllPlatforms()
30
+ .filter((p) => p.tier === "full")
31
+ .map((p) => p.displayName)
32
+ .join(", ");
33
+ }
34
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/platform/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,SAAS,GAAsC,IAAI,GAAG,CAAC;IAC3D,CAAC,aAAa,EAAE,kBAAkB,CAAC;IACnC,CAAC,OAAO,EAAE,aAAa,CAAC;IACxB,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC1B,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAC9B,CAAC,SAAS,EAAE,eAAe,CAAC;IAC5B,CAAC,OAAO,EAAE,aAAa,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,EAAc;IACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,SAAS,CAAC,GAAG,CAAC,KAAmB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,eAAe,EAAE;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;SACzB,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -22,3 +22,4 @@ export async function resolveProjectPlatform(projectDir) {
22
22
  }
23
23
  return getPlatform("claude-code");
24
24
  }
25
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/platform/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,UAAkB;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;YACrB,OAAO,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,kCAAkC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC,aAAa,CAAC,CAAC;AACpC,CAAC"}
@@ -5,3 +5,4 @@
5
5
  * deliver slash commands, and run health checks per platform.
6
6
  */
7
7
  export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/platform/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,6 +1,5 @@
1
- import { readFile } from "fs/promises";
2
- import { join } from "path";
3
- import { isEnoent, formatError } from "../utils/errors.js";
1
+ import { buildPlatformDoctorChecks } from "./doctor-checks.js";
2
+ import { generateInstructionsOnlySnippet } from "./instructions-snippet.js";
4
3
  export const windsurfPlatform = {
5
4
  id: "windsurf",
6
5
  displayName: "Windsurf",
@@ -8,64 +7,9 @@ export const windsurfPlatform = {
8
7
  instructionsFile: ".windsurf/rules/bmad.md",
9
8
  commandDelivery: { kind: "none" },
10
9
  instructionsSectionMarker: "## BMAD-METHOD Integration",
11
- generateInstructionsSnippet: () => `
12
- ## BMAD-METHOD Integration
13
-
14
- Ask the BMAD master agent to navigate phases. Ask for help to discover all available agents and workflows.
15
-
16
- ### Phases
17
-
18
- | Phase | Focus | Key Agents |
19
- |-------|-------|-----------|
20
- | 1. Analysis | Understand the problem | Analyst agent |
21
- | 2. Planning | Define the solution | Product Manager agent |
22
- | 3. Solutioning | Design the architecture | Architect agent |
23
-
24
- ### Workflow
25
-
26
- Work through Phases 1-3 using BMAD agents and workflows interactively.
27
-
28
- > **Note:** Ralph (Phase 4 — autonomous implementation) is not supported on this platform.
29
-
30
- ### Available Agents
31
-
32
- | Agent | Role |
33
- |-------|------|
34
- | Analyst | Research, briefs, discovery |
35
- | Architect | Technical design, architecture |
36
- | Product Manager | PRDs, epics, stories |
37
- | Scrum Master | Sprint planning, status, coordination |
38
- | Developer | Implementation, coding |
39
- | UX Designer | User experience, wireframes |
40
- | QA Engineer | Test automation, quality assurance |
41
- `,
42
- getDoctorChecks: () => [
43
- {
44
- id: "instructions-file",
45
- label: ".windsurf/rules/bmad.md contains BMAD snippet",
46
- check: async (projectDir) => {
47
- try {
48
- const content = await readFile(join(projectDir, ".windsurf/rules/bmad.md"), "utf-8");
49
- if (content.includes("BMAD-METHOD Integration")) {
50
- return { passed: true };
51
- }
52
- return {
53
- passed: false,
54
- detail: "missing BMAD-METHOD Integration section",
55
- hint: "Run: bmalph init",
56
- };
57
- }
58
- catch (err) {
59
- if (isEnoent(err)) {
60
- return {
61
- passed: false,
62
- detail: ".windsurf/rules/bmad.md not found",
63
- hint: "Run: bmalph init",
64
- };
65
- }
66
- return { passed: false, detail: formatError(err), hint: "Check file permissions" };
67
- }
68
- },
69
- },
70
- ],
10
+ generateInstructionsSnippet: generateInstructionsOnlySnippet,
11
+ getDoctorChecks() {
12
+ return buildPlatformDoctorChecks(this);
13
+ },
71
14
  };
15
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/platform/windsurf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,CAAC,MAAM,gBAAgB,GAAa;IACxC,EAAE,EAAE,UAAU;IACd,WAAW,EAAE,UAAU;IACvB,IAAI,EAAE,mBAAmB;IACzB,gBAAgB,EAAE,yBAAyB;IAC3C,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACjC,yBAAyB,EAAE,4BAA4B;IACvD,2BAA2B,EAAE,+BAA+B;IAC5D,eAAe;QACb,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF,CAAC"}
package/dist/reset.js CHANGED
@@ -1,7 +1,7 @@
1
- import { readdir, readFile, rm } from "fs/promises";
2
- import { join, posix } from "path";
1
+ import { readdir, readFile, rm } from "node:fs/promises";
2
+ import { join, posix } from "node:path";
3
3
  import { getSlashCommandsDir } from "./installer.js";
4
- import { exists, atomicWriteFile } from "./utils/file-system.js";
4
+ import { exists, atomicWriteFile, parseGitignoreLines, replaceSection, } from "./utils/file-system.js";
5
5
  import { isEnoent } from "./utils/errors.js";
6
6
  import { BMAD_DIR, RALPH_DIR, BMALPH_DIR, BMAD_OUTPUT_DIR } from "./utils/constants.js";
7
7
  export async function buildResetPlan(projectDir, platform) {
@@ -62,10 +62,7 @@ export async function buildResetPlan(projectDir, platform) {
62
62
  // Check .gitignore for bmalph entries
63
63
  try {
64
64
  const content = await readFile(join(projectDir, ".gitignore"), "utf-8");
65
- const existingLines = new Set(content
66
- .split(/\r?\n/)
67
- .map((line) => line.trim())
68
- .filter(Boolean));
65
+ const existingLines = parseGitignoreLines(content);
69
66
  const bmalpEntries = [".ralph/logs/", "_bmad-output/"];
70
67
  for (const entry of bmalpEntries) {
71
68
  if (existingLines.has(entry)) {
@@ -113,7 +110,7 @@ export async function executeResetPlan(projectDir, plan) {
113
110
  try {
114
111
  let content = await readFile(filePath, "utf-8");
115
112
  for (const marker of plan.instructionsCleanup.sectionsToRemove) {
116
- content = removeSection(content, marker);
113
+ content = replaceSection(content, marker, "");
117
114
  }
118
115
  content = content.trim();
119
116
  if (content.length === 0) {
@@ -142,18 +139,6 @@ export async function executeResetPlan(projectDir, plan) {
142
139
  }
143
140
  }
144
141
  }
145
- function removeSection(content, marker) {
146
- if (!content.includes(marker))
147
- return content;
148
- const sectionStart = content.indexOf(marker);
149
- const before = content.slice(0, sectionStart);
150
- const afterSection = content.slice(sectionStart);
151
- // Find next level-2 heading that doesn't match this section's heading
152
- const markerEscaped = marker.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
153
- const nextHeadingMatch = afterSection.match(new RegExp(`\\n## (?!${markerEscaped.slice(3)})`));
154
- const after = nextHeadingMatch ? afterSection.slice(nextHeadingMatch.index) : "";
155
- return before.trimEnd() + after;
156
- }
157
142
  function removeGitignoreLines(content, linesToRemove) {
158
143
  const removeSet = new Set(linesToRemove);
159
144
  const lines = content.split(/\r?\n/);
@@ -179,3 +164,4 @@ export function planToDryRunActions(plan) {
179
164
  }
180
165
  return actions;
181
166
  }
167
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../src/reset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { spawn } from "node:child_process";
2
+ import { access } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { RALPH_DIR } from "../utils/constants.js";
5
+ const RALPH_LOOP_PATH = `${RALPH_DIR}/ralph_loop.sh`;
6
+ export async function validateBashAvailable() {
7
+ return new Promise((resolve, reject) => {
8
+ const child = spawn("bash", ["--version"], { stdio: "ignore" });
9
+ child.on("close", () => resolve());
10
+ child.on("error", () => reject(new Error("bash is not available. Install bash to run Ralph.")));
11
+ });
12
+ }
13
+ export async function validateRalphLoop(projectDir) {
14
+ const loopPath = join(projectDir, RALPH_LOOP_PATH);
15
+ try {
16
+ await access(loopPath);
17
+ }
18
+ catch {
19
+ throw new Error(`${RALPH_LOOP_PATH} not found. Run: bmalph init`);
20
+ }
21
+ }
22
+ export function spawnRalphLoop(projectDir, platformId, options) {
23
+ const loopPath = join(projectDir, RALPH_LOOP_PATH);
24
+ const child = spawn("bash", [loopPath], {
25
+ cwd: projectDir,
26
+ env: { ...process.env, PLATFORM_DRIVER: platformId },
27
+ stdio: options.inheritStdio ? "inherit" : ["ignore", "pipe", "pipe"],
28
+ detached: process.platform !== "win32",
29
+ });
30
+ let state = "running";
31
+ let exitCode = null;
32
+ let exitCallbacks = [];
33
+ let exited = false;
34
+ child.on("close", (code) => {
35
+ state = "stopped";
36
+ exitCode = code;
37
+ exited = true;
38
+ for (const cb of exitCallbacks)
39
+ cb(code);
40
+ exitCallbacks = [];
41
+ });
42
+ return {
43
+ get child() {
44
+ return child;
45
+ },
46
+ get state() {
47
+ return state;
48
+ },
49
+ set state(s) {
50
+ state = s;
51
+ },
52
+ get exitCode() {
53
+ return exitCode;
54
+ },
55
+ set exitCode(c) {
56
+ exitCode = c;
57
+ },
58
+ kill() {
59
+ if (process.platform !== "win32" && child.pid) {
60
+ try {
61
+ process.kill(-child.pid, "SIGTERM");
62
+ }
63
+ catch {
64
+ child.kill("SIGTERM");
65
+ }
66
+ }
67
+ else {
68
+ child.kill("SIGTERM");
69
+ }
70
+ },
71
+ detach() {
72
+ child.unref();
73
+ if (child.stdout)
74
+ child.stdout.destroy();
75
+ if (child.stderr)
76
+ child.stderr.destroy();
77
+ state = "detached";
78
+ },
79
+ onExit(callback) {
80
+ if (exited) {
81
+ callback(exitCode);
82
+ }
83
+ else {
84
+ exitCallbacks.push(callback);
85
+ }
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=ralph-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ralph-process.js","sourceRoot":"","sources":["../../src/run/ralph-process.ts"],"names":[],"mappings":"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"}