Project Workbench Skill
A skill for managing project registries and work sessions across multiple workspaces, with support for parallel sessions and session resume.
Configuration
The workbench registry is stored at ~/.claude/skills/project-workbench/workbench.json.
Read it before any operation:
cat ~/.claude/skills/project-workbench/workbench.json
User Commands
| Command | Description |
|---|---|
/workbench | Show dashboard with all projects and active sessions |
/workbench add <name> | Register a new project |
/workbench add-dir <project> <label> <path> | Add a workspace directory to a project |
/workbench start <project> [options] | Start a new work session |
/workbench list | List sessions (filter: --project, --status) |
/workbench list projects | List all registered projects |
/workbench switch <session_id> | Switch to a different session (pauses current) |
/workbench resume [session_id] | Resume a paused session (default: most recent) |
/workbench pause [--summary "..."] | Pause current session with summary |
/workbench done [--summary "..."] | Mark session as done |
/workbench archive <target> | Archive a project or session |
/workbench sync | Sync workbench.json to git |
How to Use This Skill
Step 1: Read Registry
Always start by reading the workbench registry:
cat ~/.claude/skills/project-workbench/workbench.json
If the file does not exist, create it by running:
bash ~/.claude/skills/project-workbench/scripts/init-workbench.sh
Step 2: Parse Command
Parse the user's /workbench invocation to determine the sub-command and arguments.
Step 3: Execute Operation
Dashboard (/workbench)
- •Read workbench.json
- •For each project with status != "archived":
- •Count active/paused sessions
- •List workspace_dirs
- •Print a formatted dashboard showing projects and their active sessions
Format:
PROJECT-NAME (status) · N workspaces · N active sessions |- ses_..HHMM [tool] dir-label "intent text" \- ses_..HHMM [tool] dir-label "intent text"
Add Project (/workbench add <name>)
- •Ask user for: description, workspace directories (label:path pairs), repo URL (optional)
- •Generate slug from name (lowercase, hyphenated)
- •Get timestamp:
date -u +%Y-%m-%dT%H:%M:%SZ - •Create project entry in workbench.json with status "active"
- •Write updated workbench.json
Add Workspace Dir (/workbench add-dir <project> <label> <path>)
- •Validate project exists
- •Add
label: pathto project'sworkspace_dirs - •Write updated workbench.json
Start Session (/workbench start <project>)
Options: --dir <label>, --tool <tool>, --intent "<text>", --branch <branch>
- •Validate project exists and is active
- •If
--intentnot provided, ask user what they plan to work on - •Generate session ID using
date:ses_$(date +%Y%m%d_%H%M%S) - •Default
--tooltoclaude-codeif not specified - •Create session object, append to project.sessions[]
- •Write updated workbench.json
- •Print session context
Resume Session (/workbench resume [session_id])
- •If no session_id, find most recent paused session (by
updatedtimestamp, across all projects) - •Load session data
- •Set status -> "active", update timestamp using
date -u +%Y-%m-%dT%H:%M:%SZ - •Print full context block:
- •Project name, workspace dir path, intent, last summary
- •Branch, open files, next steps (if set)
- •Write updated workbench.json
- •This context block gives Claude Code / Codex enough info to continue
Switch Session (/workbench switch <session_id>)
- •Find current active session (if any) and auto-pause it
- •If no summary set, note "auto-paused, no summary captured"
- •Find target session, set status -> "active"
- •Print resume context for target session
- •Write updated workbench.json
Pause / Done (/workbench pause|done)
- •Find current active session
- •If
--summaryprovided, use it; otherwise ask user for 1-3 sentence summary - •Set status -> "paused" (or "done")
- •Update timestamp using
date -u +%Y-%m-%dT%H:%M:%SZ - •Optionally ask for next_steps
- •Write updated workbench.json
List Sessions (/workbench list)
Options: --project <slug>, --status <status>
- •Read workbench.json
- •Filter sessions by project and/or status
- •Print table: ID | Project | Status | Tool | Dir | Intent
List Projects (/workbench list projects)
- •Read workbench.json
- •Print table: Slug | Name | Status | Workspaces | Active Sessions
Archive (/workbench archive <target>)
- •Find project or session by slug/id
- •Set status -> "archived"
- •Write updated workbench.json
Sync (/workbench sync)
- •Read config to check if a sync remote is configured
- •cd to the directory containing workbench.json
- •
git add workbench.json && git commit -m "workbench sync $(date +%Y-%m-%d %H:%M)" && git push
Step 4: Write Back
After every mutation, write the updated workbench.json back to disk using the Write tool.
IMPORTANT: Use date command for all timestamps. Never guess or make up times.
Summary Guidelines
Summaries must be:
- •1-3 sentences max -- high-level, not granular
- •Outcome-oriented -- what was accomplished or what state things are in
- •Actionable -- mention what's next if relevant
Good: "Implemented OAuth2 token refresh. Login flow works end-to-end. Logout endpoint still needs wiring up." Bad: "Edited oauth2.ts lines 45-120, added refreshToken function, modified token-store.ts..."
Session Object Schema
{
"id": "ses_20260209_143000", // deterministic: ses_YYYYMMDD_HHMMSS
"project": "openclaw",
"status": "active", // active | paused | done | archived
"tool": "claude-code", // claude-code | codex | cursor | manual
"workspace_dir": "server", // key from project.workspace_dirs
"created": "2026-02-09T14:30:00Z",
"updated": "2026-02-09T16:45:00Z",
"intent": "Implement OAuth2 flow for SSO",
"summary": "", // filled on pause/done
"branch": "", // optional: git branch
"open_files": [], // optional: breadcrumbs for resume
"blockers": [], // optional
"next_steps": "" // optional: filled on pause/done
}
Integration with memo Skill
- •
project-workbenchhandles what project/session am I in (orchestration) - •
memohandles what did I learn/decide/do (documentation) - •They share the same project slug namespace
- •A session's
intentandsummaryare NOT duplicated in memo -- they serve different purposes