@executioncontrolprotocol/cli 0.3.0 → 0.4.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.
Files changed (55) hide show
  1. package/README.md +22 -0
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +8 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +8 -0
  6. package/dist/commands/graph.d.ts +13 -0
  7. package/dist/commands/graph.d.ts.map +1 -0
  8. package/dist/commands/graph.js +36 -0
  9. package/dist/commands/graph.js.map +1 -0
  10. package/dist/commands/run.d.ts +24 -0
  11. package/dist/commands/run.d.ts.map +1 -0
  12. package/dist/commands/run.js +349 -0
  13. package/dist/commands/run.js.map +1 -0
  14. package/dist/commands/trace/list.d.ts +9 -0
  15. package/dist/commands/trace/list.d.ts.map +1 -0
  16. package/dist/commands/trace/list.js +32 -0
  17. package/dist/commands/trace/list.js.map +1 -0
  18. package/dist/commands/trace.d.ts +13 -0
  19. package/dist/commands/trace.d.ts.map +1 -0
  20. package/dist/commands/trace.js +40 -0
  21. package/dist/commands/trace.js.map +1 -0
  22. package/dist/commands/validate.d.ts +13 -0
  23. package/dist/commands/validate.d.ts.map +1 -0
  24. package/dist/commands/validate.js +89 -0
  25. package/dist/commands/validate.js.map +1 -0
  26. package/dist/lib/ecp-home.d.ts +3 -0
  27. package/dist/lib/ecp-home.d.ts.map +1 -0
  28. package/dist/lib/ecp-home.js +9 -0
  29. package/dist/lib/ecp-home.js.map +1 -0
  30. package/dist/lib/inputs.d.ts +3 -0
  31. package/dist/lib/inputs.d.ts.map +1 -0
  32. package/dist/lib/inputs.js +7 -0
  33. package/dist/lib/inputs.js.map +1 -0
  34. package/dist/lib/parsing.d.ts +12 -0
  35. package/dist/lib/parsing.d.ts.map +1 -0
  36. package/dist/lib/parsing.js +57 -0
  37. package/dist/lib/parsing.js.map +1 -0
  38. package/dist/lib/progress.d.ts +4 -0
  39. package/dist/lib/progress.d.ts.map +1 -0
  40. package/dist/lib/progress.js +111 -0
  41. package/dist/lib/progress.js.map +1 -0
  42. package/dist/lib/trace-files.d.ts +2 -0
  43. package/dist/lib/trace-files.d.ts.map +1 -0
  44. package/dist/lib/trace-files.js +14 -0
  45. package/dist/lib/trace-files.js.map +1 -0
  46. package/dist/lib/trace-view.d.ts +4 -0
  47. package/dist/lib/trace-view.d.ts.map +1 -0
  48. package/dist/lib/trace-view.js +8 -0
  49. package/dist/lib/trace-view.js.map +1 -0
  50. package/package.json +37 -7
  51. package/bin/ecp.cjs +0 -21
  52. package/dist/index.d.ts +0 -13
  53. package/dist/index.d.ts.map +0 -1
  54. package/dist/index.js +0 -471
  55. package/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAqCnD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,MAAM,CAAC,OAAO,SAAiC;IAE/C,MAAM,CAAC,KAAK;;;MAYV;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8C3B"}
@@ -0,0 +1,89 @@
1
+ import { Command, Flags, Args } from "@oclif/core";
2
+ import { resolve } from "node:path";
3
+ import { loadContext, resolveInputs } from "@executioncontrolprotocol/runtime";
4
+ import { parseKeyValueInputs } from "../lib/parsing.js";
5
+ import { getRequiredInputNames } from "../lib/inputs.js";
6
+ function collectExecutionObjectNames(context) {
7
+ const names = new Set();
8
+ const addName = (name) => {
9
+ names.add(name);
10
+ };
11
+ const visitOrchestrator = (orchestrator) => {
12
+ addName(orchestrator.name);
13
+ for (const executor of orchestrator.executors ?? []) {
14
+ addName(executor.name);
15
+ }
16
+ for (const child of orchestrator.orchestrators ?? []) {
17
+ visitOrchestrator(child);
18
+ }
19
+ };
20
+ if (context.orchestrator) {
21
+ visitOrchestrator(context.orchestrator);
22
+ }
23
+ for (const executor of context.executors ?? []) {
24
+ addName(executor.name);
25
+ }
26
+ return [...names];
27
+ }
28
+ export default class Validate extends Command {
29
+ static summary = "Validate a Context manifest";
30
+ static flags = {
31
+ input: Flags.string({
32
+ char: "i",
33
+ multiple: true,
34
+ description: "Set an input value (repeatable, key=value)",
35
+ summary: "Input value (key=value)",
36
+ }),
37
+ "skip-inputs": Flags.boolean({
38
+ description: "Validate the Context manifest itself but skip runtime input resolution (prints required inputs instead).",
39
+ default: false,
40
+ }),
41
+ };
42
+ static args = {
43
+ contextPath: Args.string({
44
+ required: true,
45
+ description: "Path to context.yaml (or context.json)",
46
+ }),
47
+ };
48
+ async run() {
49
+ const { args, flags } = await this.parse(Validate);
50
+ const contextPath = resolve(args.contextPath);
51
+ console.log(`\nValidating: ${contextPath}\n`);
52
+ let context;
53
+ try {
54
+ const inputs = parseKeyValueInputs(flags.input, "--input");
55
+ context = loadContext(contextPath);
56
+ if (!flags["skip-inputs"]) {
57
+ resolveInputs(context, inputs);
58
+ }
59
+ const strategy = context.orchestration?.strategy ?? context.orchestrator?.strategy;
60
+ const executionObjectNames = collectExecutionObjectNames(context);
61
+ console.log(` Context: ${context.metadata.name} v${context.metadata.version}`);
62
+ console.log(` Strategy: ${strategy ?? "unknown"}`);
63
+ console.log(` Execution objects: ${executionObjectNames.join(", ")}`);
64
+ console.log(` Schemas: ${Object.keys(context.schemas ?? {}).join(", ")}`);
65
+ if (flags["skip-inputs"]) {
66
+ const requiredInputs = getRequiredInputNames(context);
67
+ if (requiredInputs.length > 0) {
68
+ console.log(`\n Required inputs (from Context): ${requiredInputs.join(", ")}`);
69
+ }
70
+ else {
71
+ console.log(`\n No required inputs declared in Context.`);
72
+ }
73
+ }
74
+ console.log(`\n Validation passed.\n`);
75
+ }
76
+ catch (err) {
77
+ const msg = err instanceof Error ? err.message : String(err);
78
+ const missing = msg.match(/^Missing required input: "([^"]+)"$/);
79
+ if (missing && context) {
80
+ const inputName = missing[1];
81
+ this.error(`\n Missing required input "${inputName}" is defined in the Context.\n` +
82
+ ` Provide it via --input ${inputName}=<value> (e.g. -i ${inputName}="...").\n`, { exit: 1 });
83
+ return;
84
+ }
85
+ this.error(`\n Validation failed: ${msg}\n`, { exit: 1 });
86
+ }
87
+ }
88
+ }
89
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function getEcpHomeDir(): string;
2
+ export declare function getDefaultTraceDir(): string;
3
+ //# sourceMappingURL=ecp-home.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecp-home.d.ts","sourceRoot":"","sources":["../../src/lib/ecp-home.ts"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -0,0 +1,9 @@
1
+ import { homedir } from "node:os";
2
+ import { resolve } from "node:path";
3
+ export function getEcpHomeDir() {
4
+ return resolve(homedir(), ".ecp");
5
+ }
6
+ export function getDefaultTraceDir() {
7
+ return resolve(getEcpHomeDir(), "traces");
8
+ }
9
+ //# sourceMappingURL=ecp-home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecp-home.js","sourceRoot":"","sources":["../../src/lib/ecp-home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ECPContext } from "@executioncontrolprotocol/spec";
2
+ export declare function getRequiredInputNames(context: ECPContext): string[];
3
+ //# sourceMappingURL=inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/lib/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,CAKnE"}
@@ -0,0 +1,7 @@
1
+ export function getRequiredInputNames(context) {
2
+ const defs = context.inputs ?? {};
3
+ return Object.entries(defs)
4
+ .filter(([_name, def]) => def.required === true)
5
+ .map(([name]) => name);
6
+ }
7
+ //# sourceMappingURL=inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/lib/inputs.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,OAAmB;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAE,GAA8B,CAAC,QAAQ,KAAK,IAAI,CAAC;SAC3E,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type InputValue = string | number | boolean;
2
+ /**
3
+ * Parse `--input key=value` occurrences.
4
+ * - `true`/`false` become booleans
5
+ * - numeric-looking values become numbers
6
+ * - everything else stays a string
7
+ */
8
+ export declare function parseKeyValueInputs(raw: string[] | undefined, flagName?: string): Record<string, InputValue>;
9
+ export declare function splitCommaSeparated(raw: string[] | undefined): string[];
10
+ export declare function parseJsonObject<T = unknown>(raw: string | undefined, flagName: string): T | undefined;
11
+ export declare function resolveAndValidatePath(pathRaw: string, flagName: string): string;
12
+ //# sourceMappingURL=parsing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../../src/lib/parsing.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,EACzB,QAAQ,SAAY,GACnB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAoB5B;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAMvE;AAED,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAQrG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMhF"}
@@ -0,0 +1,57 @@
1
+ import { existsSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ /**
4
+ * Parse `--input key=value` occurrences.
5
+ * - `true`/`false` become booleans
6
+ * - numeric-looking values become numbers
7
+ * - everything else stays a string
8
+ */
9
+ export function parseKeyValueInputs(raw, flagName = "--input") {
10
+ const inputs = {};
11
+ for (const kv of raw ?? []) {
12
+ const eqIdx = kv.indexOf("=");
13
+ if (eqIdx === -1) {
14
+ throw new Error(`Invalid ${flagName} value "${kv}" (expected key=value).`);
15
+ }
16
+ const key = kv.slice(0, eqIdx).trim();
17
+ const valueRaw = kv.slice(eqIdx + 1);
18
+ if (!key) {
19
+ throw new Error(`Invalid ${flagName} value "${kv}" (missing key).`);
20
+ }
21
+ if (valueRaw === "true")
22
+ inputs[key] = true;
23
+ else if (valueRaw === "false")
24
+ inputs[key] = false;
25
+ else if (!isNaN(Number(valueRaw)) && valueRaw !== "")
26
+ inputs[key] = Number(valueRaw);
27
+ else
28
+ inputs[key] = valueRaw;
29
+ }
30
+ return inputs;
31
+ }
32
+ export function splitCommaSeparated(raw) {
33
+ const out = [];
34
+ for (const v of raw ?? []) {
35
+ out.push(...v.split(",").map((s) => s.trim()).filter(Boolean));
36
+ }
37
+ return out;
38
+ }
39
+ export function parseJsonObject(raw, flagName) {
40
+ if (!raw)
41
+ return undefined;
42
+ try {
43
+ return JSON.parse(raw);
44
+ }
45
+ catch (err) {
46
+ const msg = err instanceof Error ? err.message : String(err);
47
+ throw new Error(`Invalid ${flagName}: ${msg}`);
48
+ }
49
+ }
50
+ export function resolveAndValidatePath(pathRaw, flagName) {
51
+ const p = resolve(pathRaw);
52
+ if (!existsSync(p)) {
53
+ throw new Error(`Invalid ${flagName}: file not found at ${p}`);
54
+ }
55
+ return p;
56
+ }
57
+ //# sourceMappingURL=parsing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsing.js","sourceRoot":"","sources":["../../src/lib/parsing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAyB,EACzB,QAAQ,GAAG,SAAS;IAEpB,MAAM,MAAM,GAA+B,EAAE,CAAC;IAC9C,KAAK,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,WAAW,EAAE,yBAAyB,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,QAAQ,KAAK,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;aACvC,IAAI,QAAQ,KAAK,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,KAAK,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;;YAChF,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAyB;IAC3D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAc,GAAuB,EAAE,QAAgB;IACpF,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,QAAgB;IACtE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,4 @@
1
+ import ora from "ora";
2
+ import type { ProgressCallback } from "@executioncontrolprotocol/runtime";
3
+ export declare function createProgressHandler(spinner: ReturnType<typeof ora>, contextPath: string, contextName: string): ProgressCallback;
4
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAA0B,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAkBlG,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,CAAC,OAAO,GAAG,CAAC,EAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,gBAAgB,CA4GlB"}
@@ -0,0 +1,111 @@
1
+ function phaseToLabel(status) {
2
+ const labels = {
3
+ loading: "Loading context...",
4
+ "hydrating-seed": "Hydrating seed mounts...",
5
+ "running-orchestrator": "Running orchestrator...",
6
+ delegating: "Delegating tasks...",
7
+ "hydrating-focus": "Hydrating focus mounts...",
8
+ "hydrating-deep": "Hydrating deep mounts...",
9
+ "running-specialist": "Running specialist...",
10
+ merging: "Merging outputs...",
11
+ completed: "Completed.",
12
+ failed: "Failed.",
13
+ };
14
+ return labels[status] ?? status;
15
+ }
16
+ export function createProgressHandler(spinner, contextPath, contextName) {
17
+ let currentText = "Starting...";
18
+ const completedSteps = [];
19
+ function redraw() {
20
+ const isTTY = process.stderr.isTTY;
21
+ if (isTTY) {
22
+ process.stderr.write("\x1b[2J\x1b[H");
23
+ }
24
+ process.stderr.write(`\n Running: ${contextPath}\n`);
25
+ process.stderr.write(` Context: ${contextName}\n\n`);
26
+ for (const s of completedSteps) {
27
+ process.stderr.write(` Step ${s.step}: ${s.description} (${s.durationMs}ms)\n`);
28
+ if (s.model) {
29
+ process.stderr.write(` Model: ${s.model}\n`);
30
+ }
31
+ if (s.tokens && s.tokens.total > 0) {
32
+ process.stderr.write(` Tokens: ${s.tokens.prompt} prompt + ${s.tokens.completion} completion = ${s.tokens.total} total\n`);
33
+ }
34
+ if (s.output !== undefined) {
35
+ process.stderr.write(` Output:\n`);
36
+ const json = JSON.stringify(s.output, null, 2);
37
+ for (const line of json.split(/\r?\n/)) {
38
+ process.stderr.write(` ${line}\n`);
39
+ }
40
+ }
41
+ process.stderr.write("\n");
42
+ }
43
+ spinner.start(currentText);
44
+ }
45
+ function appendLastStep() {
46
+ const s = completedSteps[completedSteps.length - 1];
47
+ if (!s)
48
+ return;
49
+ spinner.stopAndPersist({
50
+ text: `Step ${s.step}: ${s.description} (${s.durationMs}ms)`,
51
+ });
52
+ process.stderr.write(` Model: ${s.model ?? "n/a"}\n`);
53
+ if (s.tokens && s.tokens.total > 0) {
54
+ process.stderr.write(` Tokens: ${s.tokens.prompt} prompt + ${s.tokens.completion} completion = ${s.tokens.total} total\n`);
55
+ }
56
+ if (s.output !== undefined) {
57
+ process.stderr.write(` Output:\n`);
58
+ const json = JSON.stringify(s.output, null, 2);
59
+ for (const line of json.split(/\r?\n/)) {
60
+ process.stderr.write(` ${line}\n`);
61
+ }
62
+ }
63
+ process.stderr.write("\n");
64
+ spinner.start(currentText);
65
+ }
66
+ return async (event) => {
67
+ switch (event.type) {
68
+ case "phase":
69
+ currentText = phaseToLabel(event.status);
70
+ spinner.text = currentText;
71
+ break;
72
+ case "step_start":
73
+ currentText = event.description;
74
+ spinner.text = currentText;
75
+ break;
76
+ case "step_complete":
77
+ if (event.kind === "executor") {
78
+ completedSteps.push({
79
+ step: event.step,
80
+ executorName: event.executorName ?? "",
81
+ description: event.description,
82
+ durationMs: event.durationMs,
83
+ tokens: event.tokens,
84
+ model: event.model,
85
+ output: event.output,
86
+ });
87
+ spinner.stop();
88
+ if (process.stderr.isTTY) {
89
+ redraw();
90
+ }
91
+ else {
92
+ appendLastStep();
93
+ }
94
+ }
95
+ break;
96
+ case "executor_reasoning":
97
+ spinner.stop();
98
+ {
99
+ const lines = event.reasoning.split(/\r?\n/);
100
+ process.stderr.write(`\n [${event.executorName}] Chain of thought:\n`);
101
+ for (const line of lines) {
102
+ process.stderr.write(` ${line}\n`);
103
+ }
104
+ process.stderr.write("\n");
105
+ }
106
+ spinner.start(currentText);
107
+ break;
108
+ }
109
+ };
110
+ }
111
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function listTraceIds(traceDirRaw: string): Promise<string[]>;
2
+ //# sourceMappingURL=trace-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-files.d.ts","sourceRoot":"","sources":["../../src/lib/trace-files.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUzE"}
@@ -0,0 +1,14 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ export async function listTraceIds(traceDirRaw) {
5
+ const traceDir = resolve(traceDirRaw);
6
+ if (!existsSync(traceDir))
7
+ return [];
8
+ const entries = await readdir(traceDir, { withFileTypes: true });
9
+ const ids = entries
10
+ .filter((e) => e.isFile() && e.name.endsWith(".json"))
11
+ .map((e) => e.name.slice(0, -".json".length));
12
+ return ids.sort();
13
+ }
14
+ //# sourceMappingURL=trace-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-files.js","sourceRoot":"","sources":["../../src/lib/trace-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,OAAO;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACrD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ExecutionTrace } from "@executioncontrolprotocol/runtime";
2
+ export type TraceOutputFormat = "text" | "graph";
3
+ export declare function renderTraceView(trace: ExecutionTrace, output: TraceOutputFormat): Promise<string>;
4
+ //# sourceMappingURL=trace-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-view.d.ts","sourceRoot":"","sources":["../../src/lib/trace-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,wBAAsB,eAAe,CACnC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
@@ -0,0 +1,8 @@
1
+ export async function renderTraceView(trace, output) {
2
+ const runtime = await import("@executioncontrolprotocol/runtime");
3
+ if (output === "graph") {
4
+ return runtime.renderGraph(trace);
5
+ }
6
+ return runtime.formatTrace(trace);
7
+ }
8
+ //# sourceMappingURL=trace-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-view.js","sourceRoot":"","sources":["../../src/lib/trace-view.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAqB,EACrB,MAAyB;IAEzB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;IAClE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC"}
package/package.json CHANGED
@@ -1,28 +1,58 @@
1
1
  {
2
2
  "name": "@executioncontrolprotocol/cli",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "CLI for the ECP runtime engine — run Context manifests from the command line",
5
+ "license": "Apache-2.0",
6
+ "homepage": "https://github.com/executioncontrolprotocol/executioncontrolprotocol",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/executioncontrolprotocol/executioncontrolprotocol.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/executioncontrolprotocol/executioncontrolprotocol/issues"
14
+ },
15
+ "keywords": [
16
+ "ecp",
17
+ "execution-control-protocol",
18
+ "mcp",
19
+ "model-context-protocol",
20
+ "agents",
21
+ "cli"
22
+ ],
5
23
  "private": false,
6
24
  "type": "module",
7
25
  "bin": {
8
- "ecp": "./bin/ecp.cjs"
26
+ "ecp": "./bin/run.js"
9
27
  },
10
28
  "files": [
11
- "bin/ecp.cjs",
12
- "dist"
29
+ "bin/run.js",
30
+ "bin/run.cmd",
31
+ "bin/dev.js",
32
+ "bin/dev.cmd",
33
+ "dist",
34
+ "README.md"
13
35
  ],
14
36
  "scripts": {
15
37
  "build": "tsc -b",
16
- "start": "tsx src/index.ts"
38
+ "start": "node ./bin/dev.js"
17
39
  },
18
40
  "dependencies": {
19
- "@executioncontrolprotocol/runtime": "^0.3.0",
41
+ "@executioncontrolprotocol/runtime": "^0.4.0",
42
+ "@oclif/core": "^4.10.0",
20
43
  "ora": "^8.1.1"
21
44
  },
22
45
  "devDependencies": {
23
- "@executioncontrolprotocol/spec": "^0.3.0",
46
+ "@executioncontrolprotocol/spec": "^0.4.0",
24
47
  "@types/node": "^25.3.3",
48
+ "ts-node": "^10.9.2",
25
49
  "tsx": "^4.0.0",
26
50
  "typescript": "^5.7.0"
51
+ },
52
+ "oclif": {
53
+ "bin": "ecp",
54
+ "commands": "./dist/commands",
55
+ "dirname": "ecp",
56
+ "topicSeparator": " "
27
57
  }
28
58
  }
package/bin/ecp.cjs DELETED
@@ -1,21 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Launcher so Windows npm bin shims always invoke Node (never open .ts in an editor).
4
- */
5
- const { spawnSync } = require("node:child_process");
6
- const path = require("node:path");
7
- const fs = require("node:fs");
8
-
9
- const entry = path.join(__dirname, "..", "dist", "index.js");
10
- if (!fs.existsSync(entry)) {
11
- console.error(
12
- "ecp: dist/index.js not found. Run from repo root: npm run build",
13
- );
14
- process.exit(1);
15
- }
16
-
17
- const r = spawnSync(process.execPath, [entry, ...process.argv.slice(2)], {
18
- stdio: "inherit",
19
- env: process.env,
20
- });
21
- process.exit(r.status === null ? 1 : r.status);
package/dist/index.d.ts DELETED
@@ -1,13 +0,0 @@
1
- /**
2
- * ECP CLI — run Context manifests from the command line.
3
- *
4
- * Usage:
5
- * ecp run <context.yaml> [--input key=value ...] [--debug] [--model <model>] [--trace]
6
- * ecp validate <context.yaml>
7
- * ecp trace <run_id>
8
- * ecp graph <run_id>
9
- *
10
- * @category CLI
11
- */
12
- export {};
13
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}