feat(config): expand per-project overlay to cover provider, sandbox, approval, mcp_path, max_subagents, allow_shell (#485)
The project-config overlay (`<workspace>/.deepseek/config.toml` merged on top of the user's global `~/.deepseek/config.toml`) was already wired but only carried four string fields: model, api_key, base_url, reasoning_effort. The use cases users actually file under #485 — "this repo wants a different sandbox / approval policy / MCP server set / hard sub-agent cap" — weren't covered. ### What ships Adds the following keys to the project overlay, all merged with identical "non-empty wins" semantics for strings: - `provider` — pick a different backend per repo (e.g. `nvidia-nim` for an enterprise repo, `deepseek-cn` for a CN-team repo). - `approval_policy` — `never` / `on-request` / `untrusted` for repos with strict policies. - `sandbox_mode` — `read-only` / `workspace-write` / `danger-full-access`. - `mcp_config_path` — per-repo MCP server set without touching the user's global file. - `notes_path` — keep notes in-repo for projects where the notes tool is part of the dev workflow. Plus two non-string fields: - `max_subagents` (positive integer; clamped to `1..=MAX_SUBAGENTS=20`). - `allow_shell` (bool). ### What stays user-global `skills_dir`, `hooks`, `[capacity]`, `[retry]`, `[memory]`, etc. — those are user-shaped settings, not repo-shaped. If a future use case demands per-project values for any of them, a follow-up PR can extend the overlay rather than letting the boundary blur. ### Tests - 8 new tests in `project_config_tests` covering: provider+model, approval+sandbox, max_subagents+allow_shell, max_subagents clamping, negative-max_subagents rejection, missing config file pass-through, malformed TOML pass-through, and empty-string no-op. ### Docs - New "Per-project overlay (#485)" section in `docs/CONFIGURATION.md` with a table of supported keys and the rationale for which fields stay user-global. ### Verification cargo fmt --all -- --check ✓ cargo clippy --workspace --all-targets --all-features --locked -- -D warnings ✓ cargo test --workspace --all-features --locked ✓ 1828 + supporting (was 1820) Closes #485 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,6 +18,37 @@ Overrides:
|
||||
|
||||
If both are set, `--config` wins. Environment variable overrides are applied after the file is loaded.
|
||||
|
||||
### Per-project overlay (#485)
|
||||
|
||||
When the TUI starts in a workspace that contains a
|
||||
`<workspace>/.deepseek/config.toml` file, the values declared in that
|
||||
file are merged on top of the global config. This lets a repo lock its
|
||||
own provider, model, sandbox policy, or approval policy without
|
||||
touching the user's `~/.deepseek/config.toml`. Pass
|
||||
`--no-project-config` to skip the overlay for one launch.
|
||||
|
||||
Supported keys in the project overlay (top-level fields only):
|
||||
|
||||
| Key | Effect |
|
||||
|---|---|
|
||||
| `provider` | switch backend (e.g. `"nvidia-nim"` for an enterprise repo) |
|
||||
| `model` | override `default_text_model` |
|
||||
| `api_key` | use a per-repo key (typically read from `.env`, **not committed**) |
|
||||
| `base_url` | point at a self-hosted endpoint |
|
||||
| `reasoning_effort` | force `"high"` / `"max"` for a complex repo |
|
||||
| `approval_policy` | `"never"` / `"on-request"` / `"untrusted"` for opinionated repos |
|
||||
| `sandbox_mode` | `"read-only"` / `"workspace-write"` / `"danger-full-access"` |
|
||||
| `mcp_config_path` | per-repo MCP server set |
|
||||
| `notes_path` | keep notes in-repo |
|
||||
| `max_subagents` | clamp concurrency for a constrained repo (clamped to 1..=20) |
|
||||
| `allow_shell` | gate shell tool access on `false` |
|
||||
|
||||
The overlay is intentionally narrow — it covers the fields a repo
|
||||
maintainer is most likely to want to standardize across contributors.
|
||||
Other settings (skills_dir, hooks, capacity, retry, etc.) stay
|
||||
user-global. If your repo needs more, file an issue describing the
|
||||
specific use case.
|
||||
|
||||
The `deepseek` facade and `deepseek-tui` binary share the same config file for
|
||||
DeepSeek auth and model defaults. `deepseek login --api-key ...` writes the
|
||||
root `api_key` field that `deepseek-tui` reads directly, and `deepseek --model
|
||||
|
||||
Reference in New Issue
Block a user