project-sync-issues
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chineseproject-sync-issues
project-sync-issues
GitHub Actions ワークフローファイルを生成し、Issue/PR の状態変更をプロジェクトの Status フィールドに自動同期します。手動での一括補正モードも提供します。
生成GitHub Actions工作流文件,将Issue/PR的状态变更自动同步至项目的Status字段。同时提供手动批量修正模式。
前提条件
前提条件
- 対象の GitHub Project がリポジトリにリンクされていること
- CLI がインストールされ、認証済みであること(
ghスコープ付き)project
- 目标GitHub Project已关联至仓库
- 已安装CLI并完成认证(需包含
gh权限范围)project
フロー
流程
ユーザーに実行モードを確認する:
- 自動同期セットアップ — GitHub Actions ワークフローを生成(初回推奨)
- 手動一括補正 — 現在の不整合を一括修正(スポット実行用)
向用户确认执行模式:
- 自动同步设置 — 生成GitHub Actions工作流(首次使用推荐)
- 手动批量修正 — 批量修正当前状态不一致问题(用于临时执行)
モード A: 自動同期セットアップ
模式A: 自动同步设置
Step A-1: プロジェクト情報を取得する
Step A-1: 获取项目信息
bash
undefinedbash
undefinedオーナーを取得
获取仓库所有者
gh repo view --json owner -q '.owner.login'
gh repo view --json owner -q '.owner.login'
プロジェクト番号を確認
确认项目编号
gh project list --owner <owner> --format json
ユーザーに対象プロジェクトの番号を確認する。gh project list --owner <owner> --format json
向用户确认目标项目的编号。Step A-2: 認証シークレットを案内する
Step A-2: 配置认证密钥
GitHub Actions から Projects API にアクセスするには では不足するため、以下のいずれかが必要:
GITHUB_TOKEN方法 1: Personal Access Token(個人/小規模向け)
- GitHub Settings → Developer settings → Personal access tokens → Fine-grained tokens
- 必要なスコープ: (読み書き)+
project(読み書き)+issues(読み書き)pull_requests - リポジトリの Settings → Secrets and variables → Actions → として登録
PROJECT_TOKEN
方法 2: GitHub App トークン(Organization 向け・推奨)
- GitHub App を作成し、Organization に 権限を付与
Projects: Read and write - ワークフロー内で を使用してトークンを生成
actions/create-github-app-token
GitHub Actions访问Projects API仅靠权限不足,需使用以下任一方式:
GITHUB_TOKEN方法1: Personal Access Token(适用于个人/小规模团队)
- 进入GitHub设置 → Developer settings → Personal access tokens → Fine-grained tokens
- 所需权限范围: (读写)+
project(读写)+issues(读写)pull_requests - 在仓库设置 → Secrets and variables → Actions中,以为名添加该令牌
PROJECT_TOKEN
方法2: GitHub App令牌(适用于组织,推荐)
- 创建GitHub App,并为组织授予权限
Projects: Read and write - 在工作流中使用生成令牌
actions/create-github-app-token
Step A-3: GitHub Actions ワークフローを生成する
Step A-3: 生成GitHub Actions工作流
Fandhe-AI/actions/project-sync.github/workflows/project-sync.ymlPAT を使用する場合:
yaml
name: Project Sync
on:
issues:
types: [opened, closed, reopened]
pull_request:
types: [opened, closed, ready_for_review, review_requested]
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Sync project status
uses: Fandhe-AI/actions/project-sync@main
with:
project-number: '<number>'
project-owner: '<owner>'
token: ${{ secrets.PROJECT_TOKEN }}GitHub App を使用する場合(推奨):
yaml
name: Project Sync
on:
issues:
types: [opened, closed, reopened]
pull_request:
types: [opened, closed, ready_for_review, review_requested]
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Generate token
id: token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
owner: '<owner>'
- name: Sync project status
uses: Fandhe-AI/actions/project-sync@main
with:
project-number: '<number>'
project-owner: '<owner>'
token: ${{ steps.token.outputs.token }}カスタム Status オプション名を使用する場合:
Status オプション名がデフォルト(Todo / In Progress / In Review / Done)と異なる場合は inputs で指定する:
yaml
- name: Sync project status
uses: Fandhe-AI/actions/project-sync@main
with:
project-number: '<number>'
project-owner: '<owner>'
token: ${{ secrets.PROJECT_TOKEN }}
status-todo: 'バックログ'
status-in-progress: '作業中'
status-in-review: 'レビュー中'
status-done: '完了'使用 Composite Action,生成文件:
Fandhe-AI/actions/project-sync.github/workflows/project-sync.yml使用PAT的情况:
yaml
name: Project Sync
on:
issues:
types: [opened, closed, reopened]
pull_request:
types: [opened, closed, ready_for_review, review_requested]
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Sync project status
uses: Fandhe-AI/actions/project-sync@main
with:
project-number: '<number>'
project-owner: '<owner>'
token: ${{ secrets.PROJECT_TOKEN }}使用GitHub App的情况(推荐):
yaml
name: Project Sync
on:
issues:
types: [opened, closed, reopened]
pull_request:
types: [opened, closed, ready_for_review, review_requested]
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Generate token
id: token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
owner: '<owner>'
- name: Sync project status
uses: Fandhe-AI/actions/project-sync@main
with:
project-number: '<number>'
project-owner: '<owner>'
token: ${{ steps.token.outputs.token }}使用自定义Status选项名的情况:
若Status选项名与默认值(Todo / In Progress / In Review / Done)不同,可通过inputs参数指定:
yaml
- name: Sync project status
uses: Fandhe-AI/actions/project-sync@main
with:
project-number: '<number>'
project-owner: '<owner>'
token: ${{ secrets.PROJECT_TOKEN }}
status-todo: 'バックログ'
status-in-progress: '作業中'
status-in-review: 'レビュー中'
status-done: '完了'Step A-4: ステータスマッピングを確認する
Step A-4: 确认状态映射规则
生成するワークフローのデフォルトマッピング:
| イベント | アクション | Status |
|---|---|---|
| Issue | opened | Todo |
| Issue | closed | Done |
| Issue | reopened | Todo |
| PR | opened | In Progress |
| PR | ready_for_review | In Review |
| PR | review_requested | In Review |
| PR | closed (merged) | Done |
| PR | closed (not merged) | Todo |
ユーザーの要望に応じてマッピングをカスタマイズする。
生成的工作流默认映射规则如下:
| 事件 | 操作 | Status |
|---|---|---|
| Issue | opened | Todo |
| Issue | closed | Done |
| Issue | reopened | Todo |
| PR | opened | In Progress |
| PR | ready_for_review | In Review |
| PR | review_requested | In Review |
| PR | closed (merged) | Done |
| PR | closed (not merged) | Todo |
可根据用户需求自定义映射规则。
Step A-5: ワークフローファイルを配置する
Step A-5: 部署工作流文件
bash
mkdir -p .github/workflowsbash
mkdir -p .github/workflowsワークフローファイルを .github/workflows/project-sync.yml に書き出す
将工作流文件写入.github/workflows/project-sync.yml
ユーザーにコミット・プッシュを案内する。
---
引导用户提交并推送该文件。
---モード B: 手動一括補正
模式B: 手动批量修正
プロジェクトと Issue/PR の現在の状態を比較し、不整合を一括修正する。自動同期セットアップ後の初回補正や、手動変更の反映に使用する。
对比项目与Issue/PR的当前状态,批量修正不一致问题。适用于自动同步设置后的首次修正,或手动变更后的状态同步。
Step B-1: プロジェクトアイテムを取得する
Step B-1: 获取项目项
bash
gh project item-list <number> \
--owner <owner> \
--format json \
--limit 999bash
gh project item-list <number> \
--owner <owner> \
--format json \
--limit 999Step B-2: Issue/PR の現在状態を確認する
Step B-2: 确认Issue/PR当前状态
Issue/PR タイプのアイテムに対して現在の状態を確認:
bash
gh issue view <issue-url> --json state,labels,assignees
gh pr view <pr-url> --json state,isDraft,reviewRequests,merged针对Issue/PR类型的项目项,确认其当前状态:
bash
gh issue view <issue-url> --json state,labels,assignees
gh pr view <pr-url> --json state,isDraft,reviewRequests,mergedStep B-3: 状態の不一致を検出する
Step B-3: 检测状态不一致
以下の不一致パターンを検出:
- Issue が closed だがプロジェクトの Status が Done でない → Done に更新
- Issue が open だがプロジェクトの Status が Done → Todo に更新
- PR がマージ済みだが Status が Done でない → Done に更新
- PR にレビューリクエストがあるが Status が In Review でない → In Review に更新
检测以下不一致场景:
- Issue已关闭但项目Status未设为Done → 更新为Done
- Issue已重新打开但项目Status设为Done → 更新为Todo
- PR已合并但Status未设为Done → 更新为Done
- PR已发起评审请求但Status未设为In Review → 更新为In Review
Step B-4: リポジトリの未追加 Issue/PR を検出する
Step B-4: 检测仓库中未添加至项目的Issue/PR
bash
gh issue list --state open --json number,url,title --limit 999
gh pr list --state open --json number,url,title --limit 999プロジェクトのアイテム URL と比較して未追加分を特定する。
bash
gh issue list --state open --json number,url,title --limit 999
gh pr list --state open --json number,url,title --limit 999对比项目项的URL,识别未添加的Issue/PR。
Step B-5: ユーザーに同期内容を確認する
Step B-5: 向用户确认同步内容
検出結果を表示:
undefined展示检测结果:
undefined同期内容
同步内容
ステータス更新(N 件)
状态更新(N项)
- #42: ソーシャルログイン — Status: In Progress → Done(Issue closed)
- #45: バグ修正 — Status: Done → Todo(Issue reopened)
- #50: リファクタリング PR — Status: In Progress → In Review(レビュー依頼済み)
- #42: 社交登录 — Status: In Progress → Done(Issue已关闭)
- #45: Bug修复 — Status: Done → Todo(Issue已重新打开)
- #50: 重构PR — Status: In Progress → In Review(已发起评审请求)
新規追加(M 件)
新增项目项(M项)
- #55: 新機能リクエスト (Issue)
- #56: ドキュメント更新 PR
実行しますか?
undefined- #55: 新功能请求 (Issue)
- #56: 文档更新PR
是否执行同步?
undefinedStep B-6: 同期を実行する
Step B-6: 执行同步
bash
undefinedbash
undefinedフィールドメタデータを取得
获取字段元数据
gh project field-list <number> --owner <owner> --format json
gh project field-list <number> --owner <owner> --format json
ステータス更新
更新状态
gh project item-edit
--id <item-id>
--field-id <status-field-id>
--project-id <project-id>
--single-select-option-id <option-id>
--id <item-id>
--field-id <status-field-id>
--project-id <project-id>
--single-select-option-id <option-id>
gh project item-edit
--id <item-id>
--field-id <status-field-id>
--project-id <project-id>
--single-select-option-id <option-id>
--id <item-id>
--field-id <status-field-id>
--project-id <project-id>
--single-select-option-id <option-id>
新規追加
新增项目项
gh project item-add <number>
--owner <owner>
--url <issue-or-pr-url>
--format json
--owner <owner>
--url <issue-or-pr-url>
--format json
undefinedgh project item-add <number>
--owner <owner>
--url <issue-or-pr-url>
--format json
--owner <owner>
--url <issue-or-pr-url>
--format json
undefinedStep B-7: 同期結果を報告する
Step B-7: 同步结果报告
| 操作 | 件数 |
|---|---|
| ステータス更新 | N 件 |
| 新規追加 | M 件 |
| 変更なし | K 件 |
| 操作 | 数量 |
|---|---|
| 状态更新 | N项 |
| 新增项目项 | M项 |
| 无变更 | K项 |
注意事項
注意事项
- 認証: GitHub Actions から Projects API へのアクセスには では不足。PAT または GitHub App トークンが必要
GITHUB_TOKEN - PAT 有効期限: fine-grained PAT は最大1年。定期ローテーション推奨
- ビルトインワークフローとの併用: でビルトインワークフロー(closed→Done, merged→Done)を有効化済みの場合、Actions ワークフローと二重に発火するが、同じ値への更新なので実害はない
project-init - PR ライフサイクル: ビルトインワークフローは closed/merged のみ対応。opened→In Progress, review_requested→In Review は Actions でのみ自動化可能
- プライベートリポジトリ: org の Settings → Actions → General でプライベートリポジトリからの Action 共有を許可する必要あり
- 手動補正モードは同期前に必ずユーザーの確認を得る
- DraftIssue タイプのアイテムは同期対象外(実 Issue が存在しないため)
- sandbox 環境での 併用:詳細は後述の「sandbox 環境での実行」節を参照
GIT_SSL_NO_VERIFY=1
- 认证: GitHub Actions访问Projects API仅靠权限不足,需使用PAT或GitHub App令牌
GITHUB_TOKEN - PAT有效期: 细粒度PAT最长有效期为1年,建议定期轮换
- 与内置工作流共存: 若已通过启用内置工作流(closed→Done, merged→Done),会与本Actions工作流重复触发,但因是更新为相同值,无实际影响
project-init - PR生命周期: 内置工作流仅支持closed/merged状态,opened→In Progress、review_requested→In Review仅能通过本Actions实现自动化
- 私有仓库: 需在组织设置 → Actions → General中允许私有仓库共享Action
- 手动修正模式执行前必须获得用户确认
- DraftIssue类型的项目项不在同步范围内(因无对应实际Issue)
- sandbox环境下需配合:详情请参考后文「sandbox环境下的执行」章节
GIT_SSL_NO_VERIFY=1
sandbox 環境での実行
sandbox环境下的执行
sandbox で本スキルを実行する場合、ネットワーク越しの GitHub 操作には の併用を検討してください。本スキルの主なリモート操作は / / で、「リモート書き込み」判定は 要 です。コマンド分類の詳細と TLS 検証無効化の注意事項は を参照してください。
GIT_SSL_NO_VERIFY=1git pushgh project item-editgh issue listdocs/sandbox-tls.md在sandbox环境中执行本技能时,通过网络操作GitHub需考虑配合使用。本技能的主要远程操作包括 / / ,均属于需要远程写入的操作。命令分类详情及TLS验证禁用注意事项请参考。
GIT_SSL_NO_VERIFY=1git pushgh project item-editgh issue listdocs/sandbox-tls.md