5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

Claude CodeのSubagentとcontext: forkは何が違うのか

Claude Code機能多すぎ問題

2週間ほど前、会社のブログに「LINE iOSアプリ開発を高速化するClaude Code基盤の設計思想」という記事を書いた。

この記事では、ビルド実行のようなタスクをSubagentに分離し、高度な操作をSkillsで隠蔽する方法を紹介している。

---
name: module-builder
description: Build specific modules for the app
tools: Bash, Read, Grep, Glob
skills: creating-xcode-build-scheme
---

<!-- Subagent -->

# mobule-builder

しかし、わずかここ数週間ほどの間でcontext: forkという新たなSkillのオプションが導入された*1。これを使うと、Skill実行をメインContextからフォークした別Contextを持つエージェントに委譲できる。

---
name: building-module
context: fork
---

<!-- Skill -->

今まではSkillは全てメインエージェント上で実行されていたが、これにより、Subagent + Skillといった複雑な組み合わせを使わずとも、軽量な操作であればSkill単体で完結できるようになった。実質Subagent。

それに加えて、ContextをフォークしたSkillにもSubagentを指定する手段も提供された。agent:オプションだ。これはforkしたSkillを任意のSubagentで実行できるようにするオプション。

---
name: building-module
context: fork
agent: module-builder
---

<!-- Skill -->

すなわち、SkillをSubagent化して実行する方法に、現状3つの手段があることになる。

  1. SubagentからSkillを実行する(skills:)
  2. Skillをフォークしたコンテキストを持つサブエージェントで実行する(context: fork)
  3. Skillを指定したSubagentで実行する(context: fork + agent:)

全部同じじゃないですか!

Subagent + Skill vs context: fork

いちいちSkillとSubagentを別けて作るのは面倒だし、もはや全部context: forkで良いのでは?などと思っていたが、公式ドキュメントにそれっぽい記述があった。

Image
これらの指定の比較。読んでもよくわからない

これを見てみてもいまいちピンとこない。Taskとは?Claude's delegation messageとは?

Skillの分類 - Reference ContentsとTask Contents

これを理解するには、どうやらスキルコンテンツの種類を知る必要があるようだ。Skillが持つプロンプトは大きくReference ContentsとTask Contentsに大別できる。

Reference Contentsは、Agentに現在の作業に適応する知識を渡すタイプのSkill。特定の作業を行う際に、プロンプトが常に読み込まれ知識として利用される。 例えば、コーディング規約やドメイン知識、スタイルガイドといった、常に知っておくべき知識が該当する。

一方でTask Contentsは、Agentに特定の作業手順を実行させるタイプのSkill。「PRを開く」とか、「特定のコードを生成する」と言った能動的に実行するタスクリストがこちらに当たり、最近Skillに統合された従来のCustom Slash Commandsはこちらに分類される。

これは、ゲームにおけるパッシブスキルとアクティブスキルのようなものだと考えると理解しやすい。

Subagentが主か、Skillが主か

このSkillの分類を理解すると、それぞれの指定の意味が見えてくる。要はSubagentとSkillのどちらを主体に据えるかという点だ。

従来のSubagentへのskill:指定は、Subagentの中にSkillの知識を展開するという挙動になる。すなわち、Reference Contentsを持ったSkillを隔離されたContextに展開し、その中で作業をさせるイメージ。

このとき、実行する操作は、SKILL.mdではなく、サブエージェントを立ち上げる際にメインエージェントから渡されるプロンプトに従うことになる。そのため、Task Contentsの実行には向かないかもしれない*2。上記の表にある"Claude's delegation message"はこのような挙動を指しているのだろう。

一方で、Skillへのcontext: forkの指定は、Skillの実行をメインエージェントから分離するために使う。Skillから新しいサブエージェントを立ち上げるという挙動になるため、逆にSkillが主となる。

上述のドキュメントにはcontext: forkでは、Reference Contentsは上手く動作しないと警告されている。Task Contentsを持つSkillにのみ適応するのが無難そうだ。

agent:の指定

agent:オプションは、Skillからサブエージェントを立ち上げる際に、そのSubagentを指定するためのオプションだ。利用例によると、サブエージェントの利用するモデルやパーミッションを細かく切り替えたい場合に使うようだが、ほとんどの場合は組み込みSubagent(Explore, Plan, general-purpose)で十分な気がする。

ここのSubagentに与えたプロンプトは、上記の表によるとシステムプロンプトと同格の扱いになるようだが、Skillの方に書く場合とどれぐらいの違いがあるかはよくわからなかった。

context: forkはTask Contentsにのみ使う

現状の使い分けとしては、Reference ContentsはSubagent + Skillを使い、Task Contentsはcontext: forkも選択肢に入る、という理解であっていそう。

これまでの話を表にざっくりまとめると以下のようになる。

Subagent + Skill context: fork context: fork + agent:
Contextの引き継ぎ 新しいContextが生成される メインContextがフォークされる メインContextがフォークされる
システムプロンプト SubagentのMarkdown 組み込みAgentのSystem Prompt SubagentのMarkdown
実行するタスク 元請けのメインエージェントが決める SKILL.md内で定義された内容 SKILL.md内で定義された内容
追加で読み込まれるプロンプト SKILL.md + CLAUDE.md CLAUDE.md CLAUDE.md + SubagentのMarkdown
向いている用途 Reference Contents。Subagentの中でルールに従って処理をさせる Task Contents。明確なTaskリストをSubagentで実行させる Task Contents。Subagentの挙動をさらに細かくカスタムしたい場合

これであってるかな?

最初の記事に戻ると、現在ではビルドのようなタスクはTask Contentsと言えるので、context: forkで十分で、「ビルド設定ファイルの編集」のような知識を伴う操作はSubagent + Skillで実装するのが良さそうだ。この場を借りてお詫びして訂正いたします*3

ほぼ日刊Claude Code

本記事は、1/27現在の最新版、2.1.20時点での情報を元にしている。

Claude Codeのアップデートは比喩ではなく日々配信されていて、もはや日刊Claude Codeの様相を呈している。数日で環境がコロコロ変わるし、キャッチアップが追いつかない!

今回の記事の内容はあまり日本語の情報を見かけたことがないので調べて役立ったし、Skillの実装やレビューも感覚でやっていたので、ちゃんとした論拠ができて良かった。公式ドキュメントはちゃんと読むものだなあ。

*1:1/8配信の2.1.1から実装されたらしい

*2:この点については定かではない。従来はcontext: forkがなかったことを考えると、Task Contentsを持ったSkillの実装もできそう

*3:社の記事を書いた段階ではcontext: forkはまだ実装されていなかった記憶

ゲームのプレイ時間を記録する技術

ゲームのプレイ時間を計りたい!

先日、1年間に遊んだゲームを振り返るエントリを書いた。日常的にめちゃくちゃゲームで遊んでいるので、ゲームのプレイ時間を正確にレコードしておきたい需要は強い。というわけで、個人で作っているゲームプレイ時間トラッカーについて紹介したい。

Image
なんと、遊んだゲームが記録できている!

DiscordのActivityを監視する

種明かしをすると、DiscordのActivity機能を利用している。DiscordはPCのみならず、PlayStation NetworkXbox Liveのアカウントとも連携することができてプレイ状態を表示できる。

Image
こんな感じでActivityが表示される

Discordサーバーにbotを常駐させておき、Activityが切り替わる度にデータを保存し続けているだけ。

このシステムは、実は2023年末ぐらいから2年以上稼働している。当初はPythonで実装していたが、1年ぐらいしてから機能追加のついでにKotlin製にフルリプレースした。PaaSはHerokuで動かしている。

Image
年間ランキングも見れる

ネイティブアプリは標準的なiOSアプリとして実装した。標準的な構成で特に言う事はない。

Platform情報の取得

Discord botの実装には、Python版はdiscord.py、Kotlin版はKordを利用している。しかし、どちらのライブラリもActivity上のPlatform情報をサポートしていなかった。

それもそのはずで、Platformの値はundocumentedだったので、実際にpayloadを取得してみるしかなかった。2年以上経ったが、未だにドキュメントには掲載されていないようだ。

というわけで、どちらのライブラリも自分で直している。

Nintendo Onlineのサポート

この仕組みでPS5、Xbox、PC(Steamなど)で遊んだゲームは記録できるようになったが、Nintendo Switch(2)は公式のDiscordサポートがない。調べたところ、勝手にNintendo Onlineの非公開APIに接続して、DiscordのActivityを更新するツールがあるようだ。iOSアプリのUAを偽造して繋いでいて面白い。

これを使えばSwitchのプレイログも取得できそうだが、BANのリスクも恐いので利用していない。正式対応が来るのが望ましいが、Switch 2でボイスチャットサポートが入ってしまったので、望み薄な気がする。

ゲームのプレイログを取ろう!

というわけで、せっかくなので記事を書いてみたが、非公開の個人プロダクトの紹介だとこれぐらいの中身になってしまう。Vibe Codingが流行る前の時期に作ったので、結構お手製感があったが、今だとAIでシュッと作れるので特に感慨も薄いが便利に使っている。

DiscordのSubscriptionの仕組みで利用権を販売したり、誰でも使えるような形で公開するのも考えたが、追加の対応があまりにも大変そうだったのでやめた*1。公開することはなさそうだ。

*1:タイムゾーンの考慮とか

開発環境現状確認2026

開発環境現状確認(2026年) - Don't Repeat Yourselfという記事を見かけたので僕も書いてみることにする。

Terminalエミュレータ

WezTermとGhostty(ほぼWezTerm)

2つを併用しているが、基本はほとんどWezTermGhosttyも使えるように設定しているが、以前のバージョンは仕事の環境で使っていたところクラッシュが頻発したので、結局WezTermを使う運用になっている。Appleプラットフォーム的にはGhosttyの方がネイティブUIに近くて良さそうだけど……。

両方ともカスタムしていて同じように使えるようになっていてどちらも使える。

設定ファイルはこちら。 WezTerm / Ghostty

Image
フッターは頑張ってデザインした

Terminal Multiplexer

WezTermの組み込みMultiplexer / tmux

WezTermの場合は、組み込みのMultiplexer、Ghosttyの場合はtmuxを使っている。WezTerm側のキーバインドをtmuxに寄せているので、ほとんど違いがなく意識不要。tmuxは15年以上使ってそう。

普段、ターミナルのウィンドウを1つだけ開いて、そこに大量のペインを作るという運用になっているが、最近はClaude Codeに同時に開発させる機会が増えてきたので、複数窓する機会も増えてきた。

Shell

zsh + Starship

素に近いzshとpowerline表示のためにStarship。zshにはいくつかプラグインを入れているが最低限。以前はプラグインマネージャーのようなものも使っていたが、オーバーヘッドが気になったので、ここ数年は結局dotfilesにsubmoduleでpluginを入れて、sourceするだけのシンプルな運用になっている。

iOSエンジニアっぽいポイントとして、Swiftプロジェクトの場合、常にSwiftとXcodeバージョンがpowerline上に表示されるようになっている。仕事柄Xcodeのバージョン切り替えを頻繁に行うのでかなり気に入っている拡張。Starshipの設定例はこちら

Image
Xcodeバージョンが常に出てる

dotfiles

homeshick

10年以上前からずっとShell Scriptベースのhomeshickで管理している。最近はchezmoiというツールもあるらしいけど、過剰に感じ、現状全く困っていないのでそのまま。

基本はgiginet/castleというリポジトリにほぼ全てが入っていて、プライベート・業務用マシンの両方で共有している。ちなみにこのdotfilesのInitial Commitは2011年でもう16年もメンテしている。

homeshickの良いところは、複数のリポジトリを管理できるところなので、業務用にはさらに追加のリポジトリを作って、GHEに置いている。 VPNやSSHなどといった社内固有の設定と、最近は別リポジトリにClaude Codeの業務用ユーザースキルを置いたりしている。

以前はLinuxマシンで動くようにもしていたが、最近はほぼmacOS専用。

エディタ

Neovim

大昔にNeovimに移行した記事を書いたが、それ以来ずっとNeovimを使っている。去年ぐらいに.vimファイルを駆逐し、全てLuaベースの設定に移行した。

細かなsyntax類などのプラグインはいろいろ入れているが、主要なプラグインとしては現状は以下のようになっている。

vim界隈は変化が激しいので、3~4年に一度、気が向いたときに調べて盆栽している。 テキストを書いたり、簡単な設定ファイルの編集はほとんどvimで行われていて、このブログ記事もvimで書いている。

Image
LSPや補完なども効くので最低限開発できる

IDE

Xcode / Jetbrains IDEs

主に書く言語がSwiftとKotlinなので、コーディングにNeovimはあまり使っていなくて、順当にXcodeやIntelliJを使っている。

IntelliJのUltimateプランには毎年お布施しつづけていて、どの言語を書くのにもIDEを使うことが多い。PyCharmやRubyMineも使い、たまにClionを使ったりもする。VS Codeは一応導入してるけどUIが気に入らずに、ほとんど使うことはない。現代では珍しいかも。

フォント

BitstormWera NerdFont

www.nerdfonts.com

昔からこれを使っている。変えると違和感がありそう。Nerd Fontはいろいろなアイコンが付いてるのでShellをオシャレしたいときに便利。

AIエージェント

Claude Code

最近はClaude Code弄りが捗っている。$100の方のMaxプラン。

個人開発では、MCPはuserスコープでSerena MCPとPerplexity MCPを常に有効にしていて、あとはプロジェクトによって追加している(自作のxcodeproj-mcpとかも)。業務では自作のSkillsもいろいろ用意している。Skillsの管理は独自Marketplaceを作るより、単なるdotfilesとして扱った方が楽なので上記と同じように管理している。

基本的にあまり激しくカスタムはしていないが、ccstatuslineとかはちょっと気になっている。

ブラウザ

Firefox

思想が強いといわれることが多いが、ずっとFirefox使っている。

Webエンジニアとは微妙にスキルセットが異なり、Webフロントを触る機会が一切ないので、逆にChromeを使わなくても成立している説がある。ちなみに未だにマウスジェスチャで操作している。

常用しているCLIツール

tig - gitビュアー

gitはほぼこれで、ghを使ってパッとブラウザを開けるようにしたりなど、結構カスタムしている。

lazygitなども試したが、長年使っているtigから離れられない。最近見かけたkeifuはちょっと気になっている。

ghq - リポジトリ管理

リポジトリ管理はほぼこれ

peco - Fuzzy Finder

Fuzzy Finderのpecoもずっと使っている。全く困ってなくてfzfへの移行圧力がない。ブランチやworktree切り替え、ghqの移動などをpeco経由で切り替えられるエイリアスが用意されている

zoxide / autojump - ディレクトリ切り替え

一度行ったディレクトリに曖昧検索で移動できるツール。長年の手癖でめちゃくちゃ使っていて、仕事のリポジトリはj l*1などで遷移してるレベル。

長年autojumpというPython製のものを使っていたが、もっとモダンなのはないのかとこの記事を書くタイミングで調べたら、zoxideというRust製のものがあったので乗り換えてみた。migrationツールも付いててインターフェイスも完全に一緒なのでスムーズに移行できた。Python製よりバイナリの方が扱いやすい。

wtp - gitワークツリー管理

直近導入した。最近のCoding Agentブームで、worktreeが再注目されていて、似たようなツールが群雄割拠となってきている。いろんなツールがあったが、wtpが一番メンタルモデルに近いので使っている。worktreeの新規作成時にhookを設定しておけるのも便利。

direnv - Environment Variable管理

ディレクトリ毎に環境変数を管理してくれるやつ。ないと困る。

その他開発に使っているmacOSアプリ

Marked 2 - Markdownプレビュー

Markdownのビュアー。vimからショートカットで立ち上がるようにしている。10年以上前に買ったっきり、買い切りでずっと使えていて凄い。GFMもサポートしているのでREADMEを書くときにも便利。

Kaleidoscope - Diffビュアー

macOSネイティブの高級diffビュアー。これを使ってると「金持ちですね」と言われる。最近はコーディングエージェントの生成したdiffを見るのにかなり多用しているが、difitのようなブラウザベースのもので良い気もしている。これもtigからショートカットで立ち上がるようにしている。

Raycast - ランチャー

ランチャー。設定の同期をしたいためにプレミアム会員だが、最近emojiの検索とアプリの起動ぐらいにしか使えていなくて、Workflowもあまり活用できていない。 macOS 26からSpotlightも強化されたので、標準に寄せるのでいいかもしれない。

Image
emoji探す機能を一番使ってるかも

Obsidian - メモ

メモアプリ。Design Docから日報、日常のメモまでだいたいObsidianに集約している。同期はiCloud Drive。これ単体でもプラグインなどを入れているので、使い方は今度また記事にしたい。

盆栽は楽しい

2026年1月時点での開発環境をまとめてみた。ツールの手入れを盆栽などと揶揄することが多いが、10年以上代わり映えがないツールも増えてきて、本当におじいちゃんみたいになってきた。若い方にとっては、温故知新というか、逆に古いツールを再発見する機会になると良いなと思う。

*1:lとは

Image