Releases: eigenpal/cli
@eigenpal/cli@0.4.6
Major Changes
-
fadb59b: CLI command tree reorganized around the data model. Top-level surface is now
workflow,agent(reserved), andskill; everything that operates on a
workflow lives underworkflow, grouped by sub-entity.Renames (clean break — no aliases):
eigenpal exec <slug>→eigenpal workflow execution run <slug>eigenpal clear→eigenpal workflow cleareigenpal install-skill→eigenpal skill(same interactive multiselect UX)eigenpal execution {get,list,watch,compare}→eigenpal workflow execution {…}eigenpal workflow set-definition→eigenpal workflow pusheigenpal workflow get-definition→eigenpal workflow pulleigenpal workflow set-evaluators/get-evaluators→workflow evaluators {push,pull}eigenpal workflow set-dataset/get-dataset/list-examples→workflow dataset {push,pull,list}eigenpal workflow run-experiment/get-experiment-status/get-experiment-results/
get-eval-results/list-executions→workflow experiment {run,status,results,eval-results,list}eigenpal workflow list-versions/restore-version→workflow version {list,restore}eigenpal workflow list-step-types/get-step-type→workflow step-type {list,get}eigenpal workflow get-execution→workflow execution geteigenpal workflow get-active-tenant→workflow active-tenant
Removed:
eigenpal generate-meta— deleted. The IDs it generated were never read by
any other CLI command; the server re-mints IDs on every push.
Added:
eigenpal agent— reserved placeholder namespace. Prints a "Coming soon"
message; agentic-process operations will land here in a future release.
Minor Changes
-
c82a215:
eigenpal auth loginnow shows an interactive server picker when no--base-urlflag orEIGENPAL_BASE_URLenv is set:- Cloud (
https://studio.eigenpal.com) is the default highlighted option. - Any on-prem URLs already in your credentials file are surfaced as separate options labelled with the profile names that use them — re-login against an existing on-prem deployment without retyping the URL.
- Custom URL… prompts for a URL with strict validation.
URL handling is now bulletproof in all three input paths (flag, env, picker):
- Trims leading/trailing whitespace, strips trailing slashes.
- Auto-prepends
https://when you paste a bare hostname (e.g.eigenpal.example.com→https://eigenpal.example.com). - Rejects non-http(s) schemes (
file://,ws://, etc.) with a clear error. - Rejects URLs with paths, query strings, or hash fragments — baseUrl is an origin, not a route.
- Warns when authenticating over
http://against a non-loopback host (credentials sent unencrypted).
Behavior with
--base-urlorEIGENPAL_BASE_URLset is unchanged — explicit overrides skip the picker, and an active profile's stored baseUrl is still inherited by all non-login commands. - Cloud (
-
c330c2a: CLI: bug fixes + new tooling.
success()/info()/dim()now write to stderr, not stdout.cmd | jqno longer mixes status lines with JSON output. (error()andwarn()already correctly used stderr.)workflow execution watch <bad-id>no longer treats 404 as a transient network blip; the loop exits immediately so the caller sees the structuredExecution not founderror and a non-zero exit instead of polling for 30 minutes.eigenpal statusexits non-zero when authentication fails, so scripts caneigenpal status && deploy.- New
eigenpal completion <bash|zsh|fish>command — emits a shell-completion script for the live command tree. Install viaeigenpal completion bash > /usr/local/etc/bash_completion.d/eigenpal(or your shell's equivalent). - New global
--quiet/-qflag — suppressessuccess()/info()/dim()lines while keepingerror()andwarn()(and JSON output) intact. - New
addJsonFlagMutation()helper alongsideaddJsonFlag(). Mutating commands that don't have a curated table view now use it so--verboseno longer appears in--helpwhere it's a no-op. (Wire-up in mutating handlers happens in a follow-up commit on this branch.)
-
b2c4308: CLI: per-example dataset CRUD.
Three new subcommands under
workflow datasetmean you no longer have to re-zip and re-push the whole folder when you only want to flip one row:workflow dataset create-example <wfId> --name <n> [--input-json | --input-file] [--expected-json | --expected-file] [--annotation]— add one example.workflow dataset update-example <wfId> <exampleId> [--name] [--input-*] [--expected-*] [--annotation] [--row-order]— partial PATCH; flags you omit are left alone,--annotation ""clears.workflow dataset delete-example <wfId> <exampleId> [--yes]—--yesrequired for non-TTY shells.
--input-file/--expected-fileaccept a path or-for stdin. Inline--*-jsonand the-filevariant are mutually exclusive.Server: the
POST /api/workflows/:id/eval-examplescreate schema now accepts thenameandannotationfields the dashboard already exposed via the dashboard's PATCH path. No new endpoints — the v1 mirrors at/api/v1/eval-examples/[id]and/api/v1/workflows/[id]/eval-exampleswere already in place.Skill recipes restored:
SKILL.mdandreference/dataset-format.mddocument the three flows (capture corrected output as new GT, add one example, delete one bad row). -
d41ee8b: CLI: drop the
--waitflag fromworkflow execution run. The local-folder runner already waits for every example to reach a terminal state, so the flag was a documented no-op kept "for symmetry withexperiment run --wait." That symmetry isn't worth a dead flag in the user-facing help screen —experiment run --waitis meaningful (it polls batch status),execution run --waitnever was.Behavior is unchanged. Scripts that passed
--waitwill now see an unknown-option error from Commander; remove the flag. -
d41ee8b: CLI: drop
--jqand--output-pathfromworkflow execution get. Pipe--jsonthrough realjqinstead.Rationale: our
--jqwas dotted-path only (drillJsonPath), not real jq syntax. Calling it--jqwas misleading —gh --jq '.foo[] | select(.bar)'works; ours never could. Realjqis universally installed on dev machines and supports the full filter language.Migration:
Before After eigenpal workflow execution get exec_… --jq 'output.data'eigenpal workflow execution get exec_… --json | jq '.output.data'eigenpal workflow execution get exec_… --output-path 'stepExecutions.0.error'eigenpal workflow execution get exec_… --json | jq -r '.stepExecutions[0].error'Updated SKILL.md and reference docs to use the canonical
--json | jqpattern. -
c330c2a: CLI: small DX bundle + 5 audit follow-up fixes.
eigenpal status(and every other CLI call) now detects HTML-on-the-wire and throws a structuredHtmlResponseError("API not reachable at — got HTML response (likely wrong base URL or API not running)") instead of dumping the 100 KB Next.js 404 body.workflow push --bump <patch|minor|major>reads the server's current version and computes the next semver, splicing it into the YAML before sending. Pair with--workflow-id. Conflicts with a top-levelversion:in the YAML are rejected.workflow push --set-version <X.Y.Z>for explicit overrides. (Named--set-versionto avoid the global-v, --versionflag.)workflow evaluator-type {list, get}— parallel namespace tostep-typefor evaluator schemas (exact-diff,llm-judge,custom-script). Returns JSON Schema instead of 404.eigenpal init [name]now works with no name — scaffolds into the current directory using the cwd basename as the workflow slug. Pair witheigenpal workflow execution run <slug>in the same dir;execution rundiscovers both flat (./workflow.yaml+./dataset/examples/<name>/) and nested (./eigenpal/workflows/<slug>/...) layouts.format-errornow appendsRun \eigenpal auth login` or set EIGENPAL_API_KEY.to every 401, and includes the URL we tried +EIGENPAL_BASE_URL/--base-url` hint on connection failures.execution get --jq <jsonpath>is the new canonical name for what was--output-path.--output-pathkeeps working as a hidden alias; help text shows--jqonly (matchesgh --jq/kubectl --jsonpath).workflow pushwithout--filein TTY now prompts for the path; non-TTY (CI) still errors with the existing "Missing --file" message.transform.scriptreference docs include a callout about TDZ on shadowed input names (const located = located || []triggersReferenceError).- Dropped the half-promise comment in
addJsonFlagabout future--fieldsprojection — the canonical answer isjqon the raw payload.
-
c330c2a: CLI: execution + auth polish.
workflow execution rungains--waitand--json. The local-folder
runner already polled every example to terminal, so--waitis currently a
no-op accepted for symmetry withexperiment run --wait.--jsonemits a
single{ workflowSlug, passed, failed, total }summary on stdout (human
progress lines + the "Results:" footer still go to stderr). Exits 1 when any
example fails, same as before.
...
@eigenpal/cli@0.4.5
Major Changes
-
fadb59b: CLI command tree reorganized around the data model. Top-level surface is now
workflow,agent(reserved), andskill; everything that operates on a
workflow lives underworkflow, grouped by sub-entity.Renames (clean break — no aliases):
eigenpal exec <slug>→eigenpal workflow execution run <slug>eigenpal clear→eigenpal workflow cleareigenpal install-skill→eigenpal skill(same interactive multiselect UX)eigenpal execution {get,list,watch,compare}→eigenpal workflow execution {…}eigenpal workflow set-definition→eigenpal workflow pusheigenpal workflow get-definition→eigenpal workflow pulleigenpal workflow set-evaluators/get-evaluators→workflow evaluators {push,pull}eigenpal workflow set-dataset/get-dataset/list-examples→workflow dataset {push,pull,list}eigenpal workflow run-experiment/get-experiment-status/get-experiment-results/
get-eval-results/list-executions→workflow experiment {run,status,results,eval-results,list}eigenpal workflow list-versions/restore-version→workflow version {list,restore}eigenpal workflow list-step-types/get-step-type→workflow step-type {list,get}eigenpal workflow get-execution→workflow execution geteigenpal workflow get-active-tenant→workflow active-tenant
Removed:
eigenpal generate-meta— deleted. The IDs it generated were never read by
any other CLI command; the server re-mints IDs on every push.
Added:
eigenpal agent— reserved placeholder namespace. Prints a "Coming soon"
message; agentic-process operations will land here in a future release.
Minor Changes
-
c82a215:
eigenpal auth loginnow shows an interactive server picker when no--base-urlflag orEIGENPAL_BASE_URLenv is set:- Cloud (
https://studio.eigenpal.com) is the default highlighted option. - Any on-prem URLs already in your credentials file are surfaced as separate options labelled with the profile names that use them — re-login against an existing on-prem deployment without retyping the URL.
- Custom URL… prompts for a URL with strict validation.
URL handling is now bulletproof in all three input paths (flag, env, picker):
- Trims leading/trailing whitespace, strips trailing slashes.
- Auto-prepends
https://when you paste a bare hostname (e.g.eigenpal.example.com→https://eigenpal.example.com). - Rejects non-http(s) schemes (
file://,ws://, etc.) with a clear error. - Rejects URLs with paths, query strings, or hash fragments — baseUrl is an origin, not a route.
- Warns when authenticating over
http://against a non-loopback host (credentials sent unencrypted).
Behavior with
--base-urlorEIGENPAL_BASE_URLset is unchanged — explicit overrides skip the picker, and an active profile's stored baseUrl is still inherited by all non-login commands. - Cloud (
-
c330c2a: CLI: bug fixes + new tooling.
success()/info()/dim()now write to stderr, not stdout.cmd | jqno longer mixes status lines with JSON output. (error()andwarn()already correctly used stderr.)workflow execution watch <bad-id>no longer treats 404 as a transient network blip; the loop exits immediately so the caller sees the structuredExecution not founderror and a non-zero exit instead of polling for 30 minutes.eigenpal statusexits non-zero when authentication fails, so scripts caneigenpal status && deploy.- New
eigenpal completion <bash|zsh|fish>command — emits a shell-completion script for the live command tree. Install viaeigenpal completion bash > /usr/local/etc/bash_completion.d/eigenpal(or your shell's equivalent). - New global
--quiet/-qflag — suppressessuccess()/info()/dim()lines while keepingerror()andwarn()(and JSON output) intact. - New
addJsonFlagMutation()helper alongsideaddJsonFlag(). Mutating commands that don't have a curated table view now use it so--verboseno longer appears in--helpwhere it's a no-op. (Wire-up in mutating handlers happens in a follow-up commit on this branch.)
-
b2c4308: CLI: per-example dataset CRUD.
Three new subcommands under
workflow datasetmean you no longer have to re-zip and re-push the whole folder when you only want to flip one row:workflow dataset create-example <wfId> --name <n> [--input-json | --input-file] [--expected-json | --expected-file] [--annotation]— add one example.workflow dataset update-example <wfId> <exampleId> [--name] [--input-*] [--expected-*] [--annotation] [--row-order]— partial PATCH; flags you omit are left alone,--annotation ""clears.workflow dataset delete-example <wfId> <exampleId> [--yes]—--yesrequired for non-TTY shells.
--input-file/--expected-fileaccept a path or-for stdin. Inline--*-jsonand the-filevariant are mutually exclusive.Server: the
POST /api/workflows/:id/eval-examplescreate schema now accepts thenameandannotationfields the dashboard already exposed via the dashboard's PATCH path. No new endpoints — the v1 mirrors at/api/v1/eval-examples/[id]and/api/v1/workflows/[id]/eval-exampleswere already in place.Skill recipes restored:
SKILL.mdandreference/dataset-format.mddocument the three flows (capture corrected output as new GT, add one example, delete one bad row). -
d41ee8b: CLI: drop the
--waitflag fromworkflow execution run. The local-folder runner already waits for every example to reach a terminal state, so the flag was a documented no-op kept "for symmetry withexperiment run --wait." That symmetry isn't worth a dead flag in the user-facing help screen —experiment run --waitis meaningful (it polls batch status),execution run --waitnever was.Behavior is unchanged. Scripts that passed
--waitwill now see an unknown-option error from Commander; remove the flag. -
d41ee8b: CLI: drop
--jqand--output-pathfromworkflow execution get. Pipe--jsonthrough realjqinstead.Rationale: our
--jqwas dotted-path only (drillJsonPath), not real jq syntax. Calling it--jqwas misleading —gh --jq '.foo[] | select(.bar)'works; ours never could. Realjqis universally installed on dev machines and supports the full filter language.Migration:
Before After eigenpal workflow execution get exec_… --jq 'output.data'eigenpal workflow execution get exec_… --json | jq '.output.data'eigenpal workflow execution get exec_… --output-path 'stepExecutions.0.error'eigenpal workflow execution get exec_… --json | jq -r '.stepExecutions[0].error'Updated SKILL.md and reference docs to use the canonical
--json | jqpattern. -
c330c2a: CLI: small DX bundle + 5 audit follow-up fixes.
eigenpal status(and every other CLI call) now detects HTML-on-the-wire and throws a structuredHtmlResponseError("API not reachable at — got HTML response (likely wrong base URL or API not running)") instead of dumping the 100 KB Next.js 404 body.workflow push --bump <patch|minor|major>reads the server's current version and computes the next semver, splicing it into the YAML before sending. Pair with--workflow-id. Conflicts with a top-levelversion:in the YAML are rejected.workflow push --set-version <X.Y.Z>for explicit overrides. (Named--set-versionto avoid the global-v, --versionflag.)workflow evaluator-type {list, get}— parallel namespace tostep-typefor evaluator schemas (exact-diff,llm-judge,custom-script). Returns JSON Schema instead of 404.eigenpal init [name]now works with no name — scaffolds into the current directory using the cwd basename as the workflow slug. Pair witheigenpal workflow execution run <slug>in the same dir;execution rundiscovers both flat (./workflow.yaml+./dataset/examples/<name>/) and nested (./eigenpal/workflows/<slug>/...) layouts.format-errornow appendsRun \eigenpal auth login` or set EIGENPAL_API_KEY.to every 401, and includes the URL we tried +EIGENPAL_BASE_URL/--base-url` hint on connection failures.execution get --jq <jsonpath>is the new canonical name for what was--output-path.--output-pathkeeps working as a hidden alias; help text shows--jqonly (matchesgh --jq/kubectl --jsonpath).workflow pushwithout--filein TTY now prompts for the path; non-TTY (CI) still errors with the existing "Missing --file" message.transform.scriptreference docs include a callout about TDZ on shadowed input names (const located = located || []triggersReferenceError).- Dropped the half-promise comment in
addJsonFlagabout future--fieldsprojection — the canonical answer isjqon the raw payload.
-
c330c2a: CLI: execution + auth polish.
workflow execution rungains--waitand--json. The local-folder
runner already polled every example to terminal, so--waitis currently a
no-op accepted for symmetry withexperiment run --wait.--jsonemits a
single{ workflowSlug, passed, failed, total }summary on stdout (human
progress lines + the "Results:" footer still go to stderr). Exits 1 when any
example fails, same as before.
...
@eigenpal/cli@0.4.4
Major Changes
-
fadb59b: CLI command tree reorganized around the data model. Top-level surface is now
workflow,agent(reserved), andskill; everything that operates on a
workflow lives underworkflow, grouped by sub-entity.Renames (clean break — no aliases):
eigenpal exec <slug>→eigenpal workflow execution run <slug>eigenpal clear→eigenpal workflow cleareigenpal install-skill→eigenpal skill(same interactive multiselect UX)eigenpal execution {get,list,watch,compare}→eigenpal workflow execution {…}eigenpal workflow set-definition→eigenpal workflow pusheigenpal workflow get-definition→eigenpal workflow pulleigenpal workflow set-evaluators/get-evaluators→workflow evaluators {push,pull}eigenpal workflow set-dataset/get-dataset/list-examples→workflow dataset {push,pull,list}eigenpal workflow run-experiment/get-experiment-status/get-experiment-results/
get-eval-results/list-executions→workflow experiment {run,status,results,eval-results,list}eigenpal workflow list-versions/restore-version→workflow version {list,restore}eigenpal workflow list-step-types/get-step-type→workflow step-type {list,get}eigenpal workflow get-execution→workflow execution geteigenpal workflow get-active-tenant→workflow active-tenant
Removed:
eigenpal generate-meta— deleted. The IDs it generated were never read by
any other CLI command; the server re-mints IDs on every push.
Added:
eigenpal agent— reserved placeholder namespace. Prints a "Coming soon"
message; agentic-process operations will land here in a future release.
Minor Changes
-
c82a215:
eigenpal auth loginnow shows an interactive server picker when no--base-urlflag orEIGENPAL_BASE_URLenv is set:- Cloud (
https://studio.eigenpal.com) is the default highlighted option. - Any on-prem URLs already in your credentials file are surfaced as separate options labelled with the profile names that use them — re-login against an existing on-prem deployment without retyping the URL.
- Custom URL… prompts for a URL with strict validation.
URL handling is now bulletproof in all three input paths (flag, env, picker):
- Trims leading/trailing whitespace, strips trailing slashes.
- Auto-prepends
https://when you paste a bare hostname (e.g.eigenpal.example.com→https://eigenpal.example.com). - Rejects non-http(s) schemes (
file://,ws://, etc.) with a clear error. - Rejects URLs with paths, query strings, or hash fragments — baseUrl is an origin, not a route.
- Warns when authenticating over
http://against a non-loopback host (credentials sent unencrypted).
Behavior with
--base-urlorEIGENPAL_BASE_URLset is unchanged — explicit overrides skip the picker, and an active profile's stored baseUrl is still inherited by all non-login commands. - Cloud (
-
c330c2a: CLI: bug fixes + new tooling.
success()/info()/dim()now write to stderr, not stdout.cmd | jqno longer mixes status lines with JSON output. (error()andwarn()already correctly used stderr.)workflow execution watch <bad-id>no longer treats 404 as a transient network blip; the loop exits immediately so the caller sees the structuredExecution not founderror and a non-zero exit instead of polling for 30 minutes.eigenpal statusexits non-zero when authentication fails, so scripts caneigenpal status && deploy.- New
eigenpal completion <bash|zsh|fish>command — emits a shell-completion script for the live command tree. Install viaeigenpal completion bash > /usr/local/etc/bash_completion.d/eigenpal(or your shell's equivalent). - New global
--quiet/-qflag — suppressessuccess()/info()/dim()lines while keepingerror()andwarn()(and JSON output) intact. - New
addJsonFlagMutation()helper alongsideaddJsonFlag(). Mutating commands that don't have a curated table view now use it so--verboseno longer appears in--helpwhere it's a no-op. (Wire-up in mutating handlers happens in a follow-up commit on this branch.)
-
b2c4308: CLI: per-example dataset CRUD.
Three new subcommands under
workflow datasetmean you no longer have to re-zip and re-push the whole folder when you only want to flip one row:workflow dataset create-example <wfId> --name <n> [--input-json | --input-file] [--expected-json | --expected-file] [--annotation]— add one example.workflow dataset update-example <wfId> <exampleId> [--name] [--input-*] [--expected-*] [--annotation] [--row-order]— partial PATCH; flags you omit are left alone,--annotation ""clears.workflow dataset delete-example <wfId> <exampleId> [--yes]—--yesrequired for non-TTY shells.
--input-file/--expected-fileaccept a path or-for stdin. Inline--*-jsonand the-filevariant are mutually exclusive.Server: the
POST /api/workflows/:id/eval-examplescreate schema now accepts thenameandannotationfields the dashboard already exposed via the dashboard's PATCH path. No new endpoints — the v1 mirrors at/api/v1/eval-examples/[id]and/api/v1/workflows/[id]/eval-exampleswere already in place.Skill recipes restored:
SKILL.mdandreference/dataset-format.mddocument the three flows (capture corrected output as new GT, add one example, delete one bad row). -
d41ee8b: CLI: drop the
--waitflag fromworkflow execution run. The local-folder runner already waits for every example to reach a terminal state, so the flag was a documented no-op kept "for symmetry withexperiment run --wait." That symmetry isn't worth a dead flag in the user-facing help screen —experiment run --waitis meaningful (it polls batch status),execution run --waitnever was.Behavior is unchanged. Scripts that passed
--waitwill now see an unknown-option error from Commander; remove the flag. -
d41ee8b: CLI: drop
--jqand--output-pathfromworkflow execution get. Pipe--jsonthrough realjqinstead.Rationale: our
--jqwas dotted-path only (drillJsonPath), not real jq syntax. Calling it--jqwas misleading —gh --jq '.foo[] | select(.bar)'works; ours never could. Realjqis universally installed on dev machines and supports the full filter language.Migration:
Before After eigenpal workflow execution get exec_… --jq 'output.data'eigenpal workflow execution get exec_… --json | jq '.output.data'eigenpal workflow execution get exec_… --output-path 'stepExecutions.0.error'eigenpal workflow execution get exec_… --json | jq -r '.stepExecutions[0].error'Updated SKILL.md and reference docs to use the canonical
--json | jqpattern. -
c330c2a: CLI: small DX bundle + 5 audit follow-up fixes.
eigenpal status(and every other CLI call) now detects HTML-on-the-wire and throws a structuredHtmlResponseError("API not reachable at — got HTML response (likely wrong base URL or API not running)") instead of dumping the 100 KB Next.js 404 body.workflow push --bump <patch|minor|major>reads the server's current version and computes the next semver, splicing it into the YAML before sending. Pair with--workflow-id. Conflicts with a top-levelversion:in the YAML are rejected.workflow push --set-version <X.Y.Z>for explicit overrides. (Named--set-versionto avoid the global-v, --versionflag.)workflow evaluator-type {list, get}— parallel namespace tostep-typefor evaluator schemas (exact-diff,llm-judge,custom-script). Returns JSON Schema instead of 404.eigenpal init [name]now works with no name — scaffolds into the current directory using the cwd basename as the workflow slug. Pair witheigenpal workflow execution run <slug>in the same dir;execution rundiscovers both flat (./workflow.yaml+./dataset/examples/<name>/) and nested (./eigenpal/workflows/<slug>/...) layouts.format-errornow appendsRun \eigenpal auth login` or set EIGENPAL_API_KEY.to every 401, and includes the URL we tried +EIGENPAL_BASE_URL/--base-url` hint on connection failures.execution get --jq <jsonpath>is the new canonical name for what was--output-path.--output-pathkeeps working as a hidden alias; help text shows--jqonly (matchesgh --jq/kubectl --jsonpath).workflow pushwithout--filein TTY now prompts for the path; non-TTY (CI) still errors with the existing "Missing --file" message.transform.scriptreference docs include a callout about TDZ on shadowed input names (const located = located || []triggersReferenceError).- Dropped the half-promise comment in
addJsonFlagabout future--fieldsprojection — the canonical answer isjqon the raw payload.
-
c330c2a: CLI: execution + auth polish.
workflow execution rungains--waitand--json. The local-folder
runner already polled every example to terminal, so--waitis currently a
no-op accepted for symmetry withexperiment run --wait.--jsonemits a
single{ workflowSlug, passed, failed, total }summary on stdout (human
progress lines + the "Results:" footer still go to stderr). Exits 1 when any
example fails, same as before.
...
@eigenpal/cli@0.4.3
Major Changes
-
fadb59b: CLI command tree reorganized around the data model. Top-level surface is now
workflow,agent(reserved), andskill; everything that operates on a
workflow lives underworkflow, grouped by sub-entity.Renames (clean break — no aliases):
eigenpal exec <slug>→eigenpal workflow execution run <slug>eigenpal clear→eigenpal workflow cleareigenpal install-skill→eigenpal skill(same interactive multiselect UX)eigenpal execution {get,list,watch,compare}→eigenpal workflow execution {…}eigenpal workflow set-definition→eigenpal workflow pusheigenpal workflow get-definition→eigenpal workflow pulleigenpal workflow set-evaluators/get-evaluators→workflow evaluators {push,pull}eigenpal workflow set-dataset/get-dataset/list-examples→workflow dataset {push,pull,list}eigenpal workflow run-experiment/get-experiment-status/get-experiment-results/
get-eval-results/list-executions→workflow experiment {run,status,results,eval-results,list}eigenpal workflow list-versions/restore-version→workflow version {list,restore}eigenpal workflow list-step-types/get-step-type→workflow step-type {list,get}eigenpal workflow get-execution→workflow execution geteigenpal workflow get-active-tenant→workflow active-tenant
Removed:
eigenpal generate-meta— deleted. The IDs it generated were never read by
any other CLI command; the server re-mints IDs on every push.
Added:
eigenpal agent— reserved placeholder namespace. Prints a "Coming soon"
message; agentic-process operations will land here in a future release.
Minor Changes
-
c82a215:
eigenpal auth loginnow shows an interactive server picker when no--base-urlflag orEIGENPAL_BASE_URLenv is set:- Cloud (
https://studio.eigenpal.com) is the default highlighted option. - Any on-prem URLs already in your credentials file are surfaced as separate options labelled with the profile names that use them — re-login against an existing on-prem deployment without retyping the URL.
- Custom URL… prompts for a URL with strict validation.
URL handling is now bulletproof in all three input paths (flag, env, picker):
- Trims leading/trailing whitespace, strips trailing slashes.
- Auto-prepends
https://when you paste a bare hostname (e.g.eigenpal.example.com→https://eigenpal.example.com). - Rejects non-http(s) schemes (
file://,ws://, etc.) with a clear error. - Rejects URLs with paths, query strings, or hash fragments — baseUrl is an origin, not a route.
- Warns when authenticating over
http://against a non-loopback host (credentials sent unencrypted).
Behavior with
--base-urlorEIGENPAL_BASE_URLset is unchanged — explicit overrides skip the picker, and an active profile's stored baseUrl is still inherited by all non-login commands. - Cloud (
-
c330c2a: CLI: bug fixes + new tooling.
success()/info()/dim()now write to stderr, not stdout.cmd | jqno longer mixes status lines with JSON output. (error()andwarn()already correctly used stderr.)workflow execution watch <bad-id>no longer treats 404 as a transient network blip; the loop exits immediately so the caller sees the structuredExecution not founderror and a non-zero exit instead of polling for 30 minutes.eigenpal statusexits non-zero when authentication fails, so scripts caneigenpal status && deploy.- New
eigenpal completion <bash|zsh|fish>command — emits a shell-completion script for the live command tree. Install viaeigenpal completion bash > /usr/local/etc/bash_completion.d/eigenpal(or your shell's equivalent). - New global
--quiet/-qflag — suppressessuccess()/info()/dim()lines while keepingerror()andwarn()(and JSON output) intact. - New
addJsonFlagMutation()helper alongsideaddJsonFlag(). Mutating commands that don't have a curated table view now use it so--verboseno longer appears in--helpwhere it's a no-op. (Wire-up in mutating handlers happens in a follow-up commit on this branch.)
-
b2c4308: CLI: per-example dataset CRUD.
Three new subcommands under
workflow datasetmean you no longer have to re-zip and re-push the whole folder when you only want to flip one row:workflow dataset create-example <wfId> --name <n> [--input-json | --input-file] [--expected-json | --expected-file] [--annotation]— add one example.workflow dataset update-example <wfId> <exampleId> [--name] [--input-*] [--expected-*] [--annotation] [--row-order]— partial PATCH; flags you omit are left alone,--annotation ""clears.workflow dataset delete-example <wfId> <exampleId> [--yes]—--yesrequired for non-TTY shells.
--input-file/--expected-fileaccept a path or-for stdin. Inline--*-jsonand the-filevariant are mutually exclusive.Server: the
POST /api/workflows/:id/eval-examplescreate schema now accepts thenameandannotationfields the dashboard already exposed via the dashboard's PATCH path. No new endpoints — the v1 mirrors at/api/v1/eval-examples/[id]and/api/v1/workflows/[id]/eval-exampleswere already in place.Skill recipes restored:
SKILL.mdandreference/dataset-format.mddocument the three flows (capture corrected output as new GT, add one example, delete one bad row). -
d41ee8b: CLI: drop the
--waitflag fromworkflow execution run. The local-folder runner already waits for every example to reach a terminal state, so the flag was a documented no-op kept "for symmetry withexperiment run --wait." That symmetry isn't worth a dead flag in the user-facing help screen —experiment run --waitis meaningful (it polls batch status),execution run --waitnever was.Behavior is unchanged. Scripts that passed
--waitwill now see an unknown-option error from Commander; remove the flag. -
d41ee8b: CLI: drop
--jqand--output-pathfromworkflow execution get. Pipe--jsonthrough realjqinstead.Rationale: our
--jqwas dotted-path only (drillJsonPath), not real jq syntax. Calling it--jqwas misleading —gh --jq '.foo[] | select(.bar)'works; ours never could. Realjqis universally installed on dev machines and supports the full filter language.Migration:
Before After eigenpal workflow execution get exec_… --jq 'output.data'eigenpal workflow execution get exec_… --json | jq '.output.data'eigenpal workflow execution get exec_… --output-path 'stepExecutions.0.error'eigenpal workflow execution get exec_… --json | jq -r '.stepExecutions[0].error'Updated SKILL.md and reference docs to use the canonical
--json | jqpattern. -
c330c2a: CLI: small DX bundle + 5 audit follow-up fixes.
eigenpal status(and every other CLI call) now detects HTML-on-the-wire and throws a structuredHtmlResponseError("API not reachable at — got HTML response (likely wrong base URL or API not running)") instead of dumping the 100 KB Next.js 404 body.workflow push --bump <patch|minor|major>reads the server's current version and computes the next semver, splicing it into the YAML before sending. Pair with--workflow-id. Conflicts with a top-levelversion:in the YAML are rejected.workflow push --set-version <X.Y.Z>for explicit overrides. (Named--set-versionto avoid the global-v, --versionflag.)workflow evaluator-type {list, get}— parallel namespace tostep-typefor evaluator schemas (exact-diff,llm-judge,custom-script). Returns JSON Schema instead of 404.eigenpal init [name]now works with no name — scaffolds into the current directory using the cwd basename as the workflow slug. Pair witheigenpal workflow execution run <slug>in the same dir;execution rundiscovers both flat (./workflow.yaml+./dataset/examples/<name>/) and nested (./eigenpal/workflows/<slug>/...) layouts.format-errornow appendsRun \eigenpal auth login` or set EIGENPAL_API_KEY.to every 401, and includes the URL we tried +EIGENPAL_BASE_URL/--base-url` hint on connection failures.execution get --jq <jsonpath>is the new canonical name for what was--output-path.--output-pathkeeps working as a hidden alias; help text shows--jqonly (matchesgh --jq/kubectl --jsonpath).workflow pushwithout--filein TTY now prompts for the path; non-TTY (CI) still errors with the existing "Missing --file" message.transform.scriptreference docs include a callout about TDZ on shadowed input names (const located = located || []triggersReferenceError).- Dropped the half-promise comment in
addJsonFlagabout future--fieldsprojection — the canonical answer isjqon the raw payload.
-
c330c2a: CLI: execution + auth polish.
workflow execution rungains--waitand--json. The local-folder
runner already polled every example to terminal, so--waitis currently a
no-op accepted for symmetry withexperiment run --wait.--jsonemits a
single{ workflowSlug, passed, failed, total }summary on stdout (human
progress lines + the "Results:" footer still go to stderr). Exits 1 when any
example fails, same as before.
...
@eigenpal/cli@0.4.2
No user-facing CLI changes in this release.
@eigenpal/cli@0.4.1
No user-facing CLI changes in this release.