mirror of
https://github.com/getpaseo/paseo.git
synced 2026-10-21 08:42:39 +00:00
* feat(server): let clients create internal agents The daemon's own branch-name and commit-message generators run as internal agents: never persisted, listed, flagged, announced, or seen by plugin lifecycle hooks. Nothing outside the daemon could ask for one, because the wire config schema strips `internal` and the agent.create transform re-pins it. A plugin that runs a one-turn helper per event therefore left an archived session in History every time. Add an optional `internal` flag to `create_agent_request` (inherited by `agent.create.request`), copy it onto the config in the session's create path, and skip provider session persistence for it like the generators do. The client SDK forwards the flag on both creation paths and gates it once on `server_info.features.internalAgents`. Two daemon paths assumed every agent is public and had to follow: `resolveAgentIdentifier` now accepts a live agent by exact id, since the id set it matched against came from listings that exclude internal agents and left `wait_for_finish` answering "Agent not found"; and archiving an internal agent now closes it without writing the record that `registry.applySnapshot` used to leave behind, so `autoArchive` does not accumulate hidden files on disk. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(server): keep internal agents whole through failure, archive, and wait Review follow-ups for internal agents: - A create that fails after the runtime is registered now closes the internal agent before rethrowing, so a hidden runtime cannot outlive the failed request. Public agents keep today's behaviour. - Archiving an internal agent cascades to attached children like any parent. cascadeArchiveChildren takes the parent record instead of reading it back from storage, where an internal agent never is. - The archived snapshot and last message of an internal agent stay readable by exact id for ten minutes, so create-then-waitForFinish returns the finished turn whether the wait lands before or after an auto-archive. Storage plays that role for public agents. - The internal-agent e2e scenarios live in the existing create_agent_request lifecycle suite rather than a new file. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(server): cascade to live internal children and keep a failed internal create's worktree until it closes Internal children never reach storage, so the parent archive cascade scans live agents for them as well. A failed internal create now clears the created id only after the runtime is archived, so worktree cleanup cannot delete the directory under a runtime that would not close. Stored agent payloads carry lastError, so a retained failed helper reports its error through wait_for_finish instead of the generic message. * feat(cli,mcp): expose internal agents and document --no-wait paseo run gains --internal and create_agent gains internal, both forwarded to the create request. --no-wait becomes the documented spelling for returning immediately, matching paseo send; --background and --detach stay as hidden aliases under COMPAT tags. * test: follow the --no-wait rename and stub getRetiredInternalAgent * feat: list internal agents on request and add internal workspaces Internal agents stay hidden by default, but a caller can now ask for them: `fetch_agents_request` takes `filter.includeInternal`, snapshots carry `internal: true`, and `paseo ls --internal` shows them in an INTERNAL column. The app never passes the flag. Workspaces get the same flag. `workspace.create.request` with `internal: true` persists a hidden workspace: listings, update subscriptions, sync reads, empty-project counting, open-by-path, MCP `list_workspaces`, and plugin workspace hooks all skip it unless the caller opts in with `filter.includeInternal`. Every agent created inside an internal workspace is internal and unpersisted; AgentManager applies that from the workspace id before the plugin hook so creators cannot opt out. Archive and shutdown enumerate internal agents so nothing inside an internal workspace outlives it. Surfaces: `paseo workspace create --internal`, `paseo workspace ls --internal`, `paseo run --internal --new-workspace`, MCP `create_workspace({ internal })`, SDK `workspaces.create({ internal })` and `list({ filter: { includeInternal } })`. Clients gate on `features.internalWorkspaces`. Co-Authored-By: Claude <noreply@anthropic.com> * feat(workspaces): add background visibility with inherited creation defaults * fix(cli): resolve workspace callers on the selected daemon * test(workspaces): keep caller integration coverage in server suite * test(cli): exercise workspace callers through CLI integration harness * test(mcp): remove obsolete execution flags from browser fixtures --------- Co-authored-by: marvin-ambrozio <marvin@gustavo.eng.br> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
454 lines
24 KiB
Markdown
454 lines
24 KiB
Markdown
---
|
|
title: CLI reference
|
|
description: "Paseo CLI reference: manage projects, workspaces, agents, plugins, scripts, schedules, daemons, and permissions from your terminal."
|
|
nav: CLI reference
|
|
order: 35
|
|
category: Orchestration
|
|
---
|
|
|
|
# CLI reference
|
|
|
|
The Paseo CLI lets you manage agents from your terminal. It's the same interface exposed by the daemon's API, so anything you can do in the app you can do from the command line.
|
|
|
|
> **Agent orchestration:** You can tell coding agents to use the Paseo CLI to spawn and manage other agents. Paseo recognizes the calling agent, so CLI-created workers get the same workspace and parent defaults as MCP-created workers.
|
|
|
|
## Quick reference
|
|
|
|
```bash
|
|
paseo run "fix the tests" # Start an agent
|
|
paseo ls # List running agents
|
|
paseo attach <id> # Stream agent output
|
|
paseo send <id> "also fix linting" # Send follow-up task
|
|
paseo logs <id> # View agent timeline
|
|
paseo stop <id> # Stop an agent
|
|
```
|
|
|
|
## Provider diagnostics
|
|
|
|
Ask the daemon to inspect the provider environment it actually uses:
|
|
|
|
```bash
|
|
paseo provider diagnostic claude
|
|
paseo provider diagnostic codex --json
|
|
paseo --host devbox:6767 provider diagnostic opencode
|
|
```
|
|
|
|
The diagnostic includes the configured command, daemon `PATH` and shell, matching binaries, resolved path, version, model count, and provider status. Use the global `--host` option for a remote daemon. This is the same diagnostic shown under **Settings → your host → Providers → provider → Diagnostic**.
|
|
|
|
## Running agents
|
|
|
|
Use `paseo run` to start a new agent with a task:
|
|
|
|
```bash
|
|
paseo run "implement user authentication"
|
|
paseo run --provider codex "refactor the API layer"
|
|
paseo run --no-wait "run the focused test suite"
|
|
paseo run --output-schema schema.json "name this branch"
|
|
paseo run --new-workspace worktree --worktree-mode branch-off --new-branch feature/x --base origin/main "implement feature X"
|
|
paseo run --workspace <workspace-id> "review the current diff"
|
|
paseo run --output-schema schema.json "extract release notes"
|
|
paseo run --output-schema '{"type":"object","properties":{"summary":{"type":"string"}},"required":["summary"]}' "summarize release notes"
|
|
```
|
|
|
|
From a human shell, a bare `paseo run` creates a new local workspace for the current directory. Use `--workspace <id>` to add the agent to an existing workspace, or `--new-workspace local|worktree` to explicitly create a separate workspace for the run.
|
|
|
|
Worktree creation accepts `--worktree-mode branch-off|checkout-branch|checkout-pr` plus the matching `--new-branch`/`--base`, `--branch`, or `--pr-number`/`--forge` options. Use `--worktree-slug` to choose the managed directory slug.
|
|
|
|
When an existing Paseo agent runs the same command, Paseo recognizes it through `PASEO_AGENT_ID`. Without explicit placement, the new agent becomes its subagent in the same workspace. `--workspace` can place that subagent elsewhere without changing its parent.
|
|
|
|
Use `--output-schema` to return only matching JSON output. You can pass a schema file path or an inline JSON schema object. This mode cannot be used with `--no-wait`.
|
|
|
|
By default, `paseo run` waits for completion. Use `--no-wait` to return immediately while the agent keeps running, the same flag `paseo send` takes.
|
|
|
|
The old `run --background` and `-d` aliases still mean `--no-wait`. They are deprecated, hidden
|
|
from help, and print a warning to stderr. Use `--no-wait` in scripts. Workspace visibility is
|
|
selected separately with `workspace create --background`; this release does not repurpose
|
|
`run --background`.
|
|
|
|
## Projects
|
|
|
|
Register the current directory as a project, then list the projects known to the daemon:
|
|
|
|
```bash
|
|
cd ~/dev/my-app
|
|
paseo project create
|
|
paseo project ls
|
|
```
|
|
|
|
Use the project ID from `paseo project ls` to rename, reset, or delete a project:
|
|
|
|
```bash
|
|
paseo project rename <project-id> "My app"
|
|
paseo project rename <project-id> --reset
|
|
paseo project delete <project-id>
|
|
```
|
|
|
|
`--reset` restores the name derived from the project directory. Deleting a project archives its active workspaces and removes the project from Paseo. It does not delete the project directory.
|
|
|
|
For a local daemon, `paseo project create [path]` defaults to the current directory and resolves relative paths on the CLI machine. When you use the global `--host` option or `PASEO_HOST`, provide a path that the target daemon can access:
|
|
|
|
```bash
|
|
paseo --host devbox:6767 project create /srv/repos/api
|
|
```
|
|
|
|
The remote daemon interprets that path on its own machine. See [Workspaces](/docs/workspaces) for how projects group working directories and sessions.
|
|
|
|
## Workspaces
|
|
|
|
Create a workspace independently when you want to prepare its files before starting an agent:
|
|
|
|
```bash
|
|
paseo workspace create --isolation local --path ~/dev/my-app --title main
|
|
|
|
paseo workspace create \
|
|
--isolation worktree \
|
|
--path ~/dev/my-app \
|
|
--mode branch-off \
|
|
--new-branch feature/auth \
|
|
--worktree-slug feature-auth \
|
|
--base origin/main
|
|
|
|
paseo workspace create \
|
|
--isolation worktree \
|
|
--path ~/dev/my-app \
|
|
--mode checkout-branch \
|
|
--branch feature/existing \
|
|
--worktree-slug existing-copy
|
|
|
|
paseo workspace create \
|
|
--isolation worktree \
|
|
--path ~/dev/my-app \
|
|
--mode checkout-pr \
|
|
--pr-number 2186
|
|
```
|
|
|
|
Add `--background` to hide a workspace from default discovery. Its agents and terminals keep
|
|
ordinary history, persistence, hooks, and restart recovery. `--no-background` explicitly overrides
|
|
caller-workspace inheritance; omission inherits when run by a Paseo agent and defaults to false
|
|
from a human shell. Visibility is creation-only.
|
|
|
|
```bash
|
|
paseo workspace create --isolation local --background --path /path/to/repo
|
|
paseo run --workspace <workspace-id> --no-wait "review the checkout flow"
|
|
```
|
|
|
|
Exact workspace and agent IDs remain accessible regardless of listing visibility.
|
|
|
|
Then list, use, rename, or archive it:
|
|
|
|
```bash
|
|
paseo workspace ls
|
|
paseo workspace ls --background # Also include background workspaces
|
|
paseo run --workspace <workspace-id> "implement authentication"
|
|
paseo workspace rename <workspace-id> "Auth rework"
|
|
paseo workspace rename <workspace-id> --reset # back to the branch or directory name
|
|
paseo workspace archive <workspace-id>
|
|
```
|
|
|
|
Add `--forge <name>` to PR checkout when Paseo cannot infer the forge from the source checkout. See [Git worktrees](/docs/worktrees) for setup hooks and services.
|
|
|
|
## Terminals
|
|
|
|
Use the workspace ID when multiple workspaces share a directory:
|
|
|
|
```bash
|
|
paseo terminal create --workspace <workspace-id> --name Development
|
|
paseo terminal ls --workspace <workspace-id> --json
|
|
paseo terminal send-keys <terminal-id> -l "echo ready"
|
|
paseo terminal send-keys <terminal-id> Enter
|
|
paseo terminal capture <terminal-id>
|
|
paseo terminal kill <terminal-id>
|
|
```
|
|
|
|
Creation defaults to the workspace directory. Add `--cwd <absolute-path>` to change the process directory while keeping that workspace as the owner. Unknown and archived workspace IDs fail.
|
|
|
|
Without `--workspace`, creation opens the project at `--cwd` or the current directory and reuses its oldest active workspace. Listing without `--workspace` filters by `--cwd` or the current directory and can include multiple workspaces. `ls --all` lists every terminal on the host and cannot be combined with directory or workspace filters.
|
|
|
|
Create and list results include `id`, `name`, `cwd`, and `workspaceId`. Use `--json` for structured output and the global `--host` option to target another daemon. These commands require a host that supports the [workspace terminal API](/docs/sdk/reference#clientterminals); older hosts return an update message.
|
|
|
|
## Workspace scripts
|
|
|
|
List, start, and stop the scripts configured in a workspace's `paseo.json`:
|
|
|
|
```bash
|
|
paseo script ls
|
|
paseo script start web
|
|
paseo script stop web
|
|
```
|
|
|
|
By default, Paseo selects the workspace whose directory is the current directory. Pass `--cwd <path>` to select a different directory, or `--workspace <workspace-id>` when a directory has multiple workspaces. Use the global `--host` option to target another daemon. These commands also accept standard output options such as `--json`.
|
|
|
|
The output includes each script's lifecycle and supervised terminal ID. Services also include their assigned port, proxy URL, and health. See [Git worktrees](/docs/worktrees#scripts-and-services) for `paseo.json` configuration.
|
|
|
|
## Plugins
|
|
|
|
> **Trust every plugin you add.** `paseo plugin add` and `paseo plugin install` mean “I trust this codebase.” Plugin server code and Git preparation commands run unsandboxed with the daemon user's access on the daemon host; client contributions run inside Paseo. Dependencies and future updates are part of that decision. With the global `--host` option, commands run on the remote daemon host.
|
|
|
|
Create and manage trusted plugins on a daemon:
|
|
|
|
```bash
|
|
paseo plugin init /absolute/path/to/plugin
|
|
paseo plugin install /absolute/path/to/plugin
|
|
paseo plugin add owner/repository
|
|
paseo plugin add https://gitlab.com/group/repository.git --ref main
|
|
paseo plugin add owner/monorepo:plugins/review
|
|
paseo plugin ls [id]
|
|
paseo plugin update my-plugin
|
|
paseo plugin update --all
|
|
paseo plugin reload my-plugin
|
|
paseo plugin logs my-plugin
|
|
paseo plugin disable my-plugin
|
|
paseo plugin enable my-plugin
|
|
paseo plugin remove my-plugin
|
|
```
|
|
|
|
GitHub shorthand checks an existing host directory first. Append `:<directory>` for a plugin in a
|
|
monorepo. `paseo plugin ls [id]` does not contact the remote. `paseo plugin logs <id>` returns the
|
|
plugin's recent daemon-side stdout and stderr. Add `--json` for structured entries, or run
|
|
`paseo --host <target> plugin logs <id>` for another daemon. See the
|
|
[Plugin reference](/docs/plugins/reference) for installation, trust, lifecycle, and log-retention
|
|
behavior.
|
|
|
|
## Listing agents
|
|
|
|
```bash
|
|
paseo ls # Non-archived agents in active workspaces
|
|
paseo ls -a # Also include archived agents
|
|
paseo ls -g # Non-archived agents across all workspaces
|
|
paseo ls -a -g --json # All agents, including archived, as JSON
|
|
paseo ls --background # Also include agents in background workspaces
|
|
```
|
|
|
|
## Streaming output
|
|
|
|
Use `paseo attach` to stream an agent's output in real-time:
|
|
|
|
```bash
|
|
paseo attach abc123 # Attach to agent (Ctrl+C to detach)
|
|
```
|
|
|
|
Agent IDs can be shortened, `abc` works if it's unambiguous.
|
|
|
|
## Sending messages
|
|
|
|
Send follow-up tasks to a running or idle agent:
|
|
|
|
Use the recipient's agent ID from `paseo ls`, or [copy it from the agent's tab](/docs/orchestration-workflows#send-a-prompt-to-another-agent).
|
|
|
|
```bash
|
|
paseo send <id> "now run the tests"
|
|
paseo send <id> --image screenshot.png "what's wrong here?"
|
|
paseo send <id> --no-wait "queue this task"
|
|
```
|
|
|
|
## Viewing logs
|
|
|
|
```bash
|
|
paseo logs <id> # Full timeline
|
|
paseo logs <id> -f # Follow (streaming)
|
|
paseo logs <id> --tail 10 # Last 10 entries
|
|
paseo logs <id> --filter tools # Only tool calls
|
|
```
|
|
|
|
## Waiting for agents
|
|
|
|
Block until an agent finishes its current task:
|
|
|
|
```bash
|
|
paseo wait <id>
|
|
paseo wait <id> --timeout 60 # 60 second timeout
|
|
```
|
|
|
|
Useful in scripts or when one agent needs to wait for another.
|
|
|
|
## Schedules
|
|
|
|
Run an agent on a cron schedule. The CLI also accepts simple cadence presets and compiles them to cron. See [Schedules from the CLI](/docs/schedules-cli) for the full reference.
|
|
|
|
```bash
|
|
paseo schedule create --every 30m --cwd ~/dev/my-app "Continue the refactor and leave a note."
|
|
paseo schedule ls
|
|
paseo schedule pause <id>
|
|
```
|
|
|
|
## Permissions
|
|
|
|
Agents may request permission for certain actions. Manage these from the CLI:
|
|
|
|
```bash
|
|
paseo permit ls # List pending requests
|
|
paseo permit allow <id> # Allow all pending for agent
|
|
paseo permit deny <id> --all # Deny all pending
|
|
```
|
|
|
|
## Agent modes
|
|
|
|
Change an agent's operational mode (provider-specific):
|
|
|
|
```bash
|
|
paseo agent mode <id> --list # Show available modes
|
|
paseo agent mode <id> bypass # Set bypass mode
|
|
paseo agent mode <id> plan # Set plan mode
|
|
paseo agent detach <id> # Make a subagent top-level
|
|
```
|
|
|
|
Detaching is an explicit lifecycle action, not a creation flag. The agent keeps running; only its relationship to its parent changes.
|
|
|
|
## Daemon management
|
|
|
|
Define an instance once, then start its saved configuration:
|
|
|
|
```bash
|
|
paseo daemon config set daemon.listen 127.0.0.1:6799 --home ~/paseo-test
|
|
paseo daemon config set daemon.relay.enabled false --home ~/paseo-test
|
|
paseo daemon start --home ~/paseo-test
|
|
paseo project ls --home ~/paseo-test
|
|
paseo daemon restart --home ~/paseo-test
|
|
paseo daemon stop --home ~/paseo-test
|
|
```
|
|
|
|
`start` runs in the background and reports the actual listening address and supervisor PID. It accepts only home selection and `--timeout <seconds>` (default 600). If waiting times out, the supervisor remains running: use the printed status, log, and stop instructions. A worker that exits before becoming ready makes startup fail.
|
|
|
|
`restart` requests a replacement worker from the existing supervisor. It rereads the file and retains the supervisor's original environment and arguments. Success confirms a different ready worker, following a changed address for a home target. It never starts a stopped daemon or refreshes the supervisor binary. A timeout reports whether the request was acknowledged; it does not prove why reconnection failed.
|
|
|
|
`stop --home` waits for that local supervisor to exit. On POSIX it signals the supervisor without contacting a TCP endpoint. On Windows it uses the ready daemon's shutdown RPC; an unbound instance requires explicit `--force`. `--force` permits forced process-tree cleanup after the graceful timeout (default 15 seconds). `stop --host` only reports **shutdown requested**; remote process exit is not verified. A service manager may start another instance after the captured supervisor exits.
|
|
|
|
`status` separates local supervisor state, its published endpoint, the configured address, and RPC reachability. A stopped home is never probed at its configured address. An unbound live supervisor is **not ready**. If an authenticated local connection remains open but status details time out, the result stays `reachable` with a note explaining the unavailable details. Worker and provider fields are omitted. An explicit `--host` query still fails when its status request fails.
|
|
|
|
`reload` validates the file, applies runtime-safe changes, and reports `appliedPaths`, `restartRequiredPaths`, and `overrideControlledPaths`. It never implicitly restarts. Use `--json` or `--format yaml` for structured results. An older host lacking the capability reports that it needs an update.
|
|
|
|
The root aliases `start`, `status`, `restart`, `reload`, and `pair` use the same commands as `daemon`. Root `run` and `stop` remain agent operations.
|
|
|
|
### Foreground deployments and migration
|
|
|
|
Use environment overrides with the foreground deployment command:
|
|
|
|
```bash
|
|
PASEO_LISTEN=127.0.0.1:6799 PASEO_RELAY_ENABLED=false paseo daemon run --home ~/paseo-test
|
|
```
|
|
|
|
It stays attached until the supervisor exits or you cancel, without a readiness timeout. Worker restart retains these launch inputs. Stop and relaunch the deployment to change them. If the home already has a live supervisor, `run` returns `already_running` without owning or launching a foreground process.
|
|
|
|
Managed `start` ignores inherited daemon-setting overrides, including `PORT`, `PASEO_LISTEN`, relay, voice, and web UI settings. It preserves provider credentials and executable/runtime controls. `start --foreground` is removed; use `daemon run`. Former start/restart configuration flags such as `--port`, `--no-relay`, and `--web-ui` fail before side effects, with the corresponding `config set` migration. See [configuration edits](/docs/configuration#apply-changes).
|
|
|
|
### Select one daemon
|
|
|
|
Every daemon-connected CLI command accepts global `--home` or `--host`, before or after the command. A home selects a local supervisor's published endpoint; a host selects an explicit endpoint. There is no configured-address or default-port fallback.
|
|
|
|
| Selectors | Result |
|
|
| ------------------------------------------ | ------------------------------------------------------ |
|
|
| `--home` | That local home, overriding both environment selectors |
|
|
| `--host` | That endpoint, overriding both environment selectors |
|
|
| Both flags, or conflicting duplicate flags | `TARGET_AMBIGUOUS` |
|
|
| Only `PASEO_HOME` or only `PASEO_HOST` | The corresponding target |
|
|
| Both environment selectors, without a flag | `TARGET_AMBIGUOUS` |
|
|
| Neither | Default local home, `~/.paseo` |
|
|
|
|
Local-only `start`, `daemon run`, `config`, `onboard`, and `set-password` reject explicit `--host` and ignore `PASEO_HOST`. Endpoint operations retain TCP, Unix socket, Windows pipe, SSH, and pairing-offer transports. A host-side CLI controlling a container needs `--host` or `PASEO_HOST`.
|
|
|
|
## Hub
|
|
|
|
```bash
|
|
paseo hub login [url] # Approve and store organization-scoped CLI access
|
|
paseo hub init # Create and optionally deploy a starter trigger here
|
|
paseo hub connect [url] # Enroll this daemon using CLI access
|
|
paseo hub projects # List legacy projects in the authenticated organization
|
|
paseo hub status # Show the current Hub relationship
|
|
paseo hub permissions list # Show what this Hub may do on this daemon
|
|
paseo hub permissions grant hub.execute # Let Hub automations run agents here
|
|
paseo hub permissions revoke hub.execute # Take it back
|
|
paseo hub disconnect # End it
|
|
paseo hub deploy # Validate and install .paseo/triggers/*.yml
|
|
paseo hub deploy --dry-run # Validate without installing
|
|
paseo hub deploy -p <project> # Deploy an existing legacy project bundle
|
|
paseo hub logout # Remove the active stored CLI login
|
|
```
|
|
|
|
Run deploy from the repository root. By default it reads every direct `.paseo/triggers/*.yml` file in deterministic path order. It validates all triggers before installing them one at a time. If an installation fails after earlier ones succeeded, the error lists the installed files. `--dry-run` only validates; it does not create or activate revisions.
|
|
|
|
Pass `-p, --project <slug>` for an existing legacy bundle: `.paseo/hub.yml`, direct `.paseo/workflows/*.yml` files, and referenced workflow partials. See [Deploy from the CLI](/docs/hub/configuration#deploy-from-the-cli).
|
|
|
|
`login` opens the Hub approval page and stores a durable organization-scoped CLI credential under `PASEO_HOME`. In an interactive terminal it offers to connect this daemon, then separately asks whether to allow Hub automations to run agents. Connection defaults to yes; execution permission defaults to no. It then links to Hub's **Triggers** page and prints `paseo hub init` for setup as code. `--json` and non-TTY login remain login-only and never prompt. The stored login is separate from the daemon relationship created by `connect`.
|
|
|
|
`init` requires a TTY. It signs in and connects the daemon as needed, then lists the organization's app connections that can back a starter trigger. One usable connection is selected automatically; with several, you choose a **Trigger connection**. If none is ready, setup sends you to **Hub → Apps** and stops before selecting an agent or writing files.
|
|
|
|
Setup asks which agent provider, model, and mode to run. Providers must be enabled and expose both a selectable model and an execution mode. Suggested model and mode entries are the daemon's defaults; a mode is still selected explicitly when there is no default. Hub validates the choice against the daemon before deploying, and accepts only Claude, Codex, and OpenCode for its unattended runs. `deploy` applies the same checks, so it needs the named daemon connected. Setup then asks for the identity allowed to trigger the bot: a GitHub username, Slack member ID, or Discord user ID. It validates the trigger, writes `.paseo/triggers/<provider>-help.yml`, and asks whether to deploy. Replacing that file requires confirmation; existing legacy bundles and other trigger files are preserved. See the [generated starter trigger](/docs/hub/configuration#generated-starter-trigger).
|
|
|
|
Interactive logout checks the same-origin daemon relationship and asks whether to disconnect before deleting the login. Declining removes only the login. JSON and noninteractive logout never prompt or disconnect implicitly; `--disconnect-daemon` is the explicit automation path, and `--force` applies to that daemon disconnection. If a requested disconnection fails, the login is preserved.
|
|
|
|
Every command resolves and normalizes its destination before Hub or daemon work. Origin precedence is an explicit command origin or `--hub`, then `PASEO_HUB_URL`, then the active stored login origin, then the hosted default `https://hub.paseo.sh`. The hosted default never overrides an active login. Credential precedence is `--api-key <secret>`, then `PASEO_HUB_API_KEY`, then a stored login for the exact resolved origin. A stored credential is never sent to a different origin. API keys passed through flags or the environment are not stored.
|
|
|
|
Human output reports the resolved destination before each action. JSON output keeps stdout machine-readable and includes the normalized Hub origin. Bundle diagnostics identify paths without printing configuration contents or credentials.
|
|
|
|
See [Daemons in Hub](/docs/hub/daemons), [Hub configuration](/docs/hub/configuration), and the [Hub public API](/docs/hub/api).
|
|
|
|
## Connecting to a remote daemon
|
|
|
|
The global `--host` option accepts either a local target (`host:port`, a unix socket, or a Windows pipe) or a pairing offer URL, the same `https://app.paseo.sh/#offer=...` link the mobile app uses for QR pairing. With an offer URL the CLI connects through the Paseo relay with end-to-end encryption, so you can drive a daemon on another machine without exposing it to the network.
|
|
|
|
Get an offer URL from the daemon you want to control:
|
|
|
|
```bash
|
|
paseo daemon pair # prints the QR and link when relay is enabled
|
|
paseo daemon pair --relay # enables relay without prompting
|
|
paseo daemon pair --json # structured output; never prompts
|
|
```
|
|
|
|
Relay is off for new installations. A disabled relay returns a `RELAY_DISABLED` error; pass `--relay` to provide explicit consent. For a stopped home, pairing is labelled offline; `--relay` saves relay enablement and the offer includes a start instruction. A live but unreachable home never falls back to an offline identity. Relay pairing is end-to-end encrypted. See [Security](/docs/security).
|
|
|
|
Use it from anywhere:
|
|
|
|
```bash
|
|
paseo --host 'https://app.paseo.sh/#offer=eyJ2IjoyLC...' ls
|
|
paseo --host "$OFFER_URL" run "fix the failing tests"
|
|
```
|
|
|
|
You can also set it once via `PASEO_HOST` instead of passing `--host` on every command. An explicit flag overrides the environment variable.
|
|
|
|
## Multi-agent workflows
|
|
|
|
The CLI is designed to be used by agents themselves. You can instruct an agent to spawn sub-agents for parallel work:
|
|
|
|
```bash
|
|
# Agent A spawns Agent B and waits for it
|
|
agent_id=$(paseo run --no-wait --quiet --title api-agent "implement the API")
|
|
paseo wait "$agent_id"
|
|
paseo logs "$agent_id" --tail 5
|
|
```
|
|
|
|
Because Agent A's ID is present in the environment, Agent B is created as its subagent in the same workspace unless `--workspace` is specified.
|
|
|
|
Simple implement + verify loop:
|
|
|
|
```bash
|
|
# Requires jq
|
|
while true; do
|
|
paseo run --provider codex "make the tests pass" >/dev/null
|
|
|
|
verdict=$(paseo run --provider claude --output-schema '{"type":"object","properties":{"criteria_met":{"type":"boolean"}},"required":["criteria_met"],"additionalProperties":false}' "ensure tests all pass")
|
|
if echo "$verdict" | jq -e '.criteria_met == true' >/dev/null; then
|
|
echo "criteria met"
|
|
break
|
|
fi
|
|
done
|
|
```
|
|
|
|
This pattern enables hierarchical task decomposition, a lead agent can break down work, delegate to specialists, and synthesize results.
|
|
|
|
## Output formats
|
|
|
|
Most commands support multiple output formats for scripting:
|
|
|
|
```bash
|
|
paseo ls --json # JSON output
|
|
paseo ls --format yaml # YAML output
|
|
paseo ls -q # IDs only (quiet)
|
|
```
|
|
|
|
## Global options
|
|
|
|
- `--host <target>`, connect to a different daemon (`host:port`, unix socket, or `https://app.paseo.sh/#offer=...` for relay). See [Connecting to a remote daemon](#connecting-to-a-remote-daemon).
|
|
- `--json`, JSON output
|
|
- `-q, --quiet`, minimal output
|
|
- `--no-color`, disable colors
|