@llm4ts/shell 2.18.0 → 2.20.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.
- package/dist/Cli.d.ts +11 -1
- package/dist/Cli.d.ts.map +1 -1
- package/dist/Cli.js +36 -1
- package/dist/Cli.js.map +1 -1
- package/flows/lib/epic-design.js +3 -2
- package/flows/lib/epic-stories.js +346 -22
- package/package.json +4 -4
- package/src/Cli.ts +81 -0
package/dist/Cli.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { FileSystem } from "effect/FileSystem";
|
|
|
4
4
|
import * as Schema from "effect/Schema";
|
|
5
5
|
import * as Command from "effect/unstable/cli/Command";
|
|
6
6
|
import { type CostsOptions } from "@llm4ts/runner/Costs";
|
|
7
|
+
import { type WatchOptions } from "@llm4ts/runner/Watch";
|
|
7
8
|
import { type DiscoveredKit } from "@llm4ts/runner/Kits";
|
|
8
9
|
import { type DiscoveredFlow, type FlowTierPaths } from "./FlowCatalog.ts";
|
|
9
10
|
declare const ShellUsageError_base: Schema.Class<ShellUsageError, Schema.TaggedStruct<"ShellUsage", {
|
|
@@ -41,7 +42,16 @@ export interface CostsFlags {
|
|
|
41
42
|
}
|
|
42
43
|
/** Turns the `costs` flags into program options; every rejection is a usage error. */
|
|
43
44
|
export declare const costsOptionsFrom: (flags: CostsFlags, cwd?: string) => Effect.Effect<CostsOptions, ShellUsageError>;
|
|
44
|
-
export
|
|
45
|
+
export interface WatchFlags {
|
|
46
|
+
readonly trace: Option.Option<string>;
|
|
47
|
+
readonly repo: Option.Option<string>;
|
|
48
|
+
readonly epic: Option.Option<string>;
|
|
49
|
+
readonly replay: boolean;
|
|
50
|
+
readonly speed: Option.Option<number>;
|
|
51
|
+
}
|
|
52
|
+
/** Turns the `watch` flags into program options; every rejection is a usage error. */
|
|
53
|
+
export declare const watchOptionsFrom: (flags: WatchFlags, cwd?: string) => Effect.Effect<WatchOptions, ShellUsageError>;
|
|
54
|
+
export declare const shellCommand: Command.Command<"llm4ts", {} | {}, {}, import("./FlowLaunch.ts").FlowLaunchError | import("@llm4ts/flow/FlowError.ts").DecisionsInvalid | ShellUsageError | ShellActionError | import("@llm4ts/flow/FlowError.ts").PersistenceError | import("@llm4ts/flow/FlowError.ts").PlanParseError | import("@llm4ts/flow/FlowError.ts").UnsupportedSchemaVersion | import("@llm4ts/flow/FlowError.ts").WorkspacePathError | import("@llm4ts/flow/FlowError.ts").WorkspaceLimitError | import("@llm4ts/flow/FlowError.ts").WorkspaceIoError | import("@llm4ts/flow/FlowError.ts").FlowAborted | import("@llm4ts/flow/FlowError.ts").ProcessError | import("@llm4ts/flow/FlowError.ts").FlowLlmError | import("@llm4ts/flow/FlowError.ts").FlowCapabilityDenied | import("@llm4ts/flow/FlowError.ts").ColumnNotFound | import("@llm4ts/flow/FlowError.ts").BudgetExceeded | import("@llm4ts/flow/FlowError.ts").StoryPlanInvalid | import("@llm4ts/flow/FlowError.ts").PerimeterViolation | import("@llm4ts/flow/FlowError.ts").MissingDependency | import("@llm4ts/flow/FlowError.ts").MergeConflict | import("@llm4ts/flow/FlowError.ts").EpicCheckoutDirty | import("@llm4ts/flow/FlowError.ts").RosterExhausted | import("@llm4ts/flow/FlowError.ts").RosterInvalid | import("@llm4ts/flow/FlowError.ts").EpicIncomplete | import("@llm4ts/flow/FlowError.ts").LandingFailed | import("@llm4ts/flow/FlowError.ts").StoryFailed | import("@llm4ts/flow/FlowError.ts").OpenPointsPending | import("@llm4ts/flow/FlowError.ts").ContractConflict | import("@llm4ts/flow/FlowError.ts").ExtractPackMissing | import("@llm4ts/flow/FlowError.ts").EpicBriefInvalid | import("@llm4ts/flow/FlowError.ts").EpicBriefNotApproved | import("@llm4ts/flow/FlowError.ts").RefineRefused | import("@llm4ts/runner/Watch").WatchTargetMissing, import("effect/unstable/cli/Prompt").Environment>;
|
|
45
55
|
export declare const runShellCommand: (argv: ReadonlyArray<string>) => Effect.Effect<void, unknown, Command.Environment>;
|
|
46
56
|
export {};
|
|
47
57
|
//# sourceMappingURL=Cli.d.ts.map
|
package/dist/Cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cli.d.ts","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAA;AAGtD,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"Cli.d.ts","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAA;AAGtD,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAA;AAS7B,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEjG,OAAO,EAA8C,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACpG,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAA;;;;AAMzB,qBAAa,eAAgB,SAAQ,oBAEnC;CAAG;;;;AAEL,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;AAEL,eAAO,MAAM,eAAe,QAAO,MAA6D,CAAA;AAEhG,eAAO,MAAM,cAAc,GAAI,UAAU;IACvC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;CACpE,KAAG,aAaH,CAAA;AAQD,eAAO,MAAM,aAAa,GACxB,MAAM,aAAa,CAAC,aAAa,CAAC,EAClC,UAAU;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KACpC,MA+BF,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,OAAO,aAAa,CAAC,cAAc,CAAC,EACpC,UAAU;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KACpC,MAyBF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,iGAwBtB,CAAA;AAmOF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CAC3C;AAED,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,UAAU,EACjB,MAAK,MAAsB,KAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CA2B1C,CAAA;AA4CJ,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CACtC;AAED,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,UAAU,EACjB,MAAK,MAAsB,KAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAqB1C,CAAA;AAqGJ,eAAO,MAAM,YAAY,8wDAyBxB,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,MAAM,aAAa,CAAC,MAAM,CAAC,KAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CACe,CAAA"}
|
package/dist/Cli.js
CHANGED
|
@@ -15,6 +15,7 @@ import { CostsResult, makeCostsProgram, renderCostsResult } from "@llm4ts/runner
|
|
|
15
15
|
import { makeDoctorProgram } from "@llm4ts/runner/Doctor";
|
|
16
16
|
import { pauseExecutor, renderRosterReport, resumeExecutor, rosterReport } from "@llm4ts/runner/ExecutorRoster";
|
|
17
17
|
import { nodePlainFileStore } from "@llm4ts/runner/NodePlainFileStore";
|
|
18
|
+
import { makeWatchProgram, nodeWatchDependencies } from "@llm4ts/runner/Watch";
|
|
18
19
|
import { describeExclusion } from "@llm4ts/flow/Roster";
|
|
19
20
|
import { builtinKitsDir, discoverKits, kitTierPaths } from "@llm4ts/runner/Kits";
|
|
20
21
|
import { defaultTierPaths, discoverFlows } from "./FlowCatalog.js";
|
|
@@ -131,7 +132,8 @@ const runCommand = Command.make("run", {
|
|
|
131
132
|
pack: Flag.String("pack").pipe(Flag.optional, Flag.withDescription("Pack for the modernization flows, forwarded as LLM4TS_PACK: a kit pack name from `llm4ts kits`, kit/pack, or a directory holding pack.md")),
|
|
132
133
|
verbose: Flag.Boolean("verbose").pipe(Flag.withDefault(false), Flag.withDescription("Stream verbose flow output")),
|
|
133
134
|
roster: Flag.String("roster").pipe(Flag.optional, Flag.withDescription("Executor roster for this run, forwarded as LLM4TS_ROSTER: a roster file, or `none` for one executor per seat")),
|
|
134
|
-
executors: Flag.String("executors").pipe(Flag.optional, Flag.withDescription("Only these roster executors (comma-separated ids), forwarded as LLM4TS_EXECUTORS"))
|
|
135
|
+
executors: Flag.String("executors").pipe(Flag.optional, Flag.withDescription("Only these roster executors (comma-separated ids), forwarded as LLM4TS_EXECUTORS")),
|
|
136
|
+
ui: Flag.Literals("ui", ["classic", "tree"]).pipe(Flag.withDefault("classic"), Flag.withDescription("`tree` draws the agent tree full-screen (ADR 0022; `q` returns to the classic view), forwarded as LLM4TS_UI"))
|
|
135
137
|
}, (config) => Effect.gen(function* () {
|
|
136
138
|
const tiers = shellTierPaths();
|
|
137
139
|
const flowPath = yield* resolveFlow(config.flow, tiers);
|
|
@@ -148,6 +150,9 @@ const runCommand = Command.make("run", {
|
|
|
148
150
|
if (config.pack._tag === "Some") {
|
|
149
151
|
environment.LLM4TS_PACK = config.pack.value;
|
|
150
152
|
}
|
|
153
|
+
if (config.ui === "tree") {
|
|
154
|
+
environment.LLM4TS_UI = "tree";
|
|
155
|
+
}
|
|
151
156
|
const exitCode = yield* launchFlow({
|
|
152
157
|
flowPath,
|
|
153
158
|
taskArgs: [
|
|
@@ -276,6 +281,35 @@ const costsCommand = Command.make("costs", {
|
|
|
276
281
|
? Schema.encodeSync(Schema.fromJsonString(CostsResult))(result)
|
|
277
282
|
: renderCostsResult(result));
|
|
278
283
|
})).pipe(Command.withDescription("Token and cost usage across past runs, bucketed per day and hour for budgeting"));
|
|
284
|
+
/** Turns the `watch` flags into program options; every rejection is a usage error. */
|
|
285
|
+
export const watchOptionsFrom = (flags, cwd = process.cwd()) => Effect.gen(function* () {
|
|
286
|
+
if (Option.isSome(flags.trace) && Option.isSome(flags.epic)) {
|
|
287
|
+
return yield* new ShellUsageError({
|
|
288
|
+
message: "watch takes either a trace or --epic, not both"
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
const speed = Option.getOrUndefined(flags.speed);
|
|
292
|
+
if (speed !== undefined && speed <= 0) {
|
|
293
|
+
return yield* new ShellUsageError({ message: "--speed must be positive" });
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
repo: resolve(cwd, Option.getOrElse(flags.repo, () => ".")),
|
|
297
|
+
...(Option.isSome(flags.trace) ? { trace: resolve(cwd, flags.trace.value) } : {}),
|
|
298
|
+
...(Option.isSome(flags.epic) ? { epic: flags.epic.value } : {}),
|
|
299
|
+
...(flags.replay ? { replay: true } : {}),
|
|
300
|
+
...(speed === undefined ? {} : { speed })
|
|
301
|
+
};
|
|
302
|
+
});
|
|
303
|
+
const watchCommand = Command.make("watch", {
|
|
304
|
+
trace: Argument.String("trace").pipe(Argument.optional, Argument.withDescription("A trace file (default: the newest in the repository's .llm4ts/)")),
|
|
305
|
+
repo: Flag.String("repo").pipe(Flag.optional, Flag.withDescription("Repository whose .llm4ts/ to read (defaults to the current directory)")),
|
|
306
|
+
epic: Flag.String("epic").pipe(Flag.optional, Flag.withDescription("Open this epic's latest run (epics/<id>/runs.jsonl)")),
|
|
307
|
+
replay: Flag.Boolean("replay").pipe(Flag.withDefault(false), Flag.withDescription("Replay the run on its own timestamps")),
|
|
308
|
+
speed: Flag.Int("speed").pipe(Flag.optional, Flag.withDescription("Replay speed-up (default 10)"))
|
|
309
|
+
}, (config) => Effect.gen(function* () {
|
|
310
|
+
const options = yield* watchOptionsFrom(config);
|
|
311
|
+
yield* makeWatchProgram(options, nodeWatchDependencies());
|
|
312
|
+
})).pipe(Command.withDescription("The agent tree of a running or finished flow: lanes on the roster, the judge, the log (ADR 0022)"));
|
|
279
313
|
const rosterSource = (repo) => ({
|
|
280
314
|
files: nodePlainFileStore,
|
|
281
315
|
environment: process.env,
|
|
@@ -320,6 +354,7 @@ export const shellCommand = Command.make("llm4ts", {}, () => Effect.gen(function
|
|
|
320
354
|
askCommand,
|
|
321
355
|
refineCommand,
|
|
322
356
|
costsCommand,
|
|
357
|
+
watchCommand,
|
|
323
358
|
rosterCommand,
|
|
324
359
|
doctorCommand
|
|
325
360
|
]));
|
package/dist/Cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"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"}
|
package/flows/lib/epic-design.js
CHANGED
|
@@ -429,8 +429,9 @@ export const coveragePath = (targetDir) => join(epicsDir(targetDir), "coverage.m
|
|
|
429
429
|
export const epicProgressOf = (epics) => epics.map((epic) => ({
|
|
430
430
|
epicId: epic.dir,
|
|
431
431
|
planned: true,
|
|
432
|
-
stories
|
|
433
|
-
|
|
432
|
+
// A refine round's stories are the epic's work too (ADR 0021).
|
|
433
|
+
stories: epic.rounds.reduce((sum, round) => sum + (round.plan?.stories.length ?? 0), epic.stories),
|
|
434
|
+
merged: epic.rounds.reduce((sum, round) => sum + round.merged, epic.merged),
|
|
434
435
|
landed: epic.landed !== undefined
|
|
435
436
|
}));
|
|
436
437
|
/**
|
|
@@ -13,14 +13,18 @@ import { TokenUsage } from "@llm4ts/core/Models";
|
|
|
13
13
|
import { cap } from "@llm4ts/flow/Context";
|
|
14
14
|
import { parseEpicBrief, renderEpicBrief, unanswered } from "@llm4ts/flow/EpicBrief";
|
|
15
15
|
import { structuredAndPublish } from "@llm4ts/flow/Flow";
|
|
16
|
-
import { EpicBriefInvalid, EpicBriefNotApproved } from "@llm4ts/flow/FlowError";
|
|
16
|
+
import { EpicBriefInvalid, EpicBriefNotApproved, EpicCheckoutDirty, LandingFailed, RefineRefused } from "@llm4ts/flow/FlowError";
|
|
17
17
|
import { Info } from "@llm4ts/flow/FlowEvents";
|
|
18
|
+
import { statusPaths } from "@llm4ts/flow/GitTool";
|
|
18
19
|
import { EpicLanded, EpicLandedVersion, landedPath } from "@llm4ts/flow/Landing";
|
|
20
|
+
import { RefineProposal, assembleRound, countNotPlanned, earlierStories, refineProposalJsonSchema, renderNotPlanned, roundPrefix, roundRepair, runAction } from "@llm4ts/flow/RefineRound";
|
|
21
|
+
import { EpicRun, appendEpicRun } from "@llm4ts/flow/EpicRuns";
|
|
19
22
|
import { loadVersioned } from "@llm4ts/flow/Persistence";
|
|
20
|
-
import { BlockedVerdict, StoryState, StoryStateVersion } from "@llm4ts/flow/Stories";
|
|
23
|
+
import { BlockedVerdict, StoryState, StoryStateVersion, StoryVerdict } from "@llm4ts/flow/Stories";
|
|
21
24
|
import { stableHash } from "@llm4ts/flow/Plan";
|
|
22
25
|
import { ReviewIssue } from "@llm4ts/flow/Review";
|
|
23
|
-
import { StoryPlan, dependenciesOf, makeStoryPlanStore, pathsNamedIn } from "@llm4ts/flow/StoryPlan";
|
|
26
|
+
import { StoryPlan, dependenciesOf, makeStoryPlanStore, parseStoryPlan, pathsNamedIn } from "@llm4ts/flow/StoryPlan";
|
|
27
|
+
import * as Clock from "effect/Clock";
|
|
24
28
|
import * as Console from "effect/Console";
|
|
25
29
|
import { CliConnectorConfig } from "@llm4ts/core/ConnectorConfig";
|
|
26
30
|
import { budget } from "@llm4ts/flow/Context";
|
|
@@ -42,6 +46,9 @@ export const epicUsage = [
|
|
|
42
46
|
" --list list this repository's epics (id, stories merged, landed) and stop",
|
|
43
47
|
" --epic <id> work on an existing epic by id, no text needed. Without text or",
|
|
44
48
|
" --epic, the one epic not landed yet is chosen; several stop the run",
|
|
49
|
+
" --refine the text is feedback on the finished epic: plan a round of follow-up",
|
|
50
|
+
" stories from it and run them on the epic branch (before landing).",
|
|
51
|
+
" A plain rerun finishes an open round; --plan-only stops after planning",
|
|
45
52
|
" --concurrency <n> stories implemented at once (default 3)",
|
|
46
53
|
" --fail-fast stop the epic at the first failed story",
|
|
47
54
|
"Seats: LLM4TS_REASONER (claude|gemini|…, default claude) splits, reviews, judges;",
|
|
@@ -64,6 +71,7 @@ export const parseEpicArgs = (argv) => Effect.gen(function* () {
|
|
|
64
71
|
let land;
|
|
65
72
|
let keepWorktrees = false;
|
|
66
73
|
let list = false;
|
|
74
|
+
let refine = false;
|
|
67
75
|
let epic;
|
|
68
76
|
const rest = [];
|
|
69
77
|
for (let index = 0; index < argv.length; index += 1) {
|
|
@@ -80,6 +88,9 @@ export const parseEpicArgs = (argv) => Effect.gen(function* () {
|
|
|
80
88
|
else if (argument === "--list") {
|
|
81
89
|
list = true;
|
|
82
90
|
}
|
|
91
|
+
else if (argument === "--refine") {
|
|
92
|
+
refine = true;
|
|
93
|
+
}
|
|
83
94
|
else if (argument === "--epic" || argument.startsWith("--epic=")) {
|
|
84
95
|
const value = argument.includes("=") ? argument.slice("--epic=".length) : argv[index + 1];
|
|
85
96
|
if (!argument.includes("=")) {
|
|
@@ -117,8 +128,79 @@ export const parseEpicArgs = (argv) => Effect.gen(function* () {
|
|
|
117
128
|
rest.push(argument);
|
|
118
129
|
}
|
|
119
130
|
}
|
|
120
|
-
return { planOnly, failFast, concurrency, land, keepWorktrees, list, epic, rest };
|
|
131
|
+
return { planOnly, failFast, concurrency, land, keepWorktrees, list, epic, refine, rest };
|
|
121
132
|
});
|
|
133
|
+
export const roundDir = (stateDir, round) => join(stateDir, "rounds", String(round));
|
|
134
|
+
const mergedStories = (files, stateDir, plan) => Effect.gen(function* () {
|
|
135
|
+
let merged = 0;
|
|
136
|
+
for (const story of plan.stories) {
|
|
137
|
+
const state = yield* loadVersioned(files, join(stateDir, "stories", `${story.id}.json`), StoryStateVersion, StoryState).pipe(Effect.catch(() => Effect.succeed(undefined)));
|
|
138
|
+
if (state?.status === "merged") {
|
|
139
|
+
merged += 1;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return merged;
|
|
143
|
+
});
|
|
144
|
+
/**
|
|
145
|
+
* The epic's rounds, numbered from 1 without gaps: the first `rounds/<n>`
|
|
146
|
+
* without a plan ends the list. A plan that does not parse, or breaks the
|
|
147
|
+
* plan's rules, is a round that cannot be used, never one silently skipped.
|
|
148
|
+
*/
|
|
149
|
+
export const loadRounds = (files, stateDir) => Effect.gen(function* () {
|
|
150
|
+
const rounds = [];
|
|
151
|
+
for (let round = 1;; round += 1) {
|
|
152
|
+
const dir = roundDir(stateDir, round);
|
|
153
|
+
const path = join(dir, "plan.md");
|
|
154
|
+
const text = yield* files.read(path);
|
|
155
|
+
if (text === undefined) {
|
|
156
|
+
// A plan missing while the next round has one is a hole, not the end.
|
|
157
|
+
if ((yield* files.read(join(roundDir(stateDir, round + 1), "plan.md"))) === undefined) {
|
|
158
|
+
return rounds;
|
|
159
|
+
}
|
|
160
|
+
rounds.push({
|
|
161
|
+
round,
|
|
162
|
+
stateDir: dir,
|
|
163
|
+
plan: undefined,
|
|
164
|
+
merged: 0,
|
|
165
|
+
notPlanned: 0,
|
|
166
|
+
unreadable: `${path} is missing while round ${round + 1} exists`
|
|
167
|
+
});
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const notPlanned = countNotPlanned((yield* files.read(join(dir, "not-planned.md"))) ?? "");
|
|
171
|
+
const parsed = yield* Effect.result(parseStoryPlan(text).pipe(Effect.flatMap(validateStoryPlan)));
|
|
172
|
+
if (Result.isSuccess(parsed)) {
|
|
173
|
+
rounds.push({
|
|
174
|
+
round,
|
|
175
|
+
stateDir: dir,
|
|
176
|
+
plan: parsed.success,
|
|
177
|
+
merged: yield* mergedStories(files, dir, parsed.success),
|
|
178
|
+
notPlanned,
|
|
179
|
+
unreadable: undefined
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
rounds.push({
|
|
184
|
+
round,
|
|
185
|
+
stateDir: dir,
|
|
186
|
+
plan: undefined,
|
|
187
|
+
merged: 0,
|
|
188
|
+
notPlanned,
|
|
189
|
+
unreadable: `${path}: ${parsed.failure.message}`
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
/** The rounds as the run decision reads them. */
|
|
195
|
+
export const roundProgress = (rounds) => rounds.map((round) => ({
|
|
196
|
+
round: round.round,
|
|
197
|
+
stories: round.plan?.stories.length ?? 0,
|
|
198
|
+
merged: round.merged,
|
|
199
|
+
...(round.unreadable === undefined ? {} : { unreadable: round.unreadable })
|
|
200
|
+
}));
|
|
201
|
+
const renderRound = (round) => round.plan === undefined
|
|
202
|
+
? `round ${round.round}: unreadable plan`
|
|
203
|
+
: `round ${round.round}: ${round.merged}/${round.plan.stories.length} merged${round.notPlanned === 0 ? "" : `, ${round.notPlanned} not planned`}`;
|
|
122
204
|
export const epicsDir = (workDir) => join(workDir, ".llm4ts", "epics");
|
|
123
205
|
/** Every epic with a plan in this repository, oldest folder name first. */
|
|
124
206
|
export const listEpics = (files, workDir) => Effect.gen(function* () {
|
|
@@ -137,13 +219,7 @@ export const listEpics = (files, workDir) => Effect.gen(function* () {
|
|
|
137
219
|
if (plan === undefined) {
|
|
138
220
|
continue;
|
|
139
221
|
}
|
|
140
|
-
|
|
141
|
-
for (const story of plan.stories) {
|
|
142
|
-
const state = yield* loadVersioned(files, join(stateDir, "stories", `${story.id}.json`), StoryStateVersion, StoryState).pipe(Effect.catch(() => Effect.succeed(undefined)));
|
|
143
|
-
if (state?.status === "merged") {
|
|
144
|
-
merged += 1;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
222
|
+
const merged = yield* mergedStories(files, stateDir, plan);
|
|
147
223
|
const landed = yield* loadVersioned(files, landedPath(stateDir), EpicLandedVersion, EpicLanded).pipe(Effect.catch(() => Effect.succeed(undefined)));
|
|
148
224
|
summaries.push({
|
|
149
225
|
dir: entry.name,
|
|
@@ -152,7 +228,19 @@ export const listEpics = (files, workDir) => Effect.gen(function* () {
|
|
|
152
228
|
epic: plan.epic,
|
|
153
229
|
stories: plan.stories.length,
|
|
154
230
|
merged,
|
|
155
|
-
landed: landed?.target
|
|
231
|
+
landed: landed?.target,
|
|
232
|
+
// Rounds that cannot be read are reported, never dropped: an epic
|
|
233
|
+
// must not look free of rounds when it lands.
|
|
234
|
+
rounds: yield* loadRounds(files, stateDir).pipe(Effect.catch((error) => Effect.succeed([
|
|
235
|
+
{
|
|
236
|
+
round: 1,
|
|
237
|
+
stateDir: roundDir(stateDir, 1),
|
|
238
|
+
plan: undefined,
|
|
239
|
+
merged: 0,
|
|
240
|
+
notPlanned: 0,
|
|
241
|
+
unreadable: `${join(stateDir, "rounds")}: ${error.message}`
|
|
242
|
+
}
|
|
243
|
+
])))
|
|
156
244
|
});
|
|
157
245
|
}
|
|
158
246
|
return summaries;
|
|
@@ -166,7 +254,7 @@ export const renderEpicList = (epics) => epics.length === 0
|
|
|
166
254
|
? epic.merged === epic.stories
|
|
167
255
|
? "finished, not landed"
|
|
168
256
|
: "in progress"
|
|
169
|
-
: `landed on ${epic.landed}`} (--epic ${epic.epicId})`,
|
|
257
|
+
: `landed on ${epic.landed}`}${epic.rounds.map((round) => ` · ${renderRound(round)}`).join("")} (--epic ${epic.epicId})`,
|
|
170
258
|
` "${epic.epic.length > 110 ? `${epic.epic.slice(0, 109)}…` : epic.epic}"`
|
|
171
259
|
])
|
|
172
260
|
].join("\n");
|
|
@@ -569,6 +657,128 @@ export const generateStoryPlan = (reasoning, events, epic, epicId, guidance,
|
|
|
569
657
|
brief) => structuredAndPublish(reasoning, events, `${storyPlanInstructions(epicId, guidance)}\n\nEpic:\n${brief ?? epic}`, StoryPlan, storyPlanJsonSchema).pipe(
|
|
570
658
|
// The id and the epic text are ours, whatever the model echoed back.
|
|
571
659
|
Effect.map((plan) => StoryPlan.make({ ...plan, epicId, epic })));
|
|
660
|
+
/** The round planner's constraints: the story planner's, for feedback on finished work. */
|
|
661
|
+
export const refinePlanInstructions = (inputs) => [
|
|
662
|
+
"You are the orchestrator of a parallel implementation. The epic below is finished: every",
|
|
663
|
+
"story is merged into the epic branch, which is checked out in front of you. A person tried",
|
|
664
|
+
"it and gave the feedback at the end of this message. Turn the feedback into follow-up",
|
|
665
|
+
"stories that independent coding agents will implement AT THE SAME TIME, each in its own git",
|
|
666
|
+
"worktree, each confined to the paths it owns. Read the code before you answer.",
|
|
667
|
+
"",
|
|
668
|
+
"Rules (violations are rejected mechanically):",
|
|
669
|
+
"- Every story has a kebab-case id, a title, a description precise enough to implement alone,",
|
|
670
|
+
" `dependsOn`, `owned` (repo-relative paths it may create or change), `sharedReadOnly`",
|
|
671
|
+
" (prefixes it may read but never change), and `provides`.",
|
|
672
|
+
"- One story per feedback item, or per group of items that change the same files. The",
|
|
673
|
+
" description quotes the feedback items it answers, word for word.",
|
|
674
|
+
"- `owned` lists the files the story will change, existing files included: name them from the",
|
|
675
|
+
" code. The earlier stories below are merged, so their paths are free to claim.",
|
|
676
|
+
"- `owned` sets are pairwise DISJOINT within this round: items that need the same file go",
|
|
677
|
+
" into ONE story.",
|
|
678
|
+
"- `dependsOn` names stories of THIS round only, and only when one needs the other's result.",
|
|
679
|
+
"- `provides` says what the person who gave the feedback will see changed.",
|
|
680
|
+
"- Tests that cover the changed behaviour are updated in the same story, and the test files",
|
|
681
|
+
" are in its `owned`.",
|
|
682
|
+
"- Shared surfaces (the kit, the theme, house rules) are owned only by a story the feedback",
|
|
683
|
+
" asks to change them.",
|
|
684
|
+
"- An item that is unclear, contradicts another item, or cannot be tied to a file is NOT",
|
|
685
|
+
" guessed: it goes to `notPlanned` with the question whose answer would make it plannable.",
|
|
686
|
+
`- Ids are short; each is prefixed \`${roundPrefix(inputs.round)}\` for you (round ${inputs.round} of epic "${inputs.epicId}").`,
|
|
687
|
+
"",
|
|
688
|
+
"Respond only with JSON:",
|
|
689
|
+
'{"stories":[{"id":"...","title":"...","description":"...","dependsOn":[],"owned":[],',
|
|
690
|
+
'"sharedReadOnly":[],"provides":[]}],"notPlanned":[{"item":"...","reason":"..."}]}',
|
|
691
|
+
"",
|
|
692
|
+
"Earlier stories (merged: what was built, and where):",
|
|
693
|
+
...(inputs.earlier.length === 0
|
|
694
|
+
? ["(none)"]
|
|
695
|
+
: inputs.earlier.map((story) => `- ${story.id}: ${story.title} — owns: ${story.owned.join(", ")} — provides: ${story.provides.join("; ")}`)),
|
|
696
|
+
...(inputs.brief === undefined ? [] : ["", "The epic's approved brief:", inputs.brief]),
|
|
697
|
+
...(inputs.openItems === undefined
|
|
698
|
+
? []
|
|
699
|
+
: [
|
|
700
|
+
"",
|
|
701
|
+
"Left unplanned in the previous round (the new feedback may answer these):",
|
|
702
|
+
inputs.openItems
|
|
703
|
+
]),
|
|
704
|
+
"",
|
|
705
|
+
"Target repository guidance (house rules and layout — the vocabulary to use):",
|
|
706
|
+
inputs.guidance
|
|
707
|
+
].join("\n");
|
|
708
|
+
export const generateRefineProposal = (reasoning, events, inputs) => structuredAndPublish(reasoning, events, `${refinePlanInstructions(inputs)}\n\nFeedback:\n${inputs.feedback}`, RefineProposal, refineProposalJsonSchema);
|
|
709
|
+
const bulletLines = (markdown) => markdown
|
|
710
|
+
.split("\n")
|
|
711
|
+
.filter((line) => line.startsWith("- "))
|
|
712
|
+
.join("\n");
|
|
713
|
+
/**
|
|
714
|
+
* Plans a round from feedback and writes it: `feedback.md`, `plan.md`, and
|
|
715
|
+
* `not-planned.md` when something was left out. Nothing is written unless the
|
|
716
|
+
* plan is valid, and no round is created when no story could be planned.
|
|
717
|
+
*/
|
|
718
|
+
export const planRound = Effect.fn("flows/epic-stories.planRound")(function* (deps) {
|
|
719
|
+
const open = deps.round > 1
|
|
720
|
+
? bulletLines((yield* deps.files.read(join(roundDir(deps.stateDir, deps.round - 1), "not-planned.md"))) ?? "")
|
|
721
|
+
: "";
|
|
722
|
+
const earlier = earlierStories(deps.plans);
|
|
723
|
+
const proposal = yield* generateRefineProposal(deps.reasoning, deps.events, {
|
|
724
|
+
epicId: deps.epicId,
|
|
725
|
+
round: deps.round,
|
|
726
|
+
guidance: deps.guidance,
|
|
727
|
+
earlier,
|
|
728
|
+
feedback: deps.feedback,
|
|
729
|
+
...(deps.brief === undefined ? {} : { brief: deps.brief }),
|
|
730
|
+
...(open.length === 0 ? {} : { openItems: open })
|
|
731
|
+
});
|
|
732
|
+
if (proposal.stories.length === 0) {
|
|
733
|
+
return { plan: undefined, notPlanned: proposal.notPlanned };
|
|
734
|
+
}
|
|
735
|
+
const plan = yield* validateStoryPlan(assembleRound({
|
|
736
|
+
epicId: deps.epicId,
|
|
737
|
+
round: deps.round,
|
|
738
|
+
feedback: deps.feedback,
|
|
739
|
+
proposal,
|
|
740
|
+
earlier: earlier.map((story) => story.id)
|
|
741
|
+
}));
|
|
742
|
+
const dir = roundDir(deps.stateDir, deps.round);
|
|
743
|
+
yield* deps.files.writeAtomic(join(dir, "feedback.md"), `${deps.feedback}\n`);
|
|
744
|
+
// Always written: a reused folder must not keep an older round's list.
|
|
745
|
+
yield* deps.files.writeAtomic(join(dir, "not-planned.md"), renderNotPlanned(deps.round, proposal.notPlanned));
|
|
746
|
+
// The plan goes last: it is what makes the folder a round.
|
|
747
|
+
yield* makeStoryPlanStore(deps.files).save(join(dir, "plan.md"), plan);
|
|
748
|
+
return { plan, notPlanned: proposal.notPlanned };
|
|
749
|
+
});
|
|
750
|
+
/**
|
|
751
|
+
* The epic a `--refine` run works on. The text on the command line is
|
|
752
|
+
* feedback, so it never names or creates an epic: only one with a story plan
|
|
753
|
+
* can take a round.
|
|
754
|
+
*/
|
|
755
|
+
export const refineEpic = (choice) => choice._tag === "Existing"
|
|
756
|
+
? Effect.succeed(choice.epic)
|
|
757
|
+
: choice._tag === "Brief"
|
|
758
|
+
? Effect.fail(RefineRefused.make({
|
|
759
|
+
epicId: choice.dir,
|
|
760
|
+
reason: "it has no story plan yet: run the epic first"
|
|
761
|
+
}))
|
|
762
|
+
: Effect.fail(ScriptUsage.make({
|
|
763
|
+
message: `--refine needs a finished epic, and this repository has none to pick: run an epic first, or name one with --epic <id>\n${epicUsage}`
|
|
764
|
+
}));
|
|
765
|
+
/**
|
|
766
|
+
* The planned epic a choice lands on: the one picked, or the one whose folder
|
|
767
|
+
* the given text derives (an epic rerun by its text is still that epic).
|
|
768
|
+
*/
|
|
769
|
+
export const epicOnDisk = (choice, epics) => choice._tag === "Existing"
|
|
770
|
+
? choice.epic
|
|
771
|
+
: choice._tag === "Text"
|
|
772
|
+
? epics.find((epic) => epic.dir === epicIdFor(choice.prompt))
|
|
773
|
+
: undefined;
|
|
774
|
+
/** The rounds as the landing takes them; one whose plan cannot be read stops it. */
|
|
775
|
+
export const landRounds = (epicId, target, rounds) => Effect.forEach(rounds, (round) => round.plan === undefined
|
|
776
|
+
? Effect.fail(LandingFailed.make({
|
|
777
|
+
epicBranch: `epic/${epicId}`,
|
|
778
|
+
target,
|
|
779
|
+
reason: `round ${round.round}'s plan cannot be read (${round.unreadable ?? ""}); ${roundRepair(round.round)}`
|
|
780
|
+
}))
|
|
781
|
+
: Effect.succeed({ plan: round.plan, stateDir: round.stateDir }));
|
|
572
782
|
// ---- Usage ---------------------------------------------------------------------
|
|
573
783
|
/** Sums two meters into one per-story estimate. */
|
|
574
784
|
export const combineTotals = (first, second) => Effect.map(Effect.all([first, second]), ([left, right]) => {
|
|
@@ -654,7 +864,14 @@ export const judgeStory = (reasoning, story, diff, budget, plan) => judge(reason
|
|
|
654
864
|
query: storyJudgeQuery(story, plan),
|
|
655
865
|
response: cap(diff, budget).text
|
|
656
866
|
}))
|
|
657
|
-
.pipe(Effect.mapError(FlowLlmError.from), Effect.map((scored) =>
|
|
867
|
+
.pipe(Effect.mapError(FlowLlmError.from), Effect.map((scored) => StoryVerdict.make({
|
|
868
|
+
...subBar(scored, story),
|
|
869
|
+
dimensions: scored.scores.map((score) => ({
|
|
870
|
+
id: score.name,
|
|
871
|
+
score: score.score,
|
|
872
|
+
max: storyDimensions.find((dimension) => dimension.name === score.name)?.maxScore ?? 2
|
|
873
|
+
}))
|
|
874
|
+
})));
|
|
658
875
|
// ---- App directory ----------------------------------------------------------------
|
|
659
876
|
/** Folders never taken for the application: dependencies, build output, llm4ts state. */
|
|
660
877
|
const ignoredAppDirs = new Set(["node_modules", "dist", "build", "out", "coverage"]);
|
|
@@ -811,13 +1028,45 @@ export const runEpicStories = (options) => Effect.gen(function* () {
|
|
|
811
1028
|
yield* Console.log(renderEpicList(epics));
|
|
812
1029
|
return;
|
|
813
1030
|
}
|
|
1031
|
+
// With `--refine` the text is feedback on a finished epic, never an epic's text.
|
|
1032
|
+
const feedback = flags.refine ? given.prompt.trim() : "";
|
|
814
1033
|
const choice = yield* chooseEpic({
|
|
815
|
-
text: given.prompt,
|
|
1034
|
+
text: flags.refine ? "" : given.prompt,
|
|
816
1035
|
epic: flags.epic,
|
|
817
1036
|
epics,
|
|
818
1037
|
briefs: yield* listBriefs(files, given.workDir, yield* epicDirs(given.workDir)),
|
|
819
1038
|
defaultEpic
|
|
820
1039
|
});
|
|
1040
|
+
if (flags.refine) {
|
|
1041
|
+
yield* refineEpic(choice);
|
|
1042
|
+
}
|
|
1043
|
+
// What this run does (ADR 0021): the plan's stories, the open refine round,
|
|
1044
|
+
// a new round, or the landing. Refusals come before any seat is resolved.
|
|
1045
|
+
const existing = epicOnDisk(choice, epics);
|
|
1046
|
+
const rounds = existing?.rounds ?? [];
|
|
1047
|
+
const action = existing !== undefined
|
|
1048
|
+
? runAction({
|
|
1049
|
+
planned: true,
|
|
1050
|
+
stories: existing.stories,
|
|
1051
|
+
merged: existing.merged,
|
|
1052
|
+
landed: existing.landed,
|
|
1053
|
+
rounds: roundProgress(rounds),
|
|
1054
|
+
refine: flags.refine,
|
|
1055
|
+
feedback,
|
|
1056
|
+
land: flags.land !== undefined
|
|
1057
|
+
})
|
|
1058
|
+
: flags.land !== undefined
|
|
1059
|
+
? { _tag: "Land" }
|
|
1060
|
+
: { _tag: "RunPlan" };
|
|
1061
|
+
if (action._tag === "Refused") {
|
|
1062
|
+
return yield* RefineRefused.make({
|
|
1063
|
+
epicId: existing?.epicId ?? "",
|
|
1064
|
+
reason: action.reason
|
|
1065
|
+
});
|
|
1066
|
+
}
|
|
1067
|
+
if (action._tag === "Usage") {
|
|
1068
|
+
return yield* ScriptUsage.make({ message: `${action.message}\n${epicUsage}` });
|
|
1069
|
+
}
|
|
821
1070
|
const input = {
|
|
822
1071
|
...given,
|
|
823
1072
|
prompt: choice._tag === "Existing"
|
|
@@ -853,6 +1102,16 @@ export const runEpicStories = (options) => Effect.gen(function* () {
|
|
|
853
1102
|
...runnerOptions
|
|
854
1103
|
}, (context) => Effect.gen(function* () {
|
|
855
1104
|
const events = context.events;
|
|
1105
|
+
// The epic remembers which trace each run wrote (`llm4ts watch --epic`).
|
|
1106
|
+
if (context.trace !== undefined) {
|
|
1107
|
+
yield* appendEpicRun(files, stateDir, EpicRun.make({
|
|
1108
|
+
runId: context.trace.runId,
|
|
1109
|
+
tracePath: context.trace.path,
|
|
1110
|
+
action: action._tag,
|
|
1111
|
+
...("round" in action ? { round: action.round } : {}),
|
|
1112
|
+
startedAt: yield* Clock.currentTimeMillis
|
|
1113
|
+
}));
|
|
1114
|
+
}
|
|
856
1115
|
const reasoningMeter = yield* makeEstimatedUsageMeter(context.reasoning, estimateOptions);
|
|
857
1116
|
const guidance = yield* Effect.map(files.read(join(input.workDir, "CONTRIBUTING.md")), (text) => cap(text ?? "(no CONTRIBUTING.md in the target repository)", 24_000).text);
|
|
858
1117
|
// An approved epic brief in the epic's folder is what the planner reads.
|
|
@@ -869,9 +1128,72 @@ export const runEpicStories = (options) => Effect.gen(function* () {
|
|
|
869
1128
|
yield* events.publish(Info.make({
|
|
870
1129
|
message: `story plan: ${plan.stories.length} stories at ${planPath} (edit and rerun to re-plan)`
|
|
871
1130
|
}));
|
|
872
|
-
if (flags.planOnly) {
|
|
1131
|
+
if (flags.planOnly && action._tag !== "PlanRound") {
|
|
873
1132
|
return;
|
|
874
1133
|
}
|
|
1134
|
+
const epicBranch = `epic/${plan.epicId}`;
|
|
1135
|
+
// The unit the executor works on: the epic's plan, or one refine round.
|
|
1136
|
+
// Same branch, seats, gates and judge; its own plan and state folder.
|
|
1137
|
+
let unit = { plan, stateDir, label: `Epic: ${plan.epicId}` };
|
|
1138
|
+
if (action._tag === "RunRound") {
|
|
1139
|
+
const open = rounds.find((round) => round.round === action.round);
|
|
1140
|
+
if (open?.plan !== undefined) {
|
|
1141
|
+
unit = {
|
|
1142
|
+
plan: open.plan,
|
|
1143
|
+
stateDir: open.stateDir,
|
|
1144
|
+
label: `Epic: ${plan.epicId} · round ${open.round}`
|
|
1145
|
+
};
|
|
1146
|
+
yield* events.publish(Info.make({
|
|
1147
|
+
message: `refine round ${open.round}: ${open.merged}/${open.plan.stories.length} stories merged; finishing it`
|
|
1148
|
+
}));
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
if (action._tag === "PlanRound") {
|
|
1152
|
+
// The planner reads the code as the person tried it: the epic
|
|
1153
|
+
// branch, with nothing uncommitted carried over onto it.
|
|
1154
|
+
const stray = statusPaths(yield* context.git.status);
|
|
1155
|
+
if (stray.length > 0) {
|
|
1156
|
+
return yield* EpicCheckoutDirty.make({ checkout: input.workDir, paths: stray });
|
|
1157
|
+
}
|
|
1158
|
+
yield* stage(events, "epic branch", context.git.checkoutOrCreate(epicBranch));
|
|
1159
|
+
const roundBrief = yield* files.read(join(stateDir, "brief.md"));
|
|
1160
|
+
const planned = yield* stage(events, `refine round ${action.round} plan`, planRound({
|
|
1161
|
+
files,
|
|
1162
|
+
reasoning: reasoningMeter.service,
|
|
1163
|
+
events,
|
|
1164
|
+
stateDir,
|
|
1165
|
+
epicId: plan.epicId,
|
|
1166
|
+
round: action.round,
|
|
1167
|
+
feedback,
|
|
1168
|
+
guidance,
|
|
1169
|
+
plans: [
|
|
1170
|
+
plan,
|
|
1171
|
+
...rounds.flatMap((round) => (round.plan === undefined ? [] : [round.plan]))
|
|
1172
|
+
],
|
|
1173
|
+
...(roundBrief === undefined ? {} : { brief: roundBrief })
|
|
1174
|
+
}));
|
|
1175
|
+
for (const left of planned.notPlanned) {
|
|
1176
|
+
yield* events.publish(Info.make({ message: `not planned: ${left.item} — ${left.reason}` }));
|
|
1177
|
+
}
|
|
1178
|
+
if (planned.plan === undefined) {
|
|
1179
|
+
yield* events.publish(Info.make({
|
|
1180
|
+
message: `refine round ${action.round}: no feedback item could be planned; answer the questions above and run --refine again`
|
|
1181
|
+
}));
|
|
1182
|
+
return;
|
|
1183
|
+
}
|
|
1184
|
+
const dir = roundDir(stateDir, action.round);
|
|
1185
|
+
yield* events.publish(Info.make({
|
|
1186
|
+
message: `refine round ${action.round}: ${planned.plan.stories.length} follow-up stories at ${join(dir, "plan.md")} (edit and rerun to re-plan)${planned.notPlanned.length === 0 ? "" : `; ${planned.notPlanned.length} item(s) not planned, listed in ${join(dir, "not-planned.md")}`}`
|
|
1187
|
+
}));
|
|
1188
|
+
if (flags.planOnly) {
|
|
1189
|
+
return;
|
|
1190
|
+
}
|
|
1191
|
+
unit = {
|
|
1192
|
+
plan: planned.plan,
|
|
1193
|
+
stateDir: dir,
|
|
1194
|
+
label: `Epic: ${plan.epicId} · round ${action.round}`
|
|
1195
|
+
};
|
|
1196
|
+
}
|
|
875
1197
|
// Setup and gates run where the application is, in every checkout.
|
|
876
1198
|
const appDir = yield* appDirFor(input.workDir, process.env);
|
|
877
1199
|
if (appDir !== ".") {
|
|
@@ -891,6 +1213,7 @@ export const runEpicStories = (options) => Effect.gen(function* () {
|
|
|
891
1213
|
files,
|
|
892
1214
|
stateDir,
|
|
893
1215
|
target: flags.land,
|
|
1216
|
+
rounds: yield* landRounds(plan.epicId, flags.land, rounds),
|
|
894
1217
|
keepWorktrees: flags.keepWorktrees,
|
|
895
1218
|
gates: inAppDir(appDir, gatesIn(nodeProcessExecutor, events, commands)),
|
|
896
1219
|
system: ["House rules of the target repository (CONTRIBUTING.md):", guidance].join("\n")
|
|
@@ -925,11 +1248,12 @@ export const runEpicStories = (options) => Effect.gen(function* () {
|
|
|
925
1248
|
const setupCommand = worktreeSetupCommand(process.env);
|
|
926
1249
|
const healthUrl = serverHealthUrl(localServer, process.env);
|
|
927
1250
|
const report = yield* implementStoriesFlow({ ...context, reasoning: reasoningMeter.service }, {
|
|
928
|
-
plan,
|
|
1251
|
+
plan: unit.plan,
|
|
929
1252
|
files,
|
|
930
|
-
stateDir,
|
|
1253
|
+
stateDir: unit.stateDir,
|
|
1254
|
+
epicBranch,
|
|
931
1255
|
worktreeRoot: worktreeRootFor(input.workDir, plan.epicId, process.env),
|
|
932
|
-
board: makeLocalBoardSync(files, stateDir,
|
|
1256
|
+
board: makeLocalBoardSync(files, unit.stateDir, unit.label),
|
|
933
1257
|
contextFor: (workDir, contextOptions) => Effect.gen(function* () {
|
|
934
1258
|
const rebound = yield* contextFor(workDir, contextOptions);
|
|
935
1259
|
const coderMeter = yield* makeEstimatedUsageMeter(rebound.coder, estimateOptions);
|
|
@@ -954,14 +1278,14 @@ export const runEpicStories = (options) => Effect.gen(function* () {
|
|
|
954
1278
|
// With a roster, the judge and the verifier are leased per story,
|
|
955
1279
|
// away from the executor coding it (ADR 0019).
|
|
956
1280
|
judge: options.storyJudge({
|
|
957
|
-
plan,
|
|
1281
|
+
plan: unit.plan,
|
|
958
1282
|
budget: contextBudget,
|
|
959
1283
|
reasoning: reasoningMeter.service,
|
|
960
1284
|
events,
|
|
961
1285
|
files,
|
|
962
1286
|
houseRules: guidance
|
|
963
1287
|
}),
|
|
964
|
-
verifyBlocked: (story, need, workDir, seats) => verifyBlockedOn(seats.context.roster?.forRole("verifier") ?? reasoningMeter.service, events, files, plan)(story, need, workDir),
|
|
1288
|
+
verifyBlocked: (story, need, workDir, seats) => verifyBlockedOn(seats.context.roster?.forRole("verifier") ?? reasoningMeter.service, events, files, unit.plan)(story, need, workDir),
|
|
965
1289
|
// A roster waits for its own executors (the story's next lease
|
|
966
1290
|
// does); without one, poll the single coder's engine.
|
|
967
1291
|
awaitRecovery: context.roster === undefined
|
|
@@ -978,7 +1302,7 @@ export const runEpicStories = (options) => Effect.gen(function* () {
|
|
|
978
1302
|
failFast: flags.failFast
|
|
979
1303
|
});
|
|
980
1304
|
yield* events.publish(Info.make({
|
|
981
|
-
message:
|
|
1305
|
+
message: `${unit.label.replace("Epic: ", "epic ")}: ${report.count("done")} done, ${report.count("failed")} failed, ${report.count("waiting")} waiting — report at ${join(unit.stateDir, "report.md")} (usage figures estimated)`
|
|
982
1306
|
}));
|
|
983
1307
|
}));
|
|
984
1308
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llm4ts/shell",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.20.0",
|
|
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-rc.115",
|
|
54
54
|
"@effect/platform-node-shared": "4.0.0-rc.115",
|
|
55
|
-
"@llm4ts/core": "2.
|
|
56
|
-
"@llm4ts/
|
|
57
|
-
"@llm4ts/
|
|
55
|
+
"@llm4ts/core": "2.20.0",
|
|
56
|
+
"@llm4ts/flow": "2.20.0",
|
|
57
|
+
"@llm4ts/runner": "2.20.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"effect": "4.0.0-rc.115"
|
package/src/Cli.ts
CHANGED
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
rosterReport
|
|
26
26
|
} from "@llm4ts/runner/ExecutorRoster"
|
|
27
27
|
import { nodePlainFileStore } from "@llm4ts/runner/NodePlainFileStore"
|
|
28
|
+
import { makeWatchProgram, nodeWatchDependencies, type WatchOptions } from "@llm4ts/runner/Watch"
|
|
28
29
|
import { describeExclusion } from "@llm4ts/flow/Roster"
|
|
29
30
|
import { builtinKitsDir, discoverKits, kitTierPaths, type DiscoveredKit } from "@llm4ts/runner/Kits"
|
|
30
31
|
import {
|
|
@@ -206,6 +207,12 @@ const runCommand = Command.make(
|
|
|
206
207
|
Flag.withDescription(
|
|
207
208
|
"Only these roster executors (comma-separated ids), forwarded as LLM4TS_EXECUTORS"
|
|
208
209
|
)
|
|
210
|
+
),
|
|
211
|
+
ui: Flag.Literals("ui", ["classic", "tree"]).pipe(
|
|
212
|
+
Flag.withDefault("classic"),
|
|
213
|
+
Flag.withDescription(
|
|
214
|
+
"`tree` draws the agent tree full-screen (ADR 0022; `q` returns to the classic view), forwarded as LLM4TS_UI"
|
|
215
|
+
)
|
|
209
216
|
)
|
|
210
217
|
},
|
|
211
218
|
(config) =>
|
|
@@ -225,6 +232,9 @@ const runCommand = Command.make(
|
|
|
225
232
|
if (config.pack._tag === "Some") {
|
|
226
233
|
environment.LLM4TS_PACK = config.pack.value
|
|
227
234
|
}
|
|
235
|
+
if (config.ui === "tree") {
|
|
236
|
+
environment.LLM4TS_UI = "tree"
|
|
237
|
+
}
|
|
228
238
|
const exitCode = yield* launchFlow({
|
|
229
239
|
flowPath,
|
|
230
240
|
taskArgs: [
|
|
@@ -467,6 +477,76 @@ const costsCommand = Command.make(
|
|
|
467
477
|
)
|
|
468
478
|
)
|
|
469
479
|
|
|
480
|
+
export interface WatchFlags {
|
|
481
|
+
readonly trace: Option.Option<string>
|
|
482
|
+
readonly repo: Option.Option<string>
|
|
483
|
+
readonly epic: Option.Option<string>
|
|
484
|
+
readonly replay: boolean
|
|
485
|
+
readonly speed: Option.Option<number>
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/** Turns the `watch` flags into program options; every rejection is a usage error. */
|
|
489
|
+
export const watchOptionsFrom = (
|
|
490
|
+
flags: WatchFlags,
|
|
491
|
+
cwd: string = process.cwd()
|
|
492
|
+
): Effect.Effect<WatchOptions, ShellUsageError> =>
|
|
493
|
+
Effect.gen(function* () {
|
|
494
|
+
if (Option.isSome(flags.trace) && Option.isSome(flags.epic)) {
|
|
495
|
+
return yield* new ShellUsageError({
|
|
496
|
+
message: "watch takes either a trace or --epic, not both"
|
|
497
|
+
})
|
|
498
|
+
}
|
|
499
|
+
const speed = Option.getOrUndefined(flags.speed)
|
|
500
|
+
if (speed !== undefined && speed <= 0) {
|
|
501
|
+
return yield* new ShellUsageError({ message: "--speed must be positive" })
|
|
502
|
+
}
|
|
503
|
+
return {
|
|
504
|
+
repo: resolve(
|
|
505
|
+
cwd,
|
|
506
|
+
Option.getOrElse(flags.repo, () => ".")
|
|
507
|
+
),
|
|
508
|
+
...(Option.isSome(flags.trace) ? { trace: resolve(cwd, flags.trace.value) } : {}),
|
|
509
|
+
...(Option.isSome(flags.epic) ? { epic: flags.epic.value } : {}),
|
|
510
|
+
...(flags.replay ? { replay: true } : {}),
|
|
511
|
+
...(speed === undefined ? {} : { speed })
|
|
512
|
+
}
|
|
513
|
+
})
|
|
514
|
+
|
|
515
|
+
const watchCommand = Command.make(
|
|
516
|
+
"watch",
|
|
517
|
+
{
|
|
518
|
+
trace: Argument.String("trace").pipe(
|
|
519
|
+
Argument.optional,
|
|
520
|
+
Argument.withDescription("A trace file (default: the newest in the repository's .llm4ts/)")
|
|
521
|
+
),
|
|
522
|
+
repo: Flag.String("repo").pipe(
|
|
523
|
+
Flag.optional,
|
|
524
|
+
Flag.withDescription("Repository whose .llm4ts/ to read (defaults to the current directory)")
|
|
525
|
+
),
|
|
526
|
+
epic: Flag.String("epic").pipe(
|
|
527
|
+
Flag.optional,
|
|
528
|
+
Flag.withDescription("Open this epic's latest run (epics/<id>/runs.jsonl)")
|
|
529
|
+
),
|
|
530
|
+
replay: Flag.Boolean("replay").pipe(
|
|
531
|
+
Flag.withDefault(false),
|
|
532
|
+
Flag.withDescription("Replay the run on its own timestamps")
|
|
533
|
+
),
|
|
534
|
+
speed: Flag.Int("speed").pipe(
|
|
535
|
+
Flag.optional,
|
|
536
|
+
Flag.withDescription("Replay speed-up (default 10)")
|
|
537
|
+
)
|
|
538
|
+
},
|
|
539
|
+
(config) =>
|
|
540
|
+
Effect.gen(function* () {
|
|
541
|
+
const options = yield* watchOptionsFrom(config)
|
|
542
|
+
yield* makeWatchProgram(options, nodeWatchDependencies())
|
|
543
|
+
})
|
|
544
|
+
).pipe(
|
|
545
|
+
Command.withDescription(
|
|
546
|
+
"The agent tree of a running or finished flow: lanes on the roster, the judge, the log (ADR 0022)"
|
|
547
|
+
)
|
|
548
|
+
)
|
|
549
|
+
|
|
470
550
|
const rosterSource = (repo: Option.Option<string>) => ({
|
|
471
551
|
files: nodePlainFileStore,
|
|
472
552
|
environment: process.env,
|
|
@@ -552,6 +632,7 @@ export const shellCommand = Command.make("llm4ts", {}, () =>
|
|
|
552
632
|
askCommand,
|
|
553
633
|
refineCommand,
|
|
554
634
|
costsCommand,
|
|
635
|
+
watchCommand,
|
|
555
636
|
rosterCommand,
|
|
556
637
|
doctorCommand
|
|
557
638
|
])
|