Skip to content

feat: persistent saved workspaces with multi-root paths and in-modal CRUD #28

@steven-pribilinskiy

Description

@steven-pribilinskiy

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions