natea/move-coach/tree/main/plugins/move-coach
move-coach
Claude Code にカメラペインを追加する mod です。MediaPipe の姿勢ランドマークを緑で描いたウェブカメラ映像、その横に対応する *Built to Move* のイラストを表示し、テスト中は音声でコーチングします。
この mod について
Move Coach
Claude Code にカメラペインを追加する mod です。MediaPipe の姿勢ランドマークを緑で描いたウェブカメラ映像、その横に対応する Built to Move のイラストを表示し、テスト中は音声でコーチングします。
/move-coach [test] [camera#]でペインを開きます。テストを指定しなければ通常のカメラプレビューになります。/move-coach stopで実行を終了します。- ツール
mcp__move-coach__camera_testで Claude がテストを実行できます。built-to-move-mobility-testスキルがこれを使います。 - テスト:
sit_and_rise、couch、airport_scanner、shoulder_rotation、squat、solec、old_man。
構成
helper/pose_coach.py:uv スクリプト(mediapipe 0.10.14、opencv)。カメラを取り込み、Pose Landmarker(モデルは~/.cache/move-coachにキャッシュ)を実行し、テストごとに1つのステートマシンを動かします。合図を音声で伝え、JSON 行を mod にストリームします。hooks/register.tsx:ペイン、スラッシュコマンド、ツール。Ghostty はカメラを PNGImageとして描画し、Desktop アプリは JPEG フレームを埋め込み、その上にベクターの骨格を重ねたSvgとして描画します。assets/book/:任意のイラスト。書籍のイラストには著作権があり、同梱していません。自分のものを~/.config/move-coach/book/に置いてください(assets/book/README.md参照)。なくてもペインは動きます。
音声
デフォルトでは、コーチは macOS 内蔵音声(say)で話すため、設定は不要です。
より自然な声にするには、プラグインの設定(/config → move-coach → "ElevenLabs API key"、セキュアストレージに保存)に ElevenLabs API キーを追加し、必要なら voice ID も指定します。キーは読み取り後に削除するプライベートファイルで helper に渡され、コマンドラインには出ません。ELEVENLABS_API_KEY=... を含む ~/.config/move-coach/keys.env も使えます。ElevenLabs が合図を再生できない場合、その合図は say にフォールバックします。音声クリップは ~/.cache/move-coach/tts にキャッシュされます。
要件
カメラ付きの macOS、uv(helper は初回実行時に自分で Python パッケージを入れる uv スクリプト)、Xcode コマンドラインツール(xcode-select --install、小さな "Move Coach Camera" アプリを一度ビルドするために使用)が必要です。任意で ffmpeg(カメラ名)、Muse ヘッドバンド、EEG 用の liblsl(brew install labstreaminglayer/tap/lsl)も使えます。
カメラの権限
Claude アプリはカメラの責任を持たない状態でセッションを開始するため、mod から直接起動した helper はカメラにアクセスできず、macOS も許可を求められません。そこで helper/launch.sh は小さな Move Coach Camera.app(helper/camera-app/ から ~/Library/Application Support/move-coach/ に作成)をビルドし、open でその中から helper を実行します。標準出力は FIFO で中継します。初回は macOS が "Move Coach Camera" のカメラ許可を表示し、許可は Claude の更新後も残ります。取り消すにはシステム設定 → プライバシーとセキュリティ → カメラを開きます。
任意:Muse ヘッドバンドから脳波を読む
/move-coach eeg(ペインの Connect Muse EEG ボタン、またはツールの eeg_start アクションでも可)は helper/eeg_stream.py を実行し、muse-lsl で Muse を読み取ります。すでに動いている LSL EEG ストリーム(muselsl stream)があれば接続し、なければ Bluetooth で Muse を探して muselsl stream を自分で開始します。/move-coach eeg Muse-1A2B で名前からヘッドバンドを選び、/move-coach eeg stop で終了します。
ペインには各チャンネル(TP9、AF7、AF8、TP10)の直近 4 s、センサーごとの接触ドット、直近 1 s の相対帯域パワーが表示されます。テスト中は、テスト期間の平均帯域パワー(eeg_mean_relative_band_power)も結果に含まれます。
カメラと同じく helper は "Move Coach Camera.app" 内で動くため、macOS が Bluetooth の許可を一度だけ尋ねます。pylsl には liblsl が必要です。wheel に含まれていなければ brew install labstreaminglayer/tap/lsl を実行してください。
インストール
まず作者の README で marketplace とプラグイン名を確認してください。コマンドはリポジトリの構成によって変わる場合があります。
claude plugin marketplace add natea/move-coach claude plugin install move-coach
原文 / README
Move Coach
A Claude Code mod that adds a camera pane: your webcam feed with MediaPipe pose landmarks drawn in green, the matching Built to Move illustration beside it, and spoken coaching while you do the test.
/move-coach [test] [camera#]opens the pane. With no test it's a plain camera preview./move-coach stopends a run.- Tool
mcp__move-coach__camera_testlets Claude run a test. Thebuilt-to-move-mobility-testskill uses it. - Tests:
sit_and_rise,couch,airport_scanner,shoulder_rotation,squat,solec,old_man.
Pieces
helper/pose_coach.py: a uv script (mediapipe 0.10.14, opencv). It captures the camera, runs the Pose Landmarker (model cached in~/.cache/move-coach), and runs one state machine per test. It speaks cues and streams JSON lines to the mod.hooks/register.tsx: the pane, the slash command and the tool. Ghostty draws the camera as a PNGImage; the Desktop app draws it as anSvgthat embeds the JPEG frame with a vector skeleton on top.assets/book/: illustrations, optional. The book's illustrations are copyrighted and aren't shipped; put your own in~/.config/move-coach/book/(seeassets/book/README.md). The pane works without them.
Voice
By default the coach speaks with the built-in macOS voice (say); nothing to set up.
For a more natural voice, add an ElevenLabs API key in the plugin's settings (/config → move-coach →
"ElevenLabs API key", stored in secure storage), and optionally a voice ID. The key reaches the helper
in a private file it deletes on read, never on the command line. ~/.config/move-coach/keys.env with
ELEVENLABS_API_KEY=... also works. If ElevenLabs fails for a cue, that cue falls back to say.
Audio clips are cached in ~/.cache/move-coach/tts.
Requirements
macOS with a camera, uv (the helpers are uv scripts that install their own
Python packages on first run), and the Xcode command-line tools (xcode-select --install, used once to
build the small "Move Coach Camera" app). Optional: ffmpeg (camera names), a Muse headband and liblsl
(brew install labstreaminglayer/tap/lsl) for EEG.
Camera permission
The Claude app starts its sessions with camera responsibility disclaimed, so a helper spawned straight from the mod can never get camera access (and macOS can't prompt for it). helper/launch.sh therefore builds a tiny Move Coach Camera.app (in ~/Library/Application Support/move-coach/, from helper/camera-app/) and runs the helper inside it with open, relaying its stdout through a FIFO. The first run shows the macOS camera prompt for "Move Coach Camera"; the grant then sticks across Claude updates. Revoke it in System Settings → Privacy & Security → Camera.
Optional: brain waves from a Muse headband
/move-coach eeg (or the pane's Connect Muse EEG button, or the tool's eeg_start action) runs
helper/eeg_stream.py, which reads a Muse through muse-lsl.
It attaches to an LSL EEG stream if one is already running (muselsl stream), and otherwise scans
Bluetooth for a Muse and starts muselsl stream itself. /move-coach eeg Muse-1A2B picks a headband
by name; /move-coach eeg stop ends it.
The pane draws the last 4 s of each channel (TP9, AF7, AF8, TP10), a contact dot per sensor, and
relative band power over the last second. While a test runs, its result also carries the mean band
power during the test (eeg_mean_relative_band_power).
The helper runs inside "Move Coach Camera.app", like the camera, so macOS asks once to allow Bluetooth.
pylsl needs liblsl: if the wheel doesn't bundle it, brew install labstreaminglayer/tap/lsl.