@llm4ts/shell 0.2.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 +33 -0
- package/dist/Cli.d.ts.map +1 -0
- package/dist/Cli.js +148 -0
- package/dist/Cli.js.map +1 -0
- package/dist/CoderChoice.d.ts +18 -0
- package/dist/CoderChoice.d.ts.map +1 -0
- package/dist/CoderChoice.js +41 -0
- package/dist/CoderChoice.js.map +1 -0
- package/dist/FlowCatalog.d.ts +37 -0
- package/dist/FlowCatalog.d.ts.map +1 -0
- package/dist/FlowCatalog.js +86 -0
- package/dist/FlowCatalog.js.map +1 -0
- package/dist/FlowLaunch.d.ts +36 -0
- package/dist/FlowLaunch.d.ts.map +1 -0
- package/dist/FlowLaunch.js +86 -0
- package/dist/FlowLaunch.js.map +1 -0
- package/dist/Menu.d.ts +9 -0
- package/dist/Menu.d.ts.map +1 -0
- package/dist/Menu.js +101 -0
- package/dist/Menu.js.map +1 -0
- package/dist/Package.d.ts +3 -0
- package/dist/Package.d.ts.map +1 -0
- package/dist/Package.js +7 -0
- package/dist/Package.js.map +1 -0
- package/dist/ResolveFallback.d.ts +2 -0
- package/dist/ResolveFallback.d.ts.map +1 -0
- package/dist/ResolveFallback.js +29 -0
- package/dist/ResolveFallback.js.map +1 -0
- package/dist/cli-main.d.ts +3 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +39 -0
- package/dist/cli-main.js.map +1 -0
- package/flows/implement.ts +38 -0
- package/flows/issue-pr.ts +108 -0
- package/flows/judge-suite.ts +63 -0
- package/flows/local.ts +59 -0
- package/flows/sdd.ts +181 -0
- package/package.json +66 -0
- package/src/Cli.ts +230 -0
- package/src/CoderChoice.ts +58 -0
- package/src/FlowCatalog.ts +119 -0
- package/src/FlowLaunch.ts +99 -0
- package/src/Menu.ts +123 -0
- package/src/Package.ts +11 -0
- package/src/ResolveFallback.ts +31 -0
- package/src/cli-main.ts +48 -0
package/dist/Cli.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { FileSystem } from "effect/FileSystem";
|
|
3
|
+
import * as Schema from "effect/Schema";
|
|
4
|
+
import * as Command from "effect/unstable/cli/Command";
|
|
5
|
+
import { type DiscoveredFlow, type FlowTierPaths } from "./FlowCatalog.ts";
|
|
6
|
+
declare const ShellUsageError_base: Schema.Class<ShellUsageError, Schema.TaggedStruct<"ShellUsage", {
|
|
7
|
+
readonly message: Schema.String;
|
|
8
|
+
}>, import("effect/Cause").YieldableError>;
|
|
9
|
+
export declare class ShellUsageError extends ShellUsageError_base {
|
|
10
|
+
}
|
|
11
|
+
declare const ShellActionError_base: Schema.Class<ShellActionError, Schema.TaggedStruct<"ShellAction", {
|
|
12
|
+
readonly message: Schema.String;
|
|
13
|
+
}>, import("effect/Cause").YieldableError>;
|
|
14
|
+
export declare class ShellActionError extends ShellActionError_base {
|
|
15
|
+
}
|
|
16
|
+
export declare const builtinFlowsDir: () => string;
|
|
17
|
+
export declare const shellTierPaths: (options?: {
|
|
18
|
+
readonly cwd?: string;
|
|
19
|
+
readonly environment?: Readonly<Record<string, string | undefined>>;
|
|
20
|
+
}) => FlowTierPaths;
|
|
21
|
+
export declare const renderFlowList: (flows: ReadonlyArray<DiscoveredFlow>, options?: {
|
|
22
|
+
readonly json?: boolean;
|
|
23
|
+
}) => string;
|
|
24
|
+
/**
|
|
25
|
+
* Resolves a flow argument to a runnable script path: an explicit path (a
|
|
26
|
+
* value containing a separator or ending in `.ts`) is used as-is, anything
|
|
27
|
+
* else is looked up by name in the discovery listing.
|
|
28
|
+
*/
|
|
29
|
+
export declare const resolveFlow: (reference: string, tiers: FlowTierPaths) => Effect.Effect<string, ShellUsageError, FileSystem>;
|
|
30
|
+
export declare const shellCommand: Command.Command<"llm4ts", {} | {}, {}, ShellUsageError | ShellActionError | import("./FlowLaunch.ts").FlowLaunchError, import("effect/unstable/cli/Prompt").Environment>;
|
|
31
|
+
export declare const runShellCommand: (argv: ReadonlyArray<string>) => Effect.Effect<void, unknown, Command.Environment>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=Cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cli.d.ts","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"AAGA,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;AAItD,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAA;;;;AAKzB,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,aAMA,CAAA;AAOJ,eAAO,MAAM,cAAc,GACzB,OAAO,aAAa,CAAC,cAAc,CAAC,EACpC,UAAU;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KACpC,MAwBF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,iGAwBtB,CAAA;AAyGF,eAAO,MAAM,YAAY,0KAcxB,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
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import * as Console from "effect/Console";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { FileSystem } from "effect/FileSystem";
|
|
6
|
+
import * as Schema from "effect/Schema";
|
|
7
|
+
import * as Argument from "effect/unstable/cli/Argument";
|
|
8
|
+
import * as Command from "effect/unstable/cli/Command";
|
|
9
|
+
import * as Flag from "effect/unstable/cli/Flag";
|
|
10
|
+
import { makeCliProgram } from "@llm4ts/runner/Cli";
|
|
11
|
+
import { makeDoctorProgram } from "@llm4ts/runner/Doctor";
|
|
12
|
+
import { defaultTierPaths, discoverFlows } from "./FlowCatalog.js";
|
|
13
|
+
import { launchFlow } from "./FlowLaunch.js";
|
|
14
|
+
import { mainMenu } from "./Menu.js";
|
|
15
|
+
import { packageVersion } from "./Package.js";
|
|
16
|
+
export class ShellUsageError extends Schema.TaggedErrorClass()("ShellUsage", {
|
|
17
|
+
message: Schema.String
|
|
18
|
+
}) {
|
|
19
|
+
}
|
|
20
|
+
export class ShellActionError extends Schema.TaggedErrorClass()("ShellAction", {
|
|
21
|
+
message: Schema.String
|
|
22
|
+
}) {
|
|
23
|
+
}
|
|
24
|
+
export const builtinFlowsDir = () => fileURLToPath(new URL("../flows", import.meta.url));
|
|
25
|
+
export const shellTierPaths = (options) => defaultTierPaths({
|
|
26
|
+
cwd: options?.cwd ?? process.cwd(),
|
|
27
|
+
homeDir: homedir(),
|
|
28
|
+
environment: options?.environment ?? process.env,
|
|
29
|
+
builtinDir: builtinFlowsDir()
|
|
30
|
+
});
|
|
31
|
+
const tierLabel = (flow) => {
|
|
32
|
+
const shadows = flow.shadows.length === 0 ? "" : ` shadows ${flow.shadows.join(", ")}`;
|
|
33
|
+
return `[${flow.tier}${shadows}]`;
|
|
34
|
+
};
|
|
35
|
+
export const renderFlowList = (flows, options) => {
|
|
36
|
+
if (options?.json === true) {
|
|
37
|
+
return JSON.stringify(flows.map((flow) => ({
|
|
38
|
+
name: flow.name,
|
|
39
|
+
tier: flow.tier,
|
|
40
|
+
path: flow.path,
|
|
41
|
+
...(flow.description === undefined ? {} : { description: flow.description }),
|
|
42
|
+
shadows: flow.shadows
|
|
43
|
+
})), undefined, 2);
|
|
44
|
+
}
|
|
45
|
+
const nameWidth = flows.reduce((width, flow) => Math.max(width, flow.name.length), 0);
|
|
46
|
+
return flows
|
|
47
|
+
.map((flow) => [
|
|
48
|
+
flow.name.padEnd(nameWidth),
|
|
49
|
+
tierLabel(flow),
|
|
50
|
+
...(flow.description === undefined ? [] : [flow.description])
|
|
51
|
+
].join(" "))
|
|
52
|
+
.join("\n");
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Resolves a flow argument to a runnable script path: an explicit path (a
|
|
56
|
+
* value containing a separator or ending in `.ts`) is used as-is, anything
|
|
57
|
+
* else is looked up by name in the discovery listing.
|
|
58
|
+
*/
|
|
59
|
+
export const resolveFlow = Effect.fn("@llm4ts/shell/Cli.resolveFlow")(function* (reference, tiers) {
|
|
60
|
+
if (reference.includes("/") || reference.endsWith(".ts")) {
|
|
61
|
+
const fs = yield* FileSystem;
|
|
62
|
+
const exists = yield* fs.exists(reference).pipe(Effect.orElseSucceed(() => false));
|
|
63
|
+
if (!exists) {
|
|
64
|
+
return yield* new ShellUsageError({ message: `flow script not found: ${reference}` });
|
|
65
|
+
}
|
|
66
|
+
return reference;
|
|
67
|
+
}
|
|
68
|
+
const flows = yield* discoverFlows(tiers);
|
|
69
|
+
const found = flows.find((flow) => flow.name === reference);
|
|
70
|
+
if (found === undefined) {
|
|
71
|
+
const known = flows.map((flow) => flow.name).join(", ");
|
|
72
|
+
return yield* new ShellUsageError({
|
|
73
|
+
message: known.length === 0
|
|
74
|
+
? `unknown flow '${reference}' (no flows discovered)`
|
|
75
|
+
: `unknown flow '${reference}' (known flows: ${known})`
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return found.path;
|
|
79
|
+
});
|
|
80
|
+
const runCommand = Command.make("run", {
|
|
81
|
+
flow: Argument.string("flow").pipe(Argument.withDescription("Flow name from `llm4ts list`, or a path to a flow script")),
|
|
82
|
+
task: Argument.string("task").pipe(Argument.variadic(), Argument.withDescription("Task text passed to the flow")),
|
|
83
|
+
verbose: Flag.boolean("verbose").pipe(Flag.withDescription("Stream verbose flow output"))
|
|
84
|
+
}, (config) => Effect.gen(function* () {
|
|
85
|
+
const tiers = shellTierPaths();
|
|
86
|
+
const flowPath = yield* resolveFlow(config.flow, tiers);
|
|
87
|
+
const environment = { ...process.env };
|
|
88
|
+
if (config.verbose) {
|
|
89
|
+
environment.LLM4TS_VERBOSITY = "verbose";
|
|
90
|
+
}
|
|
91
|
+
const exitCode = yield* launchFlow({
|
|
92
|
+
flowPath,
|
|
93
|
+
taskArgs: config.task,
|
|
94
|
+
environment
|
|
95
|
+
});
|
|
96
|
+
yield* Effect.sync(() => {
|
|
97
|
+
process.exitCode = exitCode;
|
|
98
|
+
});
|
|
99
|
+
})).pipe(Command.withDescription("Run a discovered flow as a child process"));
|
|
100
|
+
const listCommand = Command.make("list", {
|
|
101
|
+
json: Flag.boolean("json").pipe(Flag.withDescription("Emit the listing as JSON"))
|
|
102
|
+
}, (config) => Effect.gen(function* () {
|
|
103
|
+
const flows = yield* discoverFlows(shellTierPaths());
|
|
104
|
+
if (flows.length === 0 && !config.json) {
|
|
105
|
+
yield* Console.error("no flows discovered");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
yield* Console.log(renderFlowList(flows, { json: config.json }));
|
|
109
|
+
})).pipe(Command.withDescription("List flows across the project, global, and built-in tiers"));
|
|
110
|
+
const viewCommand = Command.make("view", {
|
|
111
|
+
flow: Argument.string("flow").pipe(Argument.withDescription("Flow name from `llm4ts list`, or a path to a flow script"))
|
|
112
|
+
}, (config) => Effect.gen(function* () {
|
|
113
|
+
const flowPath = yield* resolveFlow(config.flow, shellTierPaths());
|
|
114
|
+
const fs = yield* FileSystem;
|
|
115
|
+
const source = yield* fs
|
|
116
|
+
.readFileString(flowPath)
|
|
117
|
+
.pipe(Effect.mapError(() => new ShellActionError({ message: `cannot read ${flowPath}` })));
|
|
118
|
+
yield* Console.log(source.trimEnd());
|
|
119
|
+
})).pipe(Command.withDescription("Print a flow's source"));
|
|
120
|
+
const askCommand = Command.make("ask", {
|
|
121
|
+
prompt: Argument.string("prompt").pipe(Argument.variadic(), Argument.withDescription("Prompt streamed once to the selected coding agent")),
|
|
122
|
+
repo: Flag.string("repo").pipe(Flag.optional, Flag.withDescription("Repository to run against (defaults to the current directory)"))
|
|
123
|
+
}, (config) => Effect.gen(function* () {
|
|
124
|
+
if (config.prompt.length === 0) {
|
|
125
|
+
return yield* new ShellUsageError({ message: "ask needs a prompt" });
|
|
126
|
+
}
|
|
127
|
+
const argv = [
|
|
128
|
+
config.prompt.join(" "),
|
|
129
|
+
...(config.repo._tag === "Some" ? ["--repo", config.repo.value] : [])
|
|
130
|
+
];
|
|
131
|
+
yield* makeCliProgram(argv).pipe(Effect.mapError((error) => error._tag === "ScriptUsage"
|
|
132
|
+
? new ShellUsageError({ message: error.message })
|
|
133
|
+
: new ShellActionError({ message: error.message })));
|
|
134
|
+
})).pipe(Command.withDescription("Stream a one-shot prompt to the selected coding agent"));
|
|
135
|
+
const doctorCommand = Command.make("doctor", {}, () => Effect.gen(function* () {
|
|
136
|
+
const report = yield* makeDoctorProgram();
|
|
137
|
+
yield* Console.log(report.trimEnd());
|
|
138
|
+
})).pipe(Command.withDescription("Report available connectors and credentials"));
|
|
139
|
+
export const shellCommand = Command.make("llm4ts", {}, () => Effect.gen(function* () {
|
|
140
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
141
|
+
return yield* new ShellUsageError({
|
|
142
|
+
message: "no command given and no interactive terminal; try `llm4ts --help`"
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
yield* mainMenu(shellTierPaths());
|
|
146
|
+
})).pipe(Command.withDescription("Interactive shell and CLI for llm4ts flows: discover, inspect, and run them."), Command.withSubcommands([runCommand, listCommand, viewCommand, askCommand, doctorCommand]));
|
|
147
|
+
export const runShellCommand = (argv) => Command.runWith(shellCommand, { version: packageVersion })(argv);
|
|
148
|
+
//# sourceMappingURL=Cli.js.map
|
package/dist/Cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cli.js","sourceRoot":"","sources":["../src/Cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The coder tokens `coderFromEnv` accepts as `LLM4TS_CODER` values, each with
|
|
3
|
+
* the executable name the corresponding CLI connector spawns. The tokens are
|
|
4
|
+
* the connector identity vocabulary of `@llm4ts/core/Models` narrowed to the
|
|
5
|
+
* CLI coding agents the runner exposes.
|
|
6
|
+
*/
|
|
7
|
+
export interface CoderChoice {
|
|
8
|
+
readonly token: string;
|
|
9
|
+
readonly executable: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const coderChoices: ReadonlyArray<CoderChoice>;
|
|
12
|
+
/**
|
|
13
|
+
* Locates an executable on `PATH` without spawning a process. Decoration
|
|
14
|
+
* only: an undetected CLI stays selectable, mirroring orca's wizard probing.
|
|
15
|
+
*/
|
|
16
|
+
export declare const findOnPath: (executable: string, environment?: Readonly<Record<string, string | undefined>>) => string | undefined;
|
|
17
|
+
export declare const resolvedCoderToken: (environment?: Readonly<Record<string, string | undefined>>) => string;
|
|
18
|
+
//# sourceMappingURL=CoderChoice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoderChoice.d.ts","sourceRoot":"","sources":["../src/CoderChoice.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,WAAW,CASnD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,GACrB,YAAY,MAAM,EAClB,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,KACtE,MAAM,GAAG,SAkBX,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,KACtE,MAGF,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { accessSync, constants } from "node:fs";
|
|
2
|
+
import { delimiter, join } from "node:path";
|
|
3
|
+
export const coderChoices = [
|
|
4
|
+
{ token: "claude", executable: "claude" },
|
|
5
|
+
{ token: "codex", executable: "codex" },
|
|
6
|
+
{ token: "gemini", executable: "gemini" },
|
|
7
|
+
{ token: "pi", executable: "pi" },
|
|
8
|
+
{ token: "agy", executable: "agy" },
|
|
9
|
+
{ token: "grok", executable: "grok" },
|
|
10
|
+
{ token: "cursor", executable: "cursor-agent" },
|
|
11
|
+
{ token: "opencode", executable: "opencode" }
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Locates an executable on `PATH` without spawning a process. Decoration
|
|
15
|
+
* only: an undetected CLI stays selectable, mirroring orca's wizard probing.
|
|
16
|
+
*/
|
|
17
|
+
export const findOnPath = (executable, environment = process.env) => {
|
|
18
|
+
const searchPath = environment.PATH;
|
|
19
|
+
if (searchPath === undefined || searchPath.length === 0) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
for (const directory of searchPath.split(delimiter)) {
|
|
23
|
+
if (directory.length === 0) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const candidate = join(directory, executable);
|
|
27
|
+
try {
|
|
28
|
+
accessSync(candidate, constants.X_OK);
|
|
29
|
+
return candidate;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
};
|
|
37
|
+
export const resolvedCoderToken = (environment = process.env) => {
|
|
38
|
+
const token = environment.LLM4TS_CODER ?? environment.LLM4ZIO_CODER ?? "claude";
|
|
39
|
+
return coderChoices.some((choice) => choice.token === token) ? token : "claude";
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=CoderChoice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoderChoice.js","sourceRoot":"","sources":["../src/CoderChoice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAa3C,MAAM,CAAC,MAAM,YAAY,GAA+B;IACtD,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;IACzC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE;IACvC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;IACzC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;IACjC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;IACnC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE;IACrC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE;IAC/C,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE;CAC9C,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,UAAkB,EAClB,cAA4D,OAAO,CAAC,GAAG,EACnD,EAAE;IACtB,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAA;IACnC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,SAAQ;QACV,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAC7C,IAAI,CAAC;YACH,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;YACrC,OAAO,SAAS,CAAA;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,cAA4D,OAAO,CAAC,GAAG,EAC/D,EAAE;IACV,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,aAAa,IAAI,QAAQ,CAAA;IAC/E,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;AACjF,CAAC,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { FileSystem } from "effect/FileSystem";
|
|
3
|
+
export type FlowTier = "project" | "global" | "builtin";
|
|
4
|
+
export interface FlowTierPaths {
|
|
5
|
+
readonly project?: string;
|
|
6
|
+
readonly global?: string;
|
|
7
|
+
readonly builtin?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface DiscoveredFlow {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly path: string;
|
|
12
|
+
readonly tier: FlowTier;
|
|
13
|
+
readonly description?: string;
|
|
14
|
+
readonly shadows: ReadonlyArray<FlowTier>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The first non-empty `//` comment line within the file's leading block of
|
|
18
|
+
* blank lines and `//` comments is the flow's one-line description. A bare or
|
|
19
|
+
* whitespace-only `//` line is skipped, never returned as an empty
|
|
20
|
+
* description; the scan stops at the first line that is neither blank nor a
|
|
21
|
+
* `//` comment.
|
|
22
|
+
*/
|
|
23
|
+
export declare const parseFlowDescription: (source: string) => string | undefined;
|
|
24
|
+
export declare const defaultTierPaths: (options: {
|
|
25
|
+
readonly cwd: string;
|
|
26
|
+
readonly homeDir: string;
|
|
27
|
+
readonly environment?: Readonly<Record<string, string | undefined>>;
|
|
28
|
+
readonly builtinDir?: string;
|
|
29
|
+
}) => FlowTierPaths;
|
|
30
|
+
/**
|
|
31
|
+
* Discovers flows across the project, global, and built-in tiers. Precedence
|
|
32
|
+
* is project > global > builtin, keyed by flow name; a shadowed tier is
|
|
33
|
+
* recorded on the winning flow's `shadows` list. Missing or unreadable
|
|
34
|
+
* directories contribute nothing.
|
|
35
|
+
*/
|
|
36
|
+
export declare const discoverFlows: (tiers: FlowTierPaths) => Effect.Effect<DiscoveredFlow[], never, FileSystem>;
|
|
37
|
+
//# sourceMappingURL=FlowCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowCatalog.d.ts","sourceRoot":"","sources":["../src/FlowCatalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEvD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CAC1C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,SAe9D,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,SAAS;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B,KAAG,aAWH,CAAA;AA4BD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,8EAwBxB,CAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { FileSystem } from "effect/FileSystem";
|
|
4
|
+
/**
|
|
5
|
+
* The first non-empty `//` comment line within the file's leading block of
|
|
6
|
+
* blank lines and `//` comments is the flow's one-line description. A bare or
|
|
7
|
+
* whitespace-only `//` line is skipped, never returned as an empty
|
|
8
|
+
* description; the scan stops at the first line that is neither blank nor a
|
|
9
|
+
* `//` comment.
|
|
10
|
+
*/
|
|
11
|
+
export const parseFlowDescription = (source) => {
|
|
12
|
+
for (const line of source.split("\n")) {
|
|
13
|
+
const trimmed = line.trim();
|
|
14
|
+
if (trimmed.length === 0) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (!trimmed.startsWith("//")) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const text = trimmed.slice(2).trim();
|
|
21
|
+
if (text.length > 0) {
|
|
22
|
+
return text;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
};
|
|
27
|
+
export const defaultTierPaths = (options) => {
|
|
28
|
+
const environment = options.environment ?? process.env;
|
|
29
|
+
const configHome = environment.XDG_CONFIG_HOME !== undefined && environment.XDG_CONFIG_HOME.length > 0
|
|
30
|
+
? environment.XDG_CONFIG_HOME
|
|
31
|
+
: join(options.homeDir, ".config");
|
|
32
|
+
return {
|
|
33
|
+
project: join(options.cwd, ".llm4ts", "flows"),
|
|
34
|
+
global: join(configHome, "llm4ts", "flows"),
|
|
35
|
+
...(options.builtinDir === undefined ? {} : { builtin: options.builtinDir })
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
const tierOrder = ["project", "global", "builtin"];
|
|
39
|
+
const listTier = Effect.fn("@llm4ts/shell/FlowCatalog.listTier")(function* (tier, directory) {
|
|
40
|
+
const fs = yield* FileSystem;
|
|
41
|
+
const entries = yield* fs.readDirectory(directory).pipe(Effect.orElseSucceed(() => []));
|
|
42
|
+
const flows = [];
|
|
43
|
+
for (const entry of [...entries].sort()) {
|
|
44
|
+
if (!entry.endsWith(".ts")) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const path = join(directory, entry);
|
|
48
|
+
const source = yield* fs.readFileString(path).pipe(Effect.orElseSucceed(() => ""));
|
|
49
|
+
const description = parseFlowDescription(source);
|
|
50
|
+
flows.push({
|
|
51
|
+
name: entry.slice(0, -".ts".length),
|
|
52
|
+
path,
|
|
53
|
+
tier,
|
|
54
|
+
...(description === undefined ? {} : { description })
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return flows;
|
|
58
|
+
});
|
|
59
|
+
/**
|
|
60
|
+
* Discovers flows across the project, global, and built-in tiers. Precedence
|
|
61
|
+
* is project > global > builtin, keyed by flow name; a shadowed tier is
|
|
62
|
+
* recorded on the winning flow's `shadows` list. Missing or unreadable
|
|
63
|
+
* directories contribute nothing.
|
|
64
|
+
*/
|
|
65
|
+
export const discoverFlows = Effect.fn("@llm4ts/shell/FlowCatalog.discoverFlows")(function* (tiers) {
|
|
66
|
+
const byName = new Map();
|
|
67
|
+
for (const tier of tierOrder) {
|
|
68
|
+
const directory = tiers[tier];
|
|
69
|
+
if (directory === undefined) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
for (const flow of yield* listTier(tier, directory)) {
|
|
73
|
+
const existing = byName.get(flow.name);
|
|
74
|
+
if (existing === undefined) {
|
|
75
|
+
byName.set(flow.name, { flow, shadows: [] });
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
existing.shadows.push(tier);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return [...byName.values()]
|
|
83
|
+
.map(({ flow, shadows }) => ({ ...flow, shadows }))
|
|
84
|
+
.sort((left, right) => left.name.localeCompare(right.name));
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=FlowCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowCatalog.js","sourceRoot":"","sources":["../src/FlowCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
declare const FlowLaunchError_base: Schema.Class<FlowLaunchError, Schema.TaggedStruct<"FlowLaunch", {
|
|
4
|
+
readonly message: Schema.String;
|
|
5
|
+
}>, import("effect/Cause").YieldableError>;
|
|
6
|
+
export declare class FlowLaunchError extends FlowLaunchError_base {
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* True when the flow script cannot resolve `@llm4ts/runner` from its own
|
|
10
|
+
* location — a global flow, a built-in copy, or a bare repository. Project
|
|
11
|
+
* flows inside a repository that installs `@llm4ts/*` resolve their own pin
|
|
12
|
+
* and need no help (the project-wins policy of ADR 0006). Implemented as the
|
|
13
|
+
* same `node_modules` directory walk ESM resolution performs, so the check
|
|
14
|
+
* stays honest under test runners that patch the module system.
|
|
15
|
+
*/
|
|
16
|
+
export declare const needsResolveFallback: (flowPath: string) => boolean;
|
|
17
|
+
export interface LaunchFlowOptions {
|
|
18
|
+
readonly flowPath: string;
|
|
19
|
+
readonly taskArgs: ReadonlyArray<string>;
|
|
20
|
+
readonly environment?: Readonly<Record<string, string | undefined>>;
|
|
21
|
+
readonly cwd?: string;
|
|
22
|
+
/** Overrides `LLM4TS_CODER` in the child for this run only. */
|
|
23
|
+
readonly coder?: string;
|
|
24
|
+
/** `inherit` shares the terminal (the default); tests use `ignore`. */
|
|
25
|
+
readonly stdio?: "inherit" | "ignore";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Runs a flow script as a child `node` process with type stripping, the
|
|
29
|
+
* terminal inherited, and the task text appended to argv. While the child
|
|
30
|
+
* runs, SIGINT is ignored in the parent so Ctrl-C reaches the whole
|
|
31
|
+
* foreground process group and the shell survives to resume. Resolves with
|
|
32
|
+
* the child's exit code (`128 + signal` when terminated by a signal).
|
|
33
|
+
*/
|
|
34
|
+
export declare const launchFlow: (options: LaunchFlowOptions) => Effect.Effect<number, FlowLaunchError>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=FlowLaunch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowLaunch.d.ts","sourceRoot":"","sources":["../src/FlowLaunch.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;;;;AAEvC,qBAAa,eAAgB,SAAQ,oBAEnC;CAAG;AAEL;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAAI,UAAU,MAAM,KAAG,OAYvD,CAAA;AAYD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IACnE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;CACtC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,iBAAiB,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAoCzF,CAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { constants } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Schema from "effect/Schema";
|
|
8
|
+
export class FlowLaunchError extends Schema.TaggedErrorClass()("FlowLaunch", {
|
|
9
|
+
message: Schema.String
|
|
10
|
+
}) {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* True when the flow script cannot resolve `@llm4ts/runner` from its own
|
|
14
|
+
* location — a global flow, a built-in copy, or a bare repository. Project
|
|
15
|
+
* flows inside a repository that installs `@llm4ts/*` resolve their own pin
|
|
16
|
+
* and need no help (the project-wins policy of ADR 0006). Implemented as the
|
|
17
|
+
* same `node_modules` directory walk ESM resolution performs, so the check
|
|
18
|
+
* stays honest under test runners that patch the module system.
|
|
19
|
+
*/
|
|
20
|
+
export const needsResolveFallback = (flowPath) => {
|
|
21
|
+
let directory = dirname(resolve(flowPath));
|
|
22
|
+
while (true) {
|
|
23
|
+
if (existsSync(join(directory, "node_modules", "@llm4ts", "runner", "package.json"))) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const parent = dirname(directory);
|
|
27
|
+
if (parent === directory) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
directory = parent;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
// In the published package the hook is the compiled sibling; when running
|
|
34
|
+
// from src (tests), it is the TypeScript source, which the child can load
|
|
35
|
+
// because it always runs with type stripping enabled.
|
|
36
|
+
const resolveFallbackUrl = (() => {
|
|
37
|
+
const compiled = new URL("./ResolveFallback.js", import.meta.url);
|
|
38
|
+
return existsSync(fileURLToPath(compiled))
|
|
39
|
+
? compiled.href
|
|
40
|
+
: new URL("./ResolveFallback.ts", import.meta.url).href;
|
|
41
|
+
})();
|
|
42
|
+
/**
|
|
43
|
+
* Runs a flow script as a child `node` process with type stripping, the
|
|
44
|
+
* terminal inherited, and the task text appended to argv. While the child
|
|
45
|
+
* runs, SIGINT is ignored in the parent so Ctrl-C reaches the whole
|
|
46
|
+
* foreground process group and the shell survives to resume. Resolves with
|
|
47
|
+
* the child's exit code (`128 + signal` when terminated by a signal).
|
|
48
|
+
*/
|
|
49
|
+
export const launchFlow = (options) => Effect.callback((resume) => {
|
|
50
|
+
const environment = { ...(options.environment ?? process.env) };
|
|
51
|
+
if (options.coder !== undefined) {
|
|
52
|
+
environment.LLM4TS_CODER = options.coder;
|
|
53
|
+
}
|
|
54
|
+
const nodeArgs = ["--experimental-strip-types"];
|
|
55
|
+
if (needsResolveFallback(options.flowPath)) {
|
|
56
|
+
nodeArgs.push("--import", resolveFallbackUrl);
|
|
57
|
+
}
|
|
58
|
+
const child = spawn(process.execPath, [...nodeArgs, options.flowPath, ...options.taskArgs], {
|
|
59
|
+
stdio: options.stdio ?? "inherit",
|
|
60
|
+
env: environment,
|
|
61
|
+
...(options.cwd === undefined ? {} : { cwd: options.cwd })
|
|
62
|
+
});
|
|
63
|
+
const ignoreSigint = () => { };
|
|
64
|
+
process.on("SIGINT", ignoreSigint);
|
|
65
|
+
const restoreSigint = () => {
|
|
66
|
+
process.removeListener("SIGINT", ignoreSigint);
|
|
67
|
+
};
|
|
68
|
+
child.on("error", (error) => {
|
|
69
|
+
restoreSigint();
|
|
70
|
+
resume(Effect.fail(new FlowLaunchError({ message: error.message })));
|
|
71
|
+
});
|
|
72
|
+
child.on("exit", (code, signal) => {
|
|
73
|
+
restoreSigint();
|
|
74
|
+
if (signal !== null) {
|
|
75
|
+
resume(Effect.succeed(128 + (constants.signals[signal] ?? 15)));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
resume(Effect.succeed(code ?? 1));
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return Effect.sync(() => {
|
|
82
|
+
restoreSigint();
|
|
83
|
+
child.kill("SIGINT");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=FlowLaunch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowLaunch.js","sourceRoot":"","sources":["../src/FlowLaunch.ts"],"names":[],"mappings":"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"}
|
package/dist/Menu.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Prompt from "effect/unstable/cli/Prompt";
|
|
3
|
+
import { type FlowTierPaths } from "./FlowCatalog.ts";
|
|
4
|
+
/**
|
|
5
|
+
* The interactive main menu: run a flow, view a flow, exit. Ctrl-C inside a
|
|
6
|
+
* prompt quits the menu cleanly rather than crashing the shell.
|
|
7
|
+
*/
|
|
8
|
+
export declare const mainMenu: (tiers: FlowTierPaths) => Effect.Effect<void, import("./FlowLaunch.ts").FlowLaunchError, Prompt.Environment>;
|
|
9
|
+
//# sourceMappingURL=Menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../src/Menu.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAA;AAEpD,OAAO,EAAsC,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAuFzF;;;GAGG;AACH,eAAO,MAAM,QAAQ,8GA0BnB,CAAA"}
|