<img src="/logos/apple-touch-icon.png" alt="Dench" width="32" height="32">

# Dench CLI

Generated from the command registry, native file-command contracts and saved-setup parsers. Run `dench <command> --help` for arguments and flags. API-only upload phases and compatibility aliases are not standalone commands.

Use `dench context --sections organisation,user,memory` for knowledge, `dench memory` for facts, `dench env` for explicitly saved executable setups, and `dench secrets` for encrypted credentials. `dench cron secret` signs inbound webhooks; it does not store service credentials.

## Reusable setups

```text
dench env — verified setups reused across chats

  dench env list [--limit N] [--cursor CURSOR] [--json]
  dench env show NAME [--revision SHA256] [--json]
  dench env save NAME --path DIRECTORY [--wait SECONDS | --no-wait] [--json]
  dench env run NAME [--revision SHA256] [--state-key KEY] [--prepare-local] [--json] -- COMMAND [ARGS...]
  dench env delete NAME [--json]

Save requires dench-env.json, SKILL.md, an explicit files allowlist and verify
commands. Credentials, caches and symlinks are excluded from source uploads.
Save returns an authoritative preparation receipt; default observation is 10s.
Ready runs reuse prepared dependencies. --prepare-local explicitly prepares a
separate local platform cache once; ordinary ready runs never reinstall.
State is job-local by default; choose an explicit state key to share it.
Example: dench env run openai-report -- node report.mjs
```

```text
dench secrets — workspace-shared encrypted credentials

  dench secrets set NAME --stdin [--kind env|file] [--expected-version N] [--json]
  dench secrets set NAME --file PATH [--kind env|file] [--expected-version N] [--json]
  dench secrets list [--json]
  dench secrets delete NAME [--expected-version N] [--json]

Values are accepted only through stdin or a file. Values are never printed.
Bind a stored name in dench-env.json secretEnv or secretFiles; env run injects
only those bindings. Memory is not credential storage. --kind defaults to env.
Example: dench secrets set OPENAI_API_KEY --stdin < /private/path/key.txt
```

See [ENVIRONMENTS.md](ENVIRONMENTS.md) for the manifest, preparation lifecycle, state and security rules.

## Workspace files

Workspace paths are POSIX paths under /workspace; /reports/a.md and /workspace/reports/a.md address the same file.

These commands read or update workspace storage. Use dench stage to upload local files or directories.

### files ls

List workspace files; the default path is /.

```text
dench files ls [<path>] [--recursive|-r] [--json]
```

--recursive (or -r) includes descendants.

```sh
dench files ls /reports --recursive --json
```

### files cat

Read a workspace file's inline text.

```text
dench files cat <path> [--json]
```

Use cat for virtual files such as IDENTITY.md and ORGANISATION.md, which have no download blob.

For binary files or files without inline text, use files download.

```sh
dench files cat /reports/summary.md
```

### files write

Write a workspace file's text from stdin.

```text
dench files write <path> [--json]
```

The destination path is required. Pipe or redirect the raw UTF-8 file text into stdin.

--json controls the result format; stdin is file content, not an API JSON envelope. No --stdin, --content or --file flag is supported.

Writing replaces the complete text; empty stdin writes an empty file.

```sh
dench files write /reports/summary.md --json < ./summary.md
printf '%s\n' 'Report ready.' | dench files write /reports/summary.md --json
```

### files mv

Move or rename a workspace file or directory.

```text
dench files mv <src> <dst> [--json]
```

Both paths refer to workspace storage, not local disk.

```sh
dench files mv /reports/draft.md /reports/summary.md --json
```

### files rm

Remove a workspace file or directory.

```text
dench files rm <path> [--recursive|-r] [--json]
```

Directories require --recursive (or -r). An absent path is already removed.

```sh
dench files rm /reports/old --recursive --json
```

### files download

Download workspace bytes to local disk, or print a signed URL.

```text
dench files download <path> [<local-dest>] [--url] [--json]
```

Without --url, downloads directories recursively and defaults the local destination to the path's basename (/ becomes workspace).

--url prints a short-lived signed URL for one stored file instead of saving locally; local-dest is unused in this mode.

```sh
dench files download /reports/summary.pdf ./summary.pdf --json
dench files download /reports/summary.pdf --url --json
```


## Supported command index

This is an operation index, not a promise that a command has no required arguments. Local-only entries identify their execution boundary.

| Command | Purpose |
| --- | --- |
| `dench env list` | List workspace-shared reusable setups and ready revisions (metadata only). |
| `dench env show` | Inspect a saved setup, its manifest, and an optional immutable revision. |
| `dench env save` | Publish an explicitly saved source and manifest for one-time preparation. Returns pending/building until verified; does not run the task. |
| `dench env delete` | Retire a saved setup from new selection; retain immutable revisions and active job evidence. |
| `dench env run` | Run a command with prepared dependencies and declared credentials, saving declared state with a revision check. |
| `dench secrets list` | List workspace-shared credential names, kinds and versions; never values. |
| `dench secrets set` | Encrypt a workspace credential. Use CLI stdin or the secure chat form; return metadata only. Do not put values in chat, manifests or scripts. |
| `dench secrets delete` | Revoke a workspace credential for future resolution, optionally checking its version. |
| `dench campaign draft` | Create an idempotent empty campaign draft with the caller's available sender pools. Does not launch or send. |
| `dench campaign search` | Search people by filters without adding CRM records or campaign recipients. Search credits apply; this is not a free provider preview. |
| `dench campaign add --search` | Search and add up to 50 people to an existing campaign. New identities become Leads. Search credits apply; use nextPageToken for another page. |
| `dench campaign add --people-file` | Add up to 50 selected recipients without another search. Deduplicates, applies suppression, and preserves the campaign's launch state. |
| `dench campaign sources get` | Read a campaign's saved signal source, targeting and schedule. |
| `dench campaign sources signals` | Read signal choices, suggested terms and current source configuration. |
| `dench campaign sources set` | Update source cadence, pause/resume, targeting, signals or terms. Active sources may perform billable future work. |
| `dench campaign sources preview` | Preview a signal source using its current audience. Provider credits may apply; does not enroll people. |
| `dench campaign sources run` | Run a live campaign's signals now instead of waiting for the schedule (Run now). Provider credits apply; limited to 6 runs an hour. |
| `dench campaign sources overview` | Read the Sources tab: each signal's status, last and next run, people found and anything needing attention. |
| `dench campaign sources pending` | List people a signal found who are waiting for approval (manual approval mode). |
| `dench campaign sources approve\|reject` | Approve people waiting for review (they start the sequence) or reject them. |
| `dench campaign queue` | Today's queue: who the campaign plans to contact today, warmest first, within the senders' limits. |
| `dench campaign builder profile` | Read the company profile and suggested campaign audience. |
| `dench campaign builder save` | Save a signal campaign's audience, signals and terms idempotently. Does not start a build. |
| `dench campaign builder get` | Read signal build progress, preview people, messages and errors. |
| `dench campaign builder build` | Start the same billable signal/audience/message build used by the UI; poll the draft for progress. |
| `dench campaign builder create` | Create a campaign from a reviewed signal draft. Does not launch the campaign. |
| `dench campaign builder opener` | Edit or reset one preview person's opening line before creating the campaign. |
| `dench campaign builder drafts` | List saved, unfinished campaign drafts that can be resumed. |
| `dench campaign builder resume` | Read a saved draft's setup (source, name, targeting, signals, terms, lookalike) to resume it. |
| `dench campaign builder discard` | Discard a saved draft that has not become a campaign. |
| `dench campaign builder outreach` | Save a draft's Outreach and Review choices: AI or manual steps, the brief, the steps, who sends and when, and auto or manual approval. |
| `dench campaign builder sequence` | Generate the draft's sequence from a brief (goal, problem, tone, channels), as Generate sequence does. AI credits apply. |
| `dench campaign builder lookalike` | Set up a lookalike from the best lead's LinkedIn URL (role, similar roles, place, industry, similar companies), suggest roles again, or re-scope to a company. Nothing is saved. Provider credits apply. |
| `dench campaign builder voices` | Suggest market voices (LinkedIn experts) for the campaign's topics, to watch with voice_engagement. AI credits apply. |
| `dench campaign builder autofill` | Turn an audience description into targeting filters. AI credits apply. |
| `dench campaign builder estimate` | Estimate audience or weekly signal volume using the UI's cached estimator. Provider credits may apply. |
| `dench help` | List all CLI/API operations and parity classifications. |
| `dench signin` | Create an agent sign-in request. |
| `dench signin --email` | Start the email OTP sign-in flow. |
| `dench sessions` | List local CLI sessions. |
| `dench use <session-key-or-workspace-slug>` | Select a local CLI session. |
| `dench logout` | Remove local CLI sessions. |
| `dench backend show\|set\|clear` | Configure the CLI backend target. |
| `dench context --sections` | Read selected scoped workspace documents and a compact context index without writes. |
| `dench context` | Return the current Dench workspace context for the bearer. |
| `dench context --instructions` | Return the current workspace's standing instructions for external agents. |
| `dench status` | Return workspace and agent status. |
| `dench agents` | List agents visible in the workspace status payload. |
| `dench approvals` | List approval requests visible in the workspace status payload. |
| `dench artifacts` | List artifacts for the authenticated workspace. |
| `dench suggested-work` | List draft suggested-work artifacts. |
| `dench lists` | List saved searches (find-result lists) in the workspace, newest first. |
| `dench lists rows` | Read saved rows with current enrichment results and original indices; cursor-paged, without repeating a search. |
| `dench lists enrich` | Buy contact details for 1–100 saved profiles and save them to the list. Skips fields already found, looked up empty, or in flight. Requires a signed-in member or their personal agent. |
| `dench artifacts import` | Explicitly import selected saved profiles, optionally filtered by enrichment, with a configured Lead status. Reuses CRM records; never sends outreach or triggers conversion. |
| `dench lists show` | Get one saved search / list by artifact id. |
| `dench lists save` | Save find results as a named list (rows + filters become a workspace artifact). |
| `dench lists update` | Update a saved list in place (title, filters, and/or replacement rows). |
| `dench lists rename` | Rename a saved search / list. |
| `dench lists delete` | Delete a saved search / list, its exported CSV/JSONL files, and any linked watch. |
| `dench lists reviews` | Read durable enrichment activity (legacy review metadata remains readable). Use lists rows for current saved profiles and contacts. |
| `dench lists assess` | Suggest ICP fit for one profile. Never changes a human review decision. |
| `dench memory search` | Search durable workspace memory. |
| `dench memory save` | Save a durable workspace memory fact. |
| `dench approval request` | Request human approval. |
| `dench approval approve\|reject` | Record an approval decision. |
| `dench billing status` | Get billing and AI credit status. |
| `dench billing topup` | Create an AI credit top-up checkout link. |
| `dench upgrade` | Create a workspace upgrade checkout link. |
| `dench chat list` | List past chat threads. |
| `dench chat search` | Search past chat messages. |
| `dench chat read` | Read a past chat thread. |
| `dench chat tree` | Read the parent-child chat thread hierarchy. |
| `dench chat rename` | Rename one or more chat threads. |
| `dench chat delete` | Delete one or more chat threads. |
| `dench chat new` | Start a new chat-turn workflow. |
| `dench chat send` | Send a message to an existing chat thread. |
| `dench chat follow` | Follow a live chat response stream. |
| `dench crm objects list [--with-references]` | List CRM objects. |
| `dench crm objects list --compact` | List names, display labels, visibility and workspace counts without internal state. |
| `dench crm objects get` | Get a CRM object. |
| `dench crm objects create` | Create a CRM object. |
| `dench crm objects update` | Update a CRM object. |
| `dench crm objects rename` | Rename a CRM object. |
| `dench crm objects delete` | Delete a CRM object. |
| `dench crm objects archive` | Hide a CRM object's workspace sidebar row for the whole workspace. Not a delete — the table keeps working. Admin-only. |
| `dench crm objects unarchive` | Restore a CRM object's workspace sidebar row. Admin-only. |
| `dench crm views list` | List the saved views on a CRM object (plus the active view). |
| `dench crm views get` | Get one saved view's definition by name. |
| `dench crm views entries` | Materialize a saved view's rows (applies its filters/sort/pins), paginated. |
| `dench crm views create` | Create a saved view (named filters/sort/columns combo) on a CRM object. |
| `dench crm views update` | Replace a saved view's definition (upsert by name). |
| `dench crm views rename` | Rename a saved view in place — keeps its filters, pins, and sidebar slot. |
| `dench crm views delete` | Delete a saved view by name (idempotent). |
| `dench crm views archive` | Move a pinned view's sidebar row into the Archived flyout. Admin-only. |
| `dench crm views unarchive` | Restore a view's sidebar row (re-asserts its pin). Admin-only. |
| `dench crm sidebar list` | Describe the workspace sidebar: Library rows in tree order (with their groups), the home-level Pinned strip, what is hidden and why, and whether the caller is an admin. |
| `dench crm sidebar move` | Reposition one Library row (or group) among the Library's top-level slots. Does not add a home-level Pinned tab. Workspace-shared; admin-only. |
| `dench crm sidebar group create` | Create a named sidebar group (e.g. "Hiring") in the workspace-shared Library. Open to any member. |
| `dench crm sidebar group rename` | Rename a sidebar group. Open to any member. |
| `dench crm sidebar group delete` | Dissolve a sidebar group; its rows return to the top level in its slot. Open to any member. |
| `dench crm sidebar group add` | Move a sidebar row into a group (groupId set) or back to the top level (groupId null). Open to any member. |
| `dench crm sidebar pin` | Pin (pinned true) or unpin a Library row — or a whole group — on the home-level Pinned shortcut strip (the "tab on the left"). Does not move the row inside Library. Workspace-shared; open to any member. |
| `dench crm fields list` | List fields for a CRM object, including read-only calculation metadata. |
| `dench crm fields list --compact` | List field names, types and effective constraints without indexing or enrichment internals. |
| `dench crm fields create` | Create a CRM field or read-only campaign activity boolean column. |
| `dench crm fields update` | Update a CRM field or change/explicitly clear an existing campaign calculation. |
| `dench crm fields delete` | Delete a CRM field. |
| `dench crm fields reorder` | Reorder CRM fields. |
| `dench crm fields enum-reorder` | Reorder enum values. |
| `dench crm fields enum-add` | Add an enum value. |
| `dench crm fields enum-remove` | Remove an enum value. |
| `dench crm fields enum-rename` | Rename an enum value. |
| `dench crm fields enum-set-color` | Set an enum color. |
| `dench crm entries list [--with-references]` | List CRM entries. |
| `dench crm entries get` | Get a CRM entry. |
| `dench crm entries sync-history` | Queue a full, paged pull of the record's email history from every connected mailbox; the ledger fills as pages land. |
| `dench crm entries sync-history --status` | Has Dench read this record's email history? One row per address per mailbox. |
| `dench crm entries dossier` | Status of the account's research dossier — the delimited `dench:dossier` section Dench keeps in the record's Notes: status, when it was written, how many dated updates followed, the last error. |
| `dench crm entries dossier --regenerate` | Research the account again and append a fresh dossier section to its Notes (needs a Website / Domain on the record). |
| `dench crm privacy status` | Whether the caller hides their own emails / messages with this record from the workspace (directly, or through its account), and whether they own a connection the toggle applies to. |
| `dench crm privacy hide\|show` | Hide (`hidden: true`) or show the caller's own emails / messages with this record to the workspace. An account covers every contact and opportunity linked to it; existing ledger rows are restamped and the shared Brief regenerates. |
| `dench crm detections list` | List account-detection verdicts — why a domain (or personal address) did or did not become an account: verdict, counterparty type, probabilities, evidence threads, the rows created. `kind` picks the creator: `detections` (email + sweep), `linkedin` (the LinkedIn resolver's rows) or `all` (default). Newest first. |
| `dench crm detections undo` | Undo what the ingestion jobs created since a timestamp (admin): `kind` = `detections` (accounts + contacts from the email detector and the sweep), `linkedin` (the LinkedIn resolver's contacts + accounts; their conversations are unlinked and parked), `email-tasks` (auto-created tasks and cases) or `all` (default). Deletes only rows no human has touched and marks the verdicts / decisions rolled_back so they are never re-created. `dryRun` lists what would go; per-kind counts in `kinds`. |
| `dench crm history` | List a CRM entry's audit history. |
| `dench crm activity` | List a CRM entry's activity ledger (comments, notes, field changes, emails, meetings, Slack, LinkedIn) in one timeline, newest first by default. |
| `dench crm brief` | The record's generated Brief: health, who owes the next move, open threads, commitments, risks, next step. Read this before the ledger. |
| `dench crm context` | Read-only source diagnostics: accessible evidence, association reasons, last Brief source manifest, generation queue, and your mailbox delivery health. Bounded, cursor-paged snapshot; does not certify complete history. |
| `dench crm brief --regenerate` | Rebuild a record's Brief from the current timeline. |
| `dench crm notes list` | List a CRM entry's notes (titled, document-style comments), newest first. |
| `dench crm notes create` | Add a titled note to a CRM entry's activity timeline (markdown body). Research goes here, never into the Notes document. |
| `dench crm comments list` | List comments on a CRM entry (roots newest first, with preview replies). |
| `dench crm comments replies` | List every reply under a root comment, oldest first. |
| `dench crm comments get` | Get one comment with its entry label. |
| `dench crm comments create` | Comment on a CRM entry (markdown). Mention members with [@Name](/?member=<userId>); mention Dench with [@Dench](/?member=dench) or mentionDench. |
| `dench crm comments update` | Edit a comment you wrote. |
| `dench crm comments delete` | Delete a comment (kept as a tombstone when it has replies). |
| `dench crm comments react` | Toggle an emoji reaction on a comment. |
| `dench crm watch status` | Whether you follow a CRM entry's activity. |
| `dench crm watch` | Follow or unfollow a CRM entry's activity. |
| `dench crm tasks mine --page` | Page assigned tasks in priority order (or completed tasks by recency). |
| `dench crm tasks list --page` | Page all tasks linked to a record, including subtasks. |
| `dench crm tasks prepare` | Start or resume preparation of exact task ordering and progress. |
| `dench crm tasks mine` | Your open tasks (plus ones completed today). |
| `dench crm tasks list` | Tasks linked to a CRM entry. |
| `dench crm tasks create` | Create a task linked to a CRM entry. |
| `dench crm tasks complete` | Mark a task done. |
| `dench crm tasks reopen` | Reopen a completed task. |
| `dench crm tasks priority` | Set or clear a task's priority. |
| `dench crm tasks subtasks` | A task's subtasks. |
| `dench crm tasks create-subtask` | Create a subtask under a task (inherits the parent's record relations). |
| `dench crm tasks parent` | Nest a task under a parent, or promote it (parentEntryId: null). |
| `dench crm tasks delete` | Delete a task and its subtasks, or keep them as tasks. |
| `dench crm tasks repeat` | How a task repeats (rule, RRULE, trigger, ends, next due). |
| `dench crm tasks repeat --off` | Stop a task repeating (past occurrences are kept). |
| `dench crm tasks repeat --skip` | Skip the current occurrence: the next one is created now. |
| `dench crm tasks repeat --pause` | Pause a repeating task. |
| `dench crm tasks repeat --resume` | Resume a paused repeating task. |
| `dench crm tasks series` | Every repeating-task series in the workspace. |
| `dench crm tasks series <seriesId> --occurrences` | Every occurrence (task) of one series. |
| `dench crm entries create` | Create a CRM entry. |
| `dench crm entries create-many` | Create many CRM entries. |
| `dench crm entries update` | Update a CRM entry. |
| `dench crm entries update-many` | Update many CRM entries. |
| `dench crm entries delete` | Delete a CRM entry. |
| `dench crm entries bulk-delete` | Bulk delete CRM entries. |
| `dench crm cells get` | Get a CRM cell value. |
| `dench crm cells set` | Set a CRM cell value. |
| `dench crm cells set-many` | Set many CRM cell values. |
| `dench crm cells append` | Append to a CRM cell. |
| `dench crm query [--with-references]` | Query CRM entries. |
| `dench crm query --page` | Scan CRM entries with a resumable cursor. Empty filtered pages can have more results. |
| `dench crm sql` | Run CRM SQL-compatible query. |
| `dench crm aggregate` | Aggregate CRM entries. |
| `dench crm search [--with-references]` | Search CRM entries. |
| `dench crm search --page` | Search bounded pages of readable CRM entries, optionally projecting cells. Always follow continueCursor until isDone. |
| `dench crm statuses list` | List CRM statuses. |
| `dench crm statuses set` | Set CRM statuses. |
| `dench crm batch` | Apply a CRM batch. |
| `dench crm transaction begin` | Begin a CRM transaction. |
| `dench crm transaction add` | Add an operation to a CRM transaction. |
| `dench crm transaction commit` | Commit a CRM transaction. |
| `dench crm transaction abort` | Abort a CRM transaction. |
| `dench crm transaction inspect` | Inspect a CRM transaction. |
| `dench crm docs list` | List CRM documents. |
| `dench crm docs create` | Create a CRM document. |
| `dench crm docs link` | Link a CRM document. |
| `dench crm docs delete` | Delete a CRM document page; its workspace file stays and nested pages move up. |
| `dench crm actions list` | List CRM actions. |
| `dench crm actions create` | Create or upsert an action button on a named action column (fieldName is the column header; a column can hold multiple buttons — reuse fieldName to add more). |
| `dench crm actions edit` | Update an action button on a CRM field. |
| `dench crm actions delete` | Delete an action button from a CRM field. |
| `dench crm actions run` | Run a CRM action on one or more entries. |
| `dench members list` | List workspace members for CRM user fields. |
| `dench members presence` | Live presence (online / away / offline) for workspace members. |
| `dench members get` | A member's profile: name, email, tagline, role, timezone, presence, open task count. |
| `dench members activity` | A member's recent comments and record changes across the CRM, newest first. |
| `dench members tasks` | Open tasks assigned to a member (plus ones completed today). |
| `dench members me` | Your own member profile. |
| `dench members me --name … --tagline … --timezone …` | Update your name, tagline, avatar URL, or timezone. |
| `dench members me --avatar <file>` | Get a one-time URL to POST an avatar image to; then PUT /me/avatar with the returned storageId. |
| `dench members me --clear-avatar` | Remove your avatar. |
| `dench crm reports generate` | Generate a CRM report. |
| `dench crm analytics get` | Read an object's analytics dashboard: panels, field roles, the strip's collapsed flag, the named view's own dashboard (if any), and the fields panels may bucket on (synthetic $createdAt / $location last). |
| `dench crm analytics compute` | Compute chart-ready results (buckets / series / values) for the stored dashboard, a subset of its panels, or ad-hoc panel definitions — optionally scoped to a saved view, a period preset (with the previous interval as previousValue) and extra filters. Same query the strip renders from. |
| `dench crm analytics save` | Create or update one panel (upsert by id). With viewName the write lands on that saved view's own dashboard, forking a copy if it was still inheriting the object's. |
| `dench crm analytics update` | Edit part of one stored panel: only the keys in `patch` change (title, type, metric, metricField, groupBy, dateField, dateBucket, filters, derived, span, hidden, sortOrder); null clears an optional key. What the card's ⋮ menu writes. |
| `dench crm analytics hide` | Take a chart off the strip above the table (hidden: true). It stays in the full analytics view, counted by the strip's “+N more”. |
| `dench crm analytics show` | Bring a hidden chart back onto the strip (hidden: false). |
| `dench crm analytics resize` | Set a card's width on the 6-track dashboard grid: span 2 (third), 3 (half), 4 (two thirds), 6 (full), or null for the chart kind's default. |
| `dench crm analytics delete` | Delete one panel (idempotent). Template panels are tombstoned so a re-install never resurrects them. |
| `dench crm analytics reorder` | Persist the full panel order. panelIds must name every stored panel of the targeted dashboard. |
| `dench crm analytics roles` | Set the object's analytics setup — the field roles shared by every chart and view (amount, stage, won/lost/converted values, stageProbabilities, closeDate, recurrence, owner, location). Replaces the mapping; with merge: true only the keys given change and null clears one. |
| `dench crm analytics collapse` | Collapse the analytics strip above the object's table (team-shared, like saved views). |
| `dench crm analytics expand` | Expand the analytics strip above the object's table. |
| `dench crm analytics scope` | Give a saved view its own dashboard (mode "own": starts as a copy of the object's panels) or hand it back to the object's shared one (mode "shared"). |
| `dench crm enrich cell` | Request enrichment for one CRM cell. |
| `dench crm enrich object` | Request enrichment for a CRM object. |
| `dench crm people search` | Search for people through the enrichment gateway. `companyDomains` takes up to 1000 domains (e.g. a resolved company list; `dench leads find --company-list <id\|view>` resolves one for you) — the gateway fans large lists out as sequential vendor-safe chunks behind one `nextPageToken` stream. |
| `dench crm companies search` | Search for companies through the enrichment gateway (also `dench companies find`). |
| `dench jobs find` | Search job postings through Dench find. `companyDomains` takes up to 1000 domains (chunked automatically); `dench jobs find --company-list <id\|view>` resolves a saved company list into it. |
| `dench crm enrich profiles` | Look up up to 100 people or company profiles without buying emails or phones. Pass kind (people\|companies) and lookups; results preserve inputIndex. People require linkedinUrl or email; companies require domain or linkedinUrl. |
| `dench companies related` | Read company employees, founders, funding, investors, acquisitions, or investments. Pass domain or linkedinUrl, kind, limit (1–100), and optional pageToken. Does not import CRM records or buy contacts. |
| `dench leads find --limit 1` | Preview how many records a find would return. |
| `dench leads filters` | List Lead Finder filter vocabularies: exact enum values (seniorities, functions, industries, headcount, company types, languages) and curated suggestions (titles, locations, company HQ, universities, skills, keywords). |
| `dench crm templates list` | List one-click CRM templates (objects + automations + sample rows) with per-workspace installed flags. |
| `dench crm templates install` | Install a CRM template. Idempotent: re-installs top up missing pieces and never duplicate objects, automations, or sample rows. |
| `dench crm templates remove-sample-data` | Delete a CRM template's sample rows (tagged "Sample"); schema, views, and automations stay. |
| `dench crm automations list` | List deterministic CRM automations (rules that fire inside entry writes, e.g. qualified prospect → opportunity). |
| `dench crm automations enable\|disable` | Enable or disable a CRM automation. |
| `dench crm import` | Import a local CSV into a CRM object. |
| `dench crm export` | Export a CRM object to a local CSV. |
| `dench meetings list` | List meetings, newest first, with status and participants. |
| `dench meetings transcript get` | Read a meeting's transcript, in order, one page at a time. |
| `dench meetings transcript set` | Append up to 500 transcript segments to a meeting (speakers with an email link to existing people). |
| `dench meetings transcript clear` | Delete a batch of a meeting's transcript segments; repeat until `done` before re-appending. |
| `dench meetings action-items list` | List a meeting's action items. |
| `dench meetings action-items set` | Add action items to a meeting; `replace: true` swaps the whole list. |
| `dench meetings action-items done` | Tick or untick one action item. |
| `dench meetings action-items delete` | Delete one action item. |
| `dench meetings participants list` | Who was in the meeting, merged with the linked calendar invite. |
| `dench meetings participants set` | Record attendees by name/email; known members and existing people are linked, nobody is created. |
| `dench meetings share` | Whether a meeting is shared with the whole workspace, and whether you may change that. |
| `dench meetings share --workspace` | Share one meeting with the workspace, or take it back to owner + invitees. |
| `dench meetings import` | Import calls from a local CSV/JSONL: meeting fields plus transcript, action items and attendees per row. |
| `dench email identity verify` | Start Dench Emailing Service sender verification. |
| `dench email identity status --identity-id` | Refresh a Dench Emailing Service sender verification status. |
| `dench email identity status` | Read Dench Emailing Service sender verification status. |
| `dench email identity list` | List the workspace's email sending identities. |
| `dench email identity dns` | Fetch DNS records (DKIM/SPF/DMARC) for a pending domain sender verification. |
| `dench email identity disable` | Soft-disable a sender (or every sender on a domain) for the workspace; sends are blocked until restored. |
| `dench email identity restore` | Restore a previously disabled sender for the workspace. |
| `dench email identity delete` | Permanently delete a sender (or every sender on a domain) from the workspace; re-adding it requires verification from scratch. |
| `dench email inbox search` | Search authorized synced mailbox headers with bounded cursor pagination. isDone covers stored records, not provider completeness. |
| `dench email inbox thread` | Read a bounded page of synced headers using an exact thread handle from inbox search; bodies remain on demand. |
| `dench email inbox message` | Read a bounded stored body using an exact message handle from inbox search; rechecks mailbox and record privacy. |
| `dench email draft create` | Create an editable Dench email draft and synchronize its selected native mailbox asynchronously. Use a stable requestId for retries. |
| `dench email draft show` | Read an email draft, eligible senders and provider sync status. |
| `dench email draft senders` | List native mailboxes this caller may use. |
| `dench email draft update` | Save draft content using expectedRevision; sender changes require a new draft after provider binding. |
| `dench email draft send` | Send the current Dench draft revision through its native mailbox. Repeated requests share a durable receipt. |
| `dench email draft attach` | Upload attachment bytes authorized against this draft before adding its storage reference. |
| `dench email draft signature` | Load the selected mailbox signature for explicit visible insertion. |
| `dench email send [--mailbox <id/email>]` | Send through a native Gmail or Outlook mailbox with a durable request receipt. Only use for an explicit send request. |
| `dench email send --from <verified-email>` | Send one raw email (no campaign): to/cc/bcc, custom from-name and reply-to, optional reply threading via replyToMessageId. |
| `dench email message status` | Read a raw email message's status and open/click counters. |
| `dench email message list` | List recent raw email messages for the workspace. |
| `dench email template create` | Create a managed email campaign template. |
| `dench email template preview` | Preview a managed email campaign template. |
| `dench email campaign create` | Create a managed email campaign draft from a connected inbox or verified sender. |
| `dench email campaign status` | Read campaign status and counters. |
| `dench email campaign recipients add` | Add recipients to a managed email campaign. |
| `dench email campaign preview` | Preview rendered messages for a campaign sample. |
| `dench email campaign submit` | Submit a campaign for approval or sending. |
| `dench email campaign pause` | Pause a sending email campaign. |
| `dench email campaign resume` | Resume a paused email campaign. |
| `dench email campaign cancel` | Cancel an email campaign. |
| `dench email campaign list` | List managed email campaigns (paginated, optional status filter). |
| `dench email campaign recipients list` | List a campaign's recipients (paginated, optional status filter). |
| `dench email campaign recipients add-from-object` | Add campaign recipients from a CRM object: pick the object, the email field, and the entry ids. |
| `dench email sequence create` | Create a follow-up sequence from a connected inbox or verified sender. |
| `dench email sequence update` | Update a sequence's name, sender, or reply/stop settings. |
| `dench email sequence activate` | Activate a sequence so its enrollments begin sending. |
| `dench email sequence deactivate` | Deactivate a sequence (pause sending, revert to draft). |
| `dench email sequence archive` | Archive a sequence (stops all sending). |
| `dench email sequence list` | List the workspace's follow-up sequences. |
| `dench email sequence status` | Read a sequence with its ordered steps. |
| `dench email sequence steps add` | Add a step (subject, body, and wait delay) to a sequence. |
| `dench email sequence steps update` | Update a sequence step's subject, body, or delay. |
| `dench email sequence steps remove` | Remove a step from a sequence. |
| `dench email sequence steps reorder` | Reorder a sequence's steps. |
| `dench email sequence enroll` | Enroll explicit recipients into a sequence. |
| `dench email sequence enroll-from-object` | Enroll people from a CRM object: pick the object, the email field, and the entry ids. |
| `dench email sequence enrollments list` | List a sequence's enrollments (paginated, optional status filter). |
| `dench email sequence enrollment pause` | Pause one enrollment. |
| `dench email sequence enrollment resume` | Resume one paused enrollment. |
| `dench email sequence enrollment stop` | Stop one enrollment (no further steps send). |
| `dench campaign accounts` | Discover LinkedIn sender ids, labels, availability and remaining capacity visible to the acting workspace member. Never returns provider credentials. |
| `dench campaign list [--with-references]` | List outreach campaigns (archived ones on request). |
| `dench campaign create` | Create a draft outreach campaign with email and LinkedIn sender pools and a business-hours send window in the given timezone. |
| `dench campaign duplicate` | Copy a campaign into a new draft named "<name> copy": the same steps, schedule, sender pools and personalized lines, its lead source paused, and no people. To reach more than 300 people, duplicate and add the next page of the search to the copy. |
| `dench campaign get` | Read a campaign: settings, steps, people, their current step and hold, last touches, linked leads. |
| `dench campaign pipeline` | Where a campaign's people sit in the workspace's lead pipeline right now: each lead Status in order with how many enrolled leads are at it, and how many have no lead or a status outside the pipeline. |
| `dench campaign set` | Change a campaign's name, sender pools, send windows, daily email cap, stop-on-reply, start or end. Works until archived; existing conversations keep their assigned sender. |
| `dench campaign steps set` | Replace every step of a draft campaign (email, wait, LinkedIn visit, connection request, message, post reaction, InMail, If / else, Wait for them to accept). A workflow (stepModel workflow, or steps with key, next, yesNext or noNext) branches: condition and wait_for_connection steps continue on yesNext or noNext, other steps on next; each points at another step's key or end. Steps are checked first: a field the step type would drop, missing text, {TOKEN} single braces or paths that don't hold together are rejected, not saved. Configure sender pools on the campaign; step sender ids are legacy-only. |
| `dench campaign steps edit` | Edit the text, waits and conditions of a launched (or paused) campaign's steps in place. Each step keeps its id, type and place; pass the stepId and the updatedAt you read, and only the fields you change. A workflow keeps its paths and what each If / else checks (key, next, yesNext, noNext, check, conditionField, conditionOperator); conditionValue and acceptance waits stay editable. Messages already sent or being prepared keep their text; drafts use campaigns.steps.replace. |
| `dench campaign personalize get` | Read a campaign's personalized lines (written for each person): their {{keys}} for steps, instructions and fallbacks, how many people have them, and the cost per person. |
| `dench campaign personalize set` | Define up to 5 personalized lines (each used as {{key}} in steps) and what you sell. Saving starts writing missing lines for up to 100 people, about 3 cents a person; for more it returns needsConfirm and writes nothing until campaigns.personalization.write is confirmed. |
| `dench campaign personalize clear` | Turn off a campaign's personalized lines and cancel the ones not yet written. Refused while a step still uses one of the {{keys}}. |
| `dench campaign personalize write` | Write personalized lines for the people missing them (mode missing) or rewrite everyone's (mode all). Rewriting everyone or more than 100 people returns needsConfirm and the estimate until called with confirmed: true. |
| `dench campaign personalize edit` | Set one person's personalized line by hand; an empty value undoes the edit. Braces are removed and text past the line's length is cut. |
| `dench campaign personalize rewrite` | Write a fresh personalized line for one person: one key, or all of their lines when key is left out. About 3 cents. |
| `dench campaign add` | Add CRM records (up to 100 ids per call) to a campaign; returns how many were added and why others were skipped. |
| `dench campaign add --name` | Add one person by email and/or LinkedIn profile URL. |
| `dench campaign preview` | Show the message one person gets at one email or LinkedIn step, with their fields and personalized lines filled in: subject, body, sender, recipient, merge fields still missing, warnings, and why the step would be skipped. Nothing is sent, prepared or charged. |
| `dench campaign launch --check` | Launch readiness without launching: blockers grouped by problem, warnings, and the fingerprint `launch` requires. |
| `dench campaign launch` | Launch a ready draft. Pass the fingerprint from the preview and acknowledge the LinkedIn notice when LinkedIn steps exist. |
| `dench campaign pause` | Pause an active campaign. |
| `dench campaign resume` | Resume a paused campaign. |
| `dench campaign archive` | Archive a campaign and stop everyone still in flight. This is the app's Delete: campaigns are never erased, and their people, leads and activity stay. |
| `dench campaign events` | The campaign's activity log, newest first (sent, accepted, replied, skipped, failed, paused, stopped). |
| `dench campaign stop` | Stop one person: nothing more is sent to them from this campaign. |
| `dench campaign resume-person` | Resume one paused person in an active campaign. |
| `dench campaign person set --email` | Give a person in a draft campaign a new or corrected email address; their linked CRM record gets it too. Only before launch; another person in the campaign can't share it. |
| `dench campaign person set --linkedin-url` | Give a person in a draft campaign a new or corrected LinkedIn profile URL; their linked CRM record gets it too. Only before launch. |
| `dench campaign person set --field` | Fill or fix one {{merge field}} for a person in a draft campaign, e.g. a missing Company that blocks launch; a matching column on their CRM record is updated too. Only before launch; written personalized lines are not merge fields and can't be set here. |
| `dench campaign resume-person --all` | Resume every paused person in an active campaign at once, e.g. after a sending account is reconnected. Returns how many were resumed. |
| `dench campaign sync` | Fill each unfinished person's empty email, LinkedIn URL, name and merge fields from their linked CRM record, e.g. after enriching the records. Never overwrites a value the campaign already has; returns how many people changed. |
| `dench campaign where` | The campaigns a CRM record (a person or a lead) is in, newest first, with the person's status in each and the accounts that send to them. |
| `dench campaign person show` | Everything a campaign did for one person, step by step: what was sent (subject and text), whether it was opened or clicked, what was skipped and why, waits, failures and retries. |
| `dench campaign remove` | Remove a person who was never contacted from a draft campaign. Frees their place in the 300-person cap and keeps the draft launchable; stop anyone already contacted instead. |
| `dench cron list` | List routines. |
| `dench cron history` | List routine run history. |
| `dench cron get` | Get a routine. |
| `dench cron create` | Create a routine. |
| `dench cron update` | Update a routine. |
| `dench cron delete` | Delete a routine. |
| `dench cron enable` | Enable a routine. |
| `dench cron disable` | Disable a routine. |
| `dench cron run` | Run a routine now. |
| `dench cron runs` | List runs for a routine. |
| `dench files ls [<path>] [--recursive\|-r] [--json]` | List workspace files; the default path is /. |
| `dench files cat <path> [--json]` | Read a workspace file's inline text. |
| `dench files write <path> [--json]` | Write a workspace file's text from stdin. |
| `dench files download <path> [<local-dest>] [--url] [--json]` | Download workspace bytes to local disk, or print a signed URL. |
| `dench files rm <path> [--recursive\|-r] [--json]` | Remove a workspace file or directory. |
| `dench files mv <src> <dst> [--json]` | Move or rename a workspace file or directory. |
| `dench stage` | Stage uploaded content into the workspace. |
| `dench fs` | Run the local file sync daemon. |
| `dench search` | Search the web through the Dench gateway. |
| `dench search contents` | Fetch page contents through the Dench gateway. |
| `dench search answer` | Answer a question with web search. |
| `dench web scrape` | Read a page as clean Markdown through Dench web. |
| `dench web brand` | Look up a brand kit from a domain or email. |
| `dench web sitemap` | List sitemap URLs for a domain. |
| `dench web crawl` | Crawl a site to Markdown (capped). |
| `dench web screenshot` | Capture a rendered page screenshot. |
| `dench web extract` | Extract typed fields from a page using a JSON Schema. |
| `dench web product` | Extract a product listing from a URL. |
| `dench web competitors` | Find competitors of a domain. |
| `dench web styleguide` | Read a brand styleguide from a domain. |
| `dench web fonts` | Read site fonts from a domain. |
| `dench web classify` | Classify a domain with NAICS or SIC. |
| `dench web brand-search` | Autocomplete brand names. |
| `dench image generate` | Generate an image through the Dench gateway. |
| `dench image edit` | Edit an image through the Dench gateway. |
| `dench integrations` | List every connected integration — connected apps plus the Gmail, Outlook, Calendar, LinkedIn and Slack connections Dench provides itself (Slack rows report source: dench). |
| `dench apps list` | List installed App Store apps in the workspace. |
| `dench apps gallery` | List Discover listings — Official (Dench) + Community shelves. |
| `dench apps create` | Scaffold and register a new App Store app. |
| `dench apps install` | Install an App Store listing into the workspace. |
| `dench apps publish` | Publish an app's files as a versioned App Store listing. |
| `dench apps uninstall` | Uninstall an app from the workspace. |
| `dench apps enable` | Enable or disable an installed app. |
| `dench apps pin` | Pin or unpin an installed app in the rail. |
| `dench apps validate` | Validate a .dench.app folder: manifest, permissions, and every window.dench call it makes. |
| `dench apps webhooks register` | Register an inbound webhook for an app. Returns the URL and signing secret ONCE. |
| `dench apps webhooks list` | List an app's registered webhooks (URLs, never secrets). |
| `dench apps webhooks poll` | Read events an app webhook received since a timestamp. |
| `dench apps webhooks delete` | Remove an app webhook and every event it stored. |
| `dench tool status` | List connected tool accounts. |
| `dench tool connect` | Create a tool OAuth connection link. Slack is in-house, never a third-party connection: for toolkit slack the CLI prints the first-party install URL (/api/slack/install?slug=<workspace>, org admin) instead of calling this endpoint. |
| `dench tool search` | Search for external tool actions. |
| `dench tool run` | Run an external tool action. SLACK_* slugs (SLACK_SEND_MESSAGE with Block Kit blocks/buttons, SLACK_FETCH_HISTORY, SLACK_LIST_CHANNELS, …) run through Dench's in-house Slack app install — any channel in the connected workspace — and are always preferred over any third-party Slack connection. |
| `dench tool disconnect` | Disconnect an external tool account. |
| `dench tool labels` | List human names given to connected accounts. |
| `dench tool label` | Name a connected account, or clear its name with an empty string. |
| `dench browser` | Drive Dench Browser with a single interactive action (open, inspect, click, fill, type, screenshot, stop). Pass the step in `action` plus its arguments. |
| `dench browser session create` | Create a Dench Browser session and return a CDP connect URL for Playwright (chromium.connectOverCDP) plus a live-view URL. Use for durable scripts run from the sandbox. |
| `dench browser session status` | Get the status, connect URL, and live-view URL for a Dench Browser session. |
| `dench browser session stop` | Stop a Dench Browser session and release the remote browser. |
| `dench context --sections identity` | Read IDENTITY.md. |
| `dench context set identity` | Update IDENTITY.md. |
| `dench context --sections organisation` | Read ORGANISATION.md. |
| `dench context set organisation` | Update ORGANISATION.md. |
| `dench context --sections user` | Read USER.md. |
| `dench context set user` | Update USER.md. |
| `dench context --sections tools` | Read tool notes. |
| `dench context set tools` | Update tool notes. |
| `dench context set rules` | Update standing workspace rules; credentials belong in secrets and runnable setup in environments. |
| `dench model default` | Set the default chat model. |
| `dench model thread` | Set a thread model override. |
| `dench notifications list` | List your notifications (inbox, unread, archived, or all). |
| `dench notifications count` | How many unread notifications you have. |
| `dench notifications read` | Mark a notification read (or unread). |
| `dench notifications read-all` | Mark every inbox notification read. |
| `dench notifications archive` | Archive a notification. |
| `dench notifications prefs` | Read your notification preferences. |
| `dench notifications prefs --set` | Update your notification preferences. |
| `dench settings sync` | Read the workspace's Sync switches (accounts from email, contacts from LinkedIn, Slack Connect, calendar, dossier, tasks from email, lead auto-qualify, summaries and Brief). All on by default. |
| `dench settings sync set` | Flip Sync switches (admin). Partial patch: only the keys sent change. Off stops new work; nothing already created is removed. |

## Compatibility

Existing identity/organisation/user/tools aliases still address the same stored documents. Prefer `dench context --sections …` and `dench context set …`. Aggregate `dench mem` and bootstrap endpoints remain compatibility readers/writers while existing clients migrate; they are not the recommended memory API. Existing history is retained. No `dench agent spawn/await/message/wait-message/pause/resume/continue/tree` commands exist; use the harness subagent tools or supported `dench chat` commands.
