Problem
Today w opens a text-input modal asking for a path. The user types or tab-completes a directory, the scan switches to it, and on the next launch git-scope forgets — the path isn't persisted, the workspace can't be edited or named, and there's no way to keep a list of commonly-used roots.
For users who context-switch between distinct project trees (work / personal / OSS / a specific microservice cluster), having to retype the path every relaunch is friction. Multi-root workspaces aren't supported at all — you can only switch to one path.
Proposal
Replace the one-shot text-input with a saved workspaces picker, persisted in state.json alongside the worktree toggle.
Schema (state.json)
{
"workspaces": [
{ "label": "Cloudbeds tools", "paths": ["~/projects/cloudbeds/tools"] },
{ "label": "OSS dev tools", "paths": ["~/projects/oss/devtools", "~/projects/oss/ai-agents"] }
],
"active_workspace": "Cloudbeds tools"
}
- Each workspace is
{label, paths}. paths is a list — one workspace can group multiple roots.
active_workspace is the label of the workspace whose paths are currently driving cfg.Roots; empty means "Default (config.yml roots)".
UX
w opens a list-style picker. Row 0 is an implicit "Default (config.yml roots)"; rows 1..N are the saved workspaces. The active one is marked with a green dot, the cursor starts on it.
- ↑↓ navigate, Enter switch,
a add, e edit, d delete (with one-key y confirm), Esc close.
- Add/edit form: two fields (label + comma-separated paths). Tab cycles, Enter saves. Paths are
~-expanded and existence-checked before save.
- The last switched workspace is auto-restored on next launch so git-scope boots into the same view the user left.
Implementation note
Switching a workspace updates cfg.Roots and runs the same refreshScanCmd everything else uses — so cache invalidation (different roots → cache miss), worktree-toggle semantics, and SWR all just work without a workspace-specific code path.
Happy to send a PR — already have a branch ready.
Problem
Today
wopens a text-input modal asking for a path. The user types or tab-completes a directory, the scan switches to it, and on the next launch git-scope forgets — the path isn't persisted, the workspace can't be edited or named, and there's no way to keep a list of commonly-used roots.For users who context-switch between distinct project trees (work / personal / OSS / a specific microservice cluster), having to retype the path every relaunch is friction. Multi-root workspaces aren't supported at all — you can only switch to one path.
Proposal
Replace the one-shot text-input with a saved workspaces picker, persisted in
state.jsonalongside the worktree toggle.Schema (state.json)
{ "workspaces": [ { "label": "Cloudbeds tools", "paths": ["~/projects/cloudbeds/tools"] }, { "label": "OSS dev tools", "paths": ["~/projects/oss/devtools", "~/projects/oss/ai-agents"] } ], "active_workspace": "Cloudbeds tools" }{label, paths}.pathsis a list — one workspace can group multiple roots.active_workspaceis the label of the workspace whosepathsare currently drivingcfg.Roots; empty means "Default (config.yml roots)".UX
wopens a list-style picker. Row 0 is an implicit "Default (config.yml roots)"; rows 1..N are the saved workspaces. The active one is marked with a green dot, the cursor starts on it.aadd,eedit,ddelete (with one-keyyconfirm), Esc close.~-expanded and existence-checked before save.Implementation note
Switching a workspace updates
cfg.Rootsand runs the samerefreshScanCmdeverything else uses — so cache invalidation (different roots → cache miss), worktree-toggle semantics, and SWR all just work without a workspace-specific code path.Happy to send a PR — already have a branch ready.