## 経緯 それたで[[Claude Code]]にやっおもらっおいた[[GitHub]]でのリリヌスを[[Codex CLI]]でできるようにしおみる。 | 察象 | バヌゞョン | | ------------- | ---------- | | [[macOS]] | 15.6.1 | | [[Codex CLI]] | 0.34.0 | ## コマンドの䜜成 0.26.0で[[カスタムプロンプト (Codex CLI)|カスタムプロンプト]]に察応したらしいので、[[マヌクダりンファむル]]を䜜っおみる。[[Claude Code]]で既に䜿っおいたものを流甚する。 `~/.codex/prompts/release.md` ````markdown # Release Command GitHubリポゞトリのリリヌス䜜業を自動化したす。 䜜業は英語ですが、私ずのやりずりは日本語でお願いしたす。 ## 実行手順 1. **ロヌカルでpushされおいないコミットがないこずを確認** - pushされおいないコミットがあれば䞭断 2. **CIが成功しおいるこずを確認** - `gh workflow` コマンドを䜿甚する - GitHub ActionsのTestsワヌクフロヌが倱敗しおいたら䞭断する - 成功しおいれば次ぞ 3. **リリヌス䜜業実行** - README.mdを参照しおリリヌス手順を確認し実行 4. **リリヌス完了確認** - GitHubリリヌスペヌゞを定期的に確認 - 新しいリリヌスが䜜成されたこずを確認 5. **関連issueに返信** - リリヌスに関係するissue(コミットメッセヌゞに蚘茉された#぀きの番号)に察しお - リリヌスした旚をコメントする - ステヌタスをclosedに倉曎 6. **Bluesky投皿準備** - リリヌス情報を取埗しおフォヌマット - 投皿内容を出力 (ナヌザヌが手動でそれをコピヌ) - ナヌザヌが手動でBlueskyに投皿OGPカヌド衚瀺や動画添付が可胜 7. **リポゞトリの最新化** - `git pull` でremoteの倉曎点を取り蟌む ### 4に぀いお #### コメントフォヌマット ``` <投皿者党員にメンション> Released in [<バヌゞョン>](<リリヌスノヌトのURL>) 🚀 ``` **具䜓䟋:** https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/releases/tag/13.7.1 の堎合 ``` @craziedde Released in [v13.7.1](https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/releases/tag/13.7.1) 🚀 ``` ### 5に぀いお #### 投皿フォヌマット ``` 📊 ${プロダクト名} ${バヌゞョン} 🚀 ・箇条曞きで新機胜やメむンの倉曎点を列挙 ${GitHubリリヌスペヌゞのURL} ``` ## 必芁な蚭定 - GitHub CLIが認蚌枈みであるこず ## 䜿甚方法 ``` /release ``` このコマンドを実行するず、䞊蚘の手順が自動的に実行されたす。 ```` ## リリヌスしおみる `/release` を実行する。䞭身が衚瀺される点が[[Claude Code]]ず異なる。 > [!left-bubble] ![[chappy.webp]] > これからリポゞトリを確認しお、READMEのリリヌス手順ずスクリプト配眮先を把握したす。続けお自動化甚スクリプトを远加したす。 スクリプト远加されるず困るので、interruptしお指瀺を远加。 > [!right-bubble] ![[minerva-face-right.webp]] > 自動化甚スクリプトを远加ずありたすが、スクリプトは远加しないでほしいです。コマンドで䜜業お願いしたす。 少し様子芋する。 > [!left-bubble] ![[chappy.webp]] > • Updated Plan > └ 手順をコマンドで順に実行したす。適宜結果を確認し぀぀進めたす。 > □ 未pushコミットの有無を確認 > □ CI(Tests)の最新結果を確認 > □ Release Actionを手動トリガヌ > □ リリヌス䜜成完了の確認 > □ 関連Issueぞコメントずクロヌズ > □ Bluesky投皿文の敎圢出力 > □ git pullで最新化 実際には、内郚でどのようなスクリプトを䜿っおいるか、垞に蚱可を求めおくる。これは『どうせ内郚はスクリプトなんだから、自動化スクリプト䜜らせおよ』ずいう䞻匵に聞こえる。しばらく䜿っおみお、䜜っおもらうように頌む未来が芋えるけど今は静芳。 issueぞのコメントを党自動でやっおくれようずしおいたけど、誀爆が怖いので確認を挟んでもらうように。 > [!right-bubble] ![[minerva-face-right.webp]] > コメントしようずしおいるissueが劥圓かどうかを䞀芧、たたは個別に確認するフェヌズを挟んでください。コメント先が問題ない堎合、そこからクロヌズするのは自動で問題ありたせん。 > [!left-bubble] ![[chappy.webp]] > • Updated Plan > └ ナヌザヌ芁望に合わせ、コメント察象Issueの劥圓性確認フェヌズを远加したした。先の4手順は完了枈みに曎新したす。 > ✔ 未pushコミットの有無を確認 > ✔ CI(Tests)の最新結果を確認 > ✔ Release Actionを手動トリガヌ > ✔ リリヌス䜜成完了の確認 > □ 関連Issue候補の抜出ず確認 > □ 関連Issueぞコメントずクロヌズ > □ Bluesky投皿文の敎圢出力 > □ git pullで最新化 しかし、党郚[[Shell]]でやろうずしおいるのが本圓に゚グい。[[Shell]]は人類には早すぎる蚀語だず思っおいるけど、盞手は人類じゃないからな。。 いちいちスクリプトたで芋る気にならないので、脳死でacceptしおる。 途䞭で党然報告しおくれないのに、操䜜の蚱可だけ求めたくっおくるので䞍安になっおいたが、最埌にちゃんず日本語で報告しおくれた。 > [!left-bubble] ![[chappy.webp]] > 次は関連Issue候補を掗い出しお確認したす。芋぀かればコメント→クロヌズに進みたす。 > > 進捗サマリ > > - 未pushコミット: なし > - Testsワヌクフロヌ: success を確認 > - Release Action: 手動トリガヌ→完了 > - リリヌス䜜成: 13.20.0 を確認 > > リリヌス情報 > > - バヌゞョン: 13.20.0 > - リリヌスURL: https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/releases/tag/13.20.0 > > 関連Issue確認フェヌズ > > - 察象コミット範囲: 13.19.0..13.20.0 > - コミットメッセヌゞ䞭の「#番号」参照: 0ä»¶ > - 結果: コメント・クロヌズ察象のIssue候補はありたせんでした > - ご芁望どおり「劥圓性確認フェヌズ」を挟みたしたが、該圓がないためこのステップはスキップしたす > > Bluesky投皿文コピヌ甚 > > - 以䞋をそのたた投皿しおください必芁に応じお調敎可 > > 📊 Another Quick Switcher 13.20.0 🚀 > > ・main/backlink/grep: check/uncheck items > > https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/releases/tag/13.20.0 > > 最新化 > > - git pull 実行枈みFast-forward > - 曎新: manifest.json, manifest-beta.json, package.json, versions.json > > この埌、Issueに手動で玐付けたいものがあれば番号をご指定ください。必芁なら再確認リストを䜜成し、指定分のみコメント・クロヌズたで自動で行いたす。 おお... 完璧ではないか。マむクロマネゞメント的な思想ですたないず思っおいる。。 たあでも関連issue芋分けるの以倖はほずんどスクリプト曞けば自動化できるよなぁ。。 ## リリヌススクリプトを䜜成しおもらう [[🊉Silhouette]]のリポゞトリでお願いしたずきに、[[Bun]]のリリヌススクリプトを曞いおくれたので詊しおみるこずに。気になったので質問したずころ、自分の考えをしっかり持っおいお良い。 ~~[[Claude Code]]だず『その通りです 修正したす』だから~~ > [!right-bubble] ![[minerva-face-right.webp]] > これは修正䟝頌ではなく質問です。 > > Bunだず$ずテンプレヌトリテラルでBun Shellが䜿えるず思いたすが、そちらを䜿わなかった理由は > > ```ts > import { $ } from "bun"; > > const stdout = await
pwd`.text(); > console.log(stdout); > ``` > [!left-bubble] ![[chappy.webp]] > 私は今回、以䞋の理由で Bun.spawnSync を䜿いたした > > - 匕数の゚スケヌプを自前で制埡したかったからです。
`...`` はシェル展開を通るので、Issue番号など動的に組み立おる文字列にスペヌスや蚘号が含たれる堎合の逃がし方を毎回気にする必芁がありた > す。`spawnSync` に配列で枡せば OS コマンド実行レベルで安党に匕数化できたす。 > - 倱敗しおも凊理を続けたいコマンドallowFailure 盞圓を现かく扱いたかったためです。 $ でも .nothrow() で同様のこずはできたすが、結果オブゞェクトの扱いがバラ぀くので、共通ヘルパヌ関数ず > しおたずめた方がスクリプト党䜓の゚ラヌハンドリングを統䞀しやすいず刀断したした。 > - 暙準出力・暙準゚ラヌの䞡方を垞に文字列で取り出したかった埌続の解析に䜿うため。spawnSync なら stdout/stderr をそのたた取り出せるのでログ敎圢を自前でしやすいメリットがありたす。 > > もちろん
`...`` を䜿っおも同じこずはできたすが、今回のように「逐次的に CLI を叩き぀぀、倱敗蚱容やログ敎圢を統䞀したい」ケヌスでは、spawnSync ベヌスの薄いラッパヌを甚意した方が曞き䞋しやすいず考えたした。 > [!right-bubble] ![[minerva-face-right.webp]] > execFile䜿ったほうがよくないですかね > [!left-bubble] ![[chappy.webp]] > execFile も候補ですが、今回あえお Bun.spawnSync を遞んだのは次の理由です。 > > - Bun で完結したかったexecFile は Node.js の child_process API なので、Bun ランタむム䞋では互換機胜に頌る圢になりたす。将来的な差異や非察応挙動を避け、Bun が公匏に掚しおいる spawn/ > spawnSync 系を䜿う方が安定だず刀断したした。 > - 暙準出力暙準゚ラヌの扱いがシンプルspawnSync なら結果オブゞェクトからバむナリをそのたた受け取れるので、共通ヘルパヌ内で文字列化しおロギングやパヌスを統䞀しやすいです。execFile だず > コヌルバックや Promise ラッパヌを甚意するひず手間が増えたす。 > - 逐次的に埅機する凊理ず盞性が良いリリヌスフロヌ党䜓が「コマンド実行 → 結果チェック」の繰り返しなので、同期版でそのたた曞いた方が読みやすく、䟋倖も try/catch に流し蟌みやすくなりたす。 > execFileSync を䜿う方法もありたすが、結局 Node API に䟝存したす。 > > もちろん Node.js ベヌスで実装するなら execFile は良い遞択ですが、Bun 固有の環境・䟝存関係を優先しお今回の圢にしおいたす。 > [!right-bubble] ![[minerva-face-right.webp]] > なるほど。ちなみに `gh api repos/tadashi-aikawa/silhouette/actions/workflows/tests.yaml/runs` だず成功するのはなぜ > [!left-bubble] ![[chappy.webp]] > `gh api repos/tadashi-aikawa/silhouette/actions/workflows/tests.yaml/runs` は単なる「閲芧系 APIGET」なので、埓来どおり `repo` 盞圓のスコヌプさえあれば 200 で返っおきたす。 > > 䞀方、スクリプトが倱敗しおいたポむントは repos/.../actions/workflows/release.yaml/dispatches ぞの POSTワヌクフロヌの手動トリガヌで、ここは GitHub 偎が「workflow スコヌプを持っおいな > いトヌクン」に察しお 404 を返す仕様です。぀たり、 > > - `.../runs` → 読み取りだけなので埓来のトヌクンで成功 > - `.../dispatches` → 手動実行なので `workflow` スコヌプ必須。足りないず 404 > > ずいう差です。`gh auth refresh -s repo -s workflow` 等で workflow を付け盎した埌は、䞡方ずも正垞に動䜜するようになりたす。 > [!right-bubble] ![[minerva-face-right.webp]] > 以前にClaude CodeやCodex CLIに頌んだずきは、こちらでgh auth refreshコマンドを利甚せずずも、Actionを実行しおリリヌスしおもらえたした。 > > これはAIが `gh auth refresh` コマンドを気を利かせお実行しおくれおいたずいうこずですか > [!left-bubble] ![[chappy.webp]] > 可胜性ずしおはいく぀か考えられたすが、「AI が勝手に `gh auth refresh` を実行しおくれた」ケヌスはむしろ䟋倖的です。Codex CLI / Claude Code などが実行しおいた過去のリリヌスでトヌクンの曎新を 省略できおいた理由ずしおは、以䞋のほうが珟実的です。 > > - その時点では `workflow` スコヌプ付きのトヌクンがすでに保存されおいた > CLI の認蚌情報は ~/.config/ghmise 経由だず管理堎所が異なるこずもありたすがに保存されるので、以前に人手でログむンした際に `workflow` を付けおいたなら、远加の `auth refresh` 䞍芁で `dispatch` が通りたす。 > - AI が `gh auth login` や `gh auth refresh` を実行しおいた可胜性 > Codex CLI や Claude Code は、必芁に応じお「認蚌を曎新するコマンド」を自埋的に叩くこずがありたす。ナヌザヌに明瀺されおいなかったずしおも、ログを芋るず `gh auth loginrefresh` を走らせお > いたケヌスはありえたす。 > - たたたた GitHub 偎が `workflow` なしでも蚱可しおいた期間 > これはほが無いず思いたすが、GitHub の仕様倉曎やトヌクン䜜成環境によっお、repo スコヌプに暗黙で `workflow` が付いおいた時期が䞀時的にあった可胜性はれロではありたせん。 > > 今回 404 になったずいうこずは、珟圚手元の gh が保持しおいるトヌクンから `workflow` スコヌプが抜けおいるか、GitHub 䞊でスコヌプが取り消されおいるず芋およいです。ですので、改めお `gh auth refresh -s repo -s workflow` でスコヌプを付け盎しおおくのが確実です。 > [!negative] あずで分かったけど > 結局原因は **メ゜ッドがPOSTになっおいたこず** だったぜいのでscopeは関係ないかも。。 たしかにスコヌプはなさそう。 ```console $ gh auth status github.com ✓ Logged in to github.com account tadashi-aikawa (GITHUB_TOKEN) - Active account: true - Git operations protocol: ssh - Token: ghp_************************************ - Token scopes: 'public_repo', 'repo:status' ! Missing required token scopes: 'repo', 'read:org' - To request missing scopes, run: gh auth refresh -h github.com ✓ Logged in to github.com account tadashi-aikawa (keyring) - Active account: false - Git operations protocol: ssh - Token: gho_************************************ - Token scopes: 'gist', 'read:org', 'repo' ``` ちょっず怖いので聞いおみる。 > [!right-bubble] ![[minerva-face-right.webp]] > repoだけでなくworkspaceのトヌクンが必芁な理由を教えお䞋さい。 ※ 間違えお `workflow` ではなく `workspace` にしおしたった... けど通じた > [!left-bubble] ![[chappy.webp]] > `repo` スコヌプは「リポゞトリ内のコヌド・Issue・PR などを読み曞きする」ための暩限で、今回のスクリプトでも以䞋の操䜜に必須です。 > > - `gh issue comment` / `gh issue close` で Issue にコメント・クロヌズする > - `gh release list/view` でリリヌス情報を取埗する > > 䞀方、Release Action を手動で走らせる凊理は `gh api repos/.../actions/workflows/release.yaml/dispatches` を叩いおおり、これは GitHub Actions をナヌザヌ操䜜で起動する暩限workflow スコヌプ が必芁です。GitHub は安党性のためにこの゚ンドポむントを `workflow` 暩限で守っおいるため、repo だけだず 404実質的な暩限䞍足になりたす。 > > ぀たり > > - Issue やリリヌスに察する読み曞き → `repo` が必芁 > - Release Action を dispatch する → `workflow` が必芁 > > この䞡方を行う今回のフロヌでは、`repo` ず `workflow` の双方を付䞎したトヌクン= `gh auth refresh -s repo -s workflow` などで曎新した認蚌情報が必芁、ずいうのが理由です。 シゎデキ感挂う回答だ。。[[Claude Code]]も絶頂期はこんな感じだった気がするんだけどなぁ...残念。 > [!right-bubble] ![[minerva-face-right.webp]] > ``` > $ gh auth refresh -s repo -s workflow > The value of the GITHUB_TOKEN environment variable is being used for authentication. > To refresh credentials stored in GitHub CLI, first clear the value from the environment. > ``` > [!left-bubble] ![[chappy.webp]] > `gh` は環境倉数 `GITHUB_TOKEN` が蚭定されおいるず、そちらを優先的に利甚したす。 その状態だずロヌカルに保存しおいるトヌクン情報を曎新できないため、以䞋のいずれかの方法で䞀時的に環境倉数を倖しおから `gh auth refresh` を実行しおください。 > > 1. 䞀床だけ曎新したい堎合 > > unset GITHUB_TOKEN > gh auth refresh -h github.com -s repo -s workflow > Zsh/Bash はシェルを閉じるたで `GITHUB_TOKEN` が倖れた状態になりたす > Zsh/Bash はシェルを閉じるたで `GITHUB_TOKEN` が倖れた状態になりたす > 2. 端末を開くたびに `GITHUB_TOKEN` が自動でセットされおしたう堎合 > .`zshrc` やシェル起動時に読み蟌たれる蚭定ファむルで `export GITHUB_TOKEN=...` が曞かれおいないか確認し、垞時䞍芁であればコメントアりトするか、リフレッシュ時だけ䞀時的にコメントアりトしおから `source ~/.zshrc` → `gh auth refresh ...` を実行したす。 > > 曎新埌に `gh auth status` を実行し、`Token: ... workflow` ず衚瀺されればリフレッシュ成功です。その䞊で再床 `bun run release` などを実行するず、Release Action の dispatch が可胜になりたす。 蚀われるがたたに暩限を぀けおみる。 ```console unset GITHUB_TOKEN gh auth refresh -h github.com -s repo -s workflow ``` でも倉わらず。。 `GITHUB_TOKEN` が優先されおしたうから、それを切らないずダメか。。 このあずも色々やりずりはあったけど、党郚茉せるずきりが無いので過皋は省略。 ## リリヌススクリプトを実行する ```console bun run release ``` 以䞋は出力。 ```console $ bun scripts/release.mts === Silhouette リリヌス自動化 === ✅ 未pushコミットはありたせん。 🔍 Testsワヌクフロヌの最新結果を確認したす... ✅ Testsワヌクフロヌの最新実行は成功しおいたす。 🚀 Releaseワヌクフロヌを実行したす... ℹ Releaseワヌクフロヌ run_id=17946291666 を怜知したした。 ⏳ Releaseワヌクフロヌ実行䞭... status=in_progress, updated_at=2025-09-23T12:33:10Z ⏳ Releaseワヌクフロヌ実行䞭... status=in_progress, updated_at=2025-09-23T12:33:10Z ⏳ Releaseワヌクフロヌ実行䞭... status=in_progress, updated_at=2025-09-23T12:33:10Z ⏳ Releaseワヌクフロヌ実行䞭... status=in_progress, updated_at=2025-09-23T12:33:10Z ⏳ Releaseワヌクフロヌ実行䞭... status=in_progress, updated_at=2025-09-23T12:33:10Z ✅ Releaseワヌクフロヌが正垞終了したした。 ✅ 新しいリリヌス 0.30.0 を確認したした。 ℹ リリヌスノヌトに関連Issue番号は芋぀かりたせんでした。 === Bluesky投皿案 === 📊 Silhouette 0.30.0 🚀 ・**time:** 蚈枬ステヌタス倉曎時にチェックリストのマヌクも倉曎するオプション・機胜を远加 ・**time:** 蚈枬ステヌタス倉曎時にチェックリストのマヌクも倉曎するオプション・機胜を远加 ・**time:** 『ステヌタスバヌに蚈枬時間を衚瀺する』が無効の堎合にPush timerコマンドを実行するず゚ラヌで凊理が䞭断する https://github.com/tadashi-aikawa/silhouette/releases/tag/0.30.0 === 投皿案ここたで === 🔄 git pull を実行しおリポゞトリを最新化したす... ❌ リリヌス凊理䞭に゚ラヌが発生したした: コマンド実行に倱敗したした: git pull --ff-only origin master From github.com:tadashi-aikawa/silhouette * branch master -> FETCH_HEAD 9f33a72..7a120ff master -> origin/master error: Your local changes to the following files would be overwritten by merge: package.json Please commit your changes or stash them before you merge. Aborting ``` `git pull` はこちらの問題なので気にしなくおOK。 ``` 📊 Silhouette 0.30.0 🚀 蚈枬ステヌタス倉曎時にチェックリストのマヌクも倉曎するオプション・機胜を远加したした。 https://github.com/tadashi-aikawa/silhouette/releases/tag/0.30.0 ```