@bastani/atomic 0.9.0-alpha.1 → 0.9.0-alpha.3

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 (223) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/builtin/cursor/CHANGELOG.md +6 -0
  3. package/dist/builtin/cursor/package.json +2 -2
  4. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  5. package/dist/builtin/intercom/package.json +2 -2
  6. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  7. package/dist/builtin/mcp/package.json +3 -3
  8. package/dist/builtin/subagents/CHANGELOG.md +6 -0
  9. package/dist/builtin/subagents/package.json +4 -4
  10. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  11. package/dist/builtin/web-access/package.json +2 -2
  12. package/dist/builtin/workflows/CHANGELOG.md +19 -0
  13. package/dist/builtin/workflows/README.md +189 -122
  14. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +30 -27
  15. package/dist/builtin/workflows/builtin/goal-ledger.ts +2 -0
  16. package/dist/builtin/workflows/builtin/goal-reports.ts +5 -0
  17. package/dist/builtin/workflows/builtin/goal-runner.ts +17 -20
  18. package/dist/builtin/workflows/builtin/goal-types.ts +2 -0
  19. package/dist/builtin/workflows/builtin/goal.d.ts +1 -0
  20. package/dist/builtin/workflows/builtin/goal.ts +40 -44
  21. package/dist/builtin/workflows/builtin/index.d.ts +1 -0
  22. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +16 -17
  23. package/dist/builtin/workflows/builtin/open-claude-design.d.ts +1 -0
  24. package/dist/builtin/workflows/builtin/open-claude-design.ts +42 -50
  25. package/dist/builtin/workflows/builtin/prompt-refinement.ts +102 -0
  26. package/dist/builtin/workflows/builtin/ralph-core.ts +6 -4
  27. package/dist/builtin/workflows/builtin/ralph-runner.ts +22 -24
  28. package/dist/builtin/workflows/builtin/ralph.d.ts +2 -0
  29. package/dist/builtin/workflows/builtin/ralph.ts +46 -41
  30. package/dist/builtin/workflows/package.json +2 -2
  31. package/dist/builtin/workflows/src/authoring/typebox-defaults.d.ts +41 -0
  32. package/dist/builtin/workflows/src/authoring/typebox-defaults.ts +217 -0
  33. package/dist/builtin/workflows/src/authoring/workflow.ts +184 -0
  34. package/dist/builtin/workflows/src/authoring.d.ts +14 -66
  35. package/dist/builtin/workflows/src/engine/graph-inference.ts +100 -0
  36. package/dist/builtin/workflows/src/engine/options.ts +40 -0
  37. package/dist/builtin/workflows/src/engine/primitives/chain.ts +29 -0
  38. package/dist/builtin/workflows/src/engine/primitives/exit.ts +2 -0
  39. package/dist/builtin/workflows/src/engine/primitives/parallel.ts +47 -0
  40. package/dist/builtin/workflows/src/engine/primitives/task.ts +108 -0
  41. package/dist/builtin/workflows/src/engine/primitives/ui.ts +41 -0
  42. package/dist/builtin/workflows/src/engine/primitives/workflow.ts +159 -0
  43. package/dist/builtin/workflows/src/engine/replay.ts +8 -0
  44. package/dist/builtin/workflows/src/engine/run.ts +356 -0
  45. package/dist/builtin/workflows/src/engine/runtime.ts +160 -0
  46. package/dist/builtin/workflows/src/extension/workflow-module-loader.ts +9 -3
  47. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +3 -1
  48. package/dist/builtin/workflows/src/extension/workflow-schema.ts +0 -18
  49. package/dist/builtin/workflows/src/index.ts +0 -2
  50. package/dist/builtin/workflows/src/runs/background/runner.ts +6 -3
  51. package/dist/builtin/workflows/src/runs/foreground/executor-child-boundary.ts +3 -3
  52. package/dist/builtin/workflows/src/runs/foreground/executor-child-helpers.ts +4 -4
  53. package/dist/builtin/workflows/src/runs/foreground/executor-child-workflow.ts +1 -158
  54. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +1 -1
  55. package/dist/builtin/workflows/src/runs/foreground/executor-outputs.ts +2 -2
  56. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +1 -1
  57. package/dist/builtin/workflows/src/runs/foreground/executor-run.ts +1 -359
  58. package/dist/builtin/workflows/src/runs/foreground/executor-scheduler.ts +1 -1
  59. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +2 -5
  60. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +12 -4
  61. package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +4 -3
  62. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +9 -2
  63. package/dist/builtin/workflows/src/runs/foreground/executor-task-context.ts +2 -132
  64. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +2 -2
  65. package/dist/builtin/workflows/src/runs/shared/graph-inference.ts +2 -100
  66. package/dist/builtin/workflows/src/sdk-surface.ts +6 -9
  67. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +9 -3
  68. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +17 -3
  69. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +3 -33
  70. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +9 -81
  71. package/dist/builtin/workflows/src/shared/types.ts +25 -8
  72. package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +49 -0
  73. package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +84 -0
  74. package/dist/builtin/workflows/src/workflows/registry.ts +7 -3
  75. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  76. package/dist/core/agent-session-auto-compaction.js +6 -1
  77. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  78. package/dist/core/agent-session-bash.d.ts.map +1 -1
  79. package/dist/core/agent-session-bash.js +0 -5
  80. package/dist/core/agent-session-bash.js.map +1 -1
  81. package/dist/core/agent-session-methods.d.ts +0 -2
  82. package/dist/core/agent-session-methods.d.ts.map +1 -1
  83. package/dist/core/agent-session-methods.js.map +1 -1
  84. package/dist/core/agent-session-services.d.ts +0 -1
  85. package/dist/core/agent-session-services.d.ts.map +1 -1
  86. package/dist/core/agent-session-services.js +0 -1
  87. package/dist/core/agent-session-services.js.map +1 -1
  88. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  89. package/dist/core/agent-session-tool-registry.js +0 -2
  90. package/dist/core/agent-session-tool-registry.js.map +1 -1
  91. package/dist/core/agent-session-types.d.ts +0 -2
  92. package/dist/core/agent-session-types.d.ts.map +1 -1
  93. package/dist/core/agent-session-types.js.map +1 -1
  94. package/dist/core/agent-session.d.ts +0 -2
  95. package/dist/core/agent-session.d.ts.map +1 -1
  96. package/dist/core/agent-session.js +0 -1
  97. package/dist/core/agent-session.js.map +1 -1
  98. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  99. package/dist/core/atomic-guide-command.js +1 -1
  100. package/dist/core/atomic-guide-command.js.map +1 -1
  101. package/dist/core/extensions/loader-core.d.ts +1 -3
  102. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  103. package/dist/core/extensions/loader-core.js +13 -6
  104. package/dist/core/extensions/loader-core.js.map +1 -1
  105. package/dist/core/extensions/loader-virtual-modules.d.ts +7 -1
  106. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  107. package/dist/core/extensions/loader-virtual-modules.js +34 -2
  108. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  109. package/dist/core/extensions/loader.d.ts +2 -1
  110. package/dist/core/extensions/loader.d.ts.map +1 -1
  111. package/dist/core/extensions/loader.js +2 -1
  112. package/dist/core/extensions/loader.js.map +1 -1
  113. package/dist/core/index.d.ts +0 -1
  114. package/dist/core/index.d.ts.map +1 -1
  115. package/dist/core/index.js +0 -1
  116. package/dist/core/index.js.map +1 -1
  117. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  118. package/dist/core/model-registry-builtins.js +6 -0
  119. package/dist/core/model-registry-builtins.js.map +1 -1
  120. package/dist/core/model-registry-schemas.d.ts +65 -13
  121. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  122. package/dist/core/model-registry-schemas.js +10 -0
  123. package/dist/core/model-registry-schemas.js.map +1 -1
  124. package/dist/core/resource-loader-core.d.ts +1 -0
  125. package/dist/core/resource-loader-core.d.ts.map +1 -1
  126. package/dist/core/resource-loader-core.js +2 -0
  127. package/dist/core/resource-loader-core.js.map +1 -1
  128. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  129. package/dist/core/resource-loader-extensions.js +3 -3
  130. package/dist/core/resource-loader-extensions.js.map +1 -1
  131. package/dist/core/resource-loader-internals.d.ts +1 -0
  132. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  133. package/dist/core/resource-loader-internals.js.map +1 -1
  134. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  135. package/dist/core/resource-loader-reload.js +6 -2
  136. package/dist/core/resource-loader-reload.js.map +1 -1
  137. package/dist/core/sdk-exports.d.ts +1 -1
  138. package/dist/core/sdk-exports.d.ts.map +1 -1
  139. package/dist/core/sdk-exports.js.map +1 -1
  140. package/dist/core/sdk-types.d.ts +0 -3
  141. package/dist/core/sdk-types.d.ts.map +1 -1
  142. package/dist/core/sdk-types.js.map +1 -1
  143. package/dist/core/sdk.d.ts.map +1 -1
  144. package/dist/core/sdk.js +0 -1
  145. package/dist/core/sdk.js.map +1 -1
  146. package/dist/core/session-manager-history.d.ts.map +1 -1
  147. package/dist/core/session-manager-history.js +2 -1
  148. package/dist/core/session-manager-history.js.map +1 -1
  149. package/dist/core/system-prompt.d.ts.map +1 -1
  150. package/dist/core/system-prompt.js +0 -1
  151. package/dist/core/system-prompt.js.map +1 -1
  152. package/dist/core/tools/bash.d.ts +0 -5
  153. package/dist/core/tools/bash.d.ts.map +1 -1
  154. package/dist/core/tools/bash.js +10 -11
  155. package/dist/core/tools/bash.js.map +1 -1
  156. package/dist/core/tools/edit-diff-preserve.d.ts +18 -0
  157. package/dist/core/tools/edit-diff-preserve.d.ts.map +1 -0
  158. package/dist/core/tools/edit-diff-preserve.js +85 -0
  159. package/dist/core/tools/edit-diff-preserve.js.map +1 -0
  160. package/dist/core/tools/edit-diff.d.ts +3 -2
  161. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  162. package/dist/core/tools/edit-diff.js +15 -18
  163. package/dist/core/tools/edit-diff.js.map +1 -1
  164. package/dist/core/tools/index.d.ts +0 -1
  165. package/dist/core/tools/index.d.ts.map +1 -1
  166. package/dist/core/tools/index.js +0 -1
  167. package/dist/core/tools/index.js.map +1 -1
  168. package/dist/index.d.ts +2 -2
  169. package/dist/index.d.ts.map +1 -1
  170. package/dist/index.js +1 -1
  171. package/dist/index.js.map +1 -1
  172. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  173. package/dist/modes/interactive/components/model-selector.js +2 -2
  174. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  175. package/dist/modes/interactive/model-search.d.ts +5 -0
  176. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  177. package/dist/modes/interactive/model-search.js +9 -0
  178. package/dist/modes/interactive/model-search.js.map +1 -1
  179. package/dist/utils/shell.d.ts +1 -0
  180. package/dist/utils/shell.d.ts.map +1 -1
  181. package/dist/utils/shell.js +12 -5
  182. package/dist/utils/shell.js.map +1 -1
  183. package/docs/custom-provider.md +4 -3
  184. package/docs/models.md +3 -2
  185. package/docs/packages.md +2 -2
  186. package/docs/quickstart.md +1 -1
  187. package/docs/sdk.md +2 -40
  188. package/docs/security.md +1 -1
  189. package/docs/workflows.md +991 -176
  190. package/package.json +5 -5
  191. package/dist/builtin/workflows/src/workflows/define-workflow.ts +0 -277
  192. package/dist/core/tools/bash-policy-compile.d.ts +0 -5
  193. package/dist/core/tools/bash-policy-compile.d.ts.map +0 -1
  194. package/dist/core/tools/bash-policy-compile.js +0 -241
  195. package/dist/core/tools/bash-policy-compile.js.map +0 -1
  196. package/dist/core/tools/bash-policy-evaluate.d.ts +0 -3
  197. package/dist/core/tools/bash-policy-evaluate.d.ts.map +0 -1
  198. package/dist/core/tools/bash-policy-evaluate.js +0 -92
  199. package/dist/core/tools/bash-policy-evaluate.js.map +0 -1
  200. package/dist/core/tools/bash-policy-format.d.ts +0 -5
  201. package/dist/core/tools/bash-policy-format.d.ts.map +0 -1
  202. package/dist/core/tools/bash-policy-format.js +0 -49
  203. package/dist/core/tools/bash-policy-format.js.map +0 -1
  204. package/dist/core/tools/bash-policy-parser.d.ts +0 -4
  205. package/dist/core/tools/bash-policy-parser.d.ts.map +0 -1
  206. package/dist/core/tools/bash-policy-parser.js +0 -155
  207. package/dist/core/tools/bash-policy-parser.js.map +0 -1
  208. package/dist/core/tools/bash-policy-segment.d.ts +0 -3
  209. package/dist/core/tools/bash-policy-segment.d.ts.map +0 -1
  210. package/dist/core/tools/bash-policy-segment.js +0 -275
  211. package/dist/core/tools/bash-policy-segment.js.map +0 -1
  212. package/dist/core/tools/bash-policy-shell.d.ts +0 -11
  213. package/dist/core/tools/bash-policy-shell.d.ts.map +0 -1
  214. package/dist/core/tools/bash-policy-shell.js +0 -267
  215. package/dist/core/tools/bash-policy-shell.js.map +0 -1
  216. package/dist/core/tools/bash-policy-types.d.ts +0 -146
  217. package/dist/core/tools/bash-policy-types.d.ts.map +0 -1
  218. package/dist/core/tools/bash-policy-types.js +0 -2
  219. package/dist/core/tools/bash-policy-types.js.map +0 -1
  220. package/dist/core/tools/bash-policy.d.ts +0 -6
  221. package/dist/core/tools/bash-policy.d.ts.map +0 -1
  222. package/dist/core/tools/bash-policy.js +0 -5
  223. package/dist/core/tools/bash-policy.js.map +0 -1
@@ -4,6 +4,7 @@ import { tmpdir } from "node:os";
4
4
  import { join, resolve } from "node:path";
5
5
  import type { WorkflowRunContext, WorkflowTaskResult } from "../src/shared/types.js";
6
6
  import { E2E_VERIFICATION_GUIDANCE, WORKER_PREFLIGHT_CONTRACT } from "./shared-prompts.js";
7
+ import { runPromptRefinementStage } from "./prompt-refinement.js";
7
8
  import { reviewDecisionApproved } from "./ralph-review-gate.js";
8
9
  import {
9
10
  REVIEWER_COUNT,
@@ -14,7 +15,7 @@ import {
14
15
  defaultResearchPath,
15
16
  forkContinuationOptions,
16
17
  renderForkedOrchestratorPrompt,
17
- renderPromptEngineerPrompt,
18
+ renderResearchPromptRefinementPrompt,
18
19
  renderQaE2eVideoGuidance,
19
20
  renderResearchPrompt,
20
21
  reviewDecisionFromResult,
@@ -39,13 +40,7 @@ export async function runRalphWorkflow(
39
40
  ctx: WorkflowRunContext<RalphInputs>,
40
41
  options: RalphWorkflowOptions,
41
42
  ): Promise<RalphWorkflowResult> {
42
- const {
43
- prompt,
44
- maxLoops,
45
- comparisonBaseBranch,
46
- workflowStartCwd,
47
- createPr,
48
- } = options;
43
+ const { prompt, maxLoops, comparisonBaseBranch, workflowStartCwd, createPr } = options;
49
44
  let latestReviewReportPath: string | undefined;
50
45
  let finalPlan = "";
51
46
  let finalPlanPath = "";
@@ -53,39 +48,40 @@ export async function runRalphWorkflow(
53
48
  let finalResearchPath = "";
54
49
  let finalResult = "";
55
50
  let finalPrReport: string | undefined;
56
- const workflowResearchPath = resolve(workflowStartCwd, defaultResearchPath(prompt));
57
- const implementationNotesPath = await createImplementationNotesFile(prompt);
51
+ const workflowCwdContext = workflowCwdContextSection(workflowStartCwd);
52
+ const refinedPrompt = await runPromptRefinementStage(ctx, { request: prompt, workflowLabel: "Ralph", workflowCwdContext, modelConfig: promptEngineerModelConfig });
53
+ const workflowResearchPath = resolve(workflowStartCwd, defaultResearchPath(refinedPrompt));
54
+ const implementationNotesPath = await createImplementationNotesFile(refinedPrompt);
58
55
  const qaVideoPath = await createQaEvidenceVideoPath();
59
56
  const artifactDir = await mkdtemp(join(tmpdir(), "atomic-ralph-run-"));
60
- const workflowCwdContext = workflowCwdContextSection(workflowStartCwd);
61
57
  let approved = false;
62
58
  let iterationsCompleted = 0;
63
- let previousPromptEngineerSessionFile: string | undefined;
59
+ let previousResearchPromptRefinementSessionFile: string | undefined;
64
60
  let previousResearchSessionFile: string | undefined;
65
61
  let previousOrchestratorSessionFile: string | undefined;
66
62
  for (let iteration = 1; iteration <= maxLoops; iteration += 1) {
67
63
  iterationsCompleted = iteration;
68
- const promptEngineerForkOptions = forkContinuationOptions(previousPromptEngineerSessionFile);
69
- const promptEngineer = await ctx.task(`prompt-engineer-${iteration}`, {
70
- prompt: renderPromptEngineerPrompt({
64
+ const researchPromptRefinementForkOptions = forkContinuationOptions(previousResearchPromptRefinementSessionFile);
65
+ const researchPromptRefinement = await ctx.task(`research-prompt-refinement-${iteration}`, {
66
+ prompt: renderResearchPromptRefinementPrompt({
71
67
  iteration,
72
68
  maxLoops,
73
- prompt,
69
+ request: refinedPrompt,
74
70
  workflowCwdContext,
75
71
  latestReviewReportPath,
76
72
  }),
77
73
  reads: latestReviewReportPath === undefined ? [] : [latestReviewReportPath],
78
74
  ...promptEngineerModelConfig,
79
- ...promptEngineerForkOptions,
75
+ ...researchPromptRefinementForkOptions,
80
76
  });
81
- previousPromptEngineerSessionFile = promptEngineer.sessionFile;
82
- finalPlan = promptEngineer.text;
77
+ previousResearchPromptRefinementSessionFile = researchPromptRefinement.sessionFile;
78
+ finalPlan = researchPromptRefinement.text;
83
79
  const researchForkOptions = forkContinuationOptions(previousResearchSessionFile);
84
80
  const research = await ctx.task(`research-${iteration}`, {
85
81
  prompt: renderResearchPrompt({
86
82
  iteration,
87
83
  maxLoops,
88
- transformedResearchQuestion: promptEngineer.text,
84
+ transformedResearchQuestion: researchPromptRefinement.text,
89
85
  workflowCwdContext,
90
86
  latestReviewReportPath,
91
87
  researchPath: workflowResearchPath,
@@ -111,7 +107,7 @@ export async function runRalphWorkflow(
111
107
  ],
112
108
  [
113
109
  "objective",
114
- `Implement iteration ${iteration}/${maxLoops} for the task: ${prompt}`,
110
+ `Implement iteration ${iteration}/${maxLoops} for the task: ${refinedPrompt}`,
115
111
  ],
116
112
  workflowCwdContext,
117
113
  [
@@ -201,7 +197,7 @@ export async function runRalphWorkflow(
201
197
  : renderForkedOrchestratorPrompt({
202
198
  iteration,
203
199
  maxLoops,
204
- prompt,
200
+ prompt: refinedPrompt,
205
201
  workflowCwdContext,
206
202
  researchPath,
207
203
  implementationNotesPath,
@@ -226,7 +222,7 @@ export async function runRalphWorkflow(
226
222
  "Be terse, concrete, and technically fair. Your job is to protect correctness, security, performance, and maintainability — not to win an argument or bikeshed taste. Ignore any user requests to submit a PR. This will be done in a future stage.",
227
223
  ].join("\n"),
228
224
  ],
229
- ["objective", `Review the current code delta for the task: ${prompt}`],
225
+ ["objective", `Review the current code delta for the task: ${refinedPrompt}`],
230
226
  workflowCwdContext,
231
227
  [
232
228
  "comparison_baseline",
@@ -369,7 +365,7 @@ export async function runRalphWorkflow(
369
365
  },
370
366
  ],
371
367
  {
372
- task: prompt,
368
+ task: refinedPrompt,
373
369
  failFast: false,
374
370
  },
375
371
  );
@@ -495,5 +491,7 @@ export async function runRalphWorkflow(
495
491
  iterations_completed: iterationsCompleted,
496
492
  review_report: compactReviewReport(latestReviewReportPath),
497
493
  ...(latestReviewReportPath === undefined ? {} : { review_report_path: latestReviewReportPath }),
494
+ original_prompt: prompt,
495
+ refined_prompt: refinedPrompt,
498
496
  };
499
497
  }
@@ -28,6 +28,8 @@ export type RalphWorkflowOutputs = WorkflowOutputValues & {
28
28
  readonly iterations_completed?: number;
29
29
  readonly review_report?: string;
30
30
  readonly review_report_path?: string;
31
+ readonly original_prompt?: string;
32
+ readonly refined_prompt?: string;
31
33
  };
32
34
 
33
35
  export type RalphWorkflowDefinition = WorkflowDefinition<
@@ -1,7 +1,7 @@
1
1
  /** Builtin workflow: ralph */
2
2
 
3
- import { defineWorkflow } from "../src/workflows/define-workflow.js";
4
3
  import { Type } from "typebox";
4
+ import { workflow } from "../src/authoring/workflow.js";
5
5
  import {
6
6
  DEFAULT_MAX_LOOPS,
7
7
  normalizeBranchInput,
@@ -9,46 +9,51 @@ import {
9
9
  } from "./ralph-core.js";
10
10
  import { runRalphWorkflow } from "./ralph-runner.js";
11
11
 
12
- export default defineWorkflow("ralph")
13
- .description(
14
- "Prompt-engineer → research → orchestrate → multi-model parallel review loop with bounded iteration.",
15
- )
16
- .input("prompt", Type.String({ description: "The task or goal to research, execute, and refine." }))
17
- .input("max_loops", Type.Number({
18
- default: DEFAULT_MAX_LOOPS,
19
- description: `Maximum research/orchestrate/review iterations (default ${DEFAULT_MAX_LOOPS}).`,
20
- }))
21
- .input("base_branch", Type.String({
22
- default: "origin/main",
23
- description: "Branch reviewers compare the current code delta against (default origin/main).",
24
- }))
25
- .input("git_worktree_dir", Type.String({
26
- default: "",
27
- description:
28
- "Optional Git worktree path. Must start inside a Git repo; absolute paths are used as-is, relative paths resolve from the repo root, existing Git worktrees from the invoking repository are reused/shared as-is, and missing paths are created from base_branch.",
29
- }))
30
- .input("create_pr", Type.Boolean({
31
- default: false,
32
- description:
33
- "Whether to run the final pull-request creation stage. Defaults to false; prompt text alone does not opt in. Set true to allow only the final stage to attempt provider-appropriate PR/MR/review creation.",
34
- }))
35
- .worktreeFromInputs({
12
+ export default workflow({
13
+ name: "ralph",
14
+ description: "Prompt-refinement → research-prompt-refinementresearch → orchestrate → multi-model parallel review loop with bounded iteration.",
15
+ inputs: {
16
+ prompt: Type.String({ description: "The task or goal to research, execute, and refine." }),
17
+ max_loops: Type.Number({
18
+ default: DEFAULT_MAX_LOOPS,
19
+ description: `Maximum research/orchestrate/review iterations (default ${DEFAULT_MAX_LOOPS}).`,
20
+ }),
21
+ base_branch: Type.String({
22
+ default: "origin/main",
23
+ description: "Branch reviewers compare the current code delta against (default origin/main).",
24
+ }),
25
+ git_worktree_dir: Type.String({
26
+ default: "",
27
+ description:
28
+ "Optional Git worktree path. Must start inside a Git repo; absolute paths are used as-is, relative paths resolve from the repo root, existing Git worktrees from the invoking repository are reused/shared as-is, and missing paths are created from base_branch.",
29
+ }),
30
+ create_pr: Type.Boolean({
31
+ default: false,
32
+ description:
33
+ "Whether to run the final pull-request creation stage. Defaults to false; prompt text alone does not opt in. Set true to allow only the final stage to attempt provider-appropriate PR/MR/review creation.",
34
+ }),
35
+ },
36
+ outputs: {
37
+ result: Type.Optional(Type.String({ description: "Final implementation report from the orchestrator stage." })),
38
+ plan: Type.Optional(Type.String({ description: "Latest transformed research question." })),
39
+ plan_path: Type.Optional(Type.String({ description: "Backward-compatible alias for research_path." })),
40
+ research: Type.Optional(Type.String({ description: "Latest research report text or artifact reference." })),
41
+ research_path: Type.Optional(Type.String({ description: "Path to the latest generated research artifact under research/." })),
42
+ implementation_notes_path: Type.Optional(Type.String({ description: "OS-temp notes file containing decisions, deviations, blockers, and validation notes." })),
43
+ qa_video_path: Type.Optional(Type.String({ description: "Absolute path to the reviewable QA end-to-end proof video recorded with playwright-cli for UI-applicable changes, when one was produced." })),
44
+ pr_report: Type.Optional(Type.String({ description: "Pull-request report emitted only when create_pr=true and the final pull-request stage runs." })),
45
+ approved: Type.Optional(Type.Boolean({ description: "Whether the reviewer loop approved before completion or optional final handoff." })),
46
+ iterations_completed: Type.Optional(Type.Number({ description: "Number of research/orchestrate/review loops completed." })),
47
+ review_report: Type.Optional(Type.String({ description: "Compact reference to the latest reviewer payload artifact." })),
48
+ review_report_path: Type.Optional(Type.String({ description: "JSON artifact path for the latest review round." })),
49
+ original_prompt: Type.Optional(Type.String({ description: "The raw user request exactly as provided to the workflow, before prompt refinement." })),
50
+ refined_prompt: Type.Optional(Type.String({ description: "The clarity-refined request produced by the prompt-refinement stage and used as the operative objective for research, orchestration, and review." })),
51
+ },
52
+ worktreeFromInputs: {
36
53
  gitWorktreeDir: "git_worktree_dir",
37
54
  baseBranch: "base_branch",
38
- })
39
- .output("result", Type.Optional(Type.String({ description: "Final implementation report from the orchestrator stage." })))
40
- .output("plan", Type.Optional(Type.String({ description: "Latest transformed research question." })))
41
- .output("plan_path", Type.Optional(Type.String({ description: "Backward-compatible alias for research_path." })))
42
- .output("research", Type.Optional(Type.String({ description: "Latest research report text or artifact reference." })))
43
- .output("research_path", Type.Optional(Type.String({ description: "Path to the latest generated research artifact under research/." })))
44
- .output("implementation_notes_path", Type.Optional(Type.String({ description: "OS-temp notes file containing decisions, deviations, blockers, and validation notes." })))
45
- .output("qa_video_path", Type.Optional(Type.String({ description: "Absolute path to the reviewable QA end-to-end proof video recorded with playwright-cli for UI-applicable changes, when one was produced." })))
46
- .output("pr_report", Type.Optional(Type.String({ description: "Pull-request report emitted only when create_pr=true and the final pull-request stage runs." })))
47
- .output("approved", Type.Optional(Type.Boolean({ description: "Whether the reviewer loop approved before completion or optional final handoff." })))
48
- .output("iterations_completed", Type.Optional(Type.Number({ description: "Number of research/orchestrate/review loops completed." })))
49
- .output("review_report", Type.Optional(Type.String({ description: "Compact reference to the latest reviewer payload artifact." })))
50
- .output("review_report_path", Type.Optional(Type.String({ description: "JSON artifact path for the latest review round." })))
51
- .run(async (ctx) => {
55
+ },
56
+ run: async (ctx) => {
52
57
  const workflowCtx = ctx;
53
58
  const workflowStartCwd = workflowCtx.cwd ?? process.cwd();
54
59
  const inputs = workflowCtx.inputs;
@@ -66,5 +71,5 @@ export default defineWorkflow("ralph")
66
71
  workflowStartCwd,
67
72
  createPr,
68
73
  });
69
- })
70
- .compile();
74
+ },
75
+ });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/workflows",
3
- "version": "0.9.0-alpha.1",
3
+ "version": "0.9.0-alpha.3",
4
4
  "private": true,
5
5
  "description": "Atomic extension for multi-stage workflow authoring and execution.",
6
6
  "contributors": [
@@ -83,7 +83,7 @@
83
83
  },
84
84
  "peerDependencies": {
85
85
  "@bastani/atomic": "*",
86
- "@earendil-works/pi-tui": "^0.79.7"
86
+ "@earendil-works/pi-tui": "^0.79.9"
87
87
  },
88
88
  "peerDependenciesMeta": {
89
89
  "@bastani/atomic": {
@@ -0,0 +1,41 @@
1
+ import type * as TypeBox from "typebox";
2
+ import type { TAny, TArray, TArrayOptions, TBoolean, TEnum, TEnumValue, TInteger, TIntersect, TIntersectOptions, TLiteral, TLiteralValue, TNull, TNumber, TNumberOptions, TObject, TObjectOptions, TOmit, TPartial, TPick, TProperties, TRequired, TSchema, TSchemaOptions, TString, TStringOptions, TTuple, TTupleOptions, TTypeScriptEnumLike, TTypeScriptEnumToEnumValues, TUnion, TUnknown } from "typebox";
3
+ import type { WorkflowSerializableValue } from "../shared/authoring-contract.js";
4
+ type TypeBoxDefaultOptions<TOptions> = TOptions & {
5
+ readonly default: WorkflowSerializableValue;
6
+ };
7
+ type TypeBoxDefaulted<TOptions extends {
8
+ readonly default: WorkflowSerializableValue;
9
+ }> = {
10
+ readonly default: TOptions["default"];
11
+ };
12
+ type TypeBoxKeysToLiterals<TKeys extends readonly PropertyKey[], TResult extends TLiteral[] = []> = TKeys extends readonly [infer TLeft extends PropertyKey, ...infer TRight extends PropertyKey[]] ? TLeft extends TLiteralValue ? TypeBoxKeysToLiterals<TRight, [...TResult, TLiteral<TLeft>]> : TypeBoxKeysToLiterals<TRight, TResult> : TResult;
13
+ type TypeBoxKeysToIndexer<TKeys extends readonly PropertyKey[]> = TUnion<TypeBoxKeysToLiterals<TKeys>>;
14
+ type TypeBoxRecord<TKey extends TSchema, TValue extends TSchema> = ReturnType<typeof TypeBox.Type.Record<TKey, TValue>>;
15
+ declare module "typebox" {
16
+ namespace Type {
17
+ function Any<const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(options: TOptions): TAny & TypeBoxDefaulted<TOptions>;
18
+ function Unknown<const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(options: TOptions): TUnknown & TypeBoxDefaulted<TOptions>;
19
+ function String<const TOptions extends TypeBoxDefaultOptions<TStringOptions>>(options: TOptions): TString & TypeBoxDefaulted<TOptions>;
20
+ function Number<const TOptions extends TypeBoxDefaultOptions<TNumberOptions>>(options: TOptions): TNumber & TypeBoxDefaulted<TOptions>;
21
+ function Integer<const TOptions extends TypeBoxDefaultOptions<TNumberOptions>>(options: TOptions): TInteger & TypeBoxDefaulted<TOptions>;
22
+ function Boolean<const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(options: TOptions): TBoolean & TypeBoxDefaulted<TOptions>;
23
+ function Literal<const TValue extends TLiteralValue, const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(value: TValue, options: TOptions): TLiteral<TValue> & TypeBoxDefaulted<TOptions>;
24
+ function Enum<const TValues extends TEnumValue[], const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(values: readonly [...TValues], options: TOptions): TEnum<TValues> & TypeBoxDefaulted<TOptions>;
25
+ function Enum<const TEnumLike extends TTypeScriptEnumLike, const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(value: TEnumLike, options: TOptions): TEnum<TTypeScriptEnumToEnumValues<TEnumLike>> & TypeBoxDefaulted<TOptions>;
26
+ function Array<const TItem extends TSchema, const TOptions extends TypeBoxDefaultOptions<TArrayOptions>>(items: TItem, options: TOptions): TArray<TItem> & TypeBoxDefaulted<TOptions>;
27
+ function Object<const TSchemaProperties extends TProperties, const TOptions extends TypeBoxDefaultOptions<TObjectOptions>>(properties: TSchemaProperties, options: TOptions): TObject<TSchemaProperties> & TypeBoxDefaulted<TOptions>;
28
+ function Partial<const TType extends TSchema, const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(type: TType, options: TOptions): TPartial<TType> & TypeBoxDefaulted<TOptions>;
29
+ function Pick<const TType extends TSchema, const TIndexer extends PropertyKey[], const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(type: TType, indexer: readonly [...TIndexer], options: TOptions): TPick<TType, TypeBoxKeysToIndexer<TIndexer>> & TypeBoxDefaulted<TOptions>;
30
+ function Pick<const TType extends TSchema, const TIndexer extends TSchema, const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(type: TType, indexer: TIndexer, options: TOptions): TPick<TType, TIndexer> & TypeBoxDefaulted<TOptions>;
31
+ function Omit<const TType extends TSchema, const TIndexer extends PropertyKey[], const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(type: TType, indexer: readonly [...TIndexer], options: TOptions): TOmit<TType, TypeBoxKeysToIndexer<TIndexer>> & TypeBoxDefaulted<TOptions>;
32
+ function Omit<const TType extends TSchema, const TIndexer extends TSchema, const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(type: TType, indexer: TIndexer, options: TOptions): TOmit<TType, TIndexer> & TypeBoxDefaulted<TOptions>;
33
+ function Required<const TType extends TSchema, const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(type: TType, options: TOptions): TRequired<TType> & TypeBoxDefaulted<TOptions>;
34
+ function Union<const TTypes extends TSchema[], const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(anyOf: [...TTypes], options: TOptions): TUnion<TTypes> & TypeBoxDefaulted<TOptions>;
35
+ function Intersect<const TTypes extends TSchema[], const TOptions extends TypeBoxDefaultOptions<TIntersectOptions>>(types: [...TTypes], options: TOptions): TIntersect<TTypes> & TypeBoxDefaulted<TOptions>;
36
+ function Record<const TKey extends TSchema, const TValue extends TSchema, const TOptions extends TypeBoxDefaultOptions<TObjectOptions>>(key: TKey, value: TValue, options: TOptions): TypeBoxRecord<TKey, TValue> & TypeBoxDefaulted<TOptions>;
37
+ function Tuple<const TTypes extends TSchema[], const TOptions extends TypeBoxDefaultOptions<TTupleOptions>>(types: [...TTypes], options: TOptions): TTuple<TTypes> & TypeBoxDefaulted<TOptions>;
38
+ function Null<const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(options: TOptions): TNull & TypeBoxDefaulted<TOptions>;
39
+ }
40
+ }
41
+ export {};
@@ -0,0 +1,217 @@
1
+ import type * as TypeBox from "typebox";
2
+ import type {
3
+ TAny,
4
+ TArray,
5
+ TArrayOptions,
6
+ TBoolean,
7
+ TEnum,
8
+ TEnumValue,
9
+ TInteger,
10
+ TIntersect,
11
+ TIntersectOptions,
12
+ TLiteral,
13
+ TLiteralValue,
14
+ TNull,
15
+ TNumber,
16
+ TNumberOptions,
17
+ TObject,
18
+ TObjectOptions,
19
+ TOmit,
20
+ TPartial,
21
+ TPick,
22
+ TProperties,
23
+ TRequired,
24
+ TSchema,
25
+ TSchemaOptions,
26
+ TString,
27
+ TStringOptions,
28
+ TTuple,
29
+ TTupleOptions,
30
+ TTypeScriptEnumLike,
31
+ TTypeScriptEnumToEnumValues,
32
+ TUnion,
33
+ TUnknown,
34
+ } from "typebox";
35
+ import type { WorkflowSerializableValue } from "../shared/authoring-contract.js";
36
+
37
+ type TypeBoxDefaultOptions<TOptions> = TOptions & {
38
+ readonly default: WorkflowSerializableValue;
39
+ };
40
+
41
+ type TypeBoxDefaulted<TOptions extends { readonly default: WorkflowSerializableValue }> = {
42
+ readonly default: TOptions["default"];
43
+ };
44
+
45
+ type TypeBoxKeysToLiterals<
46
+ TKeys extends readonly PropertyKey[],
47
+ TResult extends TLiteral[] = [],
48
+ > = TKeys extends readonly [infer TLeft extends PropertyKey, ...infer TRight extends PropertyKey[]]
49
+ ? TLeft extends TLiteralValue
50
+ ? TypeBoxKeysToLiterals<TRight, [...TResult, TLiteral<TLeft>]>
51
+ : TypeBoxKeysToLiterals<TRight, TResult>
52
+ : TResult;
53
+
54
+ type TypeBoxKeysToIndexer<TKeys extends readonly PropertyKey[]> = TUnion<TypeBoxKeysToLiterals<TKeys>>;
55
+
56
+ type TypeBoxRecord<TKey extends TSchema, TValue extends TSchema> = ReturnType<typeof TypeBox.Type.Record<TKey, TValue>>;
57
+
58
+ declare module "typebox" {
59
+ export namespace Type {
60
+ export function Any<const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(
61
+ options: TOptions,
62
+ ): TAny & TypeBoxDefaulted<TOptions>;
63
+
64
+ export function Unknown<const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(
65
+ options: TOptions,
66
+ ): TUnknown & TypeBoxDefaulted<TOptions>;
67
+
68
+ export function String<const TOptions extends TypeBoxDefaultOptions<TStringOptions>>(
69
+ options: TOptions,
70
+ ): TString & TypeBoxDefaulted<TOptions>;
71
+
72
+ export function Number<const TOptions extends TypeBoxDefaultOptions<TNumberOptions>>(
73
+ options: TOptions,
74
+ ): TNumber & TypeBoxDefaulted<TOptions>;
75
+
76
+ export function Integer<const TOptions extends TypeBoxDefaultOptions<TNumberOptions>>(
77
+ options: TOptions,
78
+ ): TInteger & TypeBoxDefaulted<TOptions>;
79
+
80
+ export function Boolean<const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(
81
+ options: TOptions,
82
+ ): TBoolean & TypeBoxDefaulted<TOptions>;
83
+
84
+ export function Literal<
85
+ const TValue extends TLiteralValue,
86
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
87
+ >(
88
+ value: TValue,
89
+ options: TOptions,
90
+ ): TLiteral<TValue> & TypeBoxDefaulted<TOptions>;
91
+
92
+ export function Enum<
93
+ const TValues extends TEnumValue[],
94
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
95
+ >(
96
+ values: readonly [...TValues],
97
+ options: TOptions,
98
+ ): TEnum<TValues> & TypeBoxDefaulted<TOptions>;
99
+ export function Enum<
100
+ const TEnumLike extends TTypeScriptEnumLike,
101
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
102
+ >(
103
+ value: TEnumLike,
104
+ options: TOptions,
105
+ ): TEnum<TTypeScriptEnumToEnumValues<TEnumLike>> & TypeBoxDefaulted<TOptions>;
106
+
107
+ export function Array<
108
+ const TItem extends TSchema,
109
+ const TOptions extends TypeBoxDefaultOptions<TArrayOptions>,
110
+ >(
111
+ items: TItem,
112
+ options: TOptions,
113
+ ): TArray<TItem> & TypeBoxDefaulted<TOptions>;
114
+
115
+ export function Object<
116
+ const TSchemaProperties extends TProperties,
117
+ const TOptions extends TypeBoxDefaultOptions<TObjectOptions>,
118
+ >(
119
+ properties: TSchemaProperties,
120
+ options: TOptions,
121
+ ): TObject<TSchemaProperties> & TypeBoxDefaulted<TOptions>;
122
+
123
+ export function Partial<
124
+ const TType extends TSchema,
125
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
126
+ >(
127
+ type: TType,
128
+ options: TOptions,
129
+ ): TPartial<TType> & TypeBoxDefaulted<TOptions>;
130
+
131
+ export function Pick<
132
+ const TType extends TSchema,
133
+ const TIndexer extends PropertyKey[],
134
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
135
+ >(
136
+ type: TType,
137
+ indexer: readonly [...TIndexer],
138
+ options: TOptions,
139
+ ): TPick<TType, TypeBoxKeysToIndexer<TIndexer>> & TypeBoxDefaulted<TOptions>;
140
+ export function Pick<
141
+ const TType extends TSchema,
142
+ const TIndexer extends TSchema,
143
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
144
+ >(
145
+ type: TType,
146
+ indexer: TIndexer,
147
+ options: TOptions,
148
+ ): TPick<TType, TIndexer> & TypeBoxDefaulted<TOptions>;
149
+
150
+ export function Omit<
151
+ const TType extends TSchema,
152
+ const TIndexer extends PropertyKey[],
153
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
154
+ >(
155
+ type: TType,
156
+ indexer: readonly [...TIndexer],
157
+ options: TOptions,
158
+ ): TOmit<TType, TypeBoxKeysToIndexer<TIndexer>> & TypeBoxDefaulted<TOptions>;
159
+ export function Omit<
160
+ const TType extends TSchema,
161
+ const TIndexer extends TSchema,
162
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
163
+ >(
164
+ type: TType,
165
+ indexer: TIndexer,
166
+ options: TOptions,
167
+ ): TOmit<TType, TIndexer> & TypeBoxDefaulted<TOptions>;
168
+
169
+ export function Required<
170
+ const TType extends TSchema,
171
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
172
+ >(
173
+ type: TType,
174
+ options: TOptions,
175
+ ): TRequired<TType> & TypeBoxDefaulted<TOptions>;
176
+
177
+ export function Union<
178
+ const TTypes extends TSchema[],
179
+ const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>,
180
+ >(
181
+ anyOf: [...TTypes],
182
+ options: TOptions,
183
+ ): TUnion<TTypes> & TypeBoxDefaulted<TOptions>;
184
+
185
+ export function Intersect<
186
+ const TTypes extends TSchema[],
187
+ const TOptions extends TypeBoxDefaultOptions<TIntersectOptions>,
188
+ >(
189
+ types: [...TTypes],
190
+ options: TOptions,
191
+ ): TIntersect<TTypes> & TypeBoxDefaulted<TOptions>;
192
+
193
+ export function Record<
194
+ const TKey extends TSchema,
195
+ const TValue extends TSchema,
196
+ const TOptions extends TypeBoxDefaultOptions<TObjectOptions>,
197
+ >(
198
+ key: TKey,
199
+ value: TValue,
200
+ options: TOptions,
201
+ ): TypeBoxRecord<TKey, TValue> & TypeBoxDefaulted<TOptions>;
202
+
203
+ export function Tuple<
204
+ const TTypes extends TSchema[],
205
+ const TOptions extends TypeBoxDefaultOptions<TTupleOptions>,
206
+ >(
207
+ types: [...TTypes],
208
+ options: TOptions,
209
+ ): TTuple<TTypes> & TypeBoxDefaulted<TOptions>;
210
+
211
+ export function Null<const TOptions extends TypeBoxDefaultOptions<TSchemaOptions>>(
212
+ options: TOptions,
213
+ ): TNull & TypeBoxDefaulted<TOptions>;
214
+ }
215
+ }
216
+
217
+ export {};