13 KiB
Orca CLI V1 Spec
Goal
Define the first strict orca CLI contract for agents.
This spec focuses on:
- exact commands
- exact selector grammar
- exact handle semantics
- exact JSON contract
- what is in v1 now
- what is explicitly deferred because the current runtime does not yet support it cleanly
This document is intended to be implementation-facing.
Scope
The CLI connects to a running Orca editor.
The v1 contract is split into two buckets:
v1-now: can be grounded in current Orca persistence and IPC behavior with limited new plumbingv1-runtime-layer: desirable v1 public contract, but requires a shared runtime/orchestration layer before it is safe to ship
Global Rules
Output modes
All agent-facing commands must support --json.
When --json is used:
- stdout contains exactly one JSON object
- stdout contains no progress text, logs, or prose
- stderr is reserved for failures and unexpected diagnostics
- non-zero exit code indicates command failure
Human-readable output may exist without --json, but --json is the normative contract for agents.
Metadata
All --json responses include:
{
"_meta": {
"orcaVersion": "1.0.0",
"requestId": "req_123"
}
}
Commands that depend on the live runtime layer also include:
{
"_meta": {
"runtimeId": "runtime_abc123"
}
}
Errors
All failures in --json mode must return:
{
"_meta": {
"requestId": "req_123"
},
"error": {
"code": "selector_not_found",
"message": "No worktree matched selector \"branch:feature/foo\".",
"retryable": false
}
}
Minimum standard error codes:
orca_not_runningruntime_unavailableselector_not_foundselector_ambiguousterminal_handle_staleterminal_not_foundrepo_not_foundworktree_not_foundnot_supported_in_v1invalid_argument
Selectors
Selectors are command-time identifiers.
Repo selector grammar
Explicit forms:
id:<repo-id>path:<absolute-path>name:<display-name>
Bare fallback order:
- exact repo id match
- exact absolute path match
- exact display name match
If more than one repo matches a bare selector, fail with selector_ambiguous.
Worktree selector grammar
Explicit forms:
id:<worktree-id>path:<absolute-path>branch:<branch-name>issue:<number>
Bare fallback order:
- exact worktree id match
- exact absolute path match
- exact branch name match
If more than one worktree matches a bare selector, fail with selector_ambiguous.
issue:<number> must fail with selector_ambiguous if multiple worktrees share the same linked issue.
Terminal selector grammar
There is no durable selector for repeated live interaction in v1.
Discovery returns runtime handles. Follow-up commands use:
--terminal <handle>
Human-friendly targeting like title:<name> may be useful later, but it is not part of the strict repeated-interaction contract.
Runtime Handles
Handles identify live terminal targets.
Rules:
- handles are opaque
- handles are scoped to a specific
runtimeId - handles are ephemeral by default
- runtime restart or renderer reload may invalidate all existing handles
- callers must reacquire handles after reconnect/reload unless the runtime explicitly guarantees continuity
- stale handles must fail with
terminal_handle_stale
Example stale-handle error:
{
"_meta": {
"runtimeId": "runtime_new456",
"requestId": "req_123"
},
"error": {
"code": "terminal_handle_stale",
"message": "The terminal handle is no longer valid for the current Orca runtime.",
"retryable": true
}
}
Commands
orca status
Purpose:
- confirm Orca is running
- return current runtime identity
Status:
v1-runtime-layer
Example:
orca status --json
Response:
{
"_meta": {
"orcaVersion": "1.0.0",
"runtimeId": "runtime_abc123",
"requestId": "req_123"
},
"status": {
"running": true,
"runtimeAvailable": true,
"capabilities": {
"repo": true,
"worktree": true,
"file": true,
"search": true,
"git": true,
"gh": true,
"terminal": false,
"worktreePs": false
}
}
}
Implementation note:
- a minimal “is Orca running” probe may be possible earlier
- the strict
statuscontract in this spec assumes the runtime layer exists and can issue a realruntimeId
orca repo list
Status:
v1-now
orca repo list --json
Response:
{
"_meta": {
"orcaVersion": "1.0.0",
"requestId": "req_123"
},
"repos": [
{
"id": "repo_1",
"path": "/abs/repo",
"displayName": "orca",
"worktreeBaseRef": "origin/main"
}
]
}
orca repo add
Status:
v1-now
orca repo add --path /abs/repo --json
orca repo show
Status:
v1-now
orca repo show --repo path:/abs/repo --json
orca repo set-base-ref
Status:
v1-now
orca repo set-base-ref --repo id:repo_1 --ref origin/main --json
orca repo search-refs
Renamed from search-base-refs for better verb consistency.
Status:
v1-now
orca repo search-refs --repo id:repo_1 --query main --json
orca worktree list
Full listing command.
Status:
v1-now
orca worktree list --repo id:repo_1 --json
Response:
{
"_meta": {
"orcaVersion": "1.0.0",
"requestId": "req_123"
},
"worktrees": [
{
"id": "repo_1::/abs/wt",
"repoId": "repo_1",
"path": "/abs/wt",
"branch": "refs/heads/feature/foo",
"displayName": "Feature Foo",
"linkedIssue": 123,
"comment": "parser work"
}
]
}
orca worktree ps
Compact orchestration summary command.
Status:
v1-runtime-layer
Rationale:
- desirable public contract
- requires a shared live-runtime summary service, not just persisted state
orca worktree ps --json
Response:
{
"_meta": {
"orcaVersion": "1.0.0",
"runtimeId": "runtime_abc123",
"requestId": "req_123"
},
"worktrees": [
{
"id": "repo_1::/abs/wt",
"repo": "orca",
"branch": "feature/foo",
"linkedIssue": 123,
"unread": false,
"liveTerminals": 2,
"status": "active"
}
]
}
orca worktree show
Status:
v1-now
orca worktree show --worktree branch:feature/foo --json
Focused v1 also accepts active / current as CLI-only shortcuts for worktree
selectors. The CLI resolves them from the caller's current directory and sends a
path: selector to the runtime.
orca worktree current
Status:
v1-now
orca worktree current --json
orca worktree create
Status:
v1-now
This must preserve current editor behavior:
- sanitize name
- compute branch name from settings
- reject branch conflicts
- best-effort reject historical PR head-name reuse
- compute path under workspace root
- use chosen/default base ref
- create worktree
- best-effort apply linked issue/comment metadata
orca worktree create --repo path:/abs/repo --name feature-foo --issue 123 --comment "parser work" --json
orca worktree set
Status:
v1-now
orca worktree set --worktree branch:feature/foo --display-name "Parser" --issue 123 --comment "parser work" --json
orca worktree set --worktree active --comment "parser work" --json
orca worktree rm
Status:
v1-now
orca worktree rm --worktree path:/abs/wt --force --json
orca terminal list
Purpose:
- discover live terminal handles for a worktree
Status:
v1-runtime-layer
Rationale:
- requires shared orchestration service over renderer-owned layout plus main-owned PTYs
orca terminal list --worktree id:repo_1::/repo/.worktrees/feature-foo --json
Response:
{
"_meta": {
"orcaVersion": "1.0.0",
"runtimeId": "runtime_abc123",
"requestId": "req_123"
},
"terminals": [
{
"handle": "term_a2",
"title": "claude",
"status": "running",
"worktree": "branch:feature/foo",
"tabId": "tab_1",
"tabTitle": "Claude Code",
"leafId": "leaf_2",
"preview": "I updated the parser. Do you want me to run the full suite?"
}
]
}
Optional:
--layoutmay include secondary tab/layout context when the caller needs it
orca terminal show
Metadata-only.
Status:
v1-runtime-layer
orca terminal show --terminal term_a2 --json
Response:
{
"_meta": {
"orcaVersion": "1.0.0",
"runtimeId": "runtime_abc123",
"requestId": "req_123"
},
"terminal": {
"handle": "term_a2",
"title": "claude",
"status": "running",
"cwd": "/abs/wt",
"tabId": "tab_1",
"tabTitle": "Claude Code",
"leafId": "leaf_2",
"lastOutputAt": 1712345678,
"lastInputAt": 1712345600,
"preview": "I updated the parser. Do you want me to run the full suite?"
}
}
orca terminal read
Content-only, bounded.
Status:
v1-runtime-layer
orca terminal read --terminal term_a2 --json
Response:
{
"_meta": {
"orcaVersion": "1.0.0",
"runtimeId": "runtime_abc123",
"requestId": "req_123",
"truncated": false
},
"terminal": {
"handle": "term_a2",
"status": "running",
"tail": [
"Running targeted tests...",
"3 passed",
"I updated the parser and fixed the failing snapshot."
],
"nextCursor": null
}
}
orca terminal send
Status:
v1-runtime-layer
Supported forms:
--text <text>--enter--interrupt
orca terminal send --terminal term_a2 --text "continue" --json
orca terminal wait
Status:
exit:v1-runtime-layerinput: deferredidle: deferredoutput: deferred
Rationale:
exitcan be grounded in PTY exit events- the others require new runtime instrumentation and/or heuristics
orca terminal wait --terminal term_a2 --for exit --json
For unsupported wait modes in initial v1:
{
"_meta": {
"requestId": "req_123"
},
"error": {
"code": "not_supported_in_v1",
"message": "terminal wait --for input requires runtime instrumentation that is not available in v1.",
"retryable": false
}
}
orca terminal stop
Stop live terminals for a worktree.
Status:
v1-runtime-layer
This replaces worktree shutdown in the primary surface because the action is terminal-oriented.
Initial supported target:
--worktree <selector>
Later extension:
--terminal <handle>
orca file ls
Status:
v1-now
orca file ls --worktree id:repo_1::/repo/.worktrees/feature-foo --path src --json
orca file read
Status:
v1-now
orca file read --worktree id:repo_1::/repo/.worktrees/feature-foo --path src/main.ts --json
orca file write
Status:
v1-now
orca file write --worktree id:repo_1::/repo/.worktrees/feature-foo --path src/main.ts --stdin --json
orca file create
Status:
v1-now
orca file mkdir
Status:
v1-now
orca file rename
Status:
v1-now
orca file rm
Status:
v1-now
orca file stat
Status:
v1-now
orca search text
Status:
v1-now
orca search text --worktree id:repo_1::/repo/.worktrees/feature-foo --query worktree --json
orca search files
Status:
v1-now
Keep separate from file ls --query in v1.
Rationale:
- clearer distinction between tree listing and search behavior
- aligns with existing product/search mental model
orca git status
Status:
v1-now
orca git diff
Status:
v1-now
orca git stage
Status:
v1-now
orca git unstage
Status:
v1-now
orca git discard
Status:
v1-now
orca git branch-compare
Status:
v1-now
orca gh pr
Status:
v1-now
orca gh issue
Status:
v1-now
orca gh issues
Status:
v1-now
orca gh checks
Status:
v1-now
Explicitly Deferred From V1
Deferred:
- tab creation and closure
- pane split and close
- tab reordering
- tab colors
- unread/read metadata commands in the core surface
- terminal wait modes other than
exit
Rationale:
- either too UI-shaped
- or not grounded in current backend ownership
Recommended Implementation Order
- repo/worktree/file/search/git/gh
v1-nowcommands - shared runtime/orchestration layer with
runtimeId status- terminal handle issuance and validation
terminal list/show/read/sendworktree psterminal wait --for exit
Recommendation
This spec is the contract to review next.
It is intentionally strict and narrower than the broader design docs:
- selectors are formal
- handles are ephemeral by default
- JSON is contractual
- terminal features are split between
v1-nowandv1-runtime-layer
That should let us optimize for both agent clarity and implementation honesty.