DevSpaces provides a predictable and repeatable way to work with multi-repo projects.
Define Stacks, store configuration in a Stacks Repo, then you and your team can easily discover, create and refine Workspaces,
effortlessly handling multi-repo cloning, layout, post-clone commands, tasks, and extensions — all automatically.
No more manual steps. No more inconsistent environments. No more day-1 dev blues. Just open, run, and build.
If like us you've tried submodules, monorepos, and custom scripts - you'll find this hurts quite a bit less.
Features
- Capture and discover Stacks with details on project type, supported IDEs, platforms, and steward
- Fetch Stack definitions from a git repo, and choose a Stack to create a Workspace from
- Clone all repos for that Stack as siblings inside the Workspace, inc. bundling additional remotes
- Open the Workspace in the current or new window
- Run post-clone commands (inc those in
tasks.json), e.g. bun: install
- Install extensions
auto | prompt | none from the root repo's .vscode/extensions.json
- Refresh from the Stacks repo on demand
Setup
If your team is already using DevSpaces:
- Install UNIVERSALS.DevSpaces from the VS Code Marketplace
- Press
F1 to open the command palette, then UNIVERSALS.DevSpaces: Create Workspace from Stack
- Provide your Stacks git URL when prompted (you'll need to ask your team for this)
- Choose a Stack
- Wait for the Stack to be setup See Logging, and you'll be prompted to open the new workspace
- Dev happy!
Stacks Repo
If you're the first in your team to use DevSpaces, you'll need to create a Stacks repo first:
- Create a new git repo somewhere accessible to your team (GitHub, Azure DevOps, etc)
- Copy over
sample-stacks-repo/stacks
- Edit/ copy
JSON files to define your Stacks
Stack Defs
A Stack Def is a json file in your Stacks repo that describes an IDE setup, primarily a set of git repos for a Workspace.
Each corresponds to one Stack and will be displayed in the Stack Picker when creating a new Workspace. A Stack Def can include:
- an optional
type, ide, platforms, and steward to help identify it
- an optional
folders array to pre-create directories in the Workspace root
- N repos, each with a
name and url field which can
- define additional remotes via
remotes array
- specify a
folder to control where it's cloned relative to Workspace root
- run
setupTask (matching a VS Code task label in .vscode/tasks.json) or setupCommand (string or array), to auto-run post-clone
- control setup prompting with
setupMode: "prompt" | "auto" | "none"
- declare
extensions and control install prompting via extensionsMode: "prompt" | "auto" | "none" (host repo's .vscode/extensions.json also honored if present)
Logging
DevSpaces writes activity to its own Output Channel. Open via the View > Output menu (or Ctrl/ Cmd+Shift+U)
then pick UNIVERSALS.DevSpaces from the dropdown that normally shows Tasks or Git.
Errors during clone/ configuration are shown there in detail. DevSpaces also surfaces toasts for important notifications and critical failures.
Commands
Within the UNIVERSALS.DevSpaces extension, via the command palette (F1) you can also Refresh Stacks from Repo, and Switch Stacks Branch.
Commands manipulate configuration items universalsDevSpaces, stacksRepoUrl, stacksRepoRef, stacksRepoPath, and defaultRoot.
Known Issues
- Access control for private repos is assumed; probably fine most of the time
- No support for resync; if you change a Stack Def, current practice is to delete and recreate using DevSpaces
Development
UNIVERSALS.DevSpaces is in preview; feedback welcome. Source is on git, PRs welcome too.
The solution is built using Bun, to set up a dev env:
bun install
bun compile
You can then run a VS Code Extension Dev Host via F5.
License
UNIVERSALS is a META/FURY Venture, and is licensed under CCL-1.0. See https://ccl.fyi/license for details.