2026-07-22 10:55:17 +08:00
# `@deepseek-ai/dsh`
2026-07-26 05:03:53 +08:00
English | [中文 ](README.zh.md )
docs(python): define the standalone minimal profile
Record sdk-minimal as the narrow repository-owned exception to base-first profile composition: callers still launch only dsh and cannot provide an arbitrary Cordis tree, while the shipped bundle may own a complete explicit roster. Cross-link the launcher, profile-bundle, Python-runtime, minimal-agent, snapshot, and telemetry decisions; the supersession audit keeps each older note active because its remaining rationale is independent.
Update the CLI, architecture, Python tutorial/reference, example, runtime-wheel reference, and bundle documentation. The docs distinguish the full sdk profile from sdk-minimal, explain explicit-home/plugin/patch customization, state the minimal permission and persistence choices, and retain the separately packaged web profile and frontend assets for direct dsh use.
Correct dsh-base descriptions to cover base-backed profiles, make SDK startup configuration visible in the generated config catalog, add sdk-minimal to the module graph, and regenerate the base-composition graph. English and Chinese pairs are re-recorded at the exact reviewed contents.
2026-08-24 15:39:43 +08:00
The `dsh` command is the sole supported Node application launcher: profiles are ordered stacks of plugin-bundle patch layers under the user's own overrides. SDK and ACP are profiles, not separate public bins. The Python runtime wheel packages this same command; the SDK defaults to `sdk` , and the minimal example selects `sdk-minimal` . [`src/args.ts` ](src/args.ts ) owns the command grammar, and [`src/bin.ts` ](src/bin.ts ) loads only the selected runner. Invalid commands, options from another mode, configuration errors, and boot failures exit nonzero.
2026-07-22 10:55:17 +08:00
2026-08-05 12:46:38 +08:00
## Entry modes
2026-07-30 06:00:53 +08:00
2026-08-05 12:46:38 +08:00
| Command | Purpose |
|---|---|
2026-08-06 04:40:32 +08:00
| `dsh --profile <name>` | Boot the named profile under `$DSH_HOME/profiles/<name>` . |
2026-08-23 01:44:10 +08:00
| `dsh --profile acp` | Serve automation clients over ACP stdio until disconnect. |
2026-08-13 00:36:22 +08:00
| `dsh --profile headless "job"` | Run one fresh persisted session, print the final answer, and exit. |
2026-08-23 01:44:10 +08:00
| `dsh --profile sdk` | Serve SDK clients over JSON-RPC stdio until shutdown or disconnect. |
docs(python): define the standalone minimal profile
Record sdk-minimal as the narrow repository-owned exception to base-first profile composition: callers still launch only dsh and cannot provide an arbitrary Cordis tree, while the shipped bundle may own a complete explicit roster. Cross-link the launcher, profile-bundle, Python-runtime, minimal-agent, snapshot, and telemetry decisions; the supersession audit keeps each older note active because its remaining rationale is independent.
Update the CLI, architecture, Python tutorial/reference, example, runtime-wheel reference, and bundle documentation. The docs distinguish the full sdk profile from sdk-minimal, explain explicit-home/plugin/patch customization, state the minimal permission and persistence choices, and retain the separately packaged web profile and frontend assets for direct dsh use.
Correct dsh-base descriptions to cover base-backed profiles, make SDK startup configuration visible in the generated config catalog, add sdk-minimal to the module graph, and regenerate the base-composition graph. English and Chinese pairs are re-recorded at the exact reviewed contents.
2026-08-24 15:39:43 +08:00
| `dsh --profile sdk-minimal` | Serve SDK clients with the standalone minimal agent tree. |
2026-08-06 20:52:26 +08:00
| `dsh web` | Alias of `--profile web` . |
2026-08-06 04:40:32 +08:00
| `dsh plugin --profile <name> <pnpm args>` | Manage a profile's plugins by forwarding to pnpm in the profile directory. |
2026-07-31 14:28:52 +08:00
docs(python): define the standalone minimal profile
Record sdk-minimal as the narrow repository-owned exception to base-first profile composition: callers still launch only dsh and cannot provide an arbitrary Cordis tree, while the shipped bundle may own a complete explicit roster. Cross-link the launcher, profile-bundle, Python-runtime, minimal-agent, snapshot, and telemetry decisions; the supersession audit keeps each older note active because its remaining rationale is independent.
Update the CLI, architecture, Python tutorial/reference, example, runtime-wheel reference, and bundle documentation. The docs distinguish the full sdk profile from sdk-minimal, explain explicit-home/plugin/patch customization, state the minimal permission and persistence choices, and retain the separately packaged web profile and frontend assets for direct dsh use.
Correct dsh-base descriptions to cover base-backed profiles, make SDK startup configuration visible in the generated config catalog, add sdk-minimal to the module graph, and regenerate the base-composition graph. English and Chinese pairs are re-recorded at the exact reviewed contents.
2026-08-24 15:39:43 +08:00
The invoking directory is the default workspace root. The `web` , `headless` , `sdk` , `sdk-minimal` , and `acp` profiles auto-initialize on first use from shipped templates; any other profile must be created through `dsh plugin` .
2026-08-06 20:52:26 +08:00
## App arguments
2026-08-10 21:49:11 +08:00
The launcher parses only its own flags and hands everything after them to the booted profile, where any injected app plugin may parse the shared immutable snapshot ([`dsh-cmdline` ](../../packages/boot/cmdline/README.md )). Launcher flags therefore come first, and the first token the launcher does not recognize starts the app's arguments:
2026-08-06 20:52:26 +08:00
```sh
dsh --profile web --port 8080 # --port belongs to the web app
2026-08-12 17:18:59 +08:00
dsh --profile tui --resume < id > # example, assuming the tui profile is installed; --resume belongs to the terminal app
2026-08-06 20:52:26 +08:00
dsh --profile headless "run the tests"
dsh --profile web --help # the web app's flags, not the launcher's
dsh --help # the launcher's own help
```
2026-07-30 06:00:53 +08:00
2026-08-06 04:40:32 +08:00
## Profiles
feat(cli): even out the shipped tool rosters across both surfaces
The two shipped surfaces offered different tools for no recorded reason:
session checkpoints, tool-result pruning, the goal tools, and Ralph were in
`tui.cordis.yml`; `tool-todo` and web search were in `web.cordis.yml`. Neither
offered session search, a string-replacement editor, or a repeat-tool guard,
though none of the three is surface-specific.
Move the rows that are not surface-specific into `base.cordis.yml` and add
those three. Web search moves there too — the TUI decision the change that
made it a Web default deferred. Both surfaces now assemble the same 27 tools.
This adds only. No row is removed from either surface and no existing row's
configuration is edited: executors, sandbox composition, access defaults,
`tools.mode`, and the workflow tool are exactly what they were. Two rows stay
surface-specific: `tmux-context` (no terminal multiplexer in a browser) and
`session-reference` (its index has one writer owner).
Ship `dsh-mcp-client` as a dependency without a row: the plugin mounts one
server per instance and `command` is required, so a default would name a
third-party server and spawn it outside `ctx.bash` on every launch. The CLI
README carries the YAML for mounting one from a personal config.
2026-07-31 13:42:51 +08:00
2026-08-23 01:43:24 +08:00
A profile directory holds a `package.json` (out-of-tree plugin dependencies plus the profile manifest `dsh.profile` with its ordered `bundles` list and `patchReload` lifecycle) and a `cordis.patch.yml` (the user's own patch layer). `patchReload: live` watches the profile and home-level patch files; `startup` applies them once.
2026-08-12 15:01:46 +08:00
The tree composes over an empty root:
- each bundle's patch in `dsh.profile.bundles` order
- then the profile's `cordis.patch.yml` , then the home-level `$DSH_HOME/cordis.patch.yml`
2026-08-12 17:18:59 +08:00
- then `--patch` overlays
2026-08-12 15:01:46 +08:00
docs(python): define the standalone minimal profile
Record sdk-minimal as the narrow repository-owned exception to base-first profile composition: callers still launch only dsh and cannot provide an arbitrary Cordis tree, while the shipped bundle may own a complete explicit roster. Cross-link the launcher, profile-bundle, Python-runtime, minimal-agent, snapshot, and telemetry decisions; the supersession audit keeps each older note active because its remaining rationale is independent.
Update the CLI, architecture, Python tutorial/reference, example, runtime-wheel reference, and bundle documentation. The docs distinguish the full sdk profile from sdk-minimal, explain explicit-home/plugin/patch customization, state the minimal permission and persistence choices, and retain the separately packaged web profile and frontend assets for direct dsh use.
Correct dsh-base descriptions to cover base-backed profiles, make SDK startup configuration visible in the generated config catalog, add sdk-minimal to the module graph, and regenerate the base-composition graph. English and Chinese pairs are re-recorded at the exact reviewed contents.
2026-08-24 15:39:43 +08:00
Bundles named in `dsh.profile.bundles` resolve from the dsh installation first (`@deepseek-ai/dsh-base` , `@deepseek-ai/dsh-web-app` , `@deepseek-ai/dsh-headless` , `@deepseek-ai/dsh-sdk-app` , `@deepseek-ai/dsh-sdk-minimal` , `@deepseek-ai/dsh-acp-app` ), then from the profile's own `node_modules` , where pnpm installs out-of-tree plugins.
2026-08-12 15:01:46 +08:00
Use `--dump-default-config` and `--dump-config` to inspect the composed tree without booting it.
2026-07-26 14:47:41 +08:00
2026-08-10 15:20:52 +08:00
The [CLI behavior reference ](reference/README.md ) owns exact layer precedence, flags, shutdown behavior, deployment defaults, and source execution.
2026-07-22 10:55:17 +08:00
2026-08-24 10:00:15 +08:00
## Optional overlays
`config/examples/` ships opt-in overlays for GitHub review webhooks, session-local Schedule, memory MCP servers, and runtime Cordis tools. They are never part of a default profile; the [user guides ](../../docs/user/guide/index.md ) and [developer practice guides ](../../docs/user/develop/practice/index.md ) own setup and safety instructions.
2026-08-05 12:46:38 +08:00
## Development
2026-07-22 10:55:17 +08:00
2026-08-12 11:57:02 +08:00
Production runs require built package and frontend artifacts. From the repository root, run `pnpm run build` separately, then use `pnpm dsh <args...>` to run the TypeScript entry and forward every argument; the [source-execution reference ](reference/README.md#source-execution ) owns the module-resolution contract.