news 2026/9/10 5:49:41

如何用 oh-my-claudecode 的 PSM 为 Issue 或 PR 创建隔离的 git worktree + tmux 开发会话?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 oh-my-claudecode 的 PSM 为 Issue 或 PR 创建隔离的 git worktree + tmux 开发会话?

如何用 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 一节,依赖如下:

依赖要求用途
gitv2.5+(带 worktree 支持)必需,创建隔离 worktree
jq任意必需,解析 JSON 配置与返回信息
tmux任意可选但推荐;缺失时 PSM 会警告并跳过 tmux 会话创建
ghGitHub 工作流需要获取 PR/Issue 信息
jira仅 Jira 工作流需要获取 Jira 任务信息

脚本在每次运行时先做依赖检查(见psm.shcheck_dependencies),缺少gitjq会直接报错退出,并给出安装提示:Ubuntu/Debian: sudo apt install git jqmacOS: brew install git jq

首次运行时 PSM 会自动初始化~/.psm/目录结构,包括worktrees/logs/,以及在不存在时生成默认的projects.jsonsessions.jsonpsm_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,为该项目加一个别名条目:repoowner/repolocal填本机上已有的仓库克隆路径,default_base填会话分支的基线分支(如maindevelop)。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#123

review的完整流程(cmd_review,见 psm.sh):

  1. 解析引用,取出仓库、PR 号和本地路径;
  2. 通过gh获取 PR 的标题、作者、head/base 分支名、URL 和正文;
  3. 在本地仓库执行git fetch origin pull/<pr_number>/head并创建 worktree,路径为~/.psm/worktrees/<alias>/pr-<pr_number>
  4. 把 PR 评审上下文渲染到 worktree 的.psm/review.md(模板见 templates/pr-review.md);
  5. 创建 tmux 会话并在其中启动claude --dangerously-skip-permissions。文档中说明该参数用于避免 "Do you trust this directory?" 提示和反复的工具授权提示卡住会话(issue #2508);
  6. 等待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#42
psm fix omc#42

fixreview的区别在于:它通过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-123psm_omc_pr-123~/.psm/worktrees/omc/pr-123
Issue 修复omc:issue-42psm_omc_issue-42~/.psm/worktrees/omc/issue-42
功能开发omc:feat-authpsm_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 和脚本中的下划线形式为准。

验证会话已就绪

创建完成后,按以下方式核对:

  1. 看创建输出review会打印Session ready!及 ID、Worktree、Tmux 三项,如上示例;

  2. 列出注册表

    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

    (表格为文档示例输出)

  3. 确认 tmux 会话存在

    tmux list-sessions -F "#{session_name}" 2>/dev/null | grep "^psm_"
  4. 接入会话

    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-123

PR 合并或 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-123

teleport 的 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 5:47:54

pymagnitude向量检索原理与生产实践

1. 项目概述&#xff1a;这不是一个“梗”&#xff0c;而是一套被严重低估的向量相似度工程实践“magnitude”这个词最近在技术圈、AI应用社区和数据工程师的日常交流中高频出现&#xff0c;但它既不是某个新出的网红App&#xff0c;也不是某款硬件产品的代号&#xff0c;更不是…

作者头像 李华
网站建设 2026/9/10 5:47:28

迁移学习实战:用Transformers库微调BERT与LoRA

我在刚接触NLP那会儿&#xff0c;总以为训练一个模型就得从零开始&#xff0c;把整套网络结构重新设计一遍。直到有一次接到一个文本分类需求&#xff0c;前辈丢给我一句“用BERT微调一下就行”&#xff0c;我才真正理解什么叫迁移学习。现在无论你看哪篇大模型实战文章&#x…

作者头像 李华
网站建设 2026/9/10 5:46:42

MindIE Benchmark服务化推理压测实战:并发、时延与调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 5:44:06

旋转备用联合出清模型:原理、Matlab实现与出清价格分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华