A PowerShell module for launching pre-configured multi-pane Windows Terminal workspaces for developer projects. A single command opens a new terminal tab with a Claude Code session, an interactive shell, and an optional dev server pane — all pointed at the right project directory.
- PowerShell 7.0+
- Windows Terminal (
wt.exein PATH) - Claude Code CLI (see below)
Clone this repo into a folder on your PowerShell module path. To see your module paths:
$env:PSModulePath -split ';'Place it so the folder is named DevWorkspace under one of those paths, e.g.:
Documents\PowerShell\Modules\DevWorkspace\
Open your profile file:
notepad $PROFILEAdd the following, adjusting the path to match your machine:
# Root directory where all your source repos are cloned
$global:CodeHome = 'D:\Code'
# Claude Code account aliases
# These must point to the claude CLI using the correct account
$ClaudePersonalConfig = "$HOME\.claude-personal"
$ClaudeWorkConfig = "$HOME\.claude-work"
function claude-personal {
$env:CLAUDE_CONFIG_DIR = $ClaudePersonalConfig
claude @args
Remove-Item Env:\CLAUDE_CONFIG_DIR -ErrorAction SilentlyContinue
}
function claude-work {
$env:CLAUDE_CONFIG_DIR = $ClaudeWorkConfig
claude @args
Remove-Item Env:\CLAUDE_CONFIG_DIR -ErrorAction SilentlyContinue
}
$global:CodeHomeis required. All project paths in the module are built relative to it, so the config works across machines without changes.
Add this to your profile to auto-load the module in every session:
Import-Module DevWorkspaceOr import manually when needed:
Import-Module DevWorkspaceWhen the module loads, it populates $global:Project with paths to all configured projects. You can use this anywhere in your shell:
# Navigate to a project
cd $global:Project.VisorApi
cd $global:Project.NnfDbSpa
# Open in VS Code
code $global:Project.DataHub
# Pass to a command
git -C $global:Project.VisorSpa log --oneline -10Each project has a Setup-* alias that opens a new Windows Terminal tab with the full dev layout:
Setup-VisorSpa # Vue SPA — includes npm dev server pane
Setup-VisorApi # .NET API — includes dotnet watch pane
Setup-NnfDb # Launches both NnfDbSpa and NnfDbApi setups
Setup-NnfDbSpa
Setup-NnfDbApi
Setup-DataHub
Setup-Saps
Setup-Wra
Setup-CalsAdTools # No dev server pane (editor + shell only)
Setup-Bitemark # Monorepo — two-tab 4-pane layout (see below)
Setup-MusicMatrix # Monorepo — two-tab 4-pane layout (see below)Each single-project command opens a tab with:
| Pane | Content |
|---|---|
| Left | Claude Code (fresh session) |
| Top-right | Interactive shell at the project directory |
| Bottom-right | Dev server (npm run dev or dotnet watch) — if configured |
Repos where the API and SPA live under a single root (e.g. bitemark, musicmatrix) use
Invoke-MonorepoDevSetup, which opens two tabs:
-
Tab 1 — a single full-tab Claude Code session rooted at the repo.
-
Tab 2 — a 2×2 grid of shells:
Pane Content Upper-left API command shell Lower-left API dev server ( dotnet watch)Upper-right SPA command shell Lower-right SPA dev server ( npm run dev)
$global:Project = @{
# ... existing entries ...
MyApp = Join-Path $global:CodeHome 'github.com\myorg\my-app'
}function Invoke-MyAppSetup {
[CmdletBinding()]
param()
Invoke-AppDevSetup `
-TabColor $script:TabColor.FrontEnd `
-ClaudeAccount $script:ClaudeAccount.Work `
-WorkingDirectory $global:Project.MyApp `
-IncludeDevServerPane `
-DevServerCommand "Invoke-NpmDev -WorkingDirectory '$($global:Project.MyApp)'"
}
New-Alias -Name Setup-MyApp -Value Invoke-MyAppSetup -ForceOmit -IncludeDevServerPane and -DevServerCommand for projects with no dev server.
For a monorepo (API + SPA under one root), add the root, API, and SPA paths to the config and
call Invoke-MonorepoDevSetup instead:
function Invoke-MyMonorepoSetup {
[CmdletBinding()]
param()
Invoke-MonorepoDevSetup `
-TabColor $script:TabColor.Neutral `
-ClaudeAccount $script:ClaudeAccount.Personal `
-RepoDirectory $global:Project.MyApp `
-ApiDirectory $global:Project.MyAppApi `
-SpaDirectory $global:Project.MyAppSpa `
-ApiDevServerCommand "Invoke-DotnetWatch -WorkingDirectory '$($global:Project.MyAppApi)' -Project 'src\api\Api.csproj'" `
-SpaDevServerCommand "Invoke-NpmDev -WorkingDirectory '$($global:Project.MyAppSpa)'"
}
New-Alias -Name Setup-MyApp -Value Invoke-MyMonorepoSetup -ForceNo further registration is needed — the barrel loader picks up any .ps1 file in Projects\ automatically.
| Key | Color | Intended Use |
|---|---|---|
FrontEnd |
Blue #5495f3 |
JavaScript/TypeScript SPAs |
BackEnd |
Green #04774a |
APIs and server-side projects |
DevOps |
Orange #ff8c00 |
Infrastructure, pipelines |
Data |
Magenta #c71585 |
Data pipelines, databases |
Neutral |
Gray #5D5D5D |
Tooling, scripts, misc |
| Key | Value |
|---|---|
Work |
'work' |
Personal |
'personal' |
| Parameter | Required | Description |
|---|---|---|
-TabColor |
Yes | Hex color for the terminal tab (e.g. '#FF6600') |
-ClaudeAccount |
Yes | 'work' or 'personal' |
-WorkingDirectory |
Yes | Full path to the project root |
-IncludeDevServerPane |
No | Switch — adds a third pane for the dev server |
-DevServerCommand |
No | Command string to run in the dev server pane |
-SplitPauseMs |
No | Delay (ms) between pane creation — default 500 |
Claude Code always starts a fresh session — no session is resumed.
| Parameter | Required | Description |
|---|---|---|
-TabColor |
Yes | Hex color for the terminal tabs (e.g. '#FF6600') |
-ClaudeAccount |
Yes | 'work' or 'personal' |
-RepoDirectory |
Yes | Repo root — Claude tab working directory |
-ApiDirectory |
Yes | API project directory (left column panes) |
-SpaDirectory |
Yes | SPA project directory (right column panes) |
-ApiDevServerCommand |
No | Command for the API dev server pane (lower-left) |
-SpaDevServerCommand |
No | Command for the SPA dev server pane (lower-right) |
-SplitPauseMs |
No | Delay (ms) between pane creation — default 500 |
Invoke-NpmDev — navigates to a directory and runs npm run dev
Invoke-NpmDev -WorkingDirectory $global:Project.VisorSpaInvoke-DotnetWatch — runs dotnet watch, with optional project file
Invoke-DotnetWatch -WorkingDirectory $global:Project.VisorApi -Project 'src\api\Api.csproj'
Invoke-DotnetWatch -WorkingDirectory $global:Project.MyApi # auto-discovers .csproj