Table of Contents

πŸ‡«πŸ‡· Version franΓ§aise

orkeon CLI reference

The orkeon command-line tool is the main entry point of the framework: it runs YAML crews and TypeScript scripts (.ork.ts), scaffolds a configuration, probes LLM providers, drives the RAG subsystem, and diagnoses an installation. It is built from src/scripting/Orkeon.Scripting.Cli and packs as the dotnet tool orkeon:

dotnet tool install --global Orkeon.Scripting.Cli --prerelease
orkeon doctor

The release binaries and installers (Windows zip/MSI, Debian package, macOS tarballs) also ship the same CLI, self-contained β€” no .NET SDK required. See Three ways to run Orkeon.

Exit codes (stable): 0 OK Β· 1 script/config error (missing file, invalid script, validation failure) Β· 2 the run failed β€” an unexpected runtime error, a service the host could not build at kickoff, or a crew that ran and did not succeed (a task without a final answer, a tripped circuit breaker, a consensus not reached) Β· 130 cancelled with Ctrl+C. On exit 2 the last stderr line is ERROR: <reason> β€” the sentence that says why; the exception type and its stack trace are logged only at --verbose 2 (or ORKEON_DEBUG=1).

orkeon run

orkeon run <crew.ork.ts | crew.yaml | crew-directory/> [options]

Runs a crew definition and prints its result on stdout. Dispatch is by target type: .ork.ts/.js goes to the scripting host (esbuild transpile + Jint), .yaml/.yml β€” or a directory holding a multi-file YAML crew (config.yaml + agents/ + tasks/, or the flat crew.yaml/agents.yaml/tasks.yaml triplet) β€” goes to the shared one-shot YAML runner.

Option Description
-s, --settings <path> Path to appsettings.json. Without it, a fallback chain applies (below).
-m, --mount <spec> VFS mount, Docker-style <physical>:<virtual>:<rights>[;sub:rights]. Several mounts go space-separated after one flag (--mount a:/x:ro b:/y:rw) β€” the parser rejects a repeated --mount. A Windows drive letter needs nothing special (C:\src:/workspace:ro); a path the bare form cannot carry β€” one containing a : or a ;, or ending with a backslash β€” is quoted: "/data/odd:name":/data:ro, "C:\src\":/workspace:ro. Those double quotes belong to the mount grammar, so your shell must not eat them: write the whole spec inside single quotes in bash/zsh (--mount '"/data/odd:name":/data:ro') and double the quotes in PowerShell (--mount '""/data/odd:name"":/data:ro'). Backslashes are never escape characters. The virtual path is always a name starting with / β€” never a disk path (ADR-008), and /crew, /script, /llm-logs and /sandbox are reserved by the runner (RunnerVirtualRoots.All): a mount claiming one is refused with exit 1, and refused the same way whether it was written here or declared in the settings file β€” the guard reads both, and names the roots this command reserves rather than a fixed list. orkeon forge reserves only /sandbox: it takes no --mount, mounts /workspace, /forge and /output itself, and places those three against the settings exactly as a --mount is placed (next sentence) β€” a settings entry on one of them is replaced for the trial, so a settings file naming /output, an ordinary mount for a normal run and the name Studio gives a team's write folder, forges unchanged. Against the settings file, a --mount is placed by virtual root: on a root Orkeon:FileSystem:Mounts already declares (settings file or ORKEON_ environment), the --mount replaces every settings entry of that root for this run β€” it is written at the first entry's own index, the others are withdrawn, and the log says mount /x: --mount replaces the settings entry; on a new root it is appended after every declared entry. Settings entries no --mount names stay in force. A root is a duplicate only when one source claims it twice and nothing can tell the claims apart: two --mount on the same root (--mount a:/x:ro b:/x:rw), or a settings file declaring one root twice with an entry that carries no id (next row), are refused with exit 1 and one line (ERROR: '/x' is mounted twice on the command line: … Keep one. / … declared twice in <settings> (…) and '<entry>' has no id. Give every entry an id …) before any host is built.
--mount-id <ulid> Selects, among several settings entries declaring one virtual root, the entry this run keeps (VFS-90). A settings entry may carry an id β€” the 26-character ULID before its |, 01J9Z3K4M5N6P7Q8R9S0T1V2W3|C:\data:/output:rw; Orkeon Studio writes one on every save β€” and two entries may share a root only when both carry one. Several ids go space-separated after one flag, like --mount. The entry named is kept as declared (folder, rights); the other entries of its root are withdrawn for the run β€” not mounted, not whitelisted, their folder not probed. Without the option, the crew's mounts: block (<ulid>|/output, see the YAML schema) selects the same way; with neither, a root declared several times is refused with exit 1 and one line naming every id (ERROR: '/output' is declared twice in <settings> (<idA>: <folderA>, <idB>: <folderB>) and nothing selects one. Pass --mount-id <id>, list '<id>|/output' under mounts: in the crew, or pass --mount <folder>:/output:rw to replace them all.). An id no entry carries, or a malformed one, is refused the same way; a --mount on the same root wins over the option, with a WARNING: line; a root the crew requires that nothing provides is refused too (the crew requires '/output' … pass --mount <folder>:/output:rw). Agents never see an id: list_mounts and the access-denied messages name virtual paths only.
--allow-external-mounts Allow --mount arguments outside the working directory (or ORKEON_ALLOW_EXTERNAL_MOUNTS=1): each --mount base path is added to the PathSecurity:AdditionalAllowedDirectories whitelist PathValidator checks resolved paths against, after whatever the settings already list there. A mount declared in the settings file (or through ORKEON_ variables) needs no flag: its base path is always whitelisted, because a declared folder is the machine owner's explicit intent β€” until then such a folder was mounted and every access to it refused as "outside the allowed workspace directory", and no flag could rescue it.
-v, --verbose <0-2> 0 quiet, 1 LLM & tool exchanges, 2 full debug.
--llm-log / --llm-log-path <dir> Log full LLM exchanges as JSONL (default directory ./llm-logs).
--inputs <json> / --inputs-file <path> Structured inputs for scripts (global inputs variable).
-V, --var KEY=VALUE Variable for a YAML crew's CrewInput (task templates {KEY}). Several variables go space-separated after one -V (a repeated flag is rejected).
--initial-context <text> Initial context string for a YAML crew's CrewInput.
--memory-limit-mb <n> Jint memory limit override for this run (0 disables it).
--validate Dry run: resolve settings, build the host, load the crew with strict tool resolution β€” no LLM call, no kickoff. Prints VALIDATION OK/FAILED: ….
--list-tools Build the host, print the sorted runtime tool registry, exit. No crew path needed.
--events jsonl Emit the versioned event protocol on stdout instead of the plain rendering, and read commands on stdin. This is how Orkeon Studio watches a run. See The run event bus.
--stream With --events, also emit llm.delta events token by token. Verbose by nature: off unless asked for.
--client <name> With --events, the name the watching process answers to on the run's hub (client://<name>, default studio). Agents can post and send to that address; a crew's links: block authorizes it.
orkeon run examples/01-enterprise/01-research-assistant/config.yaml \
  --settings examples/appsettings/appsettings.deepseek.local.json \
  --mount ./out:/output:rw -v 1

Settings resolution β€” when --settings is omitted, the CLI walks a fallback chain: appsettings.json next to the crew file, then an appsettings/appsettings.json found by walking up the parent directories, then the global per-user file written by orkeon init, then ORKEON_* environment variables alone. Details and the ready-made profile matrix: Run your first example.

orkeon forge

orkeon forge "summarize my supplier's new offers every morning"   # start from a need
orkeon forge                                   # start with the interview
orkeon forge list                              # list the workspace's sessions
orkeon forge resume <slug>                     # pick a session up exactly where it stopped
orkeon forge resume <slug> --read <dir>        # try it on the documents in <dir>
orkeon forge resume <slug> --adopt             # keep the team as generated, without a trial
orkeon forge promote <slug> --to <dir>         # ship a ready session as an ordinary folder
orkeon forge reopen <team-folder>              # find β€” or rebuild from crew/ β€” the session of a promoted team

The Atelier: a guided path from a need in plain words to a deployable crew. An assistant interviews you and captures a structured brief β€” goal, inputs, acceptance criteria, a sample input β€” then proposes a team plan, renders it, validates it, tries it in a sandbox on your sample, and judges the result against your own criteria. Not conforming? The diagnosis feeds a refine loop, bounded by a hard budget (iterations, tokens, wall time). Every session lives under .orkeon/forge/<slug>/ β€” resumable, diffable between attempts, auditable.

Starting or resuming a cycle requires a configured LLM (orkeon init): the forge refuses to open the interview without one (FORGE-LLM-UNAVAILABLE) rather than degrade silently. list, promote and reopen are fully offline.

reopen <team-folder> makes a promoted team modifiable again when its session is gone β€” deleted, or the folder was forged on another machine or imported. When a session still points at the folder (promotedTo), it is only named: resume it. Otherwise a session is rebuilt from the folder itself: the plan is read back from crew/ (per-entity config.yaml + agents/ + tasks/, or a single crew.yaml), the brief comes from the forge.json every promotion now writes next to FORGE.md β€” or is derived from the plan, and the command says so β€” and the crew is copied verbatim. The rebuilt session lands at the --dry pause, pointing back at the folder: resume --edit --dry, resume, resume --adopt follow as usual, and a promote --to onto the same folder updates it in place. A folder with no YAML crew (a script crew, a foreign layout, files that do not describe a valid plan) is refused with FORGE-TEAM-UNREADABLE and the reasons; the verb takes no option but --events. This is how Orkeon Studio's Β« Modify Β» works on a team no session points at.

Option Description
--format yaml\|script Rendered format (default yaml). script renders an editable crew.ork.ts and needs esbuild β€” absent, a new session falls back to YAML with FORGE-ESBUILD-MISSING. A session's format never changes on resume.
--events jsonl Emit the versioned event protocol on stdout instead of the terminal rendering; answers go down stdin (this is how Orkeon Studio drives the forge).
--auto Arbitrate non-conforming verdicts without a human, within the budget.
--dry Stop after validation β€” generate and validate, never execute. Resume without --dry to try it.
--edit (resume) Amend the blueprint of a session paused before its trial: the amended JSON goes down the channel (blueprint.edited on stdin in --events mode, one pasted line in the terminal), is validated in full, then re-rendered deterministically β€” zero LLM tokens, same iteration. With --dry, the session pauses again at the same boundary. At the arbitration, use the edit decision instead.
--adopt (resume) Take the team as generated, without running a trial: a session paused by --dry goes straight to Ready. Fully offline β€” no host, no LLM, no run directory, zero tokens. It skips the evidence a trial produces, never a check: the crew is rendered and validated at that pause, and promotion never consumed a trial artefact (verdict.json is optional and FORGE.md says Β«no verdict recordedΒ»). Refused anywhere else, with FORGE-INVALID-STATE.
--max-iterations <n> / --max-tokens <n> / --max-seconds <n> The budget (default 3 iterations; 0 = unlimited tokens/time). Resuming may raise it; consumption always carries over.
--settings <path> Same semantics as orkeon run β€” long form only: the forge parser is bespoke and defines no short aliases.
--read <dir> (new session, resume) The folder the trial reads as /workspace, in place of the working directory. The working directory keeps every other role β€” the session still lives under its .orkeon/forge/<slug>/, the settings still resolve next to it: --read moves the documents, not the atelier. A folder that does not exist is refused with exit 1 before any session is created (--read names no directory); promote refuses the option, since it mounts nothing. A read folder outside the working directory is whitelisted for the file tools automatically, the way orkeon run whitelists its script directory β€” the forge's mounts are its own three roots, so there is no --allow-external-mounts here. This is how Orkeon Studio tries a team on the folder chosen at its first step.
--pack <dir> Override the embedded prompt pack.
--to <dir> (promote) Destination folder; must not exist or be empty.
--schedule daily@HH:mm\|hourly (promote) Generate schedule artifacts under schedule/ β€” Windows task XML, systemd timer, cron line. The install command is displayed, never executed: Orkeon has no scheduler.
--with-settings (promote) Copy the resolved settings file into the folder. Off by default β€” a settings file usually carries API keys and the folder is made to be shared.

The sandbox: the try runs in-process with writes confined to the session's own directory (/output for deliverables, /forge for its working files), the working directory β€” or the --read folder β€” mounted read-only as /workspace, and shell_command/code_interpreter removed from the tool catalogue β€” the team plan can only name tools the validation will accept.

The promoted folder is ordinary: crew/ (or crew/crew.ork.ts), run.sh/run.cmd composed against the orkeon run grammar with your sample inputs pre-filled, FORGE.md β€” the crew's identity card (goal, acceptance criteria, verdict, version), written in the interview's language β€” and forge.json, its machine-readable twin (slug, title, format, promotion instant, brief) that forge reopen reads. orkeon run <dir>/crew launches it β€” from inside <dir>, and without the --mount arguments run.sh supplies, so a team that writes deliverables writes nothing that way; the Studio launcher detects the folder and lays the mounts itself.

orkeon init

Configuration assistant. Generates a valid appsettings.json at the global per-user path (%APPDATA%\Orkeon\appsettings.json on Windows, ~/.config/Orkeon/appsettings.json on Linux/macOS) from an interactive 5-choice wizard β€” ollama, docker-model-runner, openai, custom, none β€” or non-interactively via flags, then probes the endpoint (unless --no-probe).

Option Description
-p, --provider <preset> ollama | docker-model-runner | openai | custom | none.
-u, --base-url <url> / -m, --model <id> Endpoint and model. Required for custom; presets have defaults.
-k, --api-key-env <name> / --api-key <value> Env var holding the key, or a key to store.
--path <file> Write somewhere other than the global per-user path.
-f, --force Overwrite an existing file.
--no-probe Skip the endpoint probe.
orkeon init --provider ollama --model llama3.2 --no-probe

orkeon llm

Two verbs against a live provider endpoint.

orkeon llm probe β€” exercises the LLM test protocol against a provider and optionally archives the campaign trace. Key options: -p, --provider (required: openai | anthropic | ollama | azure | together | qwen | deepseek | kimi | mistral | huggingface | zai | gemini | grok | minimax | openrouter | mammouth), -m, --model, -u, --base-url (required for Azure), --api-version (Azure deployment mode), --workspace-id (for workspace-scoped keys β€” Anthropic identity-linked keys require it), -k, --api-key-env (default ORKEON_LLM_API_KEY β€” the key itself is never accepted on the command line), --modes (comma-separated, e.g. M1,M2,M8; default all), --archive <dir>, --format md|json, --commit, --timeout (seconds, default 180), --temperature (default 0), --thinking-effort (base reasoning-effort hint, e.g. none β€” some models refuse function tools while reasoning), --m7-effort (effort the M7 thinking probe uses, default low β€” for models whose supported set excludes it).

orkeon llm models β€” lists the models a provider currently serves. Options: -p, --provider (required), -u, --base-url, -k, --api-key-env, -f, --filter (shell-style glob), --json.

ORKEON_LLM_API_KEY=... orkeon llm probe -p deepseek --modes M1,M2 --format json
orkeon llm models -p ollama --filter 'llama*'

orkeon rag

Three verbs over the RAG subsystem (ingest, search, eval). All share the host options of run: -s/--settings, -m/--mount, --allow-external-mounts, -v/--verbose. Relative sources resolve against an automatic {cwd} β†’ /workspace:ro mount; state lands in {cwd}/.orkeon β†’ /output:rw.

orkeon rag ingest β€” incremental ingestion (unchanged sources are skipped): -c, --collection (required), --source <path|glob> (required; several sources space-separated after one flag), --chunking recursive|sentence|structural|semantic, --reindex (full reindex β€” the only way past an embedding model/dimension change).

orkeon rag search β€” asks a question, prints the grounded answer with citations and scores: positional <question>, -c, --collection (required), --top-n (default 5).

orkeon rag eval β€” evaluates a collection against a golden dataset (recall@k, MRR, groundedness) and writes markdown/JSON reports: -d, --dataset (required), -c, --collection, --profile fast|balanced|quality|adaptive|corrective|default (default default = the configured Orkeon:Rag:Profile) or --compare fast,balanced,…, -k (default 5), --llm-judge, --offline (zero-network: deterministic extractive stub, no LLM key needed), --no-ingest, --reindex, --min-recall / --min-mrr (anti-regression gates, exit 1 below threshold), --output (default /output/rag/eval).

orkeon rag eval --dataset examples/rag/eval/golden.yaml \
  --compare fast,balanced,quality,corrective,adaptive --offline

orkeon doctor

Installation diagnostic: says in under 15 seconds what works and what is missing, as a βœ…/⚠️/❌ table or --json (stable {check, status, detail} schema for CI). Nine checks: dotnet-runtime, appsettings, llm-config, llm-reachability, esbuild, local-embeddings, onnx-reranker, tree-sitter, workspace-write. Exit codes: 0 all green or warnings only, 1 at least one failing check.

orkeon doctor --json

orkeon-repl β€” the separate interactive console

orkeon-repl is a different tool built from src/apps/Orkeon.ConsoleApp (dotnet tool command orkeon-repl): a full interactive REPL that drives agents, crews and tools from a Terminal.Gui split-pane console (logs + REPL), with the full framework stack wired in β€” built-in tools, RAG, code analysis, local embeddings β€” and TypeScript-scripted commands. It deliberately does not share the orkeon assembly name. See CLI TypeScript commands.

The other shipped binaries

The release archives carry more launchers than the two documented here: orkeon-slim (the same CLI, framework-dependent), orkeon-host (the long-running service daemon β€” see the service host), the two Studio TUIs (orkeon-studio-config, orkeon-studio-run) and the Windows desktop app (orkeon-studio) β€” see Orkeon Studio. That is the whole list. The publication matrix and Three ways to run Orkeon list exactly which archive carries what.


See also: Three ways to run Orkeon Β· Run your first example Β· Back to index