@neriros/ralphy 3.10.7 → 3.10.9

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 (2) hide show
  1. package/dist/shell/index.js +122 -50
  2. package/package.json +1 -1
@@ -18928,8 +18928,8 @@ import { readFileSync } from "fs";
18928
18928
  import { resolve } from "path";
18929
18929
  function getVersion() {
18930
18930
  try {
18931
- if ("3.10.7")
18932
- return "3.10.7";
18931
+ if ("3.10.9")
18932
+ return "3.10.9";
18933
18933
  } catch {}
18934
18934
  const dirsToTry = [];
18935
18935
  try {
@@ -80519,7 +80519,7 @@ function foldLegacyAssignee(v) {
80519
80519
  }
80520
80520
  return rest2;
80521
80521
  }
80522
- var CURRENT_WORKFLOW_VERSION = 3, MarkerSchema, SET_INDICATOR_KEYS, GetIndicatorSchema, SetIndicatorSchema, IndicatorsSchema, ProjectSchema, CommandsSchema, DEFAULT_META_ONLY_FILES, BoundariesSchema, WorkflowConfigSchema;
80522
+ var CURRENT_WORKFLOW_VERSION = 4, MarkerSchema, SET_INDICATOR_KEYS, GetIndicatorSchema, SetIndicatorSchema, IndicatorsSchema, ProjectSchema, CommandsSchema, DEFAULT_META_ONLY_FILES, BoundariesSchema, WorkflowConfigSchema;
80523
80523
  var init_schema = __esm(() => {
80524
80524
  init_zod();
80525
80525
  MarkerSchema = exports_external.discriminatedUnion("type", [
@@ -80533,7 +80533,13 @@ var init_schema = __esm(() => {
80533
80533
  exports_external.object({ type: exports_external.literal("project"), value: exports_external.string().min(1) }).strict(),
80534
80534
  exports_external.object({ type: exports_external.literal("comment"), value: exports_external.string().min(1) }).strict()
80535
80535
  ]);
80536
- SET_INDICATOR_KEYS = ["setInProgress", "setDone", "setError", "clearApproved"];
80536
+ SET_INDICATOR_KEYS = [
80537
+ "setInProgress",
80538
+ "setDone",
80539
+ "setPrReady",
80540
+ "setError",
80541
+ "clearApproved"
80542
+ ];
80537
80543
  GetIndicatorSchema = exports_external.object({
80538
80544
  filter: exports_external.array(MarkerSchema).default([])
80539
80545
  });
@@ -80547,6 +80553,7 @@ var init_schema = __esm(() => {
80547
80553
  getAutoApprove: GetIndicatorSchema.optional(),
80548
80554
  setInProgress: SetIndicatorSchema.optional(),
80549
80555
  setDone: SetIndicatorSchema.optional(),
80556
+ setPrReady: SetIndicatorSchema.optional(),
80550
80557
  setError: SetIndicatorSchema.optional(),
80551
80558
  setAwaitingConfirmation: SetIndicatorSchema.optional(),
80552
80559
  clearApproved: SetIndicatorSchema.optional(),
@@ -80851,6 +80858,9 @@ linear:
80851
80858
  # setDone: # status/label to set when the PR is opened
80852
80859
  # type: status
80853
80860
  # value: In Review
80861
+ # setPrReady: # additive: marker set when the PR is ready for human review
80862
+ # type: status # (fires unless the PR is auto-merged immediately; does not replace setDone)
80863
+ # value: In Review
80854
80864
  # setError: # label applied when a task is quarantined
80855
80865
  # type: label
80856
80866
  # value: "ralph:error"
@@ -81896,11 +81906,11 @@ function applyAliases(cfg) {
81896
81906
  }
81897
81907
  }
81898
81908
  }
81899
- function workflowPath(projectRoot) {
81900
- return join5(projectRoot, WORKFLOW_FILE);
81909
+ function workflowPath(projectRoot, workflowFile) {
81910
+ return workflowFile ?? join5(projectRoot, WORKFLOW_FILE);
81901
81911
  }
81902
- async function loadWorkflow(projectRoot) {
81903
- const path = workflowPath(projectRoot);
81912
+ async function loadWorkflow(projectRoot, workflowFile) {
81913
+ const path = workflowPath(projectRoot, workflowFile);
81904
81914
  const file2 = Bun.file(path);
81905
81915
  if (!await file2.exists()) {
81906
81916
  const { config: config2 } = parseWorkflow(DEFAULT_WORKFLOW_MD);
@@ -81909,8 +81919,8 @@ async function loadWorkflow(projectRoot) {
81909
81919
  const text = await file2.text();
81910
81920
  return parseWorkflow(text, path);
81911
81921
  }
81912
- async function ensureWorkflow(projectRoot) {
81913
- const path = workflowPath(projectRoot);
81922
+ async function ensureWorkflow(projectRoot, workflowFile) {
81923
+ const path = workflowPath(projectRoot, workflowFile);
81914
81924
  const file2 = Bun.file(path);
81915
81925
  if (await file2.exists())
81916
81926
  return path;
@@ -83953,6 +83963,12 @@ var init_SetupWizard = __esm(async () => {
83953
83963
  description: "Set when the task finishes and its pull request is opened.",
83954
83964
  slots: ["setDone"]
83955
83965
  },
83966
+ {
83967
+ key: "prReady",
83968
+ label: "PR ready",
83969
+ description: "Optional, additive: set when the PR is marked ready for human review (non-draft), layered on top of Done. Skipped only on the immediate non-draft auto-merge path.",
83970
+ slots: ["setPrReady"]
83971
+ },
83956
83972
  {
83957
83973
  key: "error",
83958
83974
  label: "Error",
@@ -84041,6 +84057,11 @@ var init_migrations = __esm(() => {
84041
84057
  version: 3,
84042
84058
  description: "The per-workflow `linear.assignee` setting is replaced by a global " + "`linear.filter` expression (e.g. `assignee = me`) applied to every " + "ticket fetch. Existing `assignee` values are folded in automatically; " + "note that an empty filter now defaults to `assignee = me` (it previously " + "meant unassigned-only).",
84043
84059
  fields: ["linear.filter"]
84060
+ },
84061
+ {
84062
+ version: 4,
84063
+ description: "A new additive `setPrReady` Linear indicator marks a ticket the moment its " + "PR is human-mergeable (ready, non-draft), layered on top of `setDone`. " + "Re-run the indicator builder to add it, or keep your current indicators.",
84064
+ fields: ["linear.indicators"]
84044
84065
  }
84045
84066
  ];
84046
84067
  LATEST_MIGRATION_VERSION = MIGRATIONS.reduce((max2, migration) => Math.max(max2, migration.version), 0);
@@ -84341,6 +84362,12 @@ function getLayout() {
84341
84362
  throw new Error("No layout in context. Set layout when calling runWithContext().");
84342
84363
  return ctx.layout;
84343
84364
  }
84365
+ function getArgs() {
84366
+ const ctx = getContext();
84367
+ if (!ctx.args)
84368
+ throw new Error("No args in context. Set args when calling runWithContext().");
84369
+ return ctx.args;
84370
+ }
84344
84371
  function runWithContext(ctx, fn) {
84345
84372
  return contextStore.run(ctx, fn);
84346
84373
  }
@@ -84691,6 +84718,7 @@ var init_output2 = __esm(() => {
84691
84718
  });
84692
84719
 
84693
84720
  // packages/cli-args/src/common-args.ts
84721
+ import { resolve as resolve3 } from "path";
84694
84722
  function initialCommonArgs() {
84695
84723
  return {
84696
84724
  engine: "claude",
@@ -84704,6 +84732,7 @@ function initialCommonArgs() {
84704
84732
  log: false,
84705
84733
  verbose: false,
84706
84734
  projectRoot: undefined,
84735
+ workflowFile: undefined,
84707
84736
  name: "",
84708
84737
  prompt: "",
84709
84738
  fromAgent: false
@@ -84726,6 +84755,7 @@ function emptyParseState() {
84726
84755
  pendingOption: null,
84727
84756
  expectClaudeModel: false,
84728
84757
  expectProjectRoot: false,
84758
+ expectWorkflow: false,
84729
84759
  expectName: false,
84730
84760
  expectPrompt: false,
84731
84761
  expectPromptFile: false,
@@ -84750,6 +84780,11 @@ function parseCommonArg(arg, args, state) {
84750
84780
  state.expectProjectRoot = false;
84751
84781
  return true;
84752
84782
  }
84783
+ if (state.expectWorkflow) {
84784
+ args.workflowFile = resolve3(arg);
84785
+ state.expectWorkflow = false;
84786
+ return true;
84787
+ }
84753
84788
  if (state.expectName) {
84754
84789
  args.name = arg;
84755
84790
  state.expectName = false;
@@ -84796,6 +84831,9 @@ function parseCommonArg(arg, args, state) {
84796
84831
  case "--project-root":
84797
84832
  state.expectProjectRoot = true;
84798
84833
  return true;
84834
+ case "--workflow":
84835
+ state.expectWorkflow = true;
84836
+ return true;
84799
84837
  case "--name":
84800
84838
  state.expectName = true;
84801
84839
  return true;
@@ -84945,6 +84983,7 @@ var init_cli = __esm(() => {
84945
84983
  "",
84946
84984
  "Options:",
84947
84985
  " --name <name> Change name (required for most commands)",
84986
+ " --workflow <path> Path to an alternate WORKFLOW.md (default: <project>/WORKFLOW.md)",
84948
84987
  " --prompt <text> Task description",
84949
84988
  " --prompt-file <path> Read prompt from file",
84950
84989
  " --model <model> Set model (haiku|sonnet|opus)",
@@ -85028,6 +85067,7 @@ var init_task_cli = __esm(() => {
85028
85067
  "",
85029
85068
  "Options:",
85030
85069
  " --name <name> Change name (required)",
85070
+ " --workflow <path> Path to an alternate WORKFLOW.md (default: <project>/WORKFLOW.md)",
85031
85071
  " --prompt <text> Task description",
85032
85072
  " --prompt-file <path> Read prompt from file",
85033
85073
  " --model <model> Set model (haiku|sonnet|opus)",
@@ -97361,10 +97401,10 @@ var require_xstate_development_cjs = __commonJS((exports) => {
97361
97401
  }
97362
97402
  }
97363
97403
  function toPromise(actor) {
97364
- return new Promise((resolve3, reject2) => {
97404
+ return new Promise((resolve4, reject2) => {
97365
97405
  actor.subscribe({
97366
97406
  complete: () => {
97367
- resolve3(actor.getSnapshot().output);
97407
+ resolve4(actor.getSnapshot().output);
97368
97408
  },
97369
97409
  error: reject2
97370
97410
  });
@@ -98795,10 +98835,10 @@ async function runEngine(opts) {
98795
98835
  await mkdir4(dirname6(opts.logFile), { recursive: true });
98796
98836
  rawWriter = createWriteStream(opts.logFile, { flags: "a" });
98797
98837
  }
98798
- const closeRaw = () => new Promise((resolve3) => {
98838
+ const closeRaw = () => new Promise((resolve4) => {
98799
98839
  if (!rawWriter)
98800
- return resolve3();
98801
- rawWriter.end(resolve3);
98840
+ return resolve4();
98841
+ rawWriter.end(resolve4);
98802
98842
  });
98803
98843
  const userOnFeedEvent = opts.onFeedEvent;
98804
98844
  const onFeedEvent = (event) => {
@@ -98942,8 +98982,8 @@ var init_flow_machine = __esm(() => {
98942
98982
  } catch {}
98943
98983
  const exited = await Promise.race([
98944
98984
  worker.exited.then(() => "exited"),
98945
- new Promise((resolve3) => {
98946
- const t = setTimeout(() => resolve3("timeout"), graceMs);
98985
+ new Promise((resolve4) => {
98986
+ const t = setTimeout(() => resolve4("timeout"), graceMs);
98947
98987
  t.unref();
98948
98988
  })
98949
98989
  ]);
@@ -100117,7 +100157,7 @@ var init_loop2 = __esm(() => {
100117
100157
  // apps/loop/src/hooks/useLoop.ts
100118
100158
  import { join as join15 } from "path";
100119
100159
  function sleep(seconds) {
100120
- return new Promise((resolve3) => setTimeout(resolve3, seconds * 1000));
100160
+ return new Promise((resolve4) => setTimeout(resolve4, seconds * 1000));
100121
100161
  }
100122
100162
  function useLoop(opts) {
100123
100163
  const outerLayoutRef = import_react57.useRef(null);
@@ -101289,6 +101329,8 @@ async function runDebug(opts) {
101289
101329
  out(" \u26A0 setError applied \u2014 issue is quarantined in Linear");
101290
101330
  if (logHas("setDone applied"))
101291
101331
  out(" \u2713 setDone applied \u2014 issue marked done in Linear");
101332
+ if (logHas("setPrReady applied"))
101333
+ out(" \u2713 setPrReady applied \u2014 PR is ready for human review");
101292
101334
  if (logHas("clearConflicted applied"))
101293
101335
  out(" \u2713 clearConflicted applied");
101294
101336
  if (logHas("setConflicted applied"))
@@ -101367,7 +101409,7 @@ async function main2(argv) {
101367
101409
  await mkdir6(statesDir, { recursive: true });
101368
101410
  await ensureRalphGitignore(projectRoot);
101369
101411
  const { ensureWorkflow: ensureWorkflow2 } = await Promise.resolve().then(() => (init_workflow(), exports_workflow));
101370
- const workflowPath2 = await ensureWorkflow2(projectRoot);
101412
+ const workflowPath2 = await ensureWorkflow2(projectRoot, args.workflowFile);
101371
101413
  process.stdout.write(`Workflow config: ${workflowPath2}
101372
101414
  `);
101373
101415
  const openspecBin = resolveOpenspecBin(import.meta.dir);
@@ -101738,6 +101780,7 @@ var init_cli2 = __esm(() => {
101738
101780
  "getAutoMerge",
101739
101781
  "setInProgress",
101740
101782
  "setDone",
101783
+ "setPrReady",
101741
101784
  "setError"
101742
101785
  ]);
101743
101786
  GET_KEYS = new Set(["getTodo", "getInProgress", "getAutoMerge"]);
@@ -101754,6 +101797,7 @@ var init_cli2 = __esm(() => {
101754
101797
  "",
101755
101798
  "Options:",
101756
101799
  " --name <id> Change name / ticket identifier (list / debug filter)",
101800
+ " --workflow <path> Path to an alternate WORKFLOW.md (default: <project>/WORKFLOW.md)",
101757
101801
  " --prompt <text> Task description appended to every scaffolded proposal",
101758
101802
  " --prompt-file <path> Read prompt from file",
101759
101803
  " --model <model> Set model (haiku|sonnet|opus)",
@@ -101776,9 +101820,10 @@ var init_cli2 = __esm(() => {
101776
101820
  " --worktree Run each task in its own git worktree",
101777
101821
  " --indicator <k>:<t>:<v> Override an indicator (repeatable).",
101778
101822
  " Keys: getTodo, getInProgress, getAutoMerge,",
101779
- " setInProgress, setDone, setError",
101823
+ " setInProgress, setDone, setPrReady, setError",
101780
101824
  " Types: label, status, attachment, project, comment",
101781
101825
  " --indicator setInProgress:attachment:In Progress",
101826
+ " --indicator setPrReady:status:In Review (additive ready marker)",
101782
101827
  " (attachment upserts a single 'Ralphy' entry; value = subtitle)",
101783
101828
  " --create-pr Push the worker branch and open a GitHub PR on success (needs --worktree)",
101784
101829
  " --fix-ci After opening the PR, re-run on CI failures until green (needs --create-pr)",
@@ -101813,12 +101858,12 @@ __export(exports_config, {
101813
101858
  loadRalphyConfig: () => loadRalphyConfig,
101814
101859
  ensureRalphyConfig: () => ensureRalphyConfig
101815
101860
  });
101816
- async function loadRalphyConfig(projectRoot) {
101817
- const { config: config2 } = await loadWorkflow(projectRoot);
101861
+ async function loadRalphyConfig(projectRoot, workflowFile) {
101862
+ const { config: config2 } = await loadWorkflow(projectRoot, workflowFile);
101818
101863
  return config2;
101819
101864
  }
101820
- async function ensureRalphyConfig(projectRoot) {
101821
- return ensureWorkflow(projectRoot);
101865
+ async function ensureRalphyConfig(projectRoot, workflowFile) {
101866
+ return ensureWorkflow(projectRoot, workflowFile);
101822
101867
  }
101823
101868
  var init_config = __esm(() => {
101824
101869
  init_workflow();
@@ -102125,7 +102170,7 @@ async function runCapability(cap, args, ctx = {}) {
102125
102170
  throw lastError;
102126
102171
  }
102127
102172
  function sleepMs(ms) {
102128
- return new Promise((resolve3) => setTimeout(resolve3, ms));
102173
+ return new Promise((resolve4) => setTimeout(resolve4, ms));
102129
102174
  }
102130
102175
 
102131
102176
  // packages/workflow/src/boundaries.ts
@@ -104248,6 +104293,7 @@ async function runPrPhase(input, deps) {
104248
104293
  emit: emit3,
104249
104294
  respawnWorker,
104250
104295
  registerPr,
104296
+ onPrReady,
104251
104297
  checkPrConflict,
104252
104298
  resolveDependencyBaseBranch
104253
104299
  } = deps;
@@ -104442,6 +104488,9 @@ ${indented}${suffix}`, "yellow");
104442
104488
  log3(`! manual merge failed for ${prUrl}: ${e.stderr?.trim() || e.message}`, "yellow");
104443
104489
  }
104444
104490
  }
104491
+ if (!(wantAutoMerge && !prReadyNeeded)) {
104492
+ await onPrReady?.(prUrl);
104493
+ }
104445
104494
  return 0;
104446
104495
  }
104447
104496
  async function runWorktreeCleanupPhase(input, deps) {
@@ -104647,6 +104696,7 @@ async function runPostTask(input, deps) {
104647
104696
  emit: emit3,
104648
104697
  respawnWorker,
104649
104698
  ...deps.registerPr !== undefined ? { registerPr: deps.registerPr } : {},
104699
+ ...deps.onPrReady !== undefined ? { onPrReady: deps.onPrReady } : {},
104650
104700
  ...deps.checkPrConflict !== undefined ? { checkPrConflict: deps.checkPrConflict } : {},
104651
104701
  ...deps.resolveDependencyBaseBranch !== undefined ? { resolveDependencyBaseBranch: deps.resolveDependencyBaseBranch } : {}
104652
104702
  });
@@ -107120,7 +107170,7 @@ function createPrepareHelpers(input) {
107120
107170
  }
107121
107171
  let workflowPrompt = "";
107122
107172
  try {
107123
- const workflow = await loadWorkflow(projectRoot);
107173
+ const workflow = await loadWorkflow(projectRoot, args.workflowFile);
107124
107174
  workflowPrompt = renderWorkflowPrompt(workflow, {
107125
107175
  issue: {
107126
107176
  identifier: issue2.identifier,
@@ -108150,6 +108200,8 @@ function createSpawnWorker(input) {
108150
108200
  indicators,
108151
108201
  cmdRunner,
108152
108202
  gitRunner,
108203
+ applyIndicator,
108204
+ bus,
108153
108205
  onLog,
108154
108206
  diag,
108155
108207
  runners,
@@ -108378,6 +108430,23 @@ function createSpawnWorker(input) {
108378
108430
  runScript,
108379
108431
  ...retroDepEntry(args.agentDebug, runRetrospectiveHook),
108380
108432
  registerPr: (cn, url2) => onPrRegistered(cn, url2),
108433
+ ...issueForChange && indicators.setPrReady ? {
108434
+ onPrReady: async () => {
108435
+ const issue2 = issueForChange;
108436
+ const marker = indicators.setPrReady;
108437
+ try {
108438
+ await applyIndicator(issue2, marker);
108439
+ onLog(` ${issue2.identifier}: setPrReady applied`, "gray");
108440
+ } catch (err) {
108441
+ onLog(`! Linear setPrReady failed for ${issue2.identifier}: ${err.message}`, "yellow");
108442
+ emitCapture(bus, "agent_indicator_failed", {
108443
+ indicator: "setPrReady",
108444
+ issue_identifier: issue2.identifier,
108445
+ error: err.message
108446
+ });
108447
+ }
108448
+ }
108449
+ } : {},
108381
108450
  ...onWorkerPhase && {
108382
108451
  onPhase: (phase2, detail) => onWorkerPhase(changeName, phase2, detail)
108383
108452
  },
@@ -108415,6 +108484,7 @@ var init_worker = __esm(() => {
108415
108484
  init_agent_run_state();
108416
108485
  init_retro();
108417
108486
  init_engine();
108487
+ init_coordinator();
108418
108488
  });
108419
108489
 
108420
108490
  // apps/agent/src/agent/baseline/runner.ts
@@ -111565,11 +111635,11 @@ var require_tslib = __commonJS((exports, module) => {
111565
111635
  };
111566
111636
  __awaiter = function(thisArg, _arguments, P, generator) {
111567
111637
  function adopt(value) {
111568
- return value instanceof P ? value : new P(function(resolve3) {
111569
- resolve3(value);
111638
+ return value instanceof P ? value : new P(function(resolve4) {
111639
+ resolve4(value);
111570
111640
  });
111571
111641
  }
111572
- return new (P || (P = Promise))(function(resolve3, reject2) {
111642
+ return new (P || (P = Promise))(function(resolve4, reject2) {
111573
111643
  function fulfilled(value) {
111574
111644
  try {
111575
111645
  step(generator.next(value));
@@ -111585,7 +111655,7 @@ var require_tslib = __commonJS((exports, module) => {
111585
111655
  }
111586
111656
  }
111587
111657
  function step(result2) {
111588
- result2.done ? resolve3(result2.value) : adopt(result2.value).then(fulfilled, rejected);
111658
+ result2.done ? resolve4(result2.value) : adopt(result2.value).then(fulfilled, rejected);
111589
111659
  }
111590
111660
  step((generator = generator.apply(thisArg, _arguments || [])).next());
111591
111661
  });
@@ -111814,14 +111884,14 @@ var require_tslib = __commonJS((exports, module) => {
111814
111884
  }, i);
111815
111885
  function verb(n) {
111816
111886
  i[n] = o[n] && function(v) {
111817
- return new Promise(function(resolve3, reject2) {
111818
- v = o[n](v), settle(resolve3, reject2, v.done, v.value);
111887
+ return new Promise(function(resolve4, reject2) {
111888
+ v = o[n](v), settle(resolve4, reject2, v.done, v.value);
111819
111889
  });
111820
111890
  };
111821
111891
  }
111822
- function settle(resolve3, reject2, d, v) {
111892
+ function settle(resolve4, reject2, d, v) {
111823
111893
  Promise.resolve(v).then(function(v2) {
111824
- resolve3({ value: v2, done: d });
111894
+ resolve4({ value: v2, done: d });
111825
111895
  }, reject2);
111826
111896
  }
111827
111897
  };
@@ -112684,9 +112754,9 @@ var require_clone = __commonJS((exports, module) => {
112684
112754
  } else if (_instanceof2(parent2, nativeSet)) {
112685
112755
  child = new nativeSet;
112686
112756
  } else if (_instanceof2(parent2, nativePromise)) {
112687
- child = new nativePromise(function(resolve3, reject2) {
112757
+ child = new nativePromise(function(resolve4, reject2) {
112688
112758
  parent2.then(function(value) {
112689
- resolve3(_clone(value, depth2 - 1));
112759
+ resolve4(_clone(value, depth2 - 1));
112690
112760
  }, function(err) {
112691
112761
  reject2(_clone(err, depth2 - 1));
112692
112762
  });
@@ -260735,7 +260805,7 @@ function toPdfSafe(text) {
260735
260805
  return out;
260736
260806
  }
260737
260807
  function renderMarkdownToPdf(md, title) {
260738
- return new Promise((resolve3, reject2) => {
260808
+ return new Promise((resolve4, reject2) => {
260739
260809
  try {
260740
260810
  const doc2 = new PDFDocument({
260741
260811
  size: PAGE_SIZE,
@@ -260744,7 +260814,7 @@ function renderMarkdownToPdf(md, title) {
260744
260814
  });
260745
260815
  const chunks = [];
260746
260816
  doc2.on("data", (chunk2) => chunks.push(chunk2));
260747
- doc2.on("end", () => resolve3(new Uint8Array(Buffer.concat(chunks))));
260817
+ doc2.on("end", () => resolve4(new Uint8Array(Buffer.concat(chunks))));
260748
260818
  doc2.on("error", reject2);
260749
260819
  doc2.fillColor(COLOR_TEXT).font(FONT_BODY).fontSize(BODY_SIZE);
260750
260820
  const tokens = g.lexer(md);
@@ -261809,6 +261879,8 @@ function buildAgentCoordinator(input) {
261809
261879
  indicators,
261810
261880
  cmdRunner,
261811
261881
  gitRunner,
261882
+ applyIndicator: resolvers.applyIndicator,
261883
+ bus,
261812
261884
  onLog,
261813
261885
  diag,
261814
261886
  runners: input.runners,
@@ -262040,7 +262112,7 @@ async function waitForActiveWorkers(deps) {
262040
262112
  const budgetMs = deps.budgetMs ?? 1e4;
262041
262113
  const warnAtMs = deps.warnAtMs ?? 5000;
262042
262114
  deps.stop();
262043
- await new Promise((resolve3) => {
262115
+ await new Promise((resolve4) => {
262044
262116
  const start = Date.now();
262045
262117
  let warned = false;
262046
262118
  const wait = setInterval(() => {
@@ -262048,7 +262120,7 @@ async function waitForActiveWorkers(deps) {
262048
262120
  const elapsed = Date.now() - start;
262049
262121
  if (active === 0) {
262050
262122
  clearInterval(wait);
262051
- resolve3();
262123
+ resolve4();
262052
262124
  return;
262053
262125
  }
262054
262126
  if (!warned && elapsed >= warnAtMs) {
@@ -262058,7 +262130,7 @@ async function waitForActiveWorkers(deps) {
262058
262130
  if (elapsed >= budgetMs) {
262059
262131
  clearInterval(wait);
262060
262132
  deps.onTimeout?.(active);
262061
- resolve3();
262133
+ resolve4();
262062
262134
  }
262063
262135
  }, 100);
262064
262136
  });
@@ -262643,8 +262715,8 @@ function AgentMode({
262643
262715
  let cancelled = false;
262644
262716
  async function init2() {
262645
262717
  logSession(`=== session start ${SESSION_START} ===`);
262646
- const cfgPath = await ensureConfig(projectRoot);
262647
- const cfg2 = await loadConfig(projectRoot);
262718
+ const cfgPath = await ensureConfig(projectRoot, args.workflowFile);
262719
+ const cfg2 = await loadConfig(projectRoot, args.workflowFile);
262648
262720
  cfgRef.current = cfg2;
262649
262721
  appendLog(`agent mode v${VERSION} \u2014 config: ${cfgPath}`, "gray");
262650
262722
  const apiKey = process.env["LINEAR_API_KEY"];
@@ -264548,7 +264620,7 @@ async function runList(input) {
264548
264620
  }
264549
264621
  const rows = buildLocalRows();
264550
264622
  printLocalRows(rows);
264551
- const cfg = await loadRalphyConfig(projectRoot);
264623
+ const cfg = await loadRalphyConfig(projectRoot, getArgs().workflowFile);
264552
264624
  const apiKey = process.env["LINEAR_API_KEY"];
264553
264625
  const indicators = cfg.linear.indicators;
264554
264626
  const team = input.linearTeamOverride || cfg.linear.team;
@@ -264672,7 +264744,7 @@ async function runListDebug(input) {
264672
264744
  process.exitCode = 1;
264673
264745
  return;
264674
264746
  }
264675
- const cfg = await loadRalphyConfig(projectRoot);
264747
+ const cfg = await loadRalphyConfig(projectRoot, getArgs().workflowFile);
264676
264748
  const indicators = cfg.linear.indicators;
264677
264749
  const team = input.linearTeamOverride || cfg.linear.team;
264678
264750
  const { assignee, anyAssignee } = resolveLinearFilter(input.linearFilterOverride, input.linearAssigneeOverride, cfg.linear.filter);
@@ -264810,8 +264882,8 @@ async function runAgentJson({
264810
264882
  });
264811
264883
  const fileSink = createJsonLogFileSink(args.jsonLogFile);
264812
264884
  const emit3 = makeEmit(fileSink);
264813
- const cfgPath = await ensureRalphyConfig(projectRoot);
264814
- const cfg = await loadRalphyConfig(projectRoot);
264885
+ const cfgPath = await ensureRalphyConfig(projectRoot, args.workflowFile);
264886
+ const cfg = await loadRalphyConfig(projectRoot, args.workflowFile);
264815
264887
  await writeAgentRunState({
264816
264888
  projectRoot,
264817
264889
  configPath: cfgPath,
@@ -264968,7 +265040,7 @@ async function runAgentJson({
264968
265040
  }
264969
265041
  })();
264970
265042
  }, 1000);
264971
- await new Promise((resolve3) => {
265043
+ await new Promise((resolve4) => {
264972
265044
  let shuttingDown = false;
264973
265045
  const onSig = () => {
264974
265046
  if (shuttingDown) {
@@ -264998,7 +265070,7 @@ async function runAgentJson({
264998
265070
  });
264999
265071
  setTimeout(() => process.exit(1), 50);
265000
265072
  }
265001
- }).then(() => resolve3());
265073
+ }).then(() => resolve4());
265002
265074
  };
265003
265075
  process.once("SIGINT", onSig);
265004
265076
  process.once("SIGTERM", onSig);
@@ -265076,7 +265148,7 @@ async function main3(argv) {
265076
265148
  if (args.ticketTokens.length > 0) {
265077
265149
  const { loadRalphyConfig: loadRalphyConfig2 } = await Promise.resolve().then(() => (init_config(), exports_config));
265078
265150
  const { resolveTicketNumbers: resolveTicketNumbers2, formatTicketError: formatTicketError2 } = await Promise.resolve().then(() => (init_linear_client(), exports_linear_client));
265079
- const cfg = await loadRalphyConfig2(projectRoot);
265151
+ const cfg = await loadRalphyConfig2(projectRoot, args.workflowFile);
265080
265152
  const team = args.linearTeam || cfg.linear.team;
265081
265153
  try {
265082
265154
  resolveTicketNumbers2(args.ticketTokens, team);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neriros/ralphy",
3
- "version": "3.10.7",
3
+ "version": "3.10.9",
4
4
  "description": "An iterative AI task execution framework. Orchestrates multi-phase autonomous work using Claude or Codex engines.",
5
5
  "keywords": [
6
6
  "agent",