VSCode拡張機能 CodeZoo

コミットすればするほど猫が成長するコマンド
- git commitを行ったタイミングで猫が3段階に成長
- 特定のコマンドを打ち込み遊び(Play)や餌やり(Feed)を行うことが可能
- ターミナルで色をつける
- serde を使って状態保存(JSON)
+-----------------------------+
| 🐱 CodeZoo |
| |
| (cat image here) |
| [Play] [Feed] |
| |
| ❤️ Affection: 75% |
| 💤 Energy: 40% |
+-----------------------------+
- Git commit 時に処理:git/hooks/post-commitにスクリプトを記載git commit 実行直後に Rustアプリ(例:codezoo play)を呼び出せる。
- 特定のコマンド処理:
std::env::args()
を使ってCLI引数(例:play, feed)を受け取り処理を行う - ターミナルの色づけ:colored クレートなどのターミナル制御ライブラリ
- serde を使って状態保存(JSON):serde + serde_json クレートを使用した構造体の保存と読み込み
vscode-pets
vscode-petsのようなVScodeの拡張機能を作成したい。
拡張機能の要件
・VScode内で猫を育成する。
・ 3段階に成長する。
・最初はなついていない 餌やり、おもちゃで遊ぶことを複数回繰り返すと好感度が上がる。
・育成と作業の連動: VS Codeでのタスク(一定時間の作業、commit)を完了するたびに、リワードを猫に与えられる仕組み。
・ UIの作成: WebviewまたはStatusBarを使って猫を表示する 。
・ ステート管理: データを永続化(VS Codeのグローバルステート)し、拡張機能を再起動しても猫の状態が保持されるようにする。
【実装内容】
- 猫の描写
- 猫を動作させる
- UIの作成: WebviewまたはStatusBarを使って猫を表示する
- 「餌やり」、「おもちゃ」のボタン表示
- 「満腹度」「エネルギー」のステータス表示
- ステート管理: データを永続化(VS Codeのグローバルステート)し、拡張機能を再起動しても猫の状態が保持されるようにする。
- デバッグ: 各機能をテストし、挙動が期待通りか確認。
VScode拡張機能公開までの流れ
猫のアニメーションを探す。

WebView API
WebViewは、ローカルリソースに直接アクセスできない独立したコンテキストで実行される。拡張機能から画像、スタイルシート、その他のリソースを読み込む場合、あるいはユーザーの現在のワークスペースからコンテンツを読み込む場合は、Webview.asWebviewUriローカルfile:URIを、VS Codeがローカルリソースのサブセットを読み込むために使用できる特別なURIに変換する関数を使用する必要がある。
(Webview に外部ファイルを読み込ませる際は webview.asWebviewUri() を必ず通す必要がある)

アニメーションの生成
requestAnimationFrame()
- ペットの動きをユーザーの操作に連動。
- ユーザーのマウス移動に反応
- ペットが大きくなる。
WebviewとVS Code APIの間でメッセージ通信
WebviewからVS Codeへのメッセージ送信
const vscode = acquireVsCodeApi();
vscode.postMessage({ type: 'move', direction: 'left' });
逆にVS CodeからWebviewへメッセージを送るには、postMessageメソッドを使用
panel.webview.postMessage({ command: 'movePet', direction: 'right' });

VS Codeの「Run Extension」機能で拡張機能をテスト
vsceツールを使用して拡張機能をパッケージ化し、VS Codeのマーケットプレイスに公開

vscode Global State
Mementoの場合
ExtensionContextの場合
ExtensionContext.workspaceStateでキー/値のペアを書き込み可能
// on activate
const versionKey = 'shown.version';
context.globalState.setKeysForSync([versionKey]);
// later on show page
const currentVersion = context.extension.packageJSON.version;
const lastVersionShown = context.globalState.get(versionKey);
if (isHigher(currentVersion, lastVersionShown)) {
context.globalState.update(versionKey, currentVersion);
}

猫の描写
- PNGやGIF画像
- SVG画像
- CSSアニメーション: webviewでHTMLと組み合わせて使用できる
- Canvas APIまたはWebGL
- Blenderで作成 / Three.js