# Parallel Workspaces Use `jj workspace` when multiple agents need independent working copies of the same repo. Each workspace gets its own `@` while sharing the same repo store and operation log. **Tested with jj 0.41.0** This skill intentionally prefers project-local workspace directories when they are safely ignored. Directory priority for this skill: 1. `.workspaces/` 2. `workspaces/` 3. Repo-local instructions such as `AGENTS.md` or `CLAUDE.md` 4. Ask the user Do not replace this with a blanket "sibling directories only" rule. ## Before Creating a Workspace First, make sure project-local workspaces will not leak into Git history: ```bash grep -E '^\.?workspaces/?$' .gitignore 2>/dev/null ``` If the entry is missing, add it before `jj workspace add` and record that change using the normal workflow from `references/NEW_CHANGE.md`: ```bash echo ".workspaces/" >> .gitignore ``` Never skip this check. `jj workspace add` creates directories that contain `.jj/` metadata, and the outer Git repo must ignore them. Use descriptive names so `jj workspace list` and `jj log` stay readable: ```bash REPO_NAME=$(basename "$(jj workspace root)") WORKSPACE_PATH=".workspaces/${REPO_NAME}-" ``` Examples: - `.workspaces/myrepo-test-runner` - `.workspaces/myrepo-reviewer-agent` - `.workspaces/myrepo-refactor-experiment` Avoid generic names such as `tmp`, `wip`, or `new`. ## Creating and Bootstrapping Create the workspace and move into it: ```bash jj workspace add "$WORKSPACE_PATH" cd "$WORKSPACE_PATH" ``` After creation: - the workspace has its own working-copy commit - it appears in log output as `@` - it shares history and the operation log with the main workspace - snapshots in this workspace affect only this workspace's `@` If the repo needs environment setup, bootstrap it in the new workspace before handing it to another agent: | Marker file | Setup command | | --- | --- | | `package.json` | `npm install` | | `Cargo.toml` | `cargo build` | | `pyproject.toml` | `uv sync` | | `Gemfile` | `bundle install` | | `flake.nix` | `nix develop` | | `go.mod` | `go mod download` | | `mix.exs` | `mix deps.get` | ## Agent Handoff When one agent creates a workspace for another, always report: - the absolute workspace path - the change ID the agent should edit - the exact `cd` command - the exact `jj edit ` command - the scope boundaries Use a handoff like this: ```text Workspace: /absolute/path/to/.workspaces/myrepo-tests Change ID: abcdefgh cd /absolute/path/to/.workspaces/myrepo-tests jj edit abcdefgh Rules: - Always use -m for messages. - Run jj st after every mutation. - Do not modify files outside the assigned scope. ``` Absolute paths matter. Agents lose track of relative locations more often than they lose track of change IDs. ## Monitoring Progress Start from the compact `jj log` command in `references/TEMPLATES.md`, then swap in the revset you need: - all workspace tips: `-r 'working_copies()'` - one named workspace: `-r '@'` Examples of the revsets themselves: ```bash working_copies() reviewer@ ``` See `references/QUERY_LANGUAGES.md` for the revset syntax behind those examples. ## Combining Results When a workspace finishes its work, bring that change back to the main line and retire the workspace. Do not decide silently; ask the user which strategy they want. ### Strategy 1: Rebase into the Default Workspace Use this when one developer is orchestrating multiple agents and the result should land as ordinary commits in the default workspace. ```bash jj rebase -s -d @ jj workspace forget rm -rf "$WORKSPACE_PATH" ``` If the repo uses bookmarks for shipping work, move or create the bookmark after the rebase using the normal push workflow from `references/PUSH.md`. ### Strategy 2: Keep an Explicit Merge Use this when both lines of work are independently meaningful and the merge structure should remain visible: ```bash jj new -m "merge: combine parallel work" ``` ### Strategy 3: Push a Bookmark and Open a PR Use this when the work needs human review before landing: ```bash jj bookmark create my-feature -r jj git push -b my-feature ``` Decision guide: | Situation | Default suggestion | | --- | --- | | Solo developer running multiple local agents | Strategy 1 | | Long-lived feature with checkpoints | Strategy 1, then push a bookmark when ready | | Human review required | Strategy 3 | | Both lines of work are independently meaningful | Strategy 2 | If the context is ambiguous, suggest Strategy 1 first and ask whether the user wants the result to land in the default workspace or as a PR. ## Listing and Cleaning Up ```bash jj workspace list jj workspace forget rm -rf "$WORKSPACE_PATH" ``` If you need to inspect `jj workspace list` output as an agent, use the compact command from `references/TEMPLATES.md`. `jj workspace forget` only unregisters the workspace. It does not delete files from disk. ## `update-stale` If another workspace rewrites the commit your workspace had checked out, jj marks that workspace as stale. Use this first: ```bash jj workspace update-stale jj st ``` Do not improvise a manual repair before trying `update-stale`. If the old operation is gone, jj can create a recovery commit with the current working-copy contents instead of silently discarding them. ## Conflict Avoidance | Risk | Recommended mitigation | | --- | --- | | Build outputs or generated files | Ignore them or give each workspace separate output paths | | Shared config files | Assign a single owner for that file or change it serially | | Lockfiles / dependency updates | Let one task own dependency changes | | Same source files across workspaces | Redesign the task boundary or serialize the work | ## Critical Rules 1. Never skip the `.gitignore` check for project-local workspace directories. 2. Always follow the directory priority: `.workspaces/` -> `workspaces/` -> repo instructions -> ask. 3. Use descriptive names: `${REPO_NAME}-`, not `tmp`. 4. Bootstrap the workspace before handing it to another agent. 5. Report the absolute path, change ID, and next commands when a workspace is ready. 6. Run `jj workspace forget` before deleting the directory. 7. Ask before choosing between rebase, merge, or PR integration. 8. Use `jj workspace update-stale` as the first response to a stale workspace. ## Reference Convention adapted from [edmundmiller/dotfiles `using-jj-workspaces`](https://lobehub.com/skills/edmundmiller-dotfiles-using-jj-workspaces). Additional handoff, monitoring, stale-workspace, and conflict-avoidance patterns were adapted from [joshuadavidthomas/agent-skills `jj`](https://github.com/joshuadavidthomas/agent-skills/tree/main/jj) and its [`workspaces.md`](https://raw.githubusercontent.com/joshuadavidthomas/agent-skills/main/jj/workspaces.md), while intentionally preserving this skill's local `.workspaces/` / `workspaces/` directory priority and local change-creation workflow.