diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index f221705..b67fe40 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -8,7 +8,7 @@ "name": "mutils", "source": "./plugins/mutils", "description": "masseater's utils", - "version": "0.8.0" + "version": "0.9.0" }, { "name": "sdd", @@ -32,25 +32,31 @@ "name": "use-codex", "source": "./plugins/use-codex", "description": "Codex CLI integration", - "version": "0.2.0" + "version": "0.2.1" }, { "name": "psp", "source": "./plugins/psp", "description": "Personal Project Setup - Cloudflare向け個人開発Webアプリのセットアップ", - "version": "0.0.7" + "version": "0.0.8" }, { "name": "progress-tracker", "source": "./plugins/progress-tracker", "description": "セッション進捗ファイルの自動作成・管理", - "version": "0.1.0" + "version": "0.1.1" }, { "name": "swarm", "source": "./plugins/swarm", "description": "Agent Teams(swarm)支援 - チーム設計・運用・振り返りガイド", + "version": "0.0.2" + }, + { + "name": "agnix", + "source": "./plugins/agnix", + "description": "AI アシスタント設定ファイルリンター(agnix)統合", "version": "0.0.1" } ] -} +} \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index b62f3da..fd0f71e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,9 +7,14 @@ Claude Codeプラグインのマーケットプレイスリポジトリ。 構造: -- `plugins/` - プラグイン本体(commands, skills, hooks, agents) -- `packages/` - 共有ライブラリ(npm公開用) -- `.claude-plugin/marketplace.json` - マーケットプレイス定義 + +| ディレクトリ/ファイル | 説明 | +|----------------------|------| +| `plugins/` | プラグイン本体(commands, skills, hooks, agents) | +| `packages/` | 共有ライブラリ(npm公開用) | +| `scripts/` | Git hooks 用スクリプト | +| `specs/` | SDD スペックファイル | +| `.claude-plugin/marketplace.json` | マーケットプレイス定義 | ## plugin list @@ -17,12 +22,13 @@ Claude Codeプラグインのマーケットプレイスリポジトリ。 |-----------|------| | **mutils** | 汎用ユーティリティコマンド集(hooks付き) | | **sdd** | Spec Driven Development ワークフロー支援 | -| **eslint-lsp** | ESLint Language Server 統合 | +| **eslint-lsp** | ESLint 9 Language Server 統合 | | **use-codex** | Codex CLI 統合(Web検索、ファイルレビュー) | | **psp** | Personal Project Setup - Cloudflare向け個人開発Webアプリ | | **progress-tracker** | セッション進捗ファイルの自動作成・管理 | | **debug** | プラグインデバッグ用 | | **swarm** | Agent Teams(swarm)支援 - チーム設計・運用・振り返りガイド | +| **agnix** | AI アシスタント設定ファイルリンター(agnix)統合 | ## package list @@ -36,12 +42,23 @@ Claude Codeプラグインのマーケットプレイスリポジトリ。 ### プラグイン開発(各プラグインディレクトリ内で実行) ```bash -cd plugins/mutils +cd plugins/ + +bun run check # lint + format チェック(Biome) +bun run check:fix # 自動修正 +bun run typecheck # 型チェック(tsgo = native TypeScript 7.x) +bun run knip # 未使用コード検出(一部プラグインのみ) +``` + +### パッケージ開発(packages/ 内で実行) + +```bash +cd packages/ bun run check # lint + format チェック(Biome) bun run check:fix # 自動修正 bun run typecheck # 型チェック(tsgo = native TypeScript 7.x) -bun run knip # 未使用コード検出 +bun run build # ビルド ``` ## Git Hooks diff --git a/README.md b/README.md index 8218fb9..d98d047 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,46 @@ # masseater/claude-code-plugin -Claude Code 用のプラグインマーケットプレイス。 +Claude Codeプラグインのマーケットプレイスリポジトリ。 ## インストール ```bash # マーケットプレイスを追加 -/plugin marketplace add https://github.com/masseater/claude-code-plugin +/plugin marketplace add masseater/claude-code-plugin -# プラグインをインストール -/plugin install mutils +# プラグインをインストール(例: mutils) +/plugin install mutils@masseater-plugins ``` ## 含まれるプラグイン | プラグイン | 説明 | |-----------|------| -| **mutils** | 汎用ユーティリティコマンド集(Hooks付き) | +| **mutils** | 汎用ユーティリティコマンド集(hooks付き) | | **sdd** | Spec Driven Development ワークフロー支援 | +| **eslint-lsp** | ESLint Language Server 統合 | +| **use-codex** | Codex CLI 統合(Web検索、ファイルレビュー) | +| **psp** | Personal Project Setup - Cloudflare向け個人開発Webアプリ | +| **progress-tracker** | セッション進捗ファイルの自動作成・管理 | | **debug** | プラグインデバッグ用 | +| **swarm** | Agent Teams(swarm)支援 - チーム設計・運用・振り返りガイド | +| **agnix** | AI アシスタント設定ファイルリンター(agnix)統合 | 詳細は各プラグインの README を参照: - [plugins/mutils/README.md](./plugins/mutils/README.md) -- [plugins/sdd/README.md](./plugins/sdd/README.md) -- [plugins/debug/](./plugins/debug/) +- [plugins/debug/README.md](./plugins/debug/README.md) ## 開発者向け -開発ガイドは [AGENTS.md](./AGENTS.md) を参照。 +- ランタイム: [Bun](https://bun.sh/) +- リンター/フォーマッター: [Biome](https://biomejs.dev/) +- Git Hooks: [Lefthook](https://github.com/evilmartians/lefthook) + +詳細な開発ガイドは [AGENTS.md](./AGENTS.md) を参照。 ## 参考資料 - [Claude Code プラグインドキュメント](https://code.claude.com/docs/en/plugins) +- [フック](https://code.claude.com/docs/en/hooks) +- [スキル](https://code.claude.com/docs/en/skills) +- [サブエージェント](https://code.claude.com/docs/en/sub-agents) diff --git a/packages/sdd-webapp/AGENTS.md b/packages/sdd-webapp/AGENTS.md index c3c806f..ae159e2 100644 --- a/packages/sdd-webapp/AGENTS.md +++ b/packages/sdd-webapp/AGENTS.md @@ -1,6 +1,4 @@ -# AGENTS.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. +# sdd-webapp パッケージ開発ガイド ## プロジェクト概要 diff --git a/plugins/agnix/.mcp.json b/plugins/agnix/.mcp.json new file mode 100644 index 0000000..3575d7e --- /dev/null +++ b/plugins/agnix/.mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "agnix": { + "command": "bunx", + "args": ["agnix-mcp"] + } + } +} diff --git a/plugins/agnix/README.md b/plugins/agnix/README.md new file mode 100644 index 0000000..fa54013 --- /dev/null +++ b/plugins/agnix/README.md @@ -0,0 +1,10 @@ +# agnix - AI アシスタント設定ファイルリンター統合 + +agnix リンターを Claude Code に統合するプラグイン。 + +## インストール + +```bash +/plugin marketplace add masseater/claude-code-plugin +/plugin install agnix@masseater-plugins +``` diff --git a/plugins/agnix/bun.lock b/plugins/agnix/bun.lock new file mode 100644 index 0000000..ecfba3c --- /dev/null +++ b/plugins/agnix/bun.lock @@ -0,0 +1,244 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "dependencies": { + "@r_masseater/cc-plugin-lib": "0.0.3", + }, + "devDependencies": { + "@biomejs/biome": "^2.3.8", + "@types/bun": "^1.3.4", + "@typescript/native-preview": "^7.0.0-dev.20251207.1", + "cc-hooks-ts": "^2.1.19", + "knip": "^5.71.0", + "typescript": "^5.9.3", + }, + }, + }, + "packages": { + "@anthropic-ai/claude-agent-sdk": ["@anthropic-ai/claude-agent-sdk@0.2.34", "", { "optionalDependencies": { "@img/sharp-darwin-arm64": "^0.33.5", "@img/sharp-darwin-x64": "^0.33.5", "@img/sharp-linux-arm": "^0.33.5", "@img/sharp-linux-arm64": "^0.33.5", "@img/sharp-linux-x64": "^0.33.5", "@img/sharp-linuxmusl-arm64": "^0.33.5", "@img/sharp-linuxmusl-x64": "^0.33.5", "@img/sharp-win32-x64": "^0.33.5" }, "peerDependencies": { "zod": "^4.0.0" } }, "sha512-QLHd3Nt7bGU7/YH71fXFaztM9fNxGGruzTMrTYJkbm5gYJl5ZyU2zGyoE5VpWC0e1QU0yYdNdBVgqSYDcJGufg=="], + + "@biomejs/biome": ["@biomejs/biome@2.3.15", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.15", "@biomejs/cli-darwin-x64": "2.3.15", "@biomejs/cli-linux-arm64": "2.3.15", "@biomejs/cli-linux-arm64-musl": "2.3.15", "@biomejs/cli-linux-x64": "2.3.15", "@biomejs/cli-linux-x64-musl": "2.3.15", "@biomejs/cli-win32-arm64": "2.3.15", "@biomejs/cli-win32-x64": "2.3.15" }, "bin": { "biome": "bin/biome" } }, "sha512-u+jlPBAU2B45LDkjjNNYpc1PvqrM/co4loNommS9/sl9oSxsAQKsNZejYuUztvToB5oXi1tN/e62iNd6ESiY3g=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.15", "", { "os": "darwin", "cpu": "arm64" }, "sha512-SDCdrJ4COim1r8SNHg19oqT50JfkI/xGZHSyC6mGzMfKrpNe/217Eq6y98XhNTc0vGWDjznSDNXdUc6Kg24jbw=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.15", "", { "os": "darwin", "cpu": "x64" }, "sha512-RkyeSosBtn3C3Un8zQnl9upX0Qbq4E3QmBa0qjpOh1MebRbHhNlRC16jk8HdTe/9ym5zlfnpbb8cKXzW+vlTxw=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-FN83KxrdVWANOn5tDmW6UBC0grojchbGmcEz6JkRs2YY6DY63sTZhwkQ56x6YtKhDVV1Unz7FJexy8o7KwuIhg=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-SSSIj2yMkFdSkXqASzIBdjySBXOe65RJlhKEDlri7MN19RC4cpez+C0kEwPrhXOTgJbwQR9QH1F4+VnHkC35pg=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.15", "", { "os": "linux", "cpu": "x64" }, "sha512-T8n9p8aiIKOrAD7SwC7opiBM1LYGrE5G3OQRXWgbeo/merBk8m+uxJ1nOXMPzfYyFLfPlKF92QS06KN1UW+Zbg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.15", "", { "os": "linux", "cpu": "x64" }, "sha512-dbjPzTh+ijmmNwojFYbQNMFp332019ZDioBYAMMJj5Ux9d8MkM+u+J68SBJGVwVeSHMYj+T9504CoxEzQxrdNw=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.15", "", { "os": "win32", "cpu": "arm64" }, "sha512-puMuenu/2brQdgqtQ7geNwQlNVxiABKEZJhMRX6AGWcmrMO8EObMXniFQywy2b81qmC+q+SDvlOpspNwz0WiOA=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.15", "", { "os": "win32", "cpu": "x64" }, "sha512-kDZr/hgg+igo5Emi0LcjlgfkoGZtgIpJKhnvKTRmMBv6FF/3SDyEV4khBwqNebZIyMZTzvpca9sQNSXJ39pI2A=="], + + "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.17.1", "", { "os": "android", "cpu": "arm" }, "sha512-+VuZyMYYaap5uDAU1xDU3Kul0FekLqpBS8kI5JozlWfYQKnc/HsZg2gHPkQrj0SC9lt74WMNCfOzZZJlYXSdEQ=="], + + "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.17.1", "", { "os": "android", "cpu": "arm64" }, "sha512-YlDDTjvOEKhom/cRSVsXsMVeXVIAM9PJ/x2mfe08rfuS0iIEfJd8PngKbEIhG72WPxleUa+vkEZj9ncmC14z3Q=="], + + "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.17.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HOYYLSY4JDk14YkXaz/ApgJYhgDP4KsG8EZpgpOxdszGW9HmIMMY/vXqVKYW74dSH+GQkIXYxBrEh3nv+XODVg=="], + + "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.17.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-JHPJbsa5HvPq2/RIdtGlqfaG9zV2WmgvHrKTYmlW0L5esqtKCBuetFudXTBzkNcyD69kSZLzH92AzTr6vFHMFg=="], + + "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.17.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UD1FRC8j8xZstFXYsXwQkNmmg7vUbee006IqxokwDUUA+xEgKZDpLhBEiVKM08Urb+bn7Q0gn6M1pyNR0ng5mg=="], + + "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.17.1", "", { "os": "linux", "cpu": "arm" }, "sha512-wFWC1wyf2ROFWTxK5x0Enm++DSof3EBQ/ypyAesMDLiYxOOASDoMOZG1ylWUnlKaCt5W7eNOWOzABpdfFf/ssA=="], + + "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.17.1", "", { "os": "linux", "cpu": "arm" }, "sha512-k/hUif0GEBk/csSqCfTPXb8AAVs1NNWCa/skBghvNbTtORcWfOVqJ3mM+2pE189+enRm4UnryLREu5ysI0kXEQ=="], + + "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.17.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cwm6A071ww60QouJ9LoHAwBgEoZzHQ0Qaqk2E7WLfBdiQN9mLXIDhnrpn04hlRElRPhLiu/dtg+o5PPLvaINXQ=="], + + "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.17.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+hwlE2v3m0r3sk93SchJL1uyaKcPjf+NGO/TD2DZUDo+chXx7FfaEj0nUMewigSt7oZ2sQN9Z4NJOtUa75HE5Q=="], + + "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.17.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bO+rsaE5Ox8cFyeL5Ct5tzot1TnQpFa/Wmu5k+hqBYSH2dNVDGoi0NizBN5QV8kOIC6O5MZr81UG4yW/2FyDTA=="], + + "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.17.1", "", { "os": "linux", "cpu": "none" }, "sha512-B/P+hxKQ1oX4YstI9Lyh4PGzqB87Ddqj/A4iyRBbPdXTcxa+WW3oRLx1CsJKLmHPdDk461Hmbghq1Bm3pl+8Aw=="], + + "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.17.1", "", { "os": "linux", "cpu": "none" }, "sha512-ulp2H3bFXzd/th2maH+QNKj5qgOhJ3v9Yspdf1svTw3CDOuuTl6sRKsWQ7MUw0vnkSNvQndtflBwVXgzZvURsQ=="], + + "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.17.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-LAXYVe3rKk09Zo9YKF2ZLBcH8sz8Oj+JIyiUxiHtq0hiYLMsN6dOpCf2hzQEjPAmsSEA/hdC1PVKeXo+oma8mQ=="], + + "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.17.1", "", { "os": "linux", "cpu": "x64" }, "sha512-3RAhxipMKE8RCSPn7O//sj440i+cYTgYbapLeOoDvQEt6R1QcJjTsFgI4iz99FhVj3YbPxlZmcLB5VW+ipyRTA=="], + + "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.17.1", "", { "os": "linux", "cpu": "x64" }, "sha512-wpjMEubGU8r9VjZTLdZR3aPHaBqTl8Jl8F4DBbgNoZ+yhkhQD1/MGvY70v2TLnAI6kAHSvcqgfvaqKDa2iWsPQ=="], + + "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.17.1", "", { "os": "none", "cpu": "arm64" }, "sha512-XIE4w17RYAVIgx+9Gs3deTREq5tsmalbatYOOBGNdH7n0DfTE600c7wYXsp7ANc3BPDXsInnOzXDEPCvO1F6cg=="], + + "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.17.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-Lqi5BlHX3zS4bpSOkIbOKVf7DIk6Gvmdifr2OuOI58eUUyP944M8/OyaB09cNpPy9Vukj7nmmhOzj8pwLgAkIg=="], + + "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.17.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-l6lTcLBQVj1HNquFpXSsrkCIM8X5Hlng5YNQJrg00z/KyovvDV5l3OFhoRyZ+aLBQ74zUnMRaJZC7xcBnHyeNg=="], + + "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.17.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-VTzVtfnCCsU/6GgvursWoyZrhe3Gj/RyXzDWmh4/U1Y3IW0u1FZbp+hCIlBL16pRPbDc5YvXVtCOnA41QOrOoQ=="], + + "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.17.1", "", { "os": "win32", "cpu": "x64" }, "sha512-jRPVU+6/12baj87q2+UGRh30FBVBzqKdJ7rP/mSqiL1kpNQB9yZ1j0+m3sru1m+C8hiFK7lBFwjUtYUBI7+UpQ=="], + + "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], + + "@r_masseater/cc-plugin-lib": ["@r_masseater/cc-plugin-lib@0.0.3", "", { "dependencies": { "pino": "^10.1.0" } }, "sha512-rBRHI/1xsXDS22Oacfmz7ZnXB3rQV93g96/+uThKSKL0e+kA1hN5iKhyKTjl5XNH5sVK+WuQzH8WZ1pHerxjPg=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="], + + "@types/node": ["@types/node@25.2.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ=="], + + "@typescript/native-preview": ["@typescript/native-preview@7.0.0-dev.20260213.1", "", { "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260213.1", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260213.1", "@typescript/native-preview-linux-arm": "7.0.0-dev.20260213.1", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260213.1", "@typescript/native-preview-linux-x64": "7.0.0-dev.20260213.1", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260213.1", "@typescript/native-preview-win32-x64": "7.0.0-dev.20260213.1" }, "bin": { "tsgo": "bin/tsgo.js" } }, "sha512-TZ/0Tv954jRpn5IHQJZQF0gaNmw//ZTvkgr3nC2H8u9t4GxUhIk5vfAHVFgdl8JnNGbl7gZks37FVsEwXjdHqg=="], + + "@typescript/native-preview-darwin-arm64": ["@typescript/native-preview-darwin-arm64@7.0.0-dev.20260213.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nqfuHgFZ8MvaHeb1XOkAGIGc6cR91dwQdlHmlbH918n63JguKzkYjzzulpr48IVn1SVewGwjtfs1moCpaDpWcg=="], + + "@typescript/native-preview-darwin-x64": ["@typescript/native-preview-darwin-x64@7.0.0-dev.20260213.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-JDVDVLPIYhYZR12omTKwzKbdw+wnPEtLnkmM+nioqbISlV29fg7IBgFx0/mf1D+Gz1ztUQVHDTqw4GEgOZ9VTg=="], + + "@typescript/native-preview-linux-arm": ["@typescript/native-preview-linux-arm@7.0.0-dev.20260213.1", "", { "os": "linux", "cpu": "arm" }, "sha512-O6iVB8tTnLZJVYrChH6VJuCwqAa2ObWVdMtrKQw5UtmLXBhsOhZ3isttSuGzQrPfTiGN091IdW1KuRi8Ft1lnQ=="], + + "@typescript/native-preview-linux-arm64": ["@typescript/native-preview-linux-arm64@7.0.0-dev.20260213.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-d7Gwl8W4aics0KI4H0zz3TP1ngnP8L5COND0TPBZ7ifWVrxKDNSLhF2V9OuStW43RPfA4Gzik9iIv+l0Lg+eGw=="], + + "@typescript/native-preview-linux-x64": ["@typescript/native-preview-linux-x64@7.0.0-dev.20260213.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Aq55fID1fE5/8K4XvfVddgw8LKUgY3kp5IOb+QEklfyle4MuAV5gtat3MnEv9XMbiidk8iKVxYrYASlUQEQzDw=="], + + "@typescript/native-preview-win32-arm64": ["@typescript/native-preview-win32-arm64@7.0.0-dev.20260213.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-VlyULgXApmGMSqAANjskGx0AcjHchf3I8rhZ47AxF/XKAkZPe/5ewfleJ97iln7dg1UL3lq2cJY2CXxU+JPcFQ=="], + + "@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20260213.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lEtWvZDa2oCgqJ2gbP6BRLUeTyHLyrt5BfJmVlvmVSTZzdoBpFROJdp9yprsa2Zry2o5GK8HFAxd3RlvxkOU5Q=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="], + + "cc-hooks-ts": ["cc-hooks-ts@2.1.34", "", { "dependencies": { "@anthropic-ai/claude-agent-sdk": "0.2.34", "valibot": "^1.1.0" } }, "sha512-MzhyJ64LQ9Vk5TgXhLd73lq+8/ETxZRrvFIpYDBTFPxujiGO91fuAXGDgQ3e8yRoKGflbImF0LS/u0v8k4ySnQ=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "fd-package-json": ["fd-package-json@2.0.0", "", { "dependencies": { "walk-up-path": "^4.0.0" } }, "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "knip": ["knip@5.83.1", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-av3ZG/Nui6S/BNL8Tmj12yGxYfTnwWnslouW97m40him7o8MwiMjZBY9TPvlEWUci45aVId0/HbgTwSKIDGpMw=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + + "oxc-resolver": ["oxc-resolver@11.17.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.17.1", "@oxc-resolver/binding-android-arm64": "11.17.1", "@oxc-resolver/binding-darwin-arm64": "11.17.1", "@oxc-resolver/binding-darwin-x64": "11.17.1", "@oxc-resolver/binding-freebsd-x64": "11.17.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.17.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.17.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.17.1", "@oxc-resolver/binding-linux-arm64-musl": "11.17.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.17.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.17.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.17.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.17.1", "@oxc-resolver/binding-linux-x64-gnu": "11.17.1", "@oxc-resolver/binding-linux-x64-musl": "11.17.1", "@oxc-resolver/binding-openharmony-arm64": "11.17.1", "@oxc-resolver/binding-wasm32-wasi": "11.17.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.17.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.17.1", "@oxc-resolver/binding-win32-x64-msvc": "11.17.1" } }, "sha512-pyRXK9kH81zKlirHufkFhOFBZRks8iAMLwPH8gU7lvKFiuzUH9L8MxDEllazwOb8fjXMcWjY1PMDfMJ2/yh5cw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pino": ["pino@10.3.1", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^3.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^4.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg=="], + + "pino-abstract-transport": ["pino-abstract-transport@3.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg=="], + + "pino-std-serializers": ["pino-std-serializers@7.1.0", "", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="], + + "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + + "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + + "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], + + "sonic-boom": ["sonic-boom@4.2.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], + + "thread-stream": ["thread-stream@4.0.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "valibot": ["valibot@1.2.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg=="], + + "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], + + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + } +} diff --git a/plugins/agnix/hooks/hooks.json b/plugins/agnix/hooks/hooks.json new file mode 100644 index 0000000..6b05047 --- /dev/null +++ b/plugins/agnix/hooks/hooks.json @@ -0,0 +1,26 @@ +{ + "description": "agnix plugin hooks", + "hooks": { + "SessionStart": [ + { + "hooks": [ + { + "type": "command", + "command": "cd ${CLAUDE_PLUGIN_ROOT} && bun install" + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Write|Edit", + "hooks": [ + { + "type": "command", + "command": "bun run -i ${CLAUDE_PLUGIN_ROOT}/hooks/lint-config-file.ts" + } + ] + } + ] + } +} diff --git a/plugins/agnix/hooks/lib/agnix-runner.ts b/plugins/agnix/hooks/lib/agnix-runner.ts new file mode 100644 index 0000000..e403459 --- /dev/null +++ b/plugins/agnix/hooks/lib/agnix-runner.ts @@ -0,0 +1,32 @@ +import { execFileSync } from "node:child_process"; +import type { HookLogger } from "@r_masseater/cc-plugin-lib"; + +export const isAgnixAvailable = (): boolean => { + try { + execFileSync("which", ["agnix"], { stdio: "pipe" }); + return true; + } catch { + return false; + } +}; + +export const runAgnix = ( + args: string[], + logger: HookLogger, +): { exitCode: number; output: string } => { + try { + const result = execFileSync("agnix", args, { + stdio: "pipe", + encoding: "utf-8", + timeout: 30_000, + }); + logger.debug(`agnix exited with code 0`); + return { exitCode: 0, output: result }; + } catch (error) { + const err = error as { status?: number; stdout?: string; stderr?: string }; + const output = [err.stdout, err.stderr].filter(Boolean).join("\n"); + const exitCode = err.status ?? 1; + logger.debug(`agnix exited with code ${exitCode}`); + return { exitCode, output }; + } +}; diff --git a/plugins/agnix/hooks/lint-config-file.ts b/plugins/agnix/hooks/lint-config-file.ts new file mode 100644 index 0000000..4464d30 --- /dev/null +++ b/plugins/agnix/hooks/lint-config-file.ts @@ -0,0 +1,64 @@ +#!/usr/bin/env bun +import { basename } from "node:path"; +import { HookLogger, wrapRun } from "@r_masseater/cc-plugin-lib"; +import { defineHook, runHook } from "cc-hooks-ts"; +import { isAgnixAvailable, runAgnix } from "./lib/agnix-runner.js"; + +using logger = HookLogger.fromFile(import.meta.filename); + +const CONFIG_FILE_PATTERNS = [ + /(?:^|\/)(CLAUDE|AGENTS|SKILL)\.md$/, + /(?:^|\/)(hooks|plugin|settings)\.json$/, + /\.mcp\.json$/, + /(?:^|\/)\.claude\/rules\/.*\.md$/, +]; + +const isConfigFile = (filePath: string): boolean => + CONFIG_FILE_PATTERNS.some((pattern) => pattern.test(filePath)); + +const hook = defineHook({ + trigger: { + PostToolUse: { + Write: true, + Edit: true, + }, + }, + run: wrapRun(logger, (context) => { + const filePath = context.input.tool_input.file_path; + + if (!isConfigFile(filePath)) { + return context.success({}); + } + + if (!isAgnixAvailable()) { + logger.debug("agnix not found in PATH, skipping"); + return context.success({}); + } + + const { exitCode, output } = runAgnix( + ["--target", "claude-code", filePath], + logger, + ); + + if (exitCode === 0) { + logger.debug(`agnix: no issues found in ${basename(filePath)}`); + return context.success({}); + } + + logger.info(`agnix: issues found in ${basename(filePath)}`); + return context.json({ + event: "PostToolUse" as const, + output: { + hookSpecificOutput: { + hookEventName: "PostToolUse" as const, + additionalContext: `agnix lint results for ${basename(filePath)}:\n${output}`, + }, + suppressOutput: true, + }, + }); + }), +}); + +if (import.meta.main) { + await runHook(hook); +} diff --git a/plugins/agnix/knip.json b/plugins/agnix/knip.json new file mode 100644 index 0000000..08fc85e --- /dev/null +++ b/plugins/agnix/knip.json @@ -0,0 +1,3 @@ +{ + "entry": ["hooks/**/*.ts", "!hooks/lib/**"] +} diff --git a/plugins/agnix/package.json b/plugins/agnix/package.json new file mode 100644 index 0000000..739f4bf --- /dev/null +++ b/plugins/agnix/package.json @@ -0,0 +1,20 @@ +{ + "type": "module", + "scripts": { + "check": "biome check", + "check:fix": "biome check --write", + "typecheck": "tsgo --noEmit", + "knip": "knip" + }, + "devDependencies": { + "@biomejs/biome": "^2.3.8", + "@types/bun": "^1.3.4", + "@typescript/native-preview": "^7.0.0-dev.20251207.1", + "cc-hooks-ts": "^2.1.19", + "knip": "^5.71.0", + "typescript": "^5.9.3" + }, + "dependencies": { + "@r_masseater/cc-plugin-lib": "0.0.3" + } +} diff --git a/plugins/agnix/plugin.json b/plugins/agnix/plugin.json new file mode 100644 index 0000000..0adace5 --- /dev/null +++ b/plugins/agnix/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "agnix", + "author": { + "name": "masseater" + }, + "skills": ["./skills/"], + "hooks": "./hooks/hooks.json" +} diff --git a/plugins/agnix/skills/agnix/SKILL.md b/plugins/agnix/skills/agnix/SKILL.md new file mode 100644 index 0000000..7d901a0 --- /dev/null +++ b/plugins/agnix/skills/agnix/SKILL.md @@ -0,0 +1,87 @@ +--- +description: AI コーディングアシスタント設定ファイルのリンター。CLAUDE.md, AGENTS.md, SKILL.md, hooks.json, MCP設定等を検証し、ベストプラクティス違反を検出・自動修正する。 +--- + +# agnix + +AI コーディングアシスタント設定ファイルのリンター。`/agnix:lint` で検証、`/agnix:setup` でインストール。 + +## サブコマンド + +### /agnix:lint + +設定ファイルを lint する。 + +```bash +# カレントディレクトリを claude-code 向けに検証 +agnix --target claude-code . + +# 特定ファイルを検証 +agnix --target claude-code CLAUDE.md + +# 自動修正(HIGH + MEDIUM confidence) +agnix --target claude-code --fix . + +# 安全な修正のみ(HIGH confidence) +agnix --target claude-code --fix-safe . + +# 修正プレビュー(dry-run) +agnix --dry-run --show-fixes --target claude-code . + +# 警告もエラーとして扱う +agnix --target claude-code --strict . +``` + +**引数:** +| オプション | 説明 | +|-----------|------| +| `--target ` | 対象ツール(claude-code, cursor, copilot, mcp, agents-md, agent-skills, gemini-cli) | +| `--fix` | HIGH + MEDIUM confidence の自動修正を適用 | +| `--fix-safe` | HIGH confidence のみ修正 | +| `--fix-unsafe` | 全 confidence レベルの修正を適用 | +| `--dry-run --show-fixes` | 修正のプレビュー(差分表示) | +| `--strict` | 警告をエラーとして扱う | + +`--target` 未指定時は全ターゲットが対象になる。Claude Code プロジェクトでは `--target claude-code` を推奨。 + +### /agnix:setup + +agnix をインストールする。 + +```bash +# npm(推奨) +npm install -g agnix + +# Homebrew +brew tap avifenesh/agnix && brew install agnix + +# Cargo +cargo install agnix-cli +``` + +インストール確認: +```bash +agnix --version +``` + +## 対象ファイル + +agnix が検証する設定ファイル: +- `CLAUDE.md`, `AGENTS.md`, `SKILL.md` +- `hooks.json`, `plugin.json`, `settings.json` +- `*.mcp.json` +- `.claude/rules/*.md` + +## ルール数 + +169 ルール(Claude Code: 53, Agent Skills: 31, AGENTS.md: 13, MCP: 12, Cursor: 10, Copilot: 6, Gemini CLI: 3 等) + +## CI + +GitHub Actions で CI に組み込める: + +```yaml +- uses: avifenesh/agnix@v0 + with: + target: claude-code +``` diff --git a/plugins/agnix/tsconfig.json b/plugins/agnix/tsconfig.json new file mode 100644 index 0000000..6da9ee8 --- /dev/null +++ b/plugins/agnix/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "noEmit": true, + "skipLibCheck": true + }, + "include": ["hooks/**/*.ts"] +} diff --git a/plugins/debug/AGENTS.md b/plugins/debug/AGENTS.md deleted file mode 100644 index 17ed6f1..0000000 --- a/plugins/debug/AGENTS.md +++ /dev/null @@ -1,30 +0,0 @@ -# debug プラグイン開発ガイド - -## 概要 - -Claude Code プラグイン開発時のデバッグ用プラグイン。 - -## 構成 - -| 種別 | 内容 | -|------|------| -| hooks | SessionStart のみ | - -## Hooks - -SessionStart 時に以下のデバッグ出力を実行: - -| 出力先 | exit code | 内容 | -|--------|-----------|------| -| stdout | 0 | "Debug plugin session started" | -| stdout | 0 | `CLAUDE_PLUGIN_ROOT` の値 | -| stderr | 2 | "Debug plugin session started" | -| stderr | 2 | `CLAUDE_PLUGIN_ROOT` の値 | -| ファイル | - | `~/claude_plugin_debug.txt` に書き込み | - -## 用途 - -- プラグインのインストール・読み込み確認 -- `CLAUDE_PLUGIN_ROOT` 環境変数の確認 -- Hooks の stdout/stderr 出力の動作確認 -- exit code による Hooks の挙動確認 diff --git a/plugins/debug/CLAUDE.md b/plugins/debug/CLAUDE.md deleted file mode 100644 index 43c994c..0000000 --- a/plugins/debug/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -@AGENTS.md diff --git a/plugins/eslint-lsp/AGENTS.md b/plugins/eslint-lsp/AGENTS.md deleted file mode 100644 index 4222505..0000000 --- a/plugins/eslint-lsp/AGENTS.md +++ /dev/null @@ -1,38 +0,0 @@ -# eslint-lsp プラグイン開発ガイド - -## 概要 - -ESLint 9 Language Server 統合プラグイン。セッション開始時に ESLint LSP サーバーの状態を確認する。 - -## 構成 - -| 種別 | 内容 | -|------|------| -| hooks | SessionStart のみ | - -## 開発コマンド - -```bash -cd plugins/eslint-lsp - -bun run check # lint + format チェック -bun run check:fix # 自動修正 -bun run typecheck # 型チェック -bun run knip # 未使用コード検出 -``` - -## Hooks - -| イベント | フック | 説明 | -|----------|--------|------| -| SessionStart | bun install | 依存関係の自動インストール | -| SessionStart | check-eslint-server | ESLint LSP サーバーの状態確認 | - -## 設定ファイル - -`.lsp.json` で ESLint サーバーの設定を管理。 - -## 注意事項 - -- ESLint 9 以降が対象 -- LSP サーバーが起動していない場合は警告を出力 diff --git a/plugins/eslint-lsp/CLAUDE.md b/plugins/eslint-lsp/CLAUDE.md deleted file mode 100644 index 43c994c..0000000 --- a/plugins/eslint-lsp/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -@AGENTS.md diff --git a/plugins/eslint-lsp/README.md b/plugins/eslint-lsp/README.md new file mode 100644 index 0000000..b4a5129 --- /dev/null +++ b/plugins/eslint-lsp/README.md @@ -0,0 +1,16 @@ +# eslint-lsp - ESLint 9 Language Server 統合 + +セッション開始時に ESLint LSP サーバーの状態を確認するプラグイン。 + +## インストール + +```bash +/plugin marketplace add masseater/claude-code-plugin +/plugin install eslint-lsp@masseater-plugins +``` + +## 開発時の注意事項 + +- ESLint 9 以降が対象 +- LSP サーバーが起動していない場合は警告を出力 +- `.lsp.json` で ESLint サーバーの設定を管理 diff --git a/plugins/mutils/AGENTS.md b/plugins/mutils/AGENTS.md index b3256f8..0198e36 100644 --- a/plugins/mutils/AGENTS.md +++ b/plugins/mutils/AGENTS.md @@ -10,9 +10,8 @@ Claude Code プラグイン開発支援のためのコマンド・スキル・Ho | 種別 | 内容 | |------|------| -| commands | 20個のスラッシュコマンド | | agents | 6個のサブエージェント | -| skills | 9個のスキル | +| skills | 31個のスキル | | hooks | SessionStart, PreToolUse, PostToolUse, Stop | ## 開発コマンド @@ -114,7 +113,7 @@ return context.json({ ## ファイル参照ルール - hooks.json 内: `${CLAUDE_PLUGIN_ROOT}/hooks/xxx.ts` -- コマンド内: `@${CLAUDE_PLUGIN_ROOT}/assets/xxx.md` +- スキル内: `@${CLAUDE_PLUGIN_ROOT}/skills/xxx/reference.md` ## 注意事項 diff --git a/plugins/mutils/README.md b/plugins/mutils/README.md index 3c32e38..7e3fc53 100644 --- a/plugins/mutils/README.md +++ b/plugins/mutils/README.md @@ -65,7 +65,7 @@ | スキル | 説明 | |--------|------| | **cc-hooks-ts** | TypeScriptで型安全なClaude Code Hooksを作成するためのガイド | -| **cli-tech-stack** | CLIツール開発の技術スタック・規約定義 | +| **should-be-cli-stack** | CLIツール開発の技術スタック・規約定義 | | **claude-code-features** | Claude Codeの各機能(commands, agents, skills, rules, hooks)の分類基準 | | **figma-screenshot** | Figma Desktop MCPを使用したスクリーンショットのエクスポート | | **github-pr** | GitHub PR操作のユーティリティ(レビューコメント、未解決スレッド管理など) | @@ -106,6 +106,12 @@ Hooks は `$XDG_STATE_HOME/masseater-plugins/` にログを出力します(デ --- +## 開発時の注意事項 + +- Hooks は複数インスタンスから同時実行される可能性あり +- ファイル書き込みは追記モードを使用 +- lib/config.ts に共通設定を配置 + ## 参考資料 - [Claude Code プラグインドキュメント](https://code.claude.com/docs/en/plugins) diff --git a/plugins/mutils/bun.lock b/plugins/mutils/bun.lock index b48e106..e1db149 100644 --- a/plugins/mutils/bun.lock +++ b/plugins/mutils/bun.lock @@ -9,8 +9,11 @@ "chalk": "^5.6.2", "citty": "^0.1.6", "octokit": "^5.0.5", + "pixelmatch": "^7.1.0", "semver": "^7.7.3", + "sharp": "^0.34.5", "simple-git": "^3.30.0", + "yaml": "^2.8.2", }, "devDependencies": { "@biomejs/biome": "^2.3.8", @@ -53,35 +56,55 @@ "@google/genai": ["@google/genai@1.38.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-V/4CQVQGovvGHuS73lwJwHKR9x33kCij3zz/ReEQ4A7RJaV0U7m4k1mvYhFk55cGZdF5JLKu2S9BTaFuEs5xTA=="], - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="], - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], @@ -285,6 +308,8 @@ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], @@ -393,6 +418,10 @@ "pino-std-serializers": ["pino-std-serializers@7.0.0", "", {}, "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA=="], + "pixelmatch": ["pixelmatch@7.1.0", "", { "dependencies": { "pngjs": "^7.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" } }, "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng=="], + + "pngjs": ["pngjs@7.0.0", "", {}, "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow=="], + "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], "protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="], @@ -415,6 +444,8 @@ "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], @@ -469,8 +500,26 @@ "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + "zod": ["zod@4.2.1", "", {}, "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw=="], + "@anthropic-ai/claude-agent-sdk/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -485,6 +534,20 @@ "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@anthropic-ai/claude-agent-sdk/@img/sharp-darwin-arm64/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-darwin-x64/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linux-arm/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linux-arm64/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linux-x64/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linuxmusl-arm64/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + + "@anthropic-ai/claude-agent-sdk/@img/sharp-linuxmusl-x64/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], diff --git a/plugins/mutils/commands/check-pr.md b/plugins/mutils/commands/check-pr.md deleted file mode 100644 index 16c86ef..0000000 --- a/plugins/mutils/commands/check-pr.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -description: PRのレビューコメントを確認し対応 -argument-hint: "[追加指示]" -allowed-tools: Skill(mutils:github-pr), Bash, Write, Edit, Read, Grep, Glob, TodoRead, TodoWrite, AskUserQuestion ---- - -現在のブランチに紐づくPRのレビューコメントを確認し、対応方針についてユーザーに確認を取ります。 - -$ARGUMENTS - -## 事前準備 - -github-pr スキルを読み込む。 - -``` -/mutils:github-pr -``` - -## 実行手順 - -### 1. 未解決スレッドの取得 - -github-pr スキルを使用して、現在のリポジトリのPRに存在する未解決スレッドの一覧を取得してください。 - -### 2. 各スレッドの詳細確認 - -取得した各スレッドについて、コメントの詳細を取得してください。ファイルパス、行番号、レビュアー名、コメント内容を把握し、一覧として整理してください。 - -### 3. 対応方針の確認 - -各コメントについて、AskUserQuestion ツールを使用して、対応方針をユーザーに確認する。 - -### 4. todo リストを作成 - -ユーザーの選択に基づいて、対応内容の todo リストを作成する。 diff --git a/plugins/mutils/commands/incremental-research.md b/plugins/mutils/commands/incremental-research.md deleted file mode 100644 index 3b72d24..0000000 --- a/plugins/mutils/commands/incremental-research.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -description: 調査計画をmarkdownに記載し、順次調べて結果を記録する構造化された調査ワークフロー -argument-hint: [調査テーマ] ---- - -# 構造化調査 - -調査計画をmarkdownファイルに記載し、順次調べて結果を更新する。 - -## 実行手順 - -### 1. 調査テーマの確認 - -`$ARGUMENTS` が空の場合、ユーザーに調査テーマを聞く。 - -### 2. 調査ディレクトリと計画ファイルの作成 - -``` -.agents/research-[テーマ名]/ -└── plan.md -``` - -### 3. plan.md の初期構造 - -```markdown -# [調査テーマ] - -## 目的 -[調査の目的を記載] - -## 調査項目 - -### 1. [調査項目1] -**状態**: 未調査 -**結果**: - ---- - -### 2. [調査項目2] -**状態**: 未調査 -**結果**: - ---- - -(必要に応じて項目を追加) - -## 結論 -(調査完了後に記載) -``` - -### 4. 調査の実行 - -各調査項目について: -1. **状態** を「調査中」に更新 -2. 調査を実行(WebSearch, WebFetch, Bash など) -3. **結果** に調査内容を記載 -4. **状態** を「完了」に更新 -5. plan.md を保存 - -調査中に新たな調査項目が発生した場合は plan.md に追加する。 - -### 5. 結論の記載 - -全ての調査項目が完了したら: -1. 調査結果を総合的に分析 -2. 結論セクションに最終的な判断を記載 -3. 必要に応じて根拠を箇条書きで列挙 - -## 注意事項 - -- 各調査項目の結果は具体的に記載する(「確認した」ではなく、何を確認してどうだったかを書く) -- 調査途中でも定期的に plan.md を保存する -- 結論は根拠に基づいて明確に記載する diff --git a/plugins/mutils/hooks/redirect-figma-screenshot.ts b/plugins/mutils/hooks/redirect-figma-screenshot.ts index 982cfc2..ad82a31 100644 --- a/plugins/mutils/hooks/redirect-figma-screenshot.ts +++ b/plugins/mutils/hooks/redirect-figma-screenshot.ts @@ -33,7 +33,7 @@ const hook = defineHook({ const message = `Figma MCP get_screenshot is blocked! The get_screenshot tool returns base64 data directly to context, which cannot be saved as a file or referenced by other tools. -Load the mutils:figma-screenshot skill`; +Load the mutils:figma-screenshot skill instead (uses REST API with Desktop MCP fallback)`; return context.json({ event: "PreToolUse" as const, diff --git a/plugins/mutils/package.json b/plugins/mutils/package.json index 5b9cc2a..433de9e 100644 --- a/plugins/mutils/package.json +++ b/plugins/mutils/package.json @@ -24,7 +24,10 @@ "chalk": "^5.6.2", "citty": "^0.1.6", "octokit": "^5.0.5", + "pixelmatch": "^7.1.0", "semver": "^7.7.3", - "simple-git": "^3.30.0" + "sharp": "^0.34.5", + "simple-git": "^3.30.0", + "yaml": "^2.8.2" } } diff --git a/plugins/mutils/plugin.json b/plugins/mutils/plugin.json index 0b9b7cb..1c7b680 100644 --- a/plugins/mutils/plugin.json +++ b/plugins/mutils/plugin.json @@ -3,7 +3,6 @@ "author": { "name": "masseater" }, - "commands": ["./commands/"], "agents": ["./agents/"], "skills": ["./skills/"], "hooks": "./hooks/hooks.json" diff --git a/plugins/mutils/commands/add-agent.md b/plugins/mutils/skills/add-agent/SKILL.md similarity index 100% rename from plugins/mutils/commands/add-agent.md rename to plugins/mutils/skills/add-agent/SKILL.md diff --git a/plugins/mutils/commands/add-command.md b/plugins/mutils/skills/add-command/SKILL.md similarity index 100% rename from plugins/mutils/commands/add-command.md rename to plugins/mutils/skills/add-command/SKILL.md diff --git a/plugins/mutils/commands/add-rule.md b/plugins/mutils/skills/add-rule/SKILL.md similarity index 100% rename from plugins/mutils/commands/add-rule.md rename to plugins/mutils/skills/add-rule/SKILL.md diff --git a/plugins/mutils/commands/add-skill.md b/plugins/mutils/skills/add-skill/SKILL.md similarity index 100% rename from plugins/mutils/commands/add-skill.md rename to plugins/mutils/skills/add-skill/SKILL.md diff --git a/plugins/mutils/skills/cc-hooks-ts/SKILL.md b/plugins/mutils/skills/cc-hooks-ts/SKILL.md index 75a96ca..e310441 100644 --- a/plugins/mutils/skills/cc-hooks-ts/SKILL.md +++ b/plugins/mutils/skills/cc-hooks-ts/SKILL.md @@ -1,5 +1,5 @@ --- -description: TypeScriptで型安全なClaude Code Hooksを作成するためのガイド。cc-hooks-tsライブラリを使用してフックを実装する際に使用する。(1) Claude Code用の新しいhookを作成する時、(2) 既存のhookをTypeScriptで書き直す時、(3) PreToolUse/PostToolUse/SessionStart等のイベントフックを実装する時、(4) plugin.jsonにhooksを設定する時 +description: TypeScriptで型安全なClaude Code Hooksを作成するためのガイド。Use when creating new hooks, rewriting existing hooks in TypeScript, implementing event hooks (PreToolUse/PostToolUse/SessionStart), or configuring hooks in plugin.json. --- # cc-hooks-ts を使用した Claude Code Hooks 作成ガイド diff --git a/plugins/mutils/skills/check-pr/SKILL.md b/plugins/mutils/skills/check-pr/SKILL.md new file mode 100644 index 0000000..5e52933 --- /dev/null +++ b/plugins/mutils/skills/check-pr/SKILL.md @@ -0,0 +1,27 @@ +--- +description: PRの状態をチェックし対応する。Use when checking PR review comments, analyzing CI failures, or responding to check-pr requests. +--- + +# Check PR + +github-pr スキルのスクリプトを使用して PR の状態をチェックし、対応アクションを実行する。 + +## 事前準備 + +github-pr スキルを読み込む: + +``` +/mutils:github-pr +``` + +## Checkers + +### 1. Review Comments + +未解決のレビューコメントを確認し、対応方針を決定する。 +@${CLAUDE_PLUGIN_ROOT}/skills/check-pr/checkers/review-comments.md + +### 2. CI Status + +CI の状態を確認し、失敗時はログを分析して修正方針を策定する。 +@${CLAUDE_PLUGIN_ROOT}/skills/check-pr/checkers/ci-status.md diff --git a/plugins/mutils/skills/check-pr/checkers/ci-status.md b/plugins/mutils/skills/check-pr/checkers/ci-status.md new file mode 100644 index 0000000..ed9f537 --- /dev/null +++ b/plugins/mutils/skills/check-pr/checkers/ci-status.md @@ -0,0 +1,68 @@ +# CI Status Checker + +CIの状態を確認し、失敗時はログを分析して修正方針を策定するワークフロー。 + +## ワークフロー + +### Step 1: CI 状態の取得 + +```bash +bun run ${CLAUDE_PLUGIN_ROOT}/skills/github-pr/scripts/get-ci-status.ts +``` + +出力には `overallStatus`(success / failure / pending / neutral)と各チェックの詳細が含まれる。 + +特定のチェックのみ確認する場合: + +```bash +bun run ${CLAUDE_PLUGIN_ROOT}/skills/github-pr/scripts/get-ci-status.ts --name "build" +``` + +### Step 2: 状態の評価 + +- `success` / `neutral`: 報告して完了。 +- `pending`: どのチェックが実行中かを報告。 +- `failure`: Step 3 へ進む。 + +### Step 3: 失敗ログのダウンロード + +```bash +bun run ${CLAUDE_PLUGIN_ROOT}/skills/github-pr/scripts/get-ci-logs.ts +``` + +デフォルトでは失敗したチェックのログのみダウンロードする。 + +全チェックのログをダウンロードする場合: + +```bash +bun run ${CLAUDE_PLUGIN_ROOT}/skills/github-pr/scripts/get-ci-logs.ts --all +``` + +特定のチェックのログのみダウンロードする場合: + +```bash +bun run ${CLAUDE_PLUGIN_ROOT}/skills/github-pr/scripts/get-ci-logs.ts --name "build" +``` + +出力先を指定する場合: + +```bash +bun run ${CLAUDE_PLUGIN_ROOT}/skills/github-pr/scripts/get-ci-logs.ts --output-dir ./my-logs +``` + +### Step 4: ログの分析 + +ダウンロードされたログファイルを読み込み、以下を特定する: + +- エラーメッセージとスタックトレース +- 失敗したテスト名 +- ビルドエラー +- 設定の問題 + +### Step 5: 修正方針の策定 + +特定されたエラーごとに、修正方針の todo リストを作成する: + +- エラーの説明 +- 影響を受けるファイル +- 修正アプローチの提案 diff --git a/plugins/mutils/skills/check-pr/checkers/review-comments.md b/plugins/mutils/skills/check-pr/checkers/review-comments.md new file mode 100644 index 0000000..bdbdb11 --- /dev/null +++ b/plugins/mutils/skills/check-pr/checkers/review-comments.md @@ -0,0 +1,53 @@ +# Review Comments Checker + +未解決のレビューコメントを確認し、対応方針を決定するワークフロー。 + +## ワークフロー + +### Step 1: 未解決スレッドの取得 + +```bash +bun run ${CLAUDE_PLUGIN_ROOT}/skills/github-pr/scripts/get-unresolved-threads.ts +``` + +出力例: +```json +{ + "owner": "user", + "repo": "repo", + "pr": 123, + "threadIds": ["PRRT_abc123", "PRRT_def456"] +} +``` + +### Step 2: 各スレッドのコメント詳細を取得 + +各スレッドIDについて実行: + +```bash +bun run ${CLAUDE_PLUGIN_ROOT}/skills/github-pr/scripts/get-comments-by-thread.ts --thread-id "PRRT_abc123" +``` + +出力にはファイルパス(`path`)、行番号(`line`)、コメント一覧(`comments`)が含まれる。 + +### Step 3: サマリーの提示 + +取得した全スレッドを以下の形式で整理してユーザーに提示する: + +- ファイルパスと行番号 +- レビュアー名 +- コメント内容(スレッド内の最新コメント) +- スレッドURL + +### Step 4: 対応方針の確認 + +AskUserQuestion ツールを使用して、各未解決スレッドについて対応方針をユーザーに確認する。 + +選択肢の例: +- 指摘通り修正する +- 議論/返信する +- スキップする + +### Step 5: todo リストの作成 + +ユーザーの選択に基づいて、対応内容の todo リストを作成する。 diff --git a/plugins/mutils/skills/claude-code-features/SKILL.md b/plugins/mutils/skills/claude-code-features/SKILL.md deleted file mode 100644 index 9fa40f4..0000000 --- a/plugins/mutils/skills/claude-code-features/SKILL.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -description: Guide for distinguishing Claude Code features (Commands, Skills, Agents, Hooks, Rules) and selection criteria. Use when decomposing context files, deciding where to add new features, or customizing Claude Code. ---- - -# Claude Code Features Guide - -Guide for choosing between 5 major Claude Code features. - -## Feature Overview - -| Feature | Trigger | Essence | Best For | -|---------|---------|---------|----------| -| **Commands** | Manual (`/command`) | Inject saved prompts instantly | Repeatable **standard workflows** by user execute | -| **Skills** | Auto (Claude decides) | Knowledge loaded on demand | **On-demand knowledge** (tool usage, guidelines) | -| **Agents** | Manual/delegation | Specialists with independent context | **Bulk data processing** & parallel tasks | -| **Hooks** | Event-driven | Shell scripts auto-executed around tools | **Deterministic automation** | -| **Rules** | Conditional/always | Modularized rules | **Path-conditional constraints** | - -## Decision Flowchart - -``` -1. "Should it auto-execute on events like file edits?" - → Yes: Hooks (implement as shell commands) - -2. "Needs independent context for bulk data processing?" - → Yes: Agents (don't pollute main conversation) - -3. "Knowledge not always needed, but should surface when relevant?" - → Yes: Skills (tool usage guides, domain expertise, patterns) - -4. "Standard procedure user explicitly executes?" - → Yes: Commands (instant /command execution) - -5. "Constraints for specific paths or entire project?" - → Yes: Rules (conditional with paths:) - -6. Cannot classify - → Keep in CLAUDE.md -``` - -## Feature Details - -- @${CLAUDE_PLUGIN_ROOT}/skills/claude-code-features/commands.md -- @${CLAUDE_PLUGIN_ROOT}/skills/claude-code-features/skills.md -- @${CLAUDE_PLUGIN_ROOT}/skills/claude-code-features/agents.md -- @${CLAUDE_PLUGIN_ROOT}/skills/claude-code-features/hooks.md -- @${CLAUDE_PLUGIN_ROOT}/skills/claude-code-features/rules.md - -## References - -@${CLAUDE_PLUGIN_ROOT}/skills/claude-code-features/references.md diff --git a/plugins/mutils/skills/claude-code-features/agents.md b/plugins/mutils/skills/claude-code-features/agents.md deleted file mode 100644 index e00d5b6..0000000 --- a/plugins/mutils/skills/claude-code-features/agents.md +++ /dev/null @@ -1,22 +0,0 @@ -# Agents (Sub-agents) - -**Trigger**: Manual invocation or delegation from Claude - -## Characteristics - -- **Independent context** (doesn't pollute main conversation) -- Parallel execution possible -- Can have specialized personas - -## Best For - -- Code reviewer -- Test runner -- Security auditor -- Large-scale code analysis -- Debugger - -## Not Suitable For - -- Processing requiring parent context (→ Skills) -- Simple standard tasks (→ Commands) diff --git a/plugins/mutils/skills/claude-code-features/commands.md b/plugins/mutils/skills/claude-code-features/commands.md deleted file mode 100644 index fb1a4b9..0000000 --- a/plugins/mutils/skills/claude-code-features/commands.md +++ /dev/null @@ -1,20 +0,0 @@ -# Commands (Slash Commands) - -**Trigger**: User explicitly executes with `/command` - -## Characteristics - -- Full control over execution timing -- No context consumption until invoked -- Self-contained in a single .md file - -## Best For - -- git commit, PR creation, build execution -- Code review requests -- Standard workflows - -## Not Suitable For - -- Complex domain knowledge (→ Skills) -- Auto-applied processing (→ Hooks/Rules) diff --git a/plugins/mutils/skills/claude-code-features/hooks.md b/plugins/mutils/skills/claude-code-features/hooks.md deleted file mode 100644 index cbbb640..0000000 --- a/plugins/mutils/skills/claude-code-features/hooks.md +++ /dev/null @@ -1,22 +0,0 @@ -# Hooks - -**Trigger**: Event-driven (PreToolUse, PostToolUse, SessionStart, etc.) - -## Characteristics - -- Implemented as shell commands -- **Deterministic** behavior (no LLM judgment dependency) -- Can block with exit code 2 - -## Best For - -- Auto-format/lint after file edits -- Blocking dangerous commands -- Pre-commit validation -- Sending notifications -- Logging - -## Not Suitable For - -- Context-dependent decisions (→ Skills/Agents) -- Complex workflows (→ Commands) diff --git a/plugins/mutils/skills/claude-code-features/references.md b/plugins/mutils/skills/claude-code-features/references.md deleted file mode 100644 index 2650203..0000000 --- a/plugins/mutils/skills/claude-code-features/references.md +++ /dev/null @@ -1,21 +0,0 @@ -# Reference Links - -## Official Documentation - -- [Slash Commands](https://code.claude.com/docs/en/slash-commands.md) -- [Agent Skills](https://code.claude.com/docs/en/skills.md) -- [Subagents](https://code.claude.com/docs/en/sub-agents.md) -- [Hooks](https://code.claude.com/docs/en/hooks.md) -- [Memory (Rules)](https://code.claude.com/docs/en/memory.md) - -## Articles & Blogs - -- [When to Use Skills vs Commands vs Agents](https://danielmiessler.com/blog/when-to-use-skills-vs-commands-vs-agents) - 3-tier hierarchy model -- [Claude Code Full Stack Guide](https://alexop.dev/posts/understanding-claude-code-full-stack/) - MCP, Skills, Subagents, Hooks relationships -- [Skills vs Commands vs Sub-Agents Complete Guide](https://www.aiskills.top/articles/claude-code-skills-vs-slash-commands-vs-sub-agents-complete-guide) - Detailed selection criteria -- [Automate Your AI Workflows with Hooks](https://blog.gitbutler.com/automate-your-ai-workflows-with-claude-code-hooks) - Hooks practical examples -- [Claude Agent Skills: First Principles Deep Dive](https://leehanchung.github.io/blogs/2025/10/26/claude-skills-deep-dive/) - Skills architecture details - -## GitHub Repositories - -- [claude-code-infrastructure-showcase](https://github.com/diet103/claude-code-infrastructure-showcase) - 6-month production pattern collection diff --git a/plugins/mutils/skills/claude-code-features/rules.md b/plugins/mutils/skills/claude-code-features/rules.md deleted file mode 100644 index 597cd55..0000000 --- a/plugins/mutils/skills/claude-code-features/rules.md +++ /dev/null @@ -1,25 +0,0 @@ -# Rules - -**Trigger**: Conditional (when `paths:` specified) or always - -## Characteristics - -- **Can apply to specific files only** via `paths:` frontmatter -- Modular decomposition to prevent CLAUDE.md bloat -- Placed in `.claude/rules/` - -## Best For - -- Content regarding the entire repository - - Project glossary - - Usecase - - User persona -- Content that should be documented in the root directory for application across multiple projects, but which becomes lengthy and difficult to maintain. - - Accessibility Guidelines - - Security requirements - - Coding guidelines - -## Not Suitable For - -- Execution procedures (→ Commands) -- Automated processing (→ Hooks) diff --git a/plugins/mutils/skills/claude-code-features/skills.md b/plugins/mutils/skills/claude-code-features/skills.md deleted file mode 100644 index e7d06ba..0000000 --- a/plugins/mutils/skills/claude-code-features/skills.md +++ /dev/null @@ -1,31 +0,0 @@ -# Skills (Agent Skills) - -**Trigger**: Claude auto-decides based on context - -## Characteristics - -- Progressive disclosure (loaded only when needed) -- Can consist of multiple files (SKILL.md + references) -- Shares main context - -## Best For - -- **Tool usage guides** (how to use specific tools/libraries) -- Domain-specific expertise & patterns -- Architecture guides -- API design patterns -- Security checklists - -## Key Criteria - -**"Knowledge not always needed, but should surface when relevant"** - -- Putting it in AGENTS.md wastes context tokens -- But it's necessary for specific tasks -- Claude auto-loads when relevant - -## Not Suitable For - -- Standard procedures (→ Commands) -- Processing requiring independent context (→ Agents) -- Constraints that should always apply (→ Rules) diff --git a/plugins/mutils/commands/cli-compliance.md b/plugins/mutils/skills/cli-compliance/SKILL.md similarity index 94% rename from plugins/mutils/commands/cli-compliance.md rename to plugins/mutils/skills/cli-compliance/SKILL.md index b9460ba..3370d4d 100644 --- a/plugins/mutils/commands/cli-compliance.md +++ b/plugins/mutils/skills/cli-compliance/SKILL.md @@ -17,7 +17,7 @@ $ARGUMENTS 以下のSkillを読み込み、技術スタック・規約を確認する: -- `/mutils:cli-tech-stack` - 技術スタック・規約定義 +- `/mutils:should-be-cli-stack` - 技術スタック・規約定義 ## 実施手順 diff --git a/plugins/mutils/commands/dig.md b/plugins/mutils/skills/dig/SKILL.md similarity index 100% rename from plugins/mutils/commands/dig.md rename to plugins/mutils/skills/dig/SKILL.md diff --git a/plugins/mutils/skills/figma-screenshot/SKILL.md b/plugins/mutils/skills/figma-screenshot/SKILL.md index e2e25fe..10320f5 100644 --- a/plugins/mutils/skills/figma-screenshot/SKILL.md +++ b/plugins/mutils/skills/figma-screenshot/SKILL.md @@ -1,13 +1,23 @@ --- -description: Save Figma design screenshots to files via Desktop MCP. Solves the MCP get_screenshot base64 problem by generating image files that other tools can reference. No API token required. +description: Save Figma design screenshots to files. Uses REST API (recommended, requires FIGMA_ACCESS_TOKEN) with Desktop MCP fallback. Solves the MCP get_screenshot base64 problem by generating image files that other tools can reference. --- # Figma Screenshot Export -Export screenshots of specified Figma nodes using Figma Desktop MCP and save them as local files. +Export screenshots of specified Figma nodes and save them as local files. +Uses Figma REST API as the primary method, with Desktop MCP as a fallback. ## Prerequisites +### REST API (recommended) + +- Set `FIGMA_ACCESS_TOKEN` environment variable with a [Figma personal access token](https://www.figma.com/developers/api#access-tokens) +- Supports `--scale` and `--format` options + +### Desktop MCP (fallback) + +Used automatically when `FIGMA_ACCESS_TOKEN` is not set, or when the REST API fails. + - Figma Desktop app must be running - Dev Mode MCP Server must be enabled in Figma settings @@ -24,11 +34,27 @@ Located at `${CLAUDE_PLUGIN_ROOT}/skills/figma-screenshot/scripts/`. | Option | Required | Description | |--------|----------|-------------| | `--file-key` | ✓ | Figma file key (from URL) | -| `--node-id` | ✓ | Target node ID (e.g., `7247-25294`) | +| `--node-id` | ✓ | Target node ID (e.g., `7247-25294` or `7247:25294`) | | `--output` | ✓ | Output file path | +| `--scale` | | Export scale 0.01-4 (REST API only, default: 1) | +| `--format` | | Image format: png, jpg, svg, pdf (REST API only, default: png) | ### Usage +REST API (with token): + +```bash +FIGMA_ACCESS_TOKEN=your-token \ +bun run ${CLAUDE_PLUGIN_ROOT}/skills/figma-screenshot/scripts/export-screenshot.ts \ + --file-key abc123 \ + --node-id "7247-25294" \ + --output ./screenshot.png \ + --scale 2 \ + --format png +``` + +Desktop MCP (no token): + ```bash bun run ${CLAUDE_PLUGIN_ROOT}/skills/figma-screenshot/scripts/export-screenshot.ts \ --file-key abc123 \ @@ -42,10 +68,14 @@ bun run ${CLAUDE_PLUGIN_ROOT}/skills/figma-screenshot/scripts/export-screenshot. { "success": true, "outputPath": "./screenshot.png", - "nodeId": "7247-25294" + "nodeId": "7247-25294", + "method": "rest-api" } ``` +- `method`: which export method was used (`"rest-api"` or `"desktop-mcp"`) +- `fallback`: `true` when REST API failed and Desktop MCP was used as fallback (only present on fallback) + ## How to Get File Key and Node ID - **File key**: Extract from Figma URL `https://www.figma.com/design//...` diff --git a/plugins/mutils/skills/figma-screenshot/scripts/export-screenshot.ts b/plugins/mutils/skills/figma-screenshot/scripts/export-screenshot.ts index 37a78ad..b64fb59 100755 --- a/plugins/mutils/skills/figma-screenshot/scripts/export-screenshot.ts +++ b/plugins/mutils/skills/figma-screenshot/scripts/export-screenshot.ts @@ -1,7 +1,7 @@ #!/usr/bin/env bun /** - * Figma Desktop MCP を使用してノードのスクリーンショットをファイルに保存 - * REST API 不要 - Desktop アプリの認証を使用 + * Figma ノードのスクリーンショットをファイルに保存 + * REST API (FIGMA_ACCESS_TOKEN) を優先し、失敗時は Desktop MCP にフォールバック */ import { mkdir, writeFile } from "node:fs/promises"; @@ -14,6 +14,8 @@ type ExportResult = { success: boolean; outputPath: string; nodeId: string; + method?: "rest-api" | "desktop-mcp"; + fallback?: boolean; error?: string; }; @@ -33,6 +35,62 @@ type GetScreenshotResult = { }>; }; +type FigmaImagesResponse = { + err: string | null; + images: Record; +}; + +// --------------------------------------------------------------------------- +// REST API +// --------------------------------------------------------------------------- + +/** Node ID を API が期待する `:` 区切り形式に正規化 */ +function normalizeNodeId(nodeId: string): string { + return nodeId.replace(/-/g, ":"); +} + +async function exportViaRestApi( + fileKey: string, + nodeId: string, + token: string, + format: string, + scale: number, +): Promise { + const apiNodeId = normalizeNodeId(nodeId); + const url = `https://api.figma.com/v1/images/${fileKey}?ids=${encodeURIComponent(apiNodeId)}&format=${format}&scale=${scale}`; + + const metaRes = await fetch(url, { + headers: { "X-Figma-Token": token }, + }); + if (!metaRes.ok) { + const text = await metaRes.text(); + throw new Error(`Figma API ${metaRes.status}: ${text}`); + } + + const meta = (await metaRes.json()) as FigmaImagesResponse; + if (meta.err) { + throw new Error(`Figma API error: ${meta.err}`); + } + + const imageUrl = meta.images[apiNodeId]; + if (!imageUrl) { + throw new Error( + `No image URL returned for node ${apiNodeId}. Available keys: ${Object.keys(meta.images).join(", ")}`, + ); + } + + const imgRes = await fetch(imageUrl); + if (!imgRes.ok) { + throw new Error(`Image download failed: ${imgRes.status}`); + } + + return Buffer.from(await imgRes.arrayBuffer()); +} + +// --------------------------------------------------------------------------- +// Desktop MCP +// --------------------------------------------------------------------------- + let sessionId: string | null = null; async function callMcp( @@ -120,11 +178,21 @@ async function getScreenshot(fileKey: string, nodeId: string): Promise { return imageContent.data; } +async function exportViaMcp(fileKey: string, nodeId: string): Promise { + await initializeMcp(); + const base64Data = await getScreenshot(fileKey, nodeId); + return Buffer.from(base64Data, "base64"); +} + +// --------------------------------------------------------------------------- +// CLI +// --------------------------------------------------------------------------- + const main = defineCommand({ meta: { name: "export-screenshot", description: - "Figma ノードをスクリーンショットとしてエクスポート (Desktop MCP 経由)", + "Figma ノードをスクリーンショットとしてエクスポート (REST API + Desktop MCP fallback)", }, args: { "file-key": { @@ -134,7 +202,7 @@ const main = defineCommand({ }, "node-id": { type: "string", - description: "Node ID to export (e.g., 1:234)", + description: "Node ID to export (e.g., 1:234 or 1-234)", required: true, }, output: { @@ -142,16 +210,76 @@ const main = defineCommand({ description: "Output file path", required: true, }, + scale: { + type: "string", + description: "Export scale 0.01-4 (REST API only, default: 1)", + required: false, + }, + format: { + type: "string", + description: + "Image format: png, jpg, svg, pdf (REST API only, default: png)", + required: false, + }, }, async run({ args }) { const fileKey = args["file-key"]; const nodeId = args["node-id"]; const outputPath = args.output; + const scale = args.scale ? Number(args.scale) : 1; + const format = args.format ?? "png"; + + if (scale < 0.01 || scale > 4) { + const result: ExportResult = { + success: false, + outputPath, + nodeId, + error: "Scale must be between 0.01 and 4", + }; + console.log(JSON.stringify(result, null, 2)); + process.exit(1); + } + + if (!["png", "jpg", "svg", "pdf"].includes(format)) { + const result: ExportResult = { + success: false, + outputPath, + nodeId, + error: `Unsupported format: ${format}. Use png, jpg, svg, or pdf`, + }; + console.log(JSON.stringify(result, null, 2)); + process.exit(1); + } try { - await initializeMcp(); - const base64Data = await getScreenshot(fileKey, nodeId); - const buffer = Buffer.from(base64Data, "base64"); + let buffer: Buffer; + let method: ExportResult["method"]; + let fallback = false; + + const token = process.env.FIGMA_ACCESS_TOKEN; + + if (token) { + try { + buffer = await exportViaRestApi( + fileKey, + nodeId, + token, + format, + scale, + ); + method = "rest-api"; + } catch (apiError) { + console.error( + `[REST API failed, falling back to Desktop MCP] ${apiError instanceof Error ? apiError.message : String(apiError)}`, + ); + buffer = await exportViaMcp(fileKey, nodeId); + method = "desktop-mcp"; + fallback = true; + } + } else { + buffer = await exportViaMcp(fileKey, nodeId); + method = "desktop-mcp"; + } const dir = dirname(outputPath); await mkdir(dir, { recursive: true }); @@ -161,6 +289,8 @@ const main = defineCommand({ success: true, outputPath, nodeId, + method, + ...(fallback && { fallback }), }; console.log(JSON.stringify(result, null, 2)); } catch (error) { diff --git a/plugins/mutils/skills/github-pr/SKILL.md b/plugins/mutils/skills/github-pr/SKILL.md index 2380c3f..06e71b0 100644 --- a/plugins/mutils/skills/github-pr/SKILL.md +++ b/plugins/mutils/skills/github-pr/SKILL.md @@ -1,5 +1,5 @@ --- -description: GitHub PR操作のユーティリティ。レビューコメントの取得・返信、未解決スレッドの管理など。octokit/simple-gitを使用した効率的なPR操作を提供する。 +description: GitHub PR操作のユーティリティ。Use when fetching review comments, managing unresolved threads, checking CI status, or downloading logs for a PR. --- GitHub Pull Request の操作を効率化するユーティリティ集。 @@ -10,7 +10,11 @@ GitHub Pull Request の操作を効率化するユーティリティ集。 |-----------|------| | `get-unresolved-threads.ts` | 未解決スレッドID一覧を取得 | | `get-comments-by-thread.ts` | スレッドIDからコメント詳細を取得 | -| `reply-to-thread.ts` | スレッドに返信 | | `get-ci-status.ts` | PRのCI状態を取得 | +| `get-ci-logs.ts` | CIジョブのログをダウンロード | 使用する際は `