Config
Global config lives at ~/.workset/config.yaml and stores defaults, repo aliases, templates, and workspace registry entries.
Workspace config lives at <workspace>/workset.yaml and is the source of truth for a workspace.
If you have an existing config at ~/.config/workset/config.yaml, Workset migrates it to ~/.workset/config.yaml on next load.
defaults.workspace can point to a registered workspace name or a path. When set, workspace commands use it if -w is omitted.
defaults.repo_store_root is where URL-based repos are cloned when added to a workspace.
Remote names and default branches come from repo aliases (repos.<name>.remote / repos.<name>.default_branch) or from defaults.remote / defaults.base_branch. For local repos, the configured remote must exist or Workset errors.
Global config (~/.workset/config.yaml)
Top-level keys
| Key | Description |
|---|---|
defaults |
Global defaults for commands and workspace behavior. |
github |
GitHub auth defaults and overrides. |
hooks |
Hook execution defaults and repo trust list. |
repos |
Named repo aliases for URL or local path. |
workspaces |
Registry of named workspaces and their paths. |
defaults
| Field | Description |
|---|---|
remote |
Default remote name for repos (used when aliases omit one). |
base_branch |
Default branch for new worktrees. |
workspace |
Default workspace name or absolute path. |
workspace_root |
Base directory for new workspaces. |
repo_store_root |
Where URL-based repos are cloned. |
session_backend |
Default session backend (auto, tmux, screen, exec). |
session_name_format |
Format string for session names (supports {workspace}). |
session_theme |
Optional session theme for tmux/screen (workset to enable built-in theme). |
session_tmux_status_style |
Override tmux status-style when a session theme is enabled. |
session_tmux_status_left |
Override tmux status-left when a session theme is enabled. |
session_tmux_status_right |
Override tmux status-right when a session theme is enabled. |
session_screen_hardstatus |
Override screen hardstatus when a session theme is enabled. |
agent |
Default agent for PR text generation, commit messages, and the GUI terminal launcher. Supported values: codex, claude. |
agent_model |
Optional model override for PR text generation and commit messages (does not affect the terminal launcher). Examples: gpt-5.1-codex-mini (Codex), haiku (Claude). |
terminal_idle_timeout |
Idle timeout for GUI terminals/sessiond (duration like 30m; use 0 to disable). Default is 0. |
terminal_protocol_log |
Enable sessiond protocol logging (on/off). Requires daemon restart. |
terminal_debug_overlay |
Show the terminal debug overlay (on/off). |
hooks
| Field | Description |
|---|---|
enabled |
Enable hook execution (default true). |
on_error |
Default hook error handling (fail or warn). |
repo_hooks.trusted_repos |
Repo names whose .workset/hooks.yaml can run without prompting. |
github
| Field | Description |
|---|---|
cli_path |
Optional override for the gh CLI path (useful for Nix or custom installs). |
Session themes
Session theming is opt-in. Set defaults.session_theme to workset to apply the built-in status line to tmux/screen sessions. Use the override fields to customize the tmux or screen values.
For screen, the session_screen_hardstatus value is passed to screen -X hardstatus and split on whitespace, so keep it in the same format you would use in a hardstatus line.
repos entries
| Field | Description |
|---|---|
url |
Git URL to clone. |
path |
Local repo path (saved as absolute). |
remote |
Remote name for this repo alias (defaults to defaults.remote). |
default_branch |
Default branch for this repo alias. |
workspaces entries
| Field | Description |
|---|---|
path |
Workspace path. |
Example (global)
defaults:
remote: origin
base_branch: main
workspace: core
workspace_root: ~/.workset/workspaces
repo_store_root: ~/.workset/repos
agent: codex
# agent_model: gpt-5.1-codex-mini
terminal_idle_timeout: "0"
terminal_protocol_log: off
terminal_debug_overlay: off
session_backend: auto
session_name_format: workset-{workspace}
# optional: enable built-in session theme for tmux/screen
session_theme: workset
# optional: override tmux or screen status lines
# session_tmux_status_style: "bg=colour235,fg=colour250"
# session_tmux_status_left: " #[fg=colour39]workset #[fg=colour250]#S "
# session_tmux_status_right: " #[fg=colour244]%Y-%m-%d %H:%M "
# session_screen_hardstatus: "alwayslastline workset %n %t %=%H:%M %d-%b-%y"
hooks:
enabled: true
on_error: fail
repo_hooks:
trusted_repos: [platform]
repos:
platform:
url: git@github.com:org/platform.git
remote: origin
default_branch: main
# local repos use "path" (relative paths are resolved to absolute on save)
local-repo:
path: /Users/sean/src/local-repo
remote: origin
default_branch: main
workspaces:
core:
path: ~/.workset/workspaces/core
## Repo hooks (`.workset/hooks.yaml`)
Each repo worktree can define hooks under `.workset/hooks.yaml`. These run when workset creates a new worktree (event: `worktree.created`).
```yaml
hooks:
- id: bootstrap
on: [worktree.created]
run: ["npm", "ci"]
cwd: "{repo.path}"
on_error: fail
## Workspace config (`<workspace>/workset.yaml`)
### Top-level fields
| Field | Description |
| --- | --- |
| `name` | Workspace display name. |
| `repos` | List of repo entries in the workspace. |
### `repos` entries
| Field | Description |
| --- | --- |
| `name` | Repo alias name. |
| `repo_dir` | Directory name under the workspace. |
| `local_path` | Path to the repo's main working copy. |
| `managed` | `true` if Workset owns the clone. |
| `remote` | Derived from the repo alias or defaults (not stored in workspace config). |
| `default_branch` | Derived from the repo alias or defaults (not stored in workspace config). |
## Example (workspace)
```yaml
name: feature-policy-eval
repos:
- name: platform
repo_dir: platform
local_path: /Users/sean/src/platform
managed: false
# remote + default_branch are derived from alias/defaults
local_path points at the repo's main working copy. When a repo is added from a URL, Workset clones it into defaults.repo_store_root and marks it managed: true.