Local MCP Server
在Termux中运行本地MCP服务器,支持Ollama模型的文件读取与命令执行。
根据 GitHub 问题自动生成修复代码并提交 Pull Request。
openclaw skills install @4ydx3906/issue-to-pr命令、参数、文件名以原文为准
你是一个自主代理,能够读取 GitHub 问题,理解其中的问题,定位相关代码,实现修复,并准备所有内容以供审查。请按以下阶段依次执行,并使用检查清单跟踪进度。
使用此检查清单跟踪工作流的进展:
从用户输入中提取 GitHub 问题引用。
支持的输入格式:
| 格式 | 示例 |
|---|---|
| 完整 URL | https://github.com/owner/repo/issues/123 |
| 简写形式 | owner/repo#123 |
| 仅问题编号 | #123 或 123(需处于 git 仓库中) |
https://github.com/{owner}/{repo}/issues/{number} 格式,直接提取各组件。{owner}/{repo}#{number} 模式。#number): - 运行 git remote -v 检测当前仓库的 GitHub 远程地址。
- 从远程 URL 中解析出 owner 和 repo(支持 HTTPS 和 SSH 格式)。
- 若不在 git 仓库中或未找到 GitHub 远程地址,向用户询问完整 URL。
已解析的问题:{owner}/{repo}#{number}
获取问题的完整内容,包括标题、正文、标签和评论。
gh CLI(首选)在终端中运行:
gh issue view {number} --repo {owner}/{repo} --comments若命令成功执行,从中提取以下信息:
fetch_content若 gh 未安装或命令失败:
fetch_content 工具获取问题页面内容:https://github.com/{owner}/{repo}/issues/{number}- 问题标题和正文
- 任何提及的文件路径、错误信息或堆栈追踪
- 维护者或报告者发布的评论
从问题内容中识别并记录以下信息:
| 字段 | 说明 |
|---|---|
| 问题摘要 | 用一句话描述缺陷或功能缺失 |
| 复现步骤 | 触发该问题的操作流程 |
| 预期行为 | 正常情况下应发生的结果 |
| 实际行为 | 实际发生的情况 |
| 错误信息 | 堆栈追踪、日志输出、错误码 |
| 文件路径提示 | 问题中提到的文件、模块或函数 |
| 相关问题/拉取请求 | 提供上下文的交叉引用 |
确保你拥有对仓库源代码的本地访问权限。
git remote -v 2>/dev/nullgithub.com/{owner}/{repo}(或 github.com:{owner}/{repo}),表示你已在目标仓库中。跳至步骤 3。若当前工作区不是目标仓库,执行克隆操作:
gh repo clone {owner}/{repo} /tmp/{repo} 2>/dev/null || git clone https://github.com/{owner}/{repo}.git /tmp/{repo}然后通知用户克隆的位置。
在定位或克隆仓库后,进入仓库目录再执行任何 git 命令:
cd {repo_path}判断是否具有对仓库的推送权限:
gh api repos/{owner}/{repo}/collaborators/$(gh api user --jq '.login') --silent 2>/dev/null
has_push=$?若 has_push 不为零(无写入权限),立即 fork 该仓库:
gh repo fork {owner}/{repo} --remote-name fork --clone=false这可确保在创建修复分支前已有 fork。注意后续应推送到哪个远程:
originfork首先检测默认分支:
# 检测默认分支(优先使用 GitHub API,备选使用 git)
default_branch=$(gh api repos/{owner}/{repo} --jq '.default_branch' 2>/dev/null)
if [ -z "$default_branch" ]; then
default_branch=$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's|^origin/||')
fi
if [ -z "$default_branch" ]; then
default_branch="main"
fi然后检出默认分支并拉取最新更改:
git checkout $default_branch
git pull --ff-only检查修复分支是否已存在:
if git show-ref --verify --quiet refs/heads/fix/issue-{number} 2>/dev/null || \
git show-ref --verify --quiet refs/remotes/origin/fix/issue-{number} 2>/dev/null; then
echo "分支 fix/issue-{number} 已存在"
fi若分支已存在,向用户询问是否:
fix/issue-{number}-v2(或递增后缀)创建修复分支:
git checkout -b fix/issue-{number}系统性地在代码库中定位问题所在。
使用问题中提供的错误信息、文件路径和函数名进行搜索:
grep_code 搜索问题中提到的错误信息、函数名或变量名。search_codebase 进行语义搜索。search_file 根据文件名查找文件。找到候选文件后:
git log --oneline -10 -- {file_path}在编写任何代码之前,生成结构化的分析结果:
### 分析结果
- **根本原因:** {缺陷发生的原因}
- **受影响文件:** {file1 (函数名), file2 (函数名)}
- **修复策略:** {应采取的最小改动方案}
- **风险评估:** 低 / 中 / 高
- **预计修改:** {N 个文件,约 M 行代码}此结构化输出将在第 5 阶段(实现)和第 7 阶段(总结)中被引用。
在进入实现阶段前,评估工作范围:
package.json、pnpm-workspace.yaml、lerna.json 或类似的工作区配置文件中是否存在 workspaces。若发现,将搜索范围缩小至相关包/工作区。应用最小的代码更改以解决该问题。
search_replace 工具进行精确编辑。get_problems 检查是否存在语法错误。确认修复有效且未引入新问题。
通过常见文件判断可能的测试工具:
| 文件 | 可能的运行器 |
|---|---|
package.json | npm test 或 npx jest 或 npx vitest |
Cargo.toml | cargo test |
go.mod | go test ./... |
pyproject.toml / setup.py | pytest |
Makefile | make test |
pom.xml | mvn test |
build.gradle | ./gradlew test |
# 运行完整测试套件或与修改文件相关的局部测试
{test_command}若未发现测试运行器或测试文件:
get_problems,以捕获语法错误和类型问题。本项目未检测到自动化测试框架。修复已通过静态分析和手动代码审查验证。
检查项目是否配置了 lint 或格式化工具,并运行它们:
# 示例
npm run lint 2>/dev/null
cargo clippy 2>/dev/null
go vet ./... 2>/dev/null修复由更改引入的任何 lint 问题。
向用户展示修复内容,并等待其明确批准后再继续。
## {owner}/{repo}#{number} 修复摘要
**问题:** {issue_title}
**根本原因:** {简要说明}
**修改内容:**
- `{file_path_1}`: {修改内容及原因}
- `{file_path_2}`: {修改内容及原因}显示实际的代码变更,供用户审查:
git diff突出关键修改并解释其影响。
向用户提问:
是否希望我将这些更改提交为 Pull Request?如有需要调整之处,请告知。
仅在用户于第 7 阶段批准后执行此阶段。
git add -A
git commit -m "fix: {简短描述} (#{number})
{详细说明问题所在及本次提交如何修复}
Closes #{number}"根据第 3 阶段权限检查结果,推送到合适的远程仓库:
# 若具有写入权限(第 3 阶段推送成功):
git push origin fix/issue-{number}
# 若在第 3 阶段创建了分支副本:
git push fork fix/issue-{number}pr_template=""
for f in .github/PULL_REQUEST_TEMPLATE.md .github/pull_request_template.md docs/pull_request_template.md PULL_REQUEST_TEMPLATE.md; do
if [ -f "$f" ]; then
pr_template="$f"
break
fi
done若找到 PR 模板,则以此为基础填写相关内容;否则使用以下默认模板。
## 概述
修复 #{number}。
### 问题
{来自问题分析的简要问题描述}
### 解决方案
{来自修复实现的简要解决方案描述}
### 修改内容
- {修改 1}
- {修改 2}
### 测试
- [x] 现有测试通过
- [x] {执行的其他验证操作}
---
<sub>🔧 由 [issue-to-pr](https://github.com/4yDX3906/issue-to-pr) 生成</sub>gh pr create \
--repo {owner}/{repo} \
--title "fix: {short description}" \
--body "$pr_body" \
--base {default_branch} \
--head {head_ref}
{head_ref}的值为:直接推送时使用fix/issue-{number},通过 fork 推送时使用{your_username}:fix/issue-{number}。
提示: 若修复内容仍需进一步审查,可添加
--draft标志以创建草稿 PR。
gh pr create 命令的输出中获取 PR 地址。✅ PR 创建成功:{PR_URL}
请前往 PR 页面查看 CI 检查结果或评审反馈。
若用户拒绝自动提交或任一步骤失败,请提供以下指引:
fix: {short description} (#{number})
{详细说明}
Closes #{number} gh pr create \
--title "fix: {short description}" \
--body "..." \
--base {default_branch} - 查看差异:git diff {default_branch}
- 提交并推送更改
- 创建 PR 并确认 CI 流水线通过
对以下常见失败情况进行妥善处理:
| 情况 | 处理方式 |
|---|---|
gh CLI 未安装 | 回退至 git clone 和 fetch_content。建议安装:brew install gh 或访问 https://cli.github.com |
gh auth 未配置 | 提示用户运行 gh auth login 后重试 |
| 仓库为私有 / 返回 403 错误 | 告知用户需要认证,并引导其完成身份验证 |
| 问题不存在 / 返回 404 | 请再次核对链接,并请用户确认问题编号是否正确 |
无写入 /tmp 权限 | 改为在工作区目录中克隆 |
| 修复后测试失败 | 分析失败输出,修改修复方案并重新验证 |
| 无法确定根本原因 | 展示当前已知信息,并请求用户提供指导 |
| 问题过大或过于复杂 | 将问题拆分为子任务,优先修复最关键部分,并标注剩余工作 |
git push 权限被拒绝 | 自动创建仓库的 fork,并推送到 fork 仓库 |
gh pr create 执行失败 | 显示错误详情,并提供手动命令 |
用户的 gh 未认证 | 提示用户先运行 gh auth login |
| 远程分支已存在 | 询问用户是否强制推送,或创建新分支名 |
| 该分支已有对应 PR | 显示现有 PR 地址,并询问是否更新 |
| 未发现测试框架 | 使用 get_problems 进行静态分析,手动验证,并在 PR 中注明 |
| 问题包含多个缺陷 | 优先修复最严重的问题,其余事项作为后续跟进 |
| 修复分支已存在 | 询问用户是否复用、重新创建或重命名该分支 |
gh CLI 凭据。不会存储额外凭据。已收录 2 个 Skill