{"_id":"@design-tools/design-ai-linter","_rev":"7-3fbcb93795441fcf3b6e72e79cc46ada","name":"@design-tools/design-ai-linter","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"name":"@design-tools/design-ai-linter","version":"0.0.1","keywords":["design-system","linter","figma","tokens"],"author":"","license":"MIT","_id":"@design-tools/design-ai-linter@0.0.1","maintainers":[{"name":"redamoon","email":"yuuki60824@gmail.com"}],"bin":{"dslint":"dist/cli/cli.js"},"dist":{"shasum":"1f696c2fe302bd175b09a60b1db9d1853881b90b","tarball":"https://registry.npmjs.org/@design-tools/design-ai-linter/-/design-ai-linter-0.0.1.tgz","fileCount":23,"integrity":"sha512-f5a3o6zqMij6ZRTB4mmHKGUV4C5WTOgY3/CF/gIC6SmR7x2O7GevDQ9Bpva8b8CcgBZfwdZ2dvUBIi4Rt4830g==","signatures":[{"sig":"MEUCIQDVIVFJ9uTljo0y1ZUrAnzbziys23ZnqyTGf7hZqOa2fQIgHRuPWXZs5LXXGVWIBZlUHW7YjPNNhcCYtz2i1I0VvD8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83712},"main":"dist/index.js","_from":"file:design-tools-design-ai-linter-0.0.1.tgz","types":"dist/index.d.ts","private":false,"scripts":{"dev":"ts-node src/cli/cli.ts","test":"vitest","build":"tsc","start":"node dist/cli/cli.js","test:run":"vitest run"},"_npmUser":{"name":"redamoon","email":"yuuki60824@gmail.com"},"_resolved":"/tmp/f76b3b49b01cf74beea649ac5ae9a30c/design-tools-design-ai-linter-0.0.1.tgz","_integrity":"sha512-f5a3o6zqMij6ZRTB4mmHKGUV4C5WTOgY3/CF/gIC6SmR7x2O7GevDQ9Bpva8b8CcgBZfwdZ2dvUBIi4Rt4830g==","_npmVersion":"10.8.2","description":"A linter for Design System tokens exported from Figma","directories":{},"_nodeVersion":"20.19.5","dependencies":{"zod":"^4.1.12","chalk":"^4.1.2","dotenv":"^17.2.3","openai":"^6.9.1","commander":"^10.0.0","@google/genai":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","ts-node":"^10.9.1","@vitest/ui":"^1.0.0","typescript":"^5.0.0","@types/node":"^18.15.11"},"_npmOperationalInternal":{"tmp":"tmp/design-ai-linter_0.0.1_1764349186628_0.9765176845298702","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@design-tools/design-ai-linter","version":"0.0.2","keywords":["design-system","linter","figma","tokens"],"author":"","license":"MIT","_id":"@design-tools/design-ai-linter@0.0.2","maintainers":[{"name":"redamoon","email":"yuuki60824@gmail.com"}],"bin":{"dslint":"dist/cli/cli.js"},"dist":{"shasum":"ffa3deed5b8ee59e33e95187673fe0d88b17f220","tarball":"https://registry.npmjs.org/@design-tools/design-ai-linter/-/design-ai-linter-0.0.2.tgz","fileCount":38,"integrity":"sha512-a/Nwe20weYinONo8WVt90VL/gE7Wm+f+52XVOtoDVPKaHIW6mGOPnpY0lbLeOdbdeAbrxnSYcVv9yBnv5tMnfQ==","signatures":[{"sig":"MEUCIH62iyOgWHQPTmo6GjCuTGNpw9oaxToUeHVIdbdcjpKFAiEAic6v0hmpmvP0ddbGlLi5rwwzSMSnClnO6dCtZx249Co=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178754},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"5cff1a31f1645f9cf13dfeb49b7b31f2409a3eb5","private":false,"scripts":{"dev":"ts-node src/cli/cli.ts","test":"vitest","build":"tsc","start":"node dist/cli/cli.js","test:run":"vitest run"},"_npmUser":{"name":"redamoon","email":"yuuki60824@gmail.com"},"_npmVersion":"10.8.2","description":"A linter for Design System tokens exported from Figma","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","chalk":"^4.1.2","dotenv":"^17.2.3","openai":"^6.9.1","commander":"^10.0.0","@google/genai":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","ts-node":"^10.9.1","@vitest/ui":"^1.0.0","typescript":"^5.0.0","@types/node":"^18.15.11"},"_npmOperationalInternal":{"tmp":"tmp/design-ai-linter_0.0.2_1764401251215_0.3184449705666974","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@design-tools/design-ai-linter","version":"0.0.3","keywords":["design-system","linter","figma","tokens"],"author":"","license":"MIT","_id":"@design-tools/design-ai-linter@0.0.3","maintainers":[{"name":"redamoon","email":"yuuki60824@gmail.com"}],"bin":{"dslint":"dist/cli/cli.js"},"dist":{"shasum":"4935075a7b542b9fabedac85ca1bbd022b287904","tarball":"https://registry.npmjs.org/@design-tools/design-ai-linter/-/design-ai-linter-0.0.3.tgz","fileCount":38,"integrity":"sha512-gTrMSqdZ17OIFIf+kEj6gHqtj2Ugrzr1b4Z6xv/Ch9tzqBLWqOHOswGXLYBM3Hc4s+xS+MiwF47DtokUwcl49g==","signatures":[{"sig":"MEUCIQDj1mSJBpHXsfomZ6IIBhgSyltexZlrBGPpJeu3e6KWuQIgJAP5zG43kjWrxGT24Hp58oI4lO3EsY3M+ssLJLcE8O4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183815},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2f96877638349bd39085d9e030382161042f225a","private":false,"scripts":{"dev":"ts-node src/cli/cli.ts","test":"vitest","build":"tsc","start":"node dist/cli/cli.js","test:run":"vitest run"},"_npmUser":{"name":"redamoon","email":"yuuki60824@gmail.com"},"_npmVersion":"10.8.2","description":"A linter for Design System tokens exported from Figma","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","chalk":"^4.1.2","dotenv":"^17.2.3","openai":"^6.9.1","commander":"^10.0.0","@google/genai":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","ts-node":"^10.9.1","@vitest/ui":"^1.0.0","typescript":"^5.0.0","@types/node":"^18.15.11"},"_npmOperationalInternal":{"tmp":"tmp/design-ai-linter_0.0.3_1764402222855_0.5412263811298808","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@design-tools/design-ai-linter","version":"0.0.4","keywords":["design-system","linter","figma","tokens"],"author":"","license":"MIT","_id":"@design-tools/design-ai-linter@0.0.4","maintainers":[{"name":"redamoon","email":"yuuki60824@gmail.com"}],"bin":{"dslint":"dist/cli/cli.js"},"dist":{"shasum":"3bde63de18de70483fad969fb67b72784cc0ffe7","tarball":"https://registry.npmjs.org/@design-tools/design-ai-linter/-/design-ai-linter-0.0.4.tgz","fileCount":38,"integrity":"sha512-XP9nPepcqa3IUyVVvPsCrzIQQX835fO9h3C2xw94KoWslEduzWHkLbDKH9Jqu3aTDhIt/Cu5ioe17nkUZnUWig==","signatures":[{"sig":"MEUCIBL/pFoVF2T2c76FQk/xEzmQNn70ehAsujLHyYYLBMTSAiEAqAa0Qzcxh84LQmyyFrVoGN2Xm1T9RFt2hp/Ds8uqDMw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202397},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ff548f2d6384af64dc74b3b613d7ffcc95834f34","private":false,"scripts":{"dev":"ts-node src/cli/cli.ts","test":"vitest","build":"tsc","start":"node dist/cli/cli.js","test:run":"vitest run"},"_npmUser":{"name":"redamoon","email":"yuuki60824@gmail.com"},"_npmVersion":"10.8.2","description":"A linter for Design System tokens exported from Figma","directories":{},"_nodeVersion":"20.18.1","dependencies":{"zod":"^4.1.12","chalk":"^4.1.2","dotenv":"^17.2.3","openai":"^6.9.1","commander":"^10.0.0","@google/genai":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","ts-node":"^10.9.1","@vitest/ui":"^1.0.0","typescript":"^5.0.0","@types/node":"^18.15.11"},"_npmOperationalInternal":{"tmp":"tmp/design-ai-linter_0.0.4_1764404518278_0.717030979066348","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@design-tools/design-ai-linter","version":"0.0.5","keywords":["design-system","linter","figma","tokens"],"author":"","license":"MIT","_id":"@design-tools/design-ai-linter@0.0.5","maintainers":[{"name":"redamoon","email":"yuuki60824@gmail.com"}],"bin":{"dslint":"dist/cli/cli.js"},"dist":{"shasum":"09b19026002b87d4db0443ca13c08ca49c5817ce","tarball":"https://registry.npmjs.org/@design-tools/design-ai-linter/-/design-ai-linter-0.0.5.tgz","fileCount":24,"integrity":"sha512-q97VAlPppr8Z+mE10C8GvqABQipQCmg77q0mx9FQWiGLlWgMMoRjem+FcE9V1+BjGRcSGDrrNRVxxiwVJ37Wog==","signatures":[{"sig":"MEUCIB35fUJMsx9X+ltfIOW6xpjRqlL2wQYA6rXfUgR0//5wAiEAtYG6rjLas5qw8fDFlX/JX4pr346Io5gkWjDg2Kgr4B8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125167},"main":"dist/index.js","_from":"file:design-tools-design-ai-linter-0.0.5.tgz","types":"dist/index.d.ts","private":false,"scripts":{"dev":"ts-node src/cli/cli.ts","test":"vitest","build":"tsc","start":"node dist/cli/cli.js","test:run":"vitest run"},"_npmUser":{"name":"redamoon","email":"yuuki60824@gmail.com"},"_resolved":"/tmp/6c06687bc2b139f41ca577dd0134828f/design-tools-design-ai-linter-0.0.5.tgz","_integrity":"sha512-q97VAlPppr8Z+mE10C8GvqABQipQCmg77q0mx9FQWiGLlWgMMoRjem+FcE9V1+BjGRcSGDrrNRVxxiwVJ37Wog==","_npmVersion":"10.8.2","description":"A linter for Design System tokens exported from Figma","directories":{},"_nodeVersion":"20.19.5","dependencies":{"zod":"^4.1.12","chalk":"^4.1.2","dotenv":"^17.2.3","openai":"^6.9.1","commander":"^10.0.0","@google/genai":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","ts-node":"^10.9.1","@vitest/ui":"^1.0.0","typescript":"^5.0.0","@types/node":"^18.15.11"},"optionalDependencies":{"tsx":"^4.7.0","ts-node":"^10.9.1"},"_npmOperationalInternal":{"tmp":"tmp/design-ai-linter_0.0.5_1764474211220_0.014072584459000614","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@design-tools/design-ai-linter","version":"0.0.6","keywords":["design-system","linter","figma","tokens"],"author":"","license":"MIT","_id":"@design-tools/design-ai-linter@0.0.6","maintainers":[{"name":"redamoon","email":"yuuki60824@gmail.com"}],"bin":{"dslint":"dist/cli/cli.js"},"dist":{"shasum":"91fbc2d7a0c7fdef2341fe9fae7952cda3d58991","tarball":"https://registry.npmjs.org/@design-tools/design-ai-linter/-/design-ai-linter-0.0.6.tgz","fileCount":24,"integrity":"sha512-1kKh9zjP5WD8bZSdwYTR6gl9SRF8P3cmRs5ti5hTB8+ozva4IIUmgTN0FIB9nI1qxWERg+8W2vD4bnd8iYKFbg==","signatures":[{"sig":"MEUCIQD0RYoL5eI9HTHliW25snDyqeLsvARaejJbjQVBFU9K0QIgZvkY+c+85QjhElzEkudvS8WT6JHiW/ad/lXZTfVo0hI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125167},"main":"dist/index.js","_from":"file:design-tools-design-ai-linter-0.0.6.tgz","types":"dist/index.d.ts","private":false,"scripts":{"dev":"ts-node src/cli/cli.ts","test":"vitest","build":"tsc","start":"node dist/cli/cli.js","test:run":"vitest run"},"_npmUser":{"name":"redamoon","email":"yuuki60824@gmail.com"},"_resolved":"/tmp/24c8f272972952f3b0177046331a47cc/design-tools-design-ai-linter-0.0.6.tgz","_integrity":"sha512-1kKh9zjP5WD8bZSdwYTR6gl9SRF8P3cmRs5ti5hTB8+ozva4IIUmgTN0FIB9nI1qxWERg+8W2vD4bnd8iYKFbg==","_npmVersion":"10.8.2","description":"A linter for Design System tokens exported from Figma","directories":{},"_nodeVersion":"20.19.5","dependencies":{"zod":"^4.1.12","chalk":"^4.1.2","dotenv":"^17.2.3","openai":"^6.9.1","commander":"^10.0.0","@google/genai":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.0.0","ts-node":"^10.9.1","@vitest/ui":"^1.0.0","typescript":"^5.0.0","@types/node":"^18.15.11"},"optionalDependencies":{"tsx":"^4.7.0","ts-node":"^10.9.1"},"_npmOperationalInternal":{"tmp":"tmp/design-ai-linter_0.0.6_1764479348158_0.3717123887286282","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@design-tools/design-ai-linter","version":"0.0.7","description":"A linter for Design System tokens exported from Figma","private":false,"main":"dist/index.js","types":"dist/index.d.ts","bin":{"dslint":"dist/cli/cli.js"},"keywords":["design-system","linter","figma","tokens"],"author":"","license":"MIT","dependencies":{"@google/genai":"^1.30.0","chalk":"^4.1.2","commander":"^10.0.0","dotenv":"^17.2.3","openai":"^6.9.1","zod":"^4.1.12"},"optionalDependencies":{"ts-node":"^10.9.1","tsx":"^4.7.0"},"devDependencies":{"@types/node":"^18.15.11","@vitest/ui":"^1.0.0","ts-node":"^10.9.1","typescript":"^5.0.0","vitest":"^1.0.0"},"scripts":{"build":"tsc","start":"node dist/cli/cli.js","dev":"ts-node src/cli/cli.ts","test":"vitest","test:run":"vitest run"},"_id":"@design-tools/design-ai-linter@0.0.7","_integrity":"sha512-+nyo556F6wVfM7gEWdxaoGYBRCN5QqyhT5kvIo+yz1+5dEv2KnLiPTDMR+/oHnCaFF8uV8OuVPPjb1n21aY1/w==","_resolved":"/tmp/c5aafcfef7845a2cb39306c888c3d145/design-tools-design-ai-linter-0.0.7.tgz","_from":"file:design-tools-design-ai-linter-0.0.7.tgz","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-+nyo556F6wVfM7gEWdxaoGYBRCN5QqyhT5kvIo+yz1+5dEv2KnLiPTDMR+/oHnCaFF8uV8OuVPPjb1n21aY1/w==","shasum":"411fcabd09e2716fd75fb8e5c7ba3374114026e7","tarball":"https://registry.npmjs.org/@design-tools/design-ai-linter/-/design-ai-linter-0.0.7.tgz","fileCount":40,"unpackedSize":229718,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDp9gZRxyOufWmVepZZkCRmBJTHJhUuKktL0ZjPRy1zIQIgQbN7BVpD9VJji1YWwMgzCyrTlSJLSJbob1R6qPD+tIw="}]},"_npmUser":{"name":"redamoon","email":"yuuki60824@gmail.com"},"directories":{},"maintainers":[{"name":"redamoon","email":"yuuki60824@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/design-ai-linter_0.0.7_1764479558629_0.9502686108038301"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-28T16:59:46.498Z","modified":"2025-11-30T05:12:39.044Z","0.0.1":"2025-11-28T16:59:46.818Z","0.0.2":"2025-11-29T07:27:31.409Z","0.0.3":"2025-11-29T07:43:43.077Z","0.0.4":"2025-11-29T08:21:58.478Z","0.0.5":"2025-11-30T03:43:31.422Z","0.0.6":"2025-11-30T05:09:08.373Z","0.0.7":"2025-11-30T05:12:38.833Z"},"license":"MIT","keywords":["design-system","linter","figma","tokens"],"description":"A linter for Design System tokens exported from Figma","maintainers":[{"name":"redamoon","email":"yuuki60824@gmail.com"}],"readme":"# Design AI Linter\n\nFigmaからエクスポートされたDesign Systemトークン（例：Figma Tokens / Token Studio経由）をリントするCLIツールです。静的解析とAIによる意味解析を組み合わせて、デザイントークンの品質を保証します。\n\n## 機能\n\n- **トークン正規化**: `tokens.json`を読み込み、解析用に正規化します\n- **静的ルール**: 命名規則、生のカラー/ピクセル値、重複をチェックします\n- **AIルール**: LLM（OpenAI/Gemini）を使用して、意味的な一貫性、スペーシングの整合性、デザインの複雑さをチェックします\n- **コード解析**: コードファイルを解析して生の値を検出し、デザイントークンへの置き換えを提案します\n- **カスタムプロンプト**: 任意のプロンプトファイルを読み込んでAIに送信し、トークン情報をコンテキストとして含めて実行できます\n- **Figma同期**: Figma APIから直接トークンを同期できます\n- **レポート出力**: JSON形式やPRコメント形式でレポートを出力できます\n\n## インストール\n\n```bash\npnpm install\n```\n\n## セットアップ\n\n### 環境変数の設定（AI機能を使用する場合）\n\nプロジェクトルートに`.env`ファイルを作成し、以下のいずれかを設定します：\n\n```bash\nOPENAI_API_KEY=sk-...\n# または\nGEMINI_API_KEY=AIza...\n```\n\n### 設定ファイルの作成\n\nプロジェクトルートに`designlintrc.json`を作成します：\n\n```json\n{\n  \"source\": {\n    \"type\": \"tokensJson\",\n    \"path\": \"./tokens.json\"\n  },\n  \"rules\": {\n    \"naming-convention\": {\n      \"severity\": \"error\",\n      \"pattern\": \"^([a-z]+)(\\\\.[a-z0-9\\\\-]+)*$\"\n    }\n  },\n  \"report\": {\n    \"format\": [\"console\"],\n    \"outputPath\": \"./reports\"\n  }\n}\n```\n\n## 使用方法\n\n### 基本的なリント\n\n```bash\n# 開発モード\npnpm dev lint\n\n# ビルドして実行\npnpm build\npnpm start lint\n```\n\n**デフォルト動作**: `lint`コマンドは、デフォルトでステージングされたファイルのみをチェックします。\n\n### オプション\n\n```bash\n# カスタム設定ファイルを指定\ndslint lint --config ./custom-config.json\n\n# カスタムトークンファイルを指定\ndslint lint --source ./custom-tokens.json\n\n# コードファイルを解析（明示的に指定した場合）\ndslint lint --files \"src/**/*.{tsx,css}\"\n\n# ステージングされたファイルのみをチェック（デフォルト動作）\ndslint lint --staged\n\n# コミット範囲の差分のみをチェック\ndslint lint --commit-diff HEAD~1..HEAD\ndslint lint --commit-diff main..HEAD\n\n# AIモデルを指定\ndslint lint --model gpt-4o\ndslint lint --model gemini-3-pro-preview\n\n# JSONレポートを出力\ndslint lint --json ./report.json\n\n# PRコメント形式で出力\ndslint lint --pr-comment\n```\n\n### fixコマンド\n\n`fix`コマンドは、デフォルトで全ファイルを横断的にチェックします：\n\n```bash\n# 全ファイルをチェック\ndslint fix\n\n# ステージングされたファイルのみをチェック\ndslint fix --staged\n\n# コミット範囲の差分のみをチェック\ndslint fix --commit-diff HEAD~1..HEAD\n\n# 特定のモデルを指定\ndslint fix --model gemini-2.5-flash\n\n# コードファイルパターンを指定\ndslint fix --files \"src/**/*.{tsx,css}\"\n```\n\n### カスタムプロンプトの実行\n\nカスタムプロンプトファイルを使用して、AIにトークン分析を実行させることができます：\n\n```bash\n# 基本的な使用方法\ndslint lint --prompt-file prompt.md\n\n# JSON形式で出力\ndslint lint --prompt-file prompt.md --prompt-output-json\n\n# カスタムトークンファイルを指定\ndslint lint --source ./custom-tokens.json --prompt-file prompt.md\n\n# 特定のモデルを指定\ndslint lint --prompt-file prompt.md --model gpt-4o\n```\n\nプロンプトファイル内で`{{TOKENS}}`プレースホルダーを使用すると、その位置にトークン情報が挿入されます。使用しない場合は、プロンプトの末尾に自動的に追加されます。\n\n### Figmaからトークンを同期\n\n```bash\n# コマンドライン引数で指定\ndslint sync --key <file_key> --token <access_token> --output ./tokens.json\n\n# 環境変数で指定（.envファイルに設定）\nFIGMA_FILE_KEY=xxx\nFIGMA_ACCESS_TOKEN=xxx\ndslint sync --output ./tokens.json\n```\n\n## Git差分のチェック\n\n### lintコマンドのデフォルト動作\n\n`lint`コマンドは、デフォルトでステージングされたファイルのみをチェックします。これにより、CI/CDパイプラインやpre-commitフックでの使用に適しています。\n\n### コミット範囲の指定\n\n特定のコミット範囲の差分のみをチェックできます：\n\n```bash\n# 直前のコミットとの差分\ndslint lint --commit-diff HEAD~1..HEAD\n\n# mainブランチとの差分\ndslint lint --commit-diff main..HEAD\n\n# 特定のコミット間の差分\ndslint lint --commit-diff abc123..def456\n```\n\n### fixコマンドでの全ファイルチェック\n\n`fix`コマンドは、デフォルトで全ファイルを横断的にチェックします。これにより、プロジェクト全体のリファクタリングや一括修正に適しています。\n\n## AIモデルの指定\n\n### 利用可能なモデル\n\n**OpenAI:**\n- `gpt-4o` (推奨)\n- `gpt-4-turbo`\n- `gpt-4-turbo-preview`\n- `gpt-3.5-turbo`\n\n**Gemini:**\n- `gemini-3-pro-preview` (推奨)\n- `gemini-2.5-flash`\n- `gemini-1.5-flash`\n- `gemini-pro`\n\n### モデルの指定方法\n\n```bash\n# 特定のモデルを指定\ndslint lint --model gpt-4o\ndslint fix --model gemini-3-pro-preview\n\n# モデルを指定しない場合、デフォルトの優先順位で自動的に試行されます\ndslint lint\n```\n\nモデルを指定した場合でも、クォータ超過（429）やモデルが見つからない（404）エラーが発生した場合は、自動的に次のモデルにフォールバックします。\n\n## ルール\n\n### 静的ルール\n\n#### naming-convention\n\nトークン名が指定されたパターンに一致するかチェックします。\n\n設定例：\n```json\n{\n  \"naming-convention\": {\n    \"severity\": \"error\",\n    \"pattern\": \"^([a-z]+)(\\\\.[a-z0-9\\\\-]+)*$\"\n  }\n}\n```\n\n#### raw-color / raw-pixel\n\nコードファイル内で生のカラー値やピクセル値が使用されていないかチェックします。コードファイルを`--files`オプションで指定した場合に自動的に有効になります。\n\n### AIルール\n\n#### ai-semantic-naming\n\nAIを使用してトークン名の意味的一貫性をチェックします。以下の問題を検出します：\n\n- トークンの一貫した階層的命名の違反\n- \"info\" vs \"information\"のような同義語の混在\n- 数値と記述的値の混在\n- 命名の深さの不一致\n\n#### ai-spacing-consistency\n\nスペーシングトークンの一貫性をチェックします。スペーシングスケールの整合性や、使用されていないトークンの検出を行います。\n\n#### ai-design-complexity\n\nデザインシステムの複雑さを評価します。トークンの数、階層の深さ、使用パターンを分析して、システムの複雑さに関する警告を提供します。\n\n## カスタムAIルール\n\nデフォルトのAIルールに加えて、独自のカスタムAIルールを定義できます。プロンプトファイルとZodスキーマファイルを作成し、設定ファイルで参照することで、プロジェクト固有のルールを追加できます。\n\n### カスタムルールの定義\n\n1. **プロンプトファイルを作成** (`prompts/my-rule.md`):\n\n```md\nあなたはデザインシステムアーキテクトです。\n以下のトークンを分析してください。\n\n{{TOKENS}}\n\n出力フォーマット:\n{\n  \"issues\": [\n    {\n      \"problem\": \"string\",\n      \"reason\": \"string\",\n      ...\n    }\n  ]\n}\n```\n\n2. **スキーマファイルを作成** (`schemas/my-rule.ts`):\n\n```typescript\nimport { z } from 'zod';\n\nexport const schema = z.object({\n  issues: z.array(z.object({\n    file: z.string().nullable().optional(),\n    line: z.number().nullable().optional(),\n    problem: z.string(),\n    reason: z.string(),\n    suggestedToken: z.string().nullable().optional(),\n    fixedCode: z.string().nullable().optional(),\n    impact: z.enum(['Low', 'Medium', 'High']).nullable().optional(),\n    tokenName: z.string().nullable().optional(),\n    suggestion: z.string().nullable().optional()\n  }))\n});\n```\n\n3. **設定ファイルに追加** (`designlintrc.json`):\n\n```json\n{\n  \"rules\": {\n    \"custom-rules\": [\n      {\n        \"id\": \"my-custom-rule\",\n        \"description\": \"My custom rule description\",\n        \"severity\": \"warn\",\n        \"prompt\": \"./prompts/my-rule.md\",\n        \"schema\": \"./schemas/my-rule.ts\"\n      }\n    ]\n  }\n}\n```\n\n### プロンプトファイルのプレースホルダー\n\n- `{{TOKENS}}`: トークン情報が自動的に挿入されます。使用しない場合は、プロンプトの末尾に自動的に追加されます。\n- コードファイルが指定されている場合、コードファイルの情報も自動的に追加されます。\n\n### スキーマファイルの要件\n\n- TypeScriptファイル（`.ts`）またはJavaScriptファイル（`.js`）を使用できます\n- `export const schema`または`export default schema`でZodスキーマをエクスポートする必要があります\n- TypeScriptファイルを使用する場合、`ts-node`または`tsx`が必要です（プロジェクトにインストールされている必要があります）\n\n### 使用例\n\n```bash\n# カスタムルールを含む設定でlint実行\ndslint lint\n\n# fixコマンドでもカスタムルールが実行される\ndslint fix\n```\n\n詳細な例は`example/`ディレクトリを参照してください。\n\n## コード解析\n\n`--files`オプションを使用してコードファイルを解析すると、以下の機能が有効になります：\n\n1. **生の値の検出**: コード内で直接使用されているカラー値やピクセル値を検出\n2. **トークン提案**: 検出された生の値に対して、適切なデザイントークンへの置き換えを提案\n3. **修正コードの生成**: トークンを使用した修正後のコードを提案\n\n例：\n```bash\ndslint lint --files \"src/**/*.{tsx,css}\" --source ./tokens.json\n```\n\n## レポート\n\n### JSONレポート\n\n```bash\ndslint lint --json ./report.json\ndslint fix --json ./report.json\n```\n\n出力されるJSONには、検出されたすべての問題の詳細情報が含まれます。\n\n### PRコメント形式\n\n```bash\ndslint lint --pr-comment\ndslint fix --pr-comment\n```\n\nGitHubのPRコメントとして使用できる形式で出力されます。\n\n## 開発\n\n### ビルド\n\n```bash\npnpm build\n```\n\n### テスト\n\n```bash\npnpm test\n```\n\n### ルールの追加\n\n新しいルールを追加するには：\n\n1. `src/rules/`に新しいファイルを作成\n2. `Token[]`を受け取り`Diagnostic[]`を返す関数をエクスポート\n3. `src/cli/cli.ts`にルールを登録\n\n静的ルールの例：\n```typescript\nimport { Token, Diagnostic } from '../types';\n\nexport function myCustomRule(\n  tokens: Token[], \n  config: any\n): Diagnostic[] {\n  const diags: Diagnostic[] = [];\n  // ルールの実装\n  return diags;\n}\n```\n\nAIルールの例：\n```typescript\nimport { AIRule } from '../types';\nimport { z } from 'zod';\n\nexport const myAIRule: AIRule = {\n  id: 'my-ai-rule',\n  description: 'My custom AI rule',\n  severity: 'warn',\n  schema: z.object({\n    issues: z.array(z.object({\n      // スキーマ定義\n    }))\n  }),\n  prompt: (context) => `\n    // プロンプトテンプレート\n  `\n};\n```\n\n## アーキテクチャ\n\n詳細なアーキテクチャとAI実装の詳細については、ルートディレクトリの[WALKTHROUGH.md](../../WALKTHROUGH.md)と[ARCHITECTURE.md](../../ARCHITECTURE.md)を参照してください。\n\n## ライセンス\n\nMIT\n\n","readmeFilename":"README.md"}