@llm4ts/shell 2.39.0 → 2.40.1

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.
@@ -60,6 +60,9 @@ export const epicUsage = [
60
60
  " --fail-fast stop the epic at the first failed story",
61
61
  " --judge-rounds <n> judge attempts per story (default 2 = one revision); a story the judge",
62
62
  " has not cleared after n attempts fails. LLM4TS_JUDGE_ROUNDS sets it too",
63
+ " --merge-revisions <n> times a story whose merge turns the epic gates red goes back to",
64
+ " catch up and fix it before failing (default 1; 0 fails at once).",
65
+ " LLM4TS_MERGE_REVISIONS sets it too",
63
66
  " --defer-findings lighter review: only Critical findings are fixed in place (reviews",
64
67
  " settle, the judge clears without them); the rest are deferred and, once",
65
68
  " every story is merged, planned and run as one refine round.",
@@ -83,6 +86,7 @@ export const parseEpicArgs = (argv) => Effect.gen(function* () {
83
86
  let concurrency;
84
87
  let judgeRounds;
85
88
  let deferFindings = false;
89
+ let mergeRevisions;
86
90
  let land;
87
91
  let keepWorktrees = false;
88
92
  let list = false;
@@ -142,6 +146,21 @@ export const parseEpicArgs = (argv) => Effect.gen(function* () {
142
146
  }
143
147
  concurrency = parsed;
144
148
  }
149
+ else if (argument === "--merge-revisions" || argument.startsWith("--merge-revisions=")) {
150
+ const raw = argument.includes("=")
151
+ ? argument.slice("--merge-revisions=".length)
152
+ : argv[index + 1];
153
+ if (!argument.includes("=")) {
154
+ index += 1;
155
+ }
156
+ const parsed = Number.parseInt(raw ?? "", 10);
157
+ if (!Number.isInteger(parsed) || parsed < 0 || String(parsed) !== (raw ?? "").trim()) {
158
+ return yield* ScriptUsage.make({
159
+ message: `--merge-revisions requires a non-negative integer\n${epicUsage}`
160
+ });
161
+ }
162
+ mergeRevisions = parsed;
163
+ }
145
164
  else if (argument === "--judge-rounds" || argument.startsWith("--judge-rounds=")) {
146
165
  const raw = argument.includes("=")
147
166
  ? argument.slice("--judge-rounds=".length)
@@ -167,6 +186,7 @@ export const parseEpicArgs = (argv) => Effect.gen(function* () {
167
186
  concurrency,
168
187
  judgeRounds,
169
188
  deferFindings,
189
+ mergeRevisions,
170
190
  land,
171
191
  keepWorktrees,
172
192
  list,
@@ -175,6 +195,17 @@ export const parseEpicArgs = (argv) => Effect.gen(function* () {
175
195
  rest
176
196
  };
177
197
  });
198
+ /**
199
+ * Merge revisions per story: `--merge-revisions`, else `LLM4TS_MERGE_REVISIONS`,
200
+ * else the executor's default. An unusable environment value falls back.
201
+ */
202
+ export const mergeRevisionsOption = (flag, environment) => {
203
+ if (flag !== undefined) {
204
+ return { mergeRevisions: flag };
205
+ }
206
+ const raw = environment.LLM4TS_MERGE_REVISIONS?.trim() ?? "";
207
+ return /^\d+$/u.test(raw) ? { mergeRevisions: Number.parseInt(raw, 10) } : {};
208
+ };
178
209
  /** `--defer-findings`, or `LLM4TS_DEFER_FINDINGS` set to 1/true/on/yes (ADR 0031). */
179
210
  export const deferFindingsEnabled = (flag, environment) => flag || /^(1|true|on|yes)$/i.test(environment.LLM4TS_DEFER_FINDINGS?.trim() ?? "");
180
211
  /**
@@ -1658,6 +1689,7 @@ export const runEpicStories = (options) => Effect.gen(function* () {
1658
1689
  ...(orientation === undefined ? [] : ["", orientation])
1659
1690
  ].join("\n")),
1660
1691
  ...judgeRoundsOption(flags.judgeRounds, process.env),
1692
+ ...mergeRevisionsOption(flags.mergeRevisions, process.env),
1661
1693
  concurrency,
1662
1694
  ...(deferring ? { deferNonBlocking: true } : {}),
1663
1695
  failFast: flags.failFast
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llm4ts/shell",
3
- "version": "2.39.0",
3
+ "version": "2.40.1",
4
4
  "description": "Interactive shell and CLI for llm4ts: flow discovery, run-a-flow, and view",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -52,9 +52,9 @@
52
52
  "dependencies": {
53
53
  "@effect/platform-node": "4.0.0",
54
54
  "@effect/platform-node-shared": "4.0.0",
55
- "@llm4ts/core": "2.39.0",
56
- "@llm4ts/flow": "2.39.0",
57
- "@llm4ts/runner": "2.39.0"
55
+ "@llm4ts/core": "2.40.1",
56
+ "@llm4ts/runner": "2.40.1",
57
+ "@llm4ts/flow": "2.40.1"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "effect": "4.0.0"