[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JB1W7TAVFNPCPJD7QCHRDG":3,"skill-same:01M6JB1W7TAVFNPCPJD7QCHRDG":130},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":14,"repositoryHtmlUrl":54,"repositoryHomepageUrl":6,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":6,"updatedAt":57,"install":58,"resources":71},"01M6JB1W7TAVFNPCPJD7QCHRDG","jujutsu",null,"Use this skill for any version control operations (commit, log, diff, push, fetch, bookmark, workspace, rebase, undo, etc.). If a `.jj` directory exists, the repo is jujutsu and git mutations will corrupt it — use `jj` for all mutations; read-only `git log\u002Fdiff\u002Fshow\u002Fblame\u002Fgrep` are allowed. Covers co-located repos, multi-agent parallel workspaces, and operation-log recovery. **DO NOT IGNORE**","johnstegeman\u002Fai-skills","johnstegeman","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6601691?v=4","01M6JB1MMQ1CSDZM5PY72YZ6Q7","John Stegeman","01M6JB1MS0FQS1CSDBECTPJ3DW",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"read","co","do","show","workspaces","log","only","diff","fetch","directory","parallel","multi-agent","jj","rebase","Bash","push","git","repos","commit","2026-11-10 10:12:30",false,"---\nname: jujutsu\ndescription: Use this skill for any version control operations (commit, log, diff, push, fetch, bookmark, workspace, rebase, undo, etc.). If a `.jj` directory exists, the repo is jujutsu and git mutations will corrupt it — use `jj` for all mutations; read-only `git log\u002Fdiff\u002Fshow\u002Fblame\u002Fgrep` are allowed. Covers co-located repos, multi-agent parallel workspaces, and operation-log recovery. **DO NOT IGNORE**\nallowed-tools: Bash(jj *)\nlicense: Apache-2.0\nmetadata:\n  author: johnstegeman\n  version: \"1.3\"\n---\n\n# Jujutsu (jj) Version Control System\n\nThis skill helps you work with Jujutsu, a Git-compatible VCS with mutable commits and automatic rebasing.\n\n**Tested with jj v0.41.0** - Commands may differ in other versions.\n\nFor token-sensitive inspection commands, prefer the compact commands in `references\u002FTEMPLATES.md` over jj's default output.\n\nThe compact commands in `references\u002FTEMPLATES.md` intentionally use `jj --no-pager ...`.\n\nFor revsets, filesets, and template syntax, see `references\u002FQUERY_LANGUAGES.md`.\n\nFor sibling or unrelated work that should start from `trunk()`, see `references\u002FNONLINEAR.md`.\n\nFor common surprises and easy mistakes, see `references\u002FGOTCHAS.md`.\n\n\u003C!--\nAttribution and inspiration sources:\n\n- Forked from danverbraganza\u002Fjujutsu-skill (https:\u002F\u002Fskills.sh\u002Fdanverbraganza\u002Fjujutsu-skill\u002Fjujutsu).\n  The original scaffolding, references\u002F structure, and core mental-model wording are from there.\n\n- Enforcement language in \"Critical: never use git for mutations\" was tightened using the\n  read-only-git allowlist pattern from knoopx\u002Fpi@jujutsu\n  (https:\u002F\u002Fskills.sh\u002Fknoopx\u002Fpi\u002Fjujutsu).\n\n- \"Parallel Workspaces\" framing as a tool for multi-agent isolation draws on\n  onevcat\u002Fskills@onevcat-jj (https:\u002F\u002Fskills.sh\u002Fonevcat\u002Fskills\u002Fonevcat-jj),\n  which is explicitly subtitled \"Version Control for Agent Workflows\".\n\n- The .workspaces\u002F project-local directory convention, the .gitignore safety check,\n  and the directory-selection priority documented in references\u002FWORKSPACES.md\n  come from edmundmiller\u002Fdotfiles using-jj-workspaces\n  (https:\u002F\u002Flobehub.com\u002Fskills\u002Fedmundmiller-dotfiles-using-jj-workspaces).\n\n- The \"op log records every mutation; nothing is ever truly lost\" framing in the\n  Recovery section is adapted from trevors\u002Fdot-claude@jj-workflow\n  (https:\u002F\u002Fskills.sh\u002Ftrevors\u002Fdot-claude\u002Fjj-workflow).\n\n- Query-language guidance, nonlinear-work patterns, and workspace handoff \u002F\n  monitoring ideas were adapted from joshuadavidthomas\u002Fagent-skills `jj`\n  (https:\u002F\u002Fgithub.com\u002Fjoshuadavidthomas\u002Fagent-skills\u002Ftree\u002Fmain\u002Fjj) and its\n  `workspaces.md`\n  (https:\u002F\u002Fraw.githubusercontent.com\u002Fjoshuadavidthomas\u002Fagent-skills\u002Fmain\u002Fjj\u002Fworkspaces.md),\n  while intentionally preserving this skill's local describe-first workflow and\n  `.workspaces\u002F` \u002F `workspaces\u002F` directory priority.\n-->\n\n\n## Detecting a jj repo\n\nCheck whether a directory is part of a jj repo:\n\n```bash\njj root\n```\n\nIf it returns a path, the repo is jj-managed. If it returns `Error: There is no jj repo in \u003Cdirectory>`, it isn't. The presence of a `.jj\u002F` folder is another giveaway. If the repo is not a jj one, do not further use this skill.\n\n\u003C!-- Enforcement wording (allowed\u002Fforbidden split with read-only git allowlist) adapted from knoopx\u002Fpi@jujutsu. -->\n## Critical: never use git for mutations in a jj repo\n\nIn a jj repo (including co-located repos that also have `.git\u002F`):\n\n- **Forbidden** (corrupts jj state): `git commit`, `git add`, `git stash`, `git reset`, `git checkout \u003Cbranch>`, `git switch`, `git rebase`, `git merge`, `git cherry-pick`, `git push`, `git pull`.\n- **Allowed** (read-only): `git log`, `git show`, `git diff`, `git blame`, `git grep`, `git status`. Prefer the `jj` equivalents (`jj log`, `jj show`, `jj diff`, etc.) but read-only git commands won't break anything.\n- **Use jj instead**: `jj git push`, `jj git fetch`, `jj edit \u003Cchange>` (not `git checkout`), `jj rebase`, `jj new \u003Ca> \u003Cb>` (for merges).\n\nSee `references\u002FCOLOCATED.md` for the full co-located repo workflow.\n\n## Important: Automated\u002FAgent Environment\n\nWhen running as an agent or running on behalf of the user:\n\n1. **Always use `-m` flags** to provide commit messages inline rather than relying on editor prompts:\n\n```bash\n# Always use -m to avoid editor prompts\njj desc -m \"message\"               # NOT: jj desc\njj squash --into @- -m \"message\"   # NOT: jj squash (which opens editor or prompts for hunks)\n```\n\nEditor-based commands will fail in non-interactive environments.\n\n2. **Verify operations with `jj st`** after mutations (`squash`, `abandon`, `rebase`, `restore`) to confirm the operation succeeded.\n\n## Important Principles\n\n1. Each commit should represent one logical change. See [commit messages](references\u002FCOMMIT_MSG.md) for details on good commit messages. Before starting work on a new change, make sure the working copy is clean (no changes)\n\n```bash\njj st\n```\n\n## Core Concepts\n\n### The Working Copy is a Commit\n\nIn jj, your working directory is always a commit (referenced as `@`). Changes are automatically snapshotted when you run any jj command. There is no staging area.\n\nThere is no need to run `jj commit`.\n\n### Commits Are Mutable\n\n**CRITICAL**: Unlike git, jj commits can be freely modified. This enables a high-quality commit workflow:\n\n1. Before starting work, run `jj st`. If `@` already has changes, run `jj new` first. If `@` is empty, use it as-is.\n2. Describe your intended changes with `jj desc -m \"Message\"`\n3. Make your changes.\n4. Do NOT run `jj new` when finished — leave that to the next task's step 1.\n\nYou may refine the commit using `jj squash` or `jj absorb` as needed\n\n### Change IDs vs Commit IDs\n\n- **Change ID**: A stable identifier (like `tqpwlqmp`) that persists when a commit is rewritten\n- **Commit ID**: A content hash (like `3ccf7581`) that changes when commit content changes\n\nPrefer using Change IDs when referencing commits in commands.\n\n## Essential Workflow\n\n### Starting Work: Describe First, Then Code\n\n**Always create your commit message before writing code:**\n\n```bash\n# First, describe what you intend to do\njj desc -m \"feat: Add user authentication to login endpoint\"\n\n# Then make your changes - they automatically become part of this commit\n# ... edit files ...\n\n# Check status\njj st\n```\n\nFor the full starting-a-change workflow (when to reuse `@` vs `jj new`, anti-patterns, decision logic), see `references\u002FNEW_CHANGE.md`.\n\nFor unrelated or sibling work that should branch from `trunk()`, see `references\u002FNONLINEAR.md`.\n\n### Creating Atomic Commits\n\nEach commit should represent ONE logical change.\n\n### Viewing History\n\n```bash\n# View recent commits\njj log\n\n# View with patches\njj log -p\n\n# View specific commit\njj show \u003Cchange-id>\n\n# View diff of working copy\njj diff\n```\n\nIf you need to run `jj log`, `jj show`, or `jj diff` as an agent, use the matching compact command from `references\u002FTEMPLATES.md` unless the full default output is explicitly needed.\n\nFor the revsets, filesets, and template syntax behind those compact commands, see `references\u002FQUERY_LANGUAGES.md`.\n\n### Moving Between Commits\n\n```bash\n# Create a new empty commit on top of current\njj new\n\n# Create new commit with message\njj new && jj desc -m \"Commit message\"\n\n# Edit an existing commit (working copy becomes that commit)\njj edit \u003Cchange-id>\n\n# Edit the previous commit\njj prev -e\n\n# Edit the next commit\njj next -e\n```\n\n## Refining Commits\n\nIf you need to refine a commit (squash, abandon, undo, split, etc), see (Refining commits)[references\u002FREFINE_COMMIT.md]\n\n## Working with Bookmarks (Branches)\n\nBookmarks are jj's equivalent to git branches:\n\n```bash\n# Create a bookmark at current commit\njj bookmark create my-feature -r@\n\n# Move bookmark to a different commit\njj bookmark move my-feature --to \u003Cchange-id>\n\n# List bookmarks\njj bookmark list\n\n# Delete a bookmark\njj bookmark delete my-feature\n```\n\nIf you need to run `jj bookmark list`, use the matching compact command from `references\u002FTEMPLATES.md`.\n\n\u003C!--\nMulti-agent workspace framing inspired by onevcat\u002Fskills@onevcat-jj.\nThe .workspaces\u002F project-local convention codified in references\u002FWORKSPACES.md\nis adapted from edmundmiller\u002Fdotfiles using-jj-workspaces.\n-->\n## Parallel Workspaces\n\nFor running multiple agents in parallel against the same repo without working-copy collisions, use `jj workspace`. Each workspace gets its own `@` while sharing the underlying repo store.\n\n```bash\n# Quick reference (full convention in references\u002FWORKSPACES.md)\njj workspace add .workspaces\u002F\u003Crepo>-\u003Cpurpose>   # Create\njj workspace list                                # List\njj workspace forget \u003Cname>                       # Untrack (files stay on disk)\n```\n\nIf you need to run `jj workspace list`, use the matching compact command from `references\u002FTEMPLATES.md`.\n\nSee `references\u002FWORKSPACES.md` for the full convention: the `.workspaces\u002F` directory layout, `.gitignore` safety check, naming, environment bootstrapping, agent handoff, monitoring, stale-workspace recovery, and merging results from multiple workspaces back together.\n\n## Working with tags\n\njujutsu does not yet support tags and pushing them to a remote. If you need to tag (such as for a release), you will need to use git to create and push the tags.\n\n## Git Integration (Co-located Repos)\n\nAlways use co-located repos when working with existing git projects. They give you jj locally while keeping the repo remote-compatible with git tooling.\n\n```bash\njj git clone \u003Curl> --colocate           # Clone a git repo\njj git init --colocate                  # Adopt an existing git repo\n```\n\nSee `references\u002FCOLOCATED.md` for the complete workflow: the mutation rule (`git` is forbidden for mutations, allowed read-only), the git-command allowlist, common gotchas, and switching modes when absolutely necessary.\n\nSee `references\u002FGOTCHAS.md` when the behavior feels surprising and you want the short list of jj-specific footguns before trying a git-style workaround.\n\n### Pushing Changes\n\nFor pushing bookmarks to a remote, see `references\u002FPUSH.md`. For named remotes, fork+upstream setups, and other multi-remote workflows, see `references\u002FREMOTES.md`.\n\n## Handling Conflicts\n\njj treats conflicts as first-class objects — a commit can contain a conflict, and that conflict persists through rebases until resolved. `jj` refuses to push conflicted commits, so they must be resolved before `jj git push`.\n\n```bash\njj st                                # Reports if @ has unresolved conflicts\njj resolve --list                    # Lists conflicted paths\njj resolve --tool :ours              # Take side #1 non-interactively (agent-safe)\njj resolve --tool :theirs            # Take side #2 non-interactively (agent-safe)\n```\n\n**Never run bare `jj resolve` (no `--tool`)** — it's interactive and will hang in non-interactive agent environments. Either pass `--tool :ours` \u002F `--tool :theirs`, or edit conflict markers directly in the file and let `jj st` snapshot the resolution.\n\nSee `references\u002FCONFLICTS.md` for the full resolution playbook: marker formats (diff vs snapshot), five resolution paths, ancestor-level resolution to avoid re-resolving across descendants, verification (beyond `jj st`), and anti-patterns.\n\n\u003C!-- Recovery framing (\"op log records every mutation; nothing is ever lost\") adapted from trevors\u002Fdot-claude@jj-workflow. -->\n## Recovery and the Operation Log\n\nThe op log records every mutation. Nothing is ever lost.\n\n```bash\njj undo                  # Reverse the last operation (primary recovery tool)\njj op log                # See all operations\njj op restore \u003Cop-id>    # Jump back to any past state\njj evolog -r \u003Cchange>    # See how a specific change evolved\n```\n\nIf you need to run `jj op log` or `jj evolog`, use the matching compact commands from `references\u002FTEMPLATES.md` first. Add `-p` only after you have narrowed the scope.\n\n**Always reach for `jj undo` first** when something looks wrong — it's always correct and safe. See `references\u002FRECOVERY.md` for recovery patterns by scenario (bad squash, accidental abandon, lost work, etc.).\n\n## Preserving Commit Quality\n\n**IMPORTANT**: Because commits are mutable, always refine them:\n\n1. **Review your commit**: `jj show @` or `jj diff`\n2. **Is it atomic?** One logical change per commit\n3. **Is the message clear?** Use imperative verb phrase in sentence case format with no full stop: \"Verb object\"\n4. **Are there unrelated changes?** Use `jj restore` to move changes out, then create separate commits\n5. **Should changes be elsewhere?** Use `jj squash` or `jj absorb`\n\n## Quick Reference\n\n| Action | Command |\n|--------|---------|\n| Describe commit | `jj desc -m \"message\"` |\n| View status | `jj st` |\n| View log | `jj log` |\n| View diff | `jj diff` |\n| New commit | `jj st` then `jj new` only if `@` has changes, then `jj desc -m \"message\"` |\n| Edit commit | `jj edit \u003Cid>` |\n| Squash to parent | `jj squash --into @- -m \"message\"` |\n| Auto-distribute | `jj absorb` |\n| Abandon commit | `jj abandon \u003Cid>` |\n| Undo last operation | `jj undo` |\n| Restore files | `jj restore [paths]` |\n| Create bookmark | `jj bookmark create \u003Cname>` |\n| Push bookmark | `jj git push -b \u003Cname>` |\n| Add workspace | `jj workspace add .workspaces\u002F\u003Crepo>-\u003Cpurpose>` |\n| List workspaces | `jj workspace list` |\n| Forget workspace | `jj workspace forget \u003Cname>` |\n| See operation log | `jj op log` |\n| Jump to past state | `jj op restore \u003Cop-id>` |\n| See change evolution | `jj evolog -r \u003Cid>` |\n\n## Best Practices Summary\n\n1. **Describe first**: Set the commit message before coding\n2. **One change per commit**: Keep commits atomic and focused\n3. **Use change IDs**: They're stable across rewrites\n4. **Refine commits**: Leverage mutability for clean history\n5. **Embrace the workflow**: No staging area, no stashing — the op log replaces both\n6. **Workspaces for parallel agents**: Isolate concurrent agent work in `.workspaces\u002F\u003Crepo>-\u003Cpurpose>` (see `references\u002FWORKSPACES.md`)\n7. **`jj undo` first**: When something looks wrong, undo before fixing manually (see `references\u002FRECOVERY.md`)\n","# Jujutsu (jj) Version Control System\n\nThis skill helps you work with Jujutsu, a Git-compatible VCS with mutable commits and automatic rebasing.\n\n**Tested with jj v0.41.0** - Commands may differ in other versions.\n\nFor token-sensitive inspection commands, prefer the compact commands in `references\u002FTEMPLATES.md` over jj's default output.\n\nThe compact commands in `references\u002FTEMPLATES.md` intentionally use `jj --no-pager ...`.\n\nFor revsets, filesets, and template syntax, see `references\u002FQUERY_LANGUAGES.md`.\n\nFor sibling or unrelated work that should start from `trunk()`, see `references\u002FNONLINEAR.md`.\n\nFor common surprises and easy mistakes, see `references\u002FGOTCHAS.md`.\n\n\u003C!--\nAttribution and inspiration sources:\n\n- Forked from danverbraganza\u002Fjujutsu-skill (https:\u002F\u002Fskills.sh\u002Fdanverbraganza\u002Fjujutsu-skill\u002Fjujutsu).\n  The original scaffolding, references\u002F structure, and core mental-model wording are from there.\n\n- Enforcement language in \"Critical: never use git for mutations\" was tightened using the\n  read-only-git allowlist pattern from knoopx\u002Fpi@jujutsu\n  (https:\u002F\u002Fskills.sh\u002Fknoopx\u002Fpi\u002Fjujutsu).\n\n- \"Parallel Workspaces\" framing as a tool for multi-agent isolation draws on\n  onevcat\u002Fskills@onevcat-jj (https:\u002F\u002Fskills.sh\u002Fonevcat\u002Fskills\u002Fonevcat-jj),\n  which is explicitly subtitled \"Version Control for Agent Workflows\".\n\n- The .workspaces\u002F project-local directory convention, the .gitignore safety check,\n  and the directory-selection priority documented in references\u002FWORKSPACES.md\n  come from edmundmiller\u002Fdotfiles using-jj-workspaces\n  (https:\u002F\u002Flobehub.com\u002Fskills\u002Fedmundmiller-dotfiles-using-jj-workspaces).\n\n- The \"op log records every mutation; nothing is ever truly lost\" framing in the\n  Recovery section is adapted from trevors\u002Fdot-claude@jj-workflow\n  (https:\u002F\u002Fskills.sh\u002Ftrevors\u002Fdot-claude\u002Fjj-workflow).\n\n- Query-language guidance, nonlinear-work patterns, and workspace handoff \u002F\n  monitoring ideas were adapted from joshuadavidthomas\u002Fagent-skills `jj`\n  (https:\u002F\u002Fgithub.com\u002Fjoshuadavidthomas\u002Fagent-skills\u002Ftree\u002Fmain\u002Fjj) and its\n  `workspaces.md`\n  (https:\u002F\u002Fraw.githubusercontent.com\u002Fjoshuadavidthomas\u002Fagent-skills\u002Fmain\u002Fjj\u002Fworkspaces.md),\n  while intentionally preserving this skill's local describe-first workflow and\n  `.workspaces\u002F` \u002F `workspaces\u002F` directory priority.\n-->\n\n\n## Detecting a jj repo\n\nCheck whether a directory is part of a jj repo:\n\n```bash\njj root\n```\n\nIf it returns a path, the repo is jj-managed. If it returns `Error: There is no jj repo in \u003Cdirectory>`, it isn't. The presence of a `.jj\u002F` folder is another giveaway. If the repo is not a jj one, do not further use this skill.\n\n\u003C!-- Enforcement wording (allowed\u002Fforbidden split with read-only git allowlist) adapted from knoopx\u002Fpi@jujutsu. -->\n## Critical: never use git for mutations in a jj repo\n\nIn a jj repo (including co-located repos that also have `.git\u002F`):\n\n- **Forbidden** (corrupts jj state): `git commit`, `git add`, `git stash`, `git reset`, `git checkout \u003Cbranch>`, `git switch`, `git rebase`, `git merge`, `git cherry-pick`, `git push`, `git pull`.\n- **Allowed** (read-only): `git log`, `git show`, `git diff`, `git blame`, `git grep`, `git status`. Prefer the `jj` equivalents (`jj log`, `jj show`, `jj diff`, etc.) but read-only git commands won't break anything.\n- **Use jj instead**: `jj git push`, `jj git fetch`, `jj edit \u003Cchange>` (not `git checkout`), `jj rebase`, `jj new \u003Ca> \u003Cb>` (for merges).\n\nSee `references\u002FCOLOCATED.md` for the full co-located repo workflow.\n\n## Important: Automated\u002FAgent Environment\n\nWhen running as an agent or running on behalf of the user:\n\n1. **Always use `-m` flags** to provide commit messages inline rather than relying on editor prompts:\n\n```bash\n# Always use -m to avoid editor prompts\njj desc -m \"message\"               # NOT: jj desc\njj squash --into @- -m \"message\"   # NOT: jj squash (which opens editor or prompts for hunks)\n```\n\nEditor-based commands will fail in non-interactive environments.\n\n2. **Verify operations with `jj st`** after mutations (`squash`, `abandon`, `rebase`, `restore`) to confirm the operation succeeded.\n\n## Important Principles\n\n1. Each commit should represent one logical change. See [commit messages](references\u002FCOMMIT_MSG.md) for details on good commit messages. Before starting work on a new change, make sure the working copy is clean (no changes)\n\n```bash\njj st\n```\n\n## Core Concepts\n\n### The Working Copy is a Commit\n\nIn jj, your working directory is always a commit (referenced as `@`). Changes are automatically snapshotted when you run any jj command. There is no staging area.\n\nThere is no need to run `jj commit`.\n\n### Commits Are Mutable\n\n**CRITICAL**: Unlike git, jj commits can be freely modified. This enables a high-quality commit workflow:\n\n1. Before starting work, run `jj st`. If `@` already has changes, run `jj new` first. If `@` is empty, use it as-is.\n2. Describe your intended changes with `jj desc -m \"Message\"`\n3. Make your changes.\n4. Do NOT run `jj new` when finished — leave that to the next task's step 1.\n\nYou may refine the commit using `jj squash` or `jj absorb` as needed\n\n### Change IDs vs Commit IDs\n\n- **Change ID**: A stable identifier (like `tqpwlqmp`) that persists when a commit is rewritten\n- **Commit ID**: A content hash (like `3ccf7581`) that changes when commit content changes\n\nPrefer using Change IDs when referencing commits in commands.\n\n## Essential Workflow\n\n### Starting Work: Describe First, Then Code\n\n**Always create your commit message before writing code:**\n\n```bash\n# First, describe what you intend to do\njj desc -m \"feat: Add user authentication to login endpoint\"\n\n# Then make your changes - they automatically become part of this commit\n# ... edit files ...\n\n# Check status\njj st\n```\n\nFor the full starting-a-change workflow (when to reuse `@` vs `jj new`, anti-patterns, decision logic), see `references\u002FNEW_CHANGE.md`.\n\nFor unrelated or sibling work that should branch from `trunk()`, see `references\u002FNONLINEAR.md`.\n\n### Creating Atomic Commits\n\nEach commit should represent ONE logical change.\n\n### Viewing History\n\n```bash\n# View recent commits\njj log\n\n# View with patches\njj log -p\n\n# View specific commit\njj show \u003Cchange-id>\n\n# View diff of working copy\njj diff\n```\n\nIf you need to run `jj log`, `jj show`, or `jj diff` as an agent, use the matching compact command from `references\u002FTEMPLATES.md` unless the full default output is explicitly needed.\n\nFor the revsets, filesets, and template syntax behind those compact commands, see `references\u002FQUERY_LANGUAGES.md`.\n\n### Moving Between Commits\n\n```bash\n# Create a new empty commit on top of current\njj new\n\n# Create new commit with message\njj new && jj desc -m \"Commit message\"\n\n# Edit an existing commit (working copy becomes that commit)\njj edit \u003Cchange-id>\n\n# Edit the previous commit\njj prev -e\n\n# Edit the next commit\njj next -e\n```\n\n## Refining Commits\n\nIf you need to refine a commit (squash, abandon, undo, split, etc), see (Refining commits)[references\u002FREFINE_COMMIT.md]\n\n## Working with Bookmarks (Branches)\n\nBookmarks are jj's equivalent to git branches:\n\n```bash\n# Create a bookmark at current commit\njj bookmark create my-feature -r@\n\n# Move bookmark to a different commit\njj bookmark move my-feature --to \u003Cchange-id>\n\n# List bookmarks\njj bookmark list\n\n# Delete a bookmark\njj bookmark delete my-feature\n```\n\nIf you need to run `jj bookmark list`, use the matching compact command from `references\u002FTEMPLATES.md`.\n\n\u003C!--\nMulti-agent workspace framing inspired by onevcat\u002Fskills@onevcat-jj.\nThe .workspaces\u002F project-local convention codified in references\u002FWORKSPACES.md\nis adapted from edmundmiller\u002Fdotfiles using-jj-workspaces.\n-->\n## Parallel Workspaces\n\nFor running multiple agents in parallel against the same repo without working-copy collisions, use `jj workspace`. Each workspace gets its own `@` while sharing the underlying repo store.\n\n```bash\n# Quick reference (full convention in references\u002FWORKSPACES.md)\njj workspace add .workspaces\u002F\u003Crepo>-\u003Cpurpose>   # Create\njj workspace list                                # List\njj workspace forget \u003Cname>                       # Untrack (files stay on disk)\n```\n\nIf you need to run `jj workspace list`, use the matching compact command from `references\u002FTEMPLATES.md`.\n\nSee `references\u002FWORKSPACES.md` for the full convention: the `.workspaces\u002F` directory layout, `.gitignore` safety check, naming, environment bootstrapping, agent handoff, monitoring, stale-workspace recovery, and merging results from multiple workspaces back together.\n\n## Working with tags\n\njujutsu does not yet support tags and pushing them to a remote. If you need to tag (such as for a release), you will need to use git to create and push the tags.\n\n## Git Integration (Co-located Repos)\n\nAlways use co-located repos when working with existing git projects. They give you jj locally while keeping the repo remote-compatible with git tooling.\n\n```bash\njj git clone \u003Curl> --colocate           # Clone a git repo\njj git init --colocate                  # Adopt an existing git repo\n```\n\nSee `references\u002FCOLOCATED.md` for the complete workflow: the mutation rule (`git` is forbidden for mutations, allowed read-only), the git-command allowlist, common gotchas, and switching modes when absolutely necessary.\n\nSee `references\u002FGOTCHAS.md` when the behavior feels surprising and you want the short list of jj-specific footguns before trying a git-style workaround.\n\n### Pushing Changes\n\nFor pushing bookmarks to a remote, see `references\u002FPUSH.md`. For named remotes, fork+upstream setups, and other multi-remote workflows, see `references\u002FREMOTES.md`.\n\n## Handling Conflicts\n\njj treats conflicts as first-class objects — a commit can contain a conflict, and that conflict persists through rebases until resolved. `jj` refuses to push conflicted commits, so they must be resolved before `jj git push`.\n\n```bash\njj st                                # Reports if @ has unresolved conflicts\njj resolve --list                    # Lists conflicted paths\njj resolve --tool :ours              # Take side #1 non-interactively (agent-safe)\njj resolve --tool :theirs            # Take side #2 non-interactively (agent-safe)\n```\n\n**Never run bare `jj resolve` (no `--tool`)** — it's interactive and will hang in non-interactive agent environments. Either pass `--tool :ours` \u002F `--tool :theirs`, or edit conflict markers directly in the file and let `jj st` snapshot the resolution.\n\nSee `references\u002FCONFLICTS.md` for the full resolution playbook: marker formats (diff vs snapshot), five resolution paths, ancestor-level resolution to avoid re-resolving across descendants, verification (beyond `jj st`), and anti-patterns.\n\n\u003C!-- Recovery framing (\"op log records every mutation; nothing is ever lost\") adapted from trevors\u002Fdot-claude@jj-workflow. -->\n## Recovery and the Operation Log\n\nThe op log records every mutation. Nothing is ever lost.\n\n```bash\njj undo                  # Reverse the last operation (primary recovery tool)\njj op log                # See all operations\njj op restore \u003Cop-id>    # Jump back to any past state\njj evolog -r \u003Cchange>    # See how a specific change evolved\n```\n\nIf you need to run `jj op log` or `jj evolog`, use the matching compact commands from `references\u002FTEMPLATES.md` first. Add `-p` only after you have narrowed the scope.\n\n**Always reach for `jj undo` first** when something looks wrong — it's always correct and safe. See `references\u002FRECOVERY.md` for recovery patterns by scenario (bad squash, accidental abandon, lost work, etc.).\n\n## Preserving Commit Quality\n\n**IMPORTANT**: Because commits are mutable, always refine them:\n\n1. **Review your commit**: `jj show @` or `jj diff`\n2. **Is it atomic?** One logical change per commit\n3. **Is the message clear?** Use imperative verb phrase in sentence case format with no full stop: \"Verb object\"\n4. **Are there unrelated changes?** Use `jj restore` to move changes out, then create separate commits\n5. **Should changes be elsewhere?** Use `jj squash` or `jj absorb`\n\n## Quick Reference\n\n| Action | Command |\n|--------|---------|\n| Describe commit | `jj desc -m \"message\"` |\n| View status | `jj st` |\n| View log | `jj log` |\n| View diff | `jj diff` |\n| New commit | `jj st` then `jj new` only if `@` has changes, then `jj desc -m \"message\"` |\n| Edit commit | `jj edit \u003Cid>` |\n| Squash to parent | `jj squash --into @- -m \"message\"` |\n| Auto-distribute | `jj absorb` |\n| Abandon commit | `jj abandon \u003Cid>` |\n| Undo last operation | `jj undo` |\n| Restore files | `jj restore [paths]` |\n| Create bookmark | `jj bookmark create \u003Cname>` |\n| Push bookmark | `jj git push -b \u003Cname>` |\n| Add workspace | `jj workspace add .workspaces\u002F\u003Crepo>-\u003Cpurpose>` |\n| List workspaces | `jj workspace list` |\n| Forget workspace | `jj workspace forget \u003Cname>` |\n| See operation log | `jj op log` |\n| Jump to past state | `jj op restore \u003Cop-id>` |\n| See change evolution | `jj evolog -r \u003Cid>` |\n\n## Best Practices Summary\n\n1. **Describe first**: Set the commit message before coding\n2. **One change per commit**: Keep commits atomic and focused\n3. **Use change IDs**: They're stable across rewrites\n4. **Refine commits**: Leverage mutability for clean history\n5. **Embrace the workflow**: No staging area, no stashing — the op log replaces both\n6. **Workspaces for parallel agents**: Isolate concurrent agent work in `.workspaces\u002F\u003Crepo>-\u003Cpurpose>` (see `references\u002FWORKSPACES.md`)\n7. **`jj undo` first**: When something looks wrong, undo before fixing manually (see `references\u002FRECOVERY.md`)\n",{"name":5,"license":15,"metadata":48,"description":7,"allowed-tools":50},{"author":9,"version":49},"1.3","Bash(jj *)","main","e33b09c72c139e12a2a8cd1a92348b5ecb6edbc9","skills\u002Fjujutsu","https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills","https:\u002F\u002Fgithub.com\u002Fjohnstegeman","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fjohnstegeman\u002F","2026-05-21 03:26:07",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add johnstegeman\u002Fai-skills --skill jujutsu",{"tool":64,"command":65},"bunx","bunx skills add johnstegeman\u002Fai-skills --skill jujutsu",{"tool":67,"command":68},"pnpm","pnpm dlx skills add johnstegeman\u002Fai-skills --skill jujutsu","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002FSKILL.md",true,[72,78,82,86,90,94,98,102,106,110,114,118,122,126],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"agents\u002Fopenai.yaml","REFERENCE","参考文档",226,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Fagents\u002Fopenai.yaml",{"path":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"references\u002FCOLOCATED.md",3742,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FCOLOCATED.md",{"path":83,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002FCOMMIT_MSG.md",802,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FCOMMIT_MSG.md",{"path":87,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002FCONFLICTS.md",6473,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FCONFLICTS.md",{"path":91,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":92,"sourceHtmlUrl":93},"references\u002FGOTCHAS.md",2118,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FGOTCHAS.md",{"path":95,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":96,"sourceHtmlUrl":97},"references\u002FNEW_CHANGE.md",1983,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FNEW_CHANGE.md",{"path":99,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":100,"sourceHtmlUrl":101},"references\u002FNONLINEAR.md",2261,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FNONLINEAR.md",{"path":103,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":104,"sourceHtmlUrl":105},"references\u002FPUSH.md",1079,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FPUSH.md",{"path":107,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":108,"sourceHtmlUrl":109},"references\u002FQUERY_LANGUAGES.md",2657,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FQUERY_LANGUAGES.md",{"path":111,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":112,"sourceHtmlUrl":113},"references\u002FRECOVERY.md",4256,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FRECOVERY.md",{"path":115,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":116,"sourceHtmlUrl":117},"references\u002FREFINE_COMMIT.md",2421,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FREFINE_COMMIT.md",{"path":119,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":120,"sourceHtmlUrl":121},"references\u002FREMOTES.md",6767,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FREMOTES.md",{"path":123,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":124,"sourceHtmlUrl":125},"references\u002FTEMPLATES.md",3774,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FTEMPLATES.md",{"path":127,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":128,"sourceHtmlUrl":129},"references\u002FWORKSPACES.md",7118,"https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fjujutsu\u002Freferences\u002FWORKSPACES.md",[131,164],{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":145,"publishedAt":43},"01M6JB1R1NBS5QNSX3T6T12NN8","create-pr","Write pull request titles and descriptions when creating a PR. Use when running `gh pr create`, opening a pull request, drafting a PR body or title, or when the user asks for help writing a PR description. Produces a drafted title and body which are then passed to `gh pr create`. Encodes principles from Google eng-practices, the Linux kernel's SubmittingPatches, and Chris Beams' commit-message guide, and prevents the AI-generated-PR anti-patterns (hype tone, unsubstantiated claims, diff-restatement).","https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002Fcreate-pr\u002FSKILL.md",[137,140],{"categoryNo":138,"categoryName":139,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":141,"categoryName":142,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[146,147,148,149,150,151,152,153,154,155,31,156,157,158,159,160,42,161,162,163],"create","pr","create pr","pull","for","claims","which","principles","tone","message","use","generated","gh","gh pr","pr description","linux","kernel","writing",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":171,"publishedAt":43},"01M6JB1P8CJW9EAJ0S2QFB63C0","template-skill","Use this as the template for new SKILL.md files","https:\u002F\u002Fgithub.com\u002Fjohnstegeman\u002Fai-skills\u002Fblob\u002Fmain\u002Fskills\u002F_template-skill\u002FSKILL.md",[170],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[172,173,174,156,175,150,176],"template","template skill","new skill","files","as"]