project-session-manager
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseProject Session Manager (PSM) Skill
项目会话管理器(PSM)工具
Quick Start: For simple worktree creation without tmux sessions, use:omc teleportbashomc teleport #123 # Create worktree for issue/PR omc teleport my-feature # Create worktree for feature omc teleport list # List worktreesSee Teleport Command below for details.
Automate isolated development environments using git worktrees and tmux sessions with Claude Code. Enables parallel work across multiple tasks, projects, and repositories.
快速开始: 若无需tmux会话仅创建简单工作树,可使用:omc teleportbashomc teleport #123 # 为议题/PR创建工作树 omc teleport my-feature # 为功能创建工作树 omc teleport list # 列出所有工作树详情请见下方的【Teleport命令】章节。
借助Claude Code,通过git worktrees和tmux会话实现隔离开发环境的自动化管理,支持在多个任务、项目和代码仓库间并行工作。
Commands
命令列表
| Command | Description | Example |
|---|---|---|
| PR review session | |
| Issue fix session | |
| Feature development | |
| List active sessions | |
| Attach to session | |
| Kill session | |
| Clean merged/closed | |
| Current session info | |
| 命令 | 描述 | 示例 |
|---|---|---|
| PR评审会话 | |
| 议题修复会话 | |
| 功能开发会话 | |
| 列出活跃会话 | |
| 接入会话 | |
| 终止会话 | |
| 清理已合并/关闭的会话 | |
| 查看当前会话信息 | |
Project References
项目引用格式
Supported formats:
- Alias: (requires
omc#123)~/.psm/projects.json - Full:
owner/repo#123 - URL:
https://github.com/owner/repo/pull/123 - Current: (uses current directory's repo)
#123
支持的引用格式:
- 别名:(需配置
omc#123)~/.psm/projects.json - 完整格式:
owner/repo#123 - URL:
https://github.com/owner/repo/pull/123 - 当前仓库:(使用当前目录对应的仓库)
#123
Configuration
配置说明
Project Aliases (~/.psm/projects.json
)
~/.psm/projects.json项目别名(~/.psm/projects.json
)
~/.psm/projects.jsonjson
{
"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
}
}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
}
}Providers
支持的服务商
PSM supports multiple issue tracking providers:
| Provider | CLI Required | Reference Formats | Commands |
|---|---|---|---|
| GitHub (default) | | | review, fix, feature |
| Jira | | | fix, feature |
PSM支持多种议题追踪服务商:
| 服务商 | 所需CLI工具 | 引用格式 | 支持命令 |
|---|---|---|---|
| GitHub(默认) | | | review, fix, feature |
| Jira | | | fix, feature |
Jira Configuration
Jira配置
To use Jira, add an alias with and :
jira_projectprovider: "jira"json
{
"aliases": {
"mywork": {
"jira_project": "MYPROJ",
"repo": "mycompany/my-project",
"local": "~/Workspace/my-project",
"default_base": "develop",
"provider": "jira"
}
}
}Important: The field is still required for cloning the git repository. Jira tracks issues, but you work in a git repo.
repoFor non-GitHub repos, use instead:
clone_urljson
{
"aliases": {
"private": {
"jira_project": "PRIV",
"clone_url": "git@gitlab.internal:team/repo.git",
"local": "~/Workspace/repo",
"provider": "jira"
}
}
}若要使用Jira,需在别名中添加和:
jira_projectprovider: "jira"json
{
"aliases": {
"mywork": {
"jira_project": "MYPROJ",
"repo": "mycompany/my-project",
"local": "~/Workspace/my-project",
"default_base": "develop",
"provider": "jira"
}
}
}重要提示:字段仍为必填项,用于克隆git仓库。Jira仅负责追踪议题,实际开发工作在git仓库中进行。
repo对于非GitHub仓库,可使用替代:
clone_urljson
{
"aliases": {
"private": {
"jira_project": "PRIV",
"clone_url": "git@gitlab.internal:team/repo.git",
"local": "~/Workspace/repo",
"provider": "jira"
}
}
}Jira Reference Detection
Jira引用识别规则
PSM only recognizes format as Jira when is explicitly configured as a in your aliases. This prevents false positives from branch names like .
PROJ-123PROJjira_projectFIX-123仅当在别名中被明确配置为时,PSM才会将格式识别为Jira议题,避免将这类分支名称误判为Jira议题。
PROJjira_projectPROJ-123FIX-123Jira Examples
Jira使用示例
bash
undefinedbash
undefinedFix a Jira issue (MYPROJ must be configured)
修复Jira议题(需已配置MYPROJ)
psm fix MYPROJ-123
psm fix MYPROJ-123
Fix using alias (recommended)
使用别名修复议题(推荐方式)
psm fix mywork#123
psm fix mywork#123
Feature development (works same as GitHub)
功能开发(与GitHub使用方式一致)
psm feature mywork add-webhooks
psm feature mywork add-webhooks
Note: 'psm review' is not supported for Jira (no PR concept)
注意:Jira不支持psm review
命令(无PR概念)
psm reviewUse 'psm fix' for Jira issues
请使用psm fix
处理Jira议题
psm fixundefinedundefinedJira CLI Setup
Jira CLI安装
Install the Jira CLI:
bash
undefined安装Jira CLI:
bash
undefinedmacOS
macOS
brew install ankitpokhrel/jira-cli/jira-cli
brew install ankitpokhrel/jira-cli/jira-cli
Linux
Linux
Configure (interactive)
交互式配置
jira init
The Jira CLI handles authentication separately from PSM.jira init
Jira CLI的身份验证与PSM独立处理。Directory Structure
目录结构
~/.psm/
├── projects.json # Project aliases
├── sessions.json # Active session registry
└── worktrees/ # Worktree storage
└── <project>/
└── <type>-<id>/~/.psm/
├── projects.json # 项目别名配置
├── sessions.json # 活跃会话注册表
└── worktrees/ # 工作树存储目录
└── <project>/
└── <type>-<id>/Session Naming
会话命名规则
| Type | Tmux Session | Worktree Dir |
|---|---|---|
| PR Review | | |
| Issue Fix | | |
| Feature | | |
| 类型 | Tmux会话名称 | 工作树目录 |
|---|---|---|
| PR评审 | | |
| 议题修复 | | |
| 功能开发 | | |
Implementation Protocol
实现流程
When the user invokes a PSM command, follow this protocol:
当用户调用PSM命令时,遵循以下流程:
Parse Arguments
解析参数
Parse to determine:
{{ARGUMENTS}}- Subcommand: review, fix, feature, list, attach, kill, cleanup, status
- Reference: project#number, URL, or session ID
- Options: --branch, --base, --no-claude, --no-tmux, etc.
解析以确定:
{{ARGUMENTS}}- 子命令:review、fix、feature、list、attach、kill、cleanup、status
- 引用信息:project#number、URL或会话ID
- 选项:--branch、--base、--no-claude、--no-tmux等
Subcommand: review <ref>
review <ref>子命令:review <ref>
review <ref>Purpose: Create PR review session
Steps:
-
Resolve reference:bash
# Read project aliases cat ~/.psm/projects.json 2>/dev/null || echo '{"aliases":{}}' # Parse ref format: alias#num, owner/repo#num, or URL # Extract: project_alias, repo (owner/repo), pr_number, local_path -
Fetch PR info:bash
gh pr view <pr_number> --repo <repo> --json number,title,author,headRefName,baseRefName,body,files,url -
Ensure local repo exists:bash
# If local path doesn't exist, clone if [[ ! -d "$local_path" ]]; then git clone "https://github.com/$repo.git" "$local_path" fi -
Create worktree:bash
worktree_path="$HOME/.psm/worktrees/$project_alias/pr-$pr_number" # Fetch PR branch cd "$local_path" git fetch origin "pull/$pr_number/head:pr-$pr_number-review" # Create worktree git worktree add "$worktree_path" "pr-$pr_number-review" -
Create session metadata:bash
cat > "$worktree_path/.psm-session.json" << EOF { "id": "$project_alias:pr-$pr_number", "type": "review", "project": "$project_alias", "ref": "pr-$pr_number", "branch": "<head_branch>", "base": "<base_branch>", "created_at": "$(date -Iseconds)", "tmux_session": "psm:$project_alias:pr-$pr_number", "worktree_path": "$worktree_path", "source_repo": "$local_path", "github": { "pr_number": $pr_number, "pr_title": "<title>", "pr_author": "<author>", "pr_url": "<url>" }, "state": "active" } EOF -
Update sessions registry:bash
# Add to ~/.psm/sessions.json -
Create tmux session:bash
tmux new-session -d -s "psm:$project_alias:pr-$pr_number" -c "$worktree_path" -
Launch Claude Code (unless --no-claude):bash
tmux send-keys -t "psm:$project_alias:pr-$pr_number" "claude" Enter -
Output session info:
Session ready! ID: omc:pr-123 Worktree: ~/.psm/worktrees/omc/pr-123 Tmux: psm:omc:pr-123 To attach: tmux attach -t psm:omc:pr-123
用途:创建PR评审会话
步骤:
-
解析引用信息:bash
# 读取项目别名配置 cat ~/.psm/projects.json 2>/dev/null || echo '{"aliases":{}}' # 解析引用格式:alias#num、owner/repo#num或URL # 提取:project_alias、repo(owner/repo)、pr_number、local_path -
获取PR信息:bash
gh pr view <pr_number> --repo <repo> --json number,title,author,headRefName,baseRefName,body,files,url -
确保本地仓库存在:bash
# 若本地路径不存在则克隆仓库 if [[ ! -d "$local_path" ]]; then git clone "https://github.com/$repo.git" "$local_path" fi -
创建工作树:bash
worktree_path="$HOME/.psm/worktrees/$project_alias/pr-$pr_number" # 拉取PR分支 cd "$local_path" git fetch origin "pull/$pr_number/head:pr-$pr_number-review" # 创建工作树 git worktree add "$worktree_path" "pr-$pr_number-review" -
创建会话元数据:bash
cat > "$worktree_path/.psm-session.json" << EOF { "id": "$project_alias:pr-$pr_number", "type": "review", "project": "$project_alias", "ref": "pr-$pr_number", "branch": "<head_branch>", "base": "<base_branch>", "created_at": "$(date -Iseconds)", "tmux_session": "psm:$project_alias:pr-$pr_number", "worktree_path": "$worktree_path", "source_repo": "$local_path", "github": { "pr_number": $pr_number, "pr_title": "<title>", "pr_author": "<author>", "pr_url": "<url>" }, "state": "active" } EOF -
更新会话注册表:bash
# 添加至~/.psm/sessions.json -
创建tmux会话:bash
tmux new-session -d -s "psm:$project_alias:pr-$pr_number" -c "$worktree_path" -
启动Claude Code(除非指定--no-claude):bash
tmux send-keys -t "psm:$project_alias:pr-$pr_number" "claude" Enter -
输出会话信息:
会话已准备就绪! ID: omc:pr-123 工作树: ~/.psm/worktrees/omc/pr-123 Tmux会话: psm:omc:pr-123 接入会话:tmux attach -t psm:omc:pr-123
Subcommand: fix <ref>
fix <ref>子命令:fix <ref>
fix <ref>Purpose: Create issue fix session
Steps:
-
Resolve reference (same as review)
-
Fetch issue info:bash
gh issue view <issue_number> --repo <repo> --json number,title,body,labels,url -
Create feature branch:bash
cd "$local_path" git fetch origin main branch_name="fix/$issue_number-$(echo "$title" | tr ' ' '-' | tr '[:upper:]' '[:lower:]' | head -c 30)" git checkout -b "$branch_name" origin/main -
Create worktree:bash
worktree_path="$HOME/.psm/worktrees/$project_alias/issue-$issue_number" git worktree add "$worktree_path" "$branch_name" -
Create session metadata (similar to review, type="fix")
-
Update registry, create tmux, launch claude (same as review)
用途:创建议题修复会话
步骤:
-
解析引用信息(与review命令相同)
-
获取议题信息:bash
gh issue view <issue_number> --repo <repo> --json number,title,body,labels,url -
创建功能分支:bash
cd "$local_path" git fetch origin main branch_name="fix/$issue_number-$(echo "$title" | tr ' ' '-' | tr '[:upper:]' '[:lower:]' | head -c 30)" git checkout -b "$branch_name" origin/main -
创建工作树:bash
worktree_path="$HOME/.psm/worktrees/$project_alias/issue-$issue_number" git worktree add "$worktree_path" "$branch_name" -
创建会话元数据(与review类似,type="fix")
-
更新注册表、创建tmux会话、启动Claude Code(与review命令相同)
Subcommand: feature <project> <name>
feature <project> <name>子命令:feature <project> <name>
feature <project> <name>Purpose: Start feature development
Steps:
-
Resolve project (from alias or path)
-
Create feature branch:bash
cd "$local_path" git fetch origin main branch_name="feature/$feature_name" git checkout -b "$branch_name" origin/main -
Create worktree:bash
worktree_path="$HOME/.psm/worktrees/$project_alias/feat-$feature_name" git worktree add "$worktree_path" "$branch_name" -
Create session, tmux, launch claude (same pattern)
用途:启动功能开发会话
步骤:
-
解析项目信息(从别名或路径中获取)
-
创建功能分支:bash
cd "$local_path" git fetch origin main branch_name="feature/$feature_name" git checkout -b "$branch_name" origin/main -
创建工作树:bash
worktree_path="$HOME/.psm/worktrees/$project_alias/feat-$feature_name" git worktree add "$worktree_path" "$branch_name" -
创建会话、tmux会话、启动Claude Code(遵循相同流程)
Subcommand: list [project]
list [project]子命令:list [project]
list [project]Purpose: List active sessions
Steps:
-
Read sessions registry:bash
cat ~/.psm/sessions.json 2>/dev/null || echo '{"sessions":{}}' -
Check tmux sessions:bash
tmux list-sessions -F "#{session_name}" 2>/dev/null | grep "^psm:" -
Check worktrees:bash
ls -la ~/.psm/worktrees/*/ 2>/dev/null -
Format output:
Active PSM Sessions: ID | Type | Status | Worktree -------------------|---------|----------|--------------------------- omc:pr-123 | review | active | ~/.psm/worktrees/omc/pr-123 omc:issue-42 | fix | detached | ~/.psm/worktrees/omc/issue-42
用途:列出活跃会话
步骤:
-
读取会话注册表:bash
cat ~/.psm/sessions.json 2>/dev/null || echo '{"sessions":{}}' -
检查tmux会话:bash
tmux list-sessions -F "#{session_name}" 2>/dev/null | grep "^psm:" -
检查工作树:bash
ls -la ~/.psm/worktrees/*/ 2>/dev/null -
格式化输出:
活跃PSM会话: ID | 类型 | 状态 | 工作树路径 -------------------|---------|----------|--------------------------- omc:pr-123 | 评审 | 活跃 | ~/.psm/worktrees/omc/pr-123 omc:issue-42 | 修复 | 已断开 | ~/.psm/worktrees/omc/issue-42
Subcommand: attach <session>
attach <session>子命令:attach <session>
attach <session>Purpose: Attach to existing session
Steps:
-
Parse session ID:
project:type-number -
Verify session exists:bash
tmux has-session -t "psm:$session_id" 2>/dev/null -
Attach:bash
tmux attach -t "psm:$session_id"
用途:接入已有会话
步骤:
-
解析会话ID:
project:type-number -
验证会话存在性:bash
tmux has-session -t "psm:$session_id" 2>/dev/null -
接入会话:bash
tmux attach -t "psm:$session_id"
Subcommand: kill <session>
kill <session>子命令:kill <session>
kill <session>Purpose: Kill session and cleanup
Steps:
-
Kill tmux session:bash
tmux kill-session -t "psm:$session_id" 2>/dev/null -
Remove worktree:bash
worktree_path=$(jq -r ".sessions[\"$session_id\"].worktree" ~/.psm/sessions.json) source_repo=$(jq -r ".sessions[\"$session_id\"].source_repo" ~/.psm/sessions.json) cd "$source_repo" git worktree remove "$worktree_path" --force -
Update registry:bash
# Remove from sessions.json
用途:终止会话并清理资源
步骤:
-
终止tmux会话:bash
tmux kill-session -t "psm:$session_id" 2>/dev/null -
移除工作树:bash
worktree_path=$(jq -r ".sessions[\"$session_id\"].worktree" ~/.psm/sessions.json) source_repo=$(jq -r ".sessions[\"$session_id\"].source_repo" ~/.psm/sessions.json) cd "$source_repo" git worktree remove "$worktree_path" --force -
更新注册表:bash
# 从sessions.json中移除该会话
Subcommand: cleanup
cleanup子命令:cleanup
cleanupPurpose: Clean up merged PRs and closed issues
Steps:
-
Read all sessions
-
For each PR session, check if merged:bash
gh pr view <pr_number> --repo <repo> --json merged,state -
For each issue session, check if closed:bash
gh issue view <issue_number> --repo <repo> --json closed,state -
Clean up merged/closed sessions:
- Kill tmux session
- Remove worktree
- Update registry
-
Report:
Cleanup complete: Removed: omc:pr-123 (merged) Removed: omc:issue-42 (closed) Kept: omc:feat-auth (active)
用途:清理已合并的PR和已关闭的议题
步骤:
-
读取所有会话信息
-
检查每个PR会话是否已合并:bash
gh pr view <pr_number> --repo <repo> --json merged,state -
检查每个议题会话是否已关闭:bash
gh issue view <issue_number> --repo <repo> --json closed,state -
清理已合并/关闭的会话:
- 终止tmux会话
- 移除工作树
- 更新注册表
-
输出清理结果:
清理完成: 已移除: omc:pr-123 (已合并) 已移除: omc:issue-42 (已关闭) 保留: omc:feat-auth (活跃)
Subcommand: status
status子命令:status
statusPurpose: Show current session info
Steps:
-
Detect current session from tmux or cwd:bash
tmux display-message -p "#{session_name}" 2>/dev/null # or check if cwd is inside a worktree -
Read session metadata:bash
cat .psm-session.json 2>/dev/null -
Show status:
Current Session: omc:pr-123 Type: review PR: #123 - Add webhook support Branch: feature/webhooks Created: 2 hours ago
用途:显示当前会话信息
步骤:
-
从tmux或当前目录检测会话:bash
tmux display-message -p "#{session_name}" 2>/dev/null # 或检查当前目录是否位于工作树内 -
读取会话元数据:bash
cat .psm-session.json 2>/dev/null -
显示状态信息:
当前会话: omc:pr-123 类型: 评审 PR: #123 - 添加Webhook支持 分支: feature/webhooks 创建时间: 2小时前
Error Handling
错误处理
| Error | Resolution |
|---|---|
| Worktree exists | Offer: attach, recreate, or abort |
| PR not found | Verify URL/number, check permissions |
| No tmux | Warn and skip session creation |
| No gh CLI | Error with install instructions |
| 错误 | 解决方法 |
|---|---|
| 工作树已存在 | 提供选项:接入会话、重新创建或终止操作 |
| PR不存在 | 验证URL/编号,检查权限 |
| 未安装tmux | 发出警告并跳过会话创建 |
| 未安装gh CLI | 报错并提供安装指引 |
Teleport Command
Teleport命令
The command provides a lightweight alternative to full PSM sessions. It creates git worktrees without tmux session management — ideal for quick, isolated development.
omc teleportomc teleportUsage
使用方式
bash
undefinedbash
undefinedCreate worktree for an issue or PR
为议题或PR创建工作树
omc teleport #123
omc teleport owner/repo#123
omc teleport https://github.com/owner/repo/issues/42
omc teleport #123
omc teleport owner/repo#123
omc teleport https://github.com/owner/repo/issues/42
Create worktree for a feature
为功能创建工作树
omc teleport my-feature
omc teleport my-feature
List existing worktrees
列出所有已存在的工作树
omc teleport list
omc teleport list
Remove a worktree
移除工作树
omc teleport remove issue/my-repo-123
omc teleport remove --force feat/my-repo-my-feature
undefinedomc teleport remove issue/my-repo-123
omc teleport remove --force feat/my-repo-my-feature
undefinedOptions
选项说明
| Flag | Description | Default |
|---|---|---|
| Create worktree (default, kept for compatibility) | |
| Custom worktree root directory | |
| Base branch to create from | |
| Output as JSON | |
| 标志 | 描述 | 默认值 |
|---|---|---|
| 创建工作树(默认选项,为兼容保留) | |
| 自定义工作树根目录 | |
| 用于创建工作树的基础分支 | |
| 以JSON格式输出结果 | |
Worktree Layout
工作树目录结构
~/Workspace/omc-worktrees/
├── issue/
│ └── my-repo-123/ # Issue worktrees
├── pr/
│ └── my-repo-456/ # PR review worktrees
└── feat/
└── my-repo-my-feature/ # Feature worktrees~/Workspace/omc-worktrees/
├── issue/
│ └── my-repo-123/ # 议题工作树
├── pr/
│ └── my-repo-456/ # PR评审工作树
└── feat/
└── my-repo-my-feature/ # 功能开发工作树PSM vs Teleport
PSM与Teleport对比
| Feature | PSM | Teleport |
|---|---|---|
| Git worktree | Yes | Yes |
| Tmux session | Yes | No |
| Claude Code launch | Yes | No |
| Session registry | Yes | No |
| Auto-cleanup | Yes | No |
| Project aliases | Yes | No (uses current repo) |
Use PSM for full managed sessions. Use teleport for quick worktree creation.
| 特性 | PSM | Teleport |
|---|---|---|
| Git工作树 | 支持 | 支持 |
| Tmux会话 | 支持 | 不支持 |
| 自动启动Claude Code | 支持 | 不支持 |
| 会话注册表 | 支持 | 不支持 |
| 自动清理 | 支持 | 不支持 |
| 项目别名 | 支持 | 不支持(使用当前仓库) |
PSM适用于需要完整管理的会话场景,Teleport适用于快速创建工作树的场景。
Requirements
环境要求
Required:
- - Version control (with worktree support v2.5+)
git - - JSON parsing
jq - - Session management (optional, but recommended)
tmux
Optional (per provider):
- - GitHub CLI (for GitHub workflows)
gh - - Jira CLI (for Jira workflows)
jira
必备工具:
- - 版本控制工具(需支持worktree功能,版本v2.5+)
git - - JSON解析工具
jq - - 会话管理工具(可选,但推荐安装)
tmux
可选工具(按服务商):
- - GitHub CLI(用于GitHub工作流)
gh - - Jira CLI(用于Jira工作流)
jira
Initialization
初始化配置
On first run, create default config:
bash
mkdir -p ~/.psm/worktrees ~/.psm/logs首次运行时,将创建默认配置:
bash
mkdir -p ~/.psm/worktrees ~/.psm/logsCreate default projects.json if not exists
若不存在则创建默认projects.json
if [[ ! -f /.psm/projects.json ]]; then
cat > /.psm/projects.json << 'EOF'
{
"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
}
}
EOF
fi
if [[ ! -f /.psm/projects.json ]]; then
cat > /.psm/projects.json << 'EOF'
{
"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
}
}
EOF
fi
Create sessions.json if not exists
若不存在则创建sessions.json
if [[ ! -f ~/.psm/sessions.json ]]; then
echo '{"version":1,"sessions":{},"stats":{"total_created":0,"total_cleaned":0}}' > ~/.psm/sessions.json
fi
undefinedif [[ ! -f ~/.psm/sessions.json ]]; then
echo '{"version":1,"sessions":{},"stats":{"total_created":0,"total_cleaned":0}}' > ~/.psm/sessions.json
fi
undefined