如何用 oh-my-claudecode 的 PSM 为 Issue 或 PR 创建隔离的 git worktree + tmux 开发会话?
【免费下载链接】oh-my-claudecodeTeams-first Multi-agent orchestration for Claude Code项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-claudecode
PSM(Project Session Manager,项目会话管理器)是 oh-my-claudecode 内置的一个 skill,它为每个 Issue 或 PR 自动创建一个独立的 git worktree 目录,在其中开一个 tmux 会话,并在会话里启动 Claude Code、把任务上下文作为初始提示词喂给它。这样你可以同时在多个任务之间切换而不必 stash 或来回切分支,评审 PR 也不会弄脏主工作目录。PSM 有两种调用方式:在 Claude Code 里用斜杠命令/oh-my-claudecode:project-session-manager(别名/oh-my-claudecode:psm),或直接运行仓库自带的脚本 psm.sh(下文写作psm)。
准备条件:安装依赖并了解首次运行行为
根据 SKILL.md 的 Requirements 一节,依赖如下:
| 依赖 | 要求 | 用途 |
|---|---|---|
git | v2.5+(带 worktree 支持) | 必需,创建隔离 worktree |
jq | 任意 | 必需,解析 JSON 配置与返回信息 |
tmux | 任意 | 可选但推荐;缺失时 PSM 会警告并跳过 tmux 会话创建 |
gh | GitHub 工作流需要 | 获取 PR/Issue 信息 |
jira | 仅 Jira 工作流需要 | 获取 Jira 任务信息 |
脚本在每次运行时先做依赖检查(见psm.sh的check_dependencies),缺少git或jq会直接报错退出,并给出安装提示:Ubuntu/Debian: sudo apt install git jq或macOS: brew install git jq。
首次运行时 PSM 会自动初始化~/.psm/目录结构,包括worktrees/、logs/,以及在不存在时生成默认的projects.json和sessions.json(psm_init,见 config.sh)。生成的默认配置包含一个指向本仓库的omc别名,你可以在 templates/projects.json 中看到它的模板形态:
{ "aliases": { "omc": { "repo": "Yeachan-Heo/oh-my-claudecode", "local": "~/Workspace/oh-my-claudecode", "default_base": "main" } }, "defaults": { "worktree_root": "~/.psm/worktrees", "cleanup_after_days": 14, "auto_cleanup_merged": true } }目录布局为:
~/.psm/ ├── projects.json # 项目别名 ├── sessions.json # 活跃会话注册表 └── worktrees/ # worktree 存储 └── <project>/ └── <type>-<id>/如果你要管理的项目不是 oh-my-claudecode 本身,需要编辑~/.psm/projects.json,为该项目加一个别名条目:repo填owner/repo,local填本机上已有的仓库克隆路径,default_base填会话分支的基线分支(如main或develop)。local路径不存在时,review/fix流程会尝试克隆到~/Workspace/<仓库名>。
项目引用格式:如何指定要操作的 Issue 或 PR
创建会话时需要一个引用(ref),PSM 支持四种格式(SKILL.md 的 Project References 一节):
- 别名:
omc#123,要求~/.psm/projects.json中配置了对应别名 - 完整引用:
owner/repo#123 - GitHub URL:
https://github.com/owner/repo/pull/123 - 当前仓库:
#123,使用当前目录所在仓库
创建 PR 评审会话(review)
在 Claude Code 中输入:
/psm review omc#123或直接执行脚本:
psm review omc#123review的完整流程(cmd_review,见 psm.sh):
- 解析引用,取出仓库、PR 号和本地路径;
- 通过
gh获取 PR 的标题、作者、head/base 分支名、URL 和正文; - 在本地仓库执行
git fetch origin pull/<pr_number>/head并创建 worktree,路径为~/.psm/worktrees/<alias>/pr-<pr_number>; - 把 PR 评审上下文渲染到 worktree 的
.psm/review.md(模板见 templates/pr-review.md); - 创建 tmux 会话并在其中启动
claude --dangerously-skip-permissions。文档中说明该参数用于避免 "Do you trust this directory?" 提示和反复的工具授权提示卡住会话(issue #2508); - 等待
PSM_CLAUDE_STARTUP_DELAY(默认 5 秒)后,用tmux send-keys -l把评审任务提示词送入会话。
成功后输出类似下面的会话信息(文档示例):
Session ready! ID: omc:pr-123 Type: review PR: #123 - Add webhook support Worktree: ~/.psm/worktrees/omc/pr-123 Tmux: psm_omc_pr-123 Commands: Attach: tmux attach -t psm_omc_pr-123 Kill: psm kill omc:pr-123 Cleanup: psm cleanup如果 worktree 已存在,PSM 不会重建,而是提示Worktree already exists at ...,并建议你用psm attach <alias>:pr-<number>接入。
创建 Issue 修复会话(fix)
/psm fix omc#42psm fix omc#42fix与review的区别在于:它通过gh获取 Issue 详情后,从基线分支新建一个fix/<issue>-<slug>分支,再在~/.psm/worktrees/<alias>/issue-<issue_number>上创建 worktree,并把 Issue 标题、描述、标签渲染到 worktree 的.psm/fix.md作为 Claude 的初始上下文。
feature子命令用于无 Issue 关联的功能开发:/psm feature omc add-webhooks,它会创建feature/add-webhooks分支和feat-add-webhooksworktree。注意 Jira 提供方不支持review(Jira 没有 PR 概念),Jira 任务用fix处理。
会话命名:公共 ID 与 tmux 会话名的对应关系
由于 tmux 把:和.保留给自身的session:window.pane目标语法并会静默改写它们,PSM 在两个地方使用不同形式的名称(SKILL.md 的 Session Naming 一节,issue #3528):
| 类型 | 公共 ID(psm attach/kill使用) | tmux 会话名(tmux attach -t使用) | worktree 目录 |
|---|---|---|---|
| PR 评审 | omc:pr-123 | psm_omc_pr-123 | ~/.psm/worktrees/omc/pr-123 |
| Issue 修复 | omc:issue-42 | psm_omc_issue-42 | ~/.psm/worktrees/omc/issue-42 |
| 功能开发 | omc:feat-auth | psm_omc_feat-auth | ~/.psm/worktrees/omc/feat-auth |
规则是公共 ID 中的:/.在 tmux 会话名中变为_。用psm命令时始终填公共 ID,手工执行tmux命令时填 tmux 会话名。注意 docs/design/project-session-manager.md 是设计草案(标注 Status: Design Draft),其中psm:omc:pr-123的冒号形式与最终实现不一致,实际以 SKILL.md 和脚本中的下划线形式为准。
验证会话已就绪
创建完成后,按以下方式核对:
看创建输出:
review会打印Session ready!及 ID、Worktree、Tmux 三项,如上示例;列出注册表:
psm list输出
Active PSM Sessions:表格,列包括 ID、Type、State、Worktree;State 一列会区分 tmux 会话是否存在(不存在显示no-tmux)。也可以按项目过滤:psm list omc。Active PSM Sessions: ID | Type | State | Worktree -------------------|---------|----------|--------------------------- omc:pr-123 | review | active | ~/.psm/worktrees/omc/pr-123 omc:issue-42 | fix | detached | ~/.psm/worktrees/omc/issue-42(表格为文档示例输出)
确认 tmux 会话存在:
tmux list-sessions -F "#{session_name}" 2>/dev/null | grep "^psm_"接入会话:
tmux attach -t psm_omc_pr-123或
psm attach omc:pr-123——它会先校验对应 tmux 会话存在,然后打印Run: tmux attach -t psm_omc_pr-123。在 tmux 内用 Ctrl-b d 可随时脱离,之后随时重新 attach。
在 worktree 目录内还可以用psm status查看当前会话的 Type、Branch、Base、Worktree 和创建时间;不在任何 PSM 会话中时会提示Not in a PSM session。
常见问题与边界
| 现象 | 文档给出的处理 |
|---|---|
| Worktree 已存在 | 提示 attach、重建或放弃(psm attach <id>接入已有 worktree) |
| PR not found | 核对 URL/编号,检查gh的访问权限 |
| 未安装 tmux | 警告并跳过 tmux 会话创建,其余步骤继续 |
未安装gh | 报错并给出安装说明(如brew install gh) |
| Jira 引用 | PROJ-123只有在该PROJ被配置为某个别名的jira_project时才按 Jira 识别,避免与分支名如FIX-123误匹配 |
结束会话与清理
kill会同时终止 tmux 会话、强制移除 worktree(git worktree remove --force)并更新注册表——未推送的改动会随 worktree 一起删除,执行前确认工作已推送:
psm kill omc:pr-123PR 合并或 Issue 关闭后,用psm cleanup批量清理:它逐个查询 PR 是否 merged、Issue 是否 closed,只移除已完成的会话并报告Cleanup complete - removed N session(s)。
可选分支:只要 worktree、不要 tmux
如果只需要隔离目录而不需要 tmux 会话和 Claude 自动启动,可以用omc teleport代替完整 PSM 会话(SKILL.md 的 Teleport Command 一节):
omc teleport #123 # 为当前仓库的 issue/PR 创建 worktree omc teleport my-feature # 为功能创建 worktree omc teleport list # 列出 worktree omc teleport remove issue/my-repo-123teleport 的 worktree 默认放在~/Workspace/omc-worktrees/下(可用--path <path>覆盖),目录按issue/、pr/、feat/分类。与 PSM 的差异:teleport 不创建 tmux 会话、不启动 Claude Code、不维护会话注册表、没有自动清理,也不使用项目别名(使用当前仓库)。需要完整的受管会话时用 PSM,只需要快速隔离目录时用 teleport。
【免费下载链接】oh-my-claudecodeTeams-first Multi-agent orchestration for Claude Code项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-claudecode
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考