diff --git a/.agents/skills/creating-issues-and-prs/SKILL.md b/.agents/skills/creating-issues-and-prs/SKILL.md new file mode 100644 index 00000000000..03a03b2a098 --- /dev/null +++ b/.agents/skills/creating-issues-and-prs/SKILL.md @@ -0,0 +1,10 @@ +--- +name: creating-issues-and-prs +description: Defines rules for creating Issues and Pull Requests on GitHub, including precautions when AI is used to create them. Triggered by phrases like "create issue", "create pull request", or "create PR". +--- + +# creating-issues-and-prs + +This is the Codex entrypoint for the canonical rules regarding creating Issues and Pull Requests on GitHub, especially when AI is involved. + +Read and follow [.claude/skills/creating-issues-and-prs/SKILL.md](../../../.claude/skills/creating-issues-and-prs/SKILL.md). Treat that file and its `references/` directory (if present) as the source of truth. diff --git a/.agents/skills/shipping-misskey-change/SKILL.md b/.agents/skills/shipping-misskey-change/SKILL.md new file mode 100644 index 00000000000..ea7ab5b6864 --- /dev/null +++ b/.agents/skills/shipping-misskey-change/SKILL.md @@ -0,0 +1,10 @@ +--- +name: shipping-misskey-change +description: Use at every finish moment of a Misskey change, before committing, opening a PR, merging, or handing work back, especially when proportional validation, SPDX, locale safety, migrations, or misskey-js generation may apply. +--- + +# shipping-misskey-change + +This is the Codex entrypoint for the canonical Misskey pre-ship checklist. + +Read and follow [.claude/skills/shipping-misskey-change/SKILL.md](../../../.claude/skills/shipping-misskey-change/SKILL.md). Treat that file and its `references/` directory as the source of truth. diff --git a/.agents/skills/working-on-backend/SKILL.md b/.agents/skills/working-on-backend/SKILL.md new file mode 100644 index 00000000000..491b015185e --- /dev/null +++ b/.agents/skills/working-on-backend/SKILL.md @@ -0,0 +1,10 @@ +--- +name: working-on-backend +description: Use whenever editing or adding code under `packages/backend/`, including REST API endpoints, NestJS services/modules, TypeORM entities, migrations, backend tests, misskey-js generation, or backend validation commands. +--- + +# working-on-backend + +This is the Codex entrypoint for the canonical Misskey backend skill. + +Read and follow [.claude/skills/working-on-backend/SKILL.md](../../../.claude/skills/working-on-backend/SKILL.md). Treat that file and its `references/` directory as the source of truth. diff --git a/.agents/skills/working-on-frontend/SKILL.md b/.agents/skills/working-on-frontend/SKILL.md new file mode 100644 index 00000000000..59be8cfe992 --- /dev/null +++ b/.agents/skills/working-on-frontend/SKILL.md @@ -0,0 +1,10 @@ +--- +name: working-on-frontend +description: Use whenever editing or adding code under `packages/frontend/`, Vue SFCs, SCSS Modules, Storybook stories, or frontend-facing UI text in `locales/ja-JP.yml`. +--- + +# working-on-frontend + +This is the Codex entrypoint for the canonical Misskey frontend skill. + +Read and follow [.claude/skills/working-on-frontend/SKILL.md](../../../.claude/skills/working-on-frontend/SKILL.md). Treat that file and its `references/` directory as the source of truth. diff --git a/.claude/.gitignore b/.claude/.gitignore new file mode 100644 index 00000000000..67de78be55d --- /dev/null +++ b/.claude/.gitignore @@ -0,0 +1,2 @@ +/settings.local.json +/.credentials.json diff --git a/.claude/THIRD_PARTY_LICENSES.md b/.claude/THIRD_PARTY_LICENSES.md new file mode 100644 index 00000000000..f36e665f7b3 --- /dev/null +++ b/.claude/THIRD_PARTY_LICENSES.md @@ -0,0 +1,76 @@ +# Third-Party Licenses (`.claude/`) + +`.claude/` �下��り込�れ��るサードパーティ由�コン�ー�ント�ライセンス・出典情報を���る。Misskey 本体� AGPL-3.0-only ���本ディレクトリ内�� MIT ライセンス�ファイル���れ��る。�ファイル冒頭�も `SPDX-License-Identifier` �出典コメントを併記���る。 + +最終更新: 2026-05-11 + +--- + +## 1. everything-claude-code (ECC) + +- 上�リ�ジトリ: +- �り込ん��ージョン: v2.0.0-rc.1 +- ライセンス: **MIT** +- Copyright: Copyright (c) 2026 Affaan Mustafa + +### �り込ん�ファイル + +| `.claude/` 内�パス | 上�パス | 上�由� | Misskey ��改変 | +|---|---|---|---| +| `skills/context-budget/SKILL.md` | `skills/context-budget/SKILL.md` | ECC | description を日本語化�Misskey 固有メモを追記 | +| `commands/harness-audit.md` | `commands/harness-audit.md` | ECC | scripts �存�自動採点を�repository-native command � SPDX checker �採点�る版�書���。Misskey 固有�評価軸 (SPDX / endpoint-list / migration / locales) を組�込� | +| `commands/quality-gate.md` | `commands/quality-gate.md` | ECC | 言語自動判定を排除� Misskey 固定 pipeline (`pnpm` + tsc + ESLint + Vitest) �。Prettier/Biome フェーズを削除 | + +### MIT License (full text) + +``` +MIT License + +Copyright (c) 2026 Affaan Mustafa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### 上� LICENSE ファイル + + + +--- + +## 2. AGPL コードベース��互�性 + +Misskey 本体� **AGPL-3.0-only** ��布�れ��る��`.claude/` �下� MIT ライセンスファイル����� MIT ���残���る。 + +- MIT � permissive ライセンス��AGPL を�む copyleft ライセンス�プロジェクト� **�り込�・��布�許�れる** +- MIT ��求�る�件 (copyright notice + license text ���) を本ファイル + �ファイル冒頭� SPDX/出典コメント�満����る +- Misskey 全体��布物���� AGPL-3.0-only �扱�れる��`.claude/` �下� MIT ファイル�個別� MIT ���識別�能 + +`.ts` / `.js` / `.vue` / `.scss` � SPDX 義務化 ([AGENTS.md](../AGENTS.md) �「絶対�や�������事�§コード・データ関連) � Misskey 本体コード����`.claude/` �下� `.md` / `.sh` ���用�れ��。 + +--- + +## 3. 新�追加時�手順 + +`.claude/` �新��サードパーティ由��ファイルを�り込む際�: + +1. ライセンスを確� (互�性: MIT / Apache-2.0 / BSD � OK�GPL/AGPL ��相談) +2. �ファイル冒頭� SPDX ヘッダ + 出典コメントを追加 +3. 本ファイル §1 �テーブル� 1 行追記 +4. 必��ら新��セクション�ライセンス全文を�梱 +5. 本ファイル��導線を確� (`.claude/skills/README.md` / `.claude/commands/README.md` 等�� README �ら本ファイル�リンク�れ��る)。�� [CLAUDE.md](../CLAUDE.md) � `.claude/` �下全体を「Claude Code 固有�補助����案内���り本ファイルも�����れる。CLAUDE.md � `@AGENTS.md` を�り込む����� AGENTS.md ��個別追記��� diff --git a/.claude/agents/README.md b/.claude/agents/README.md new file mode 100644 index 00000000000..02faf2a6df7 --- /dev/null +++ b/.claude/agents/README.md @@ -0,0 +1,32 @@ +# `.claude/agents/` — プロジェクト固有�サブエージェント + +Misskey �特定領域�特化��レビュー / 調査エージェントを `.claude/agents/.md` 形���置�る。 + +frontmatter (`name` + `description` + `tools`) ��Claude � **自動�エージェントを呼�出��判断�る** 唯一�手��り��る。`description` � **起動判断�効�ドメイン・パス・ファイル種別・固有�ェック�絞��簡潔�** 書� (動詞 + 対象 + トリガー�件)。本文 checklist 項目を網羅的�列挙�る������他� reviewer �区別��る高シグナル語を��。 + +実装済エージェント�一覧�本ファイル��管���� (�敗�る��)。� `.md` � frontmatter �自己説明���機能�る。 + +## 他�レビュー手段��使�分� + +レビュー�を増や�����よ��役割を分�る: + +- **�� `.claude/agents/` � 2 �**: backend endpoint / Vue SFC � **Misskey 固有・機械的�ェック** (endpoint-list 登録�れ・misskey-js �生��れ・ja-JP.yml �定・Storybook 併設 等)。 + 別コンテキスト�差分を機械走査�る価値��る領域��定�る +- **`pr-review-toolkit` プラグイン (code-reviewer / silent-failure-hunter 等)**: 言語��存�一般的�コード�質・�グ・設計レビュー。Misskey 固有�約�見�� +- **`working-on-*` skill � checklist**: コードを **書���る最中** �自己�ェック (レビュー専用����実装ガイド) + +Misskey 固有�約�機械�ェック�本 agent�一般�質� pr-review-toolkit�実装中ガイド� skill��棲�分�る。 + +## 構�方� + +- `tools` � **編集権���** (Edit/Write を渡���) �絞り�PR baseline (`git merge-base origin/develop HEAD`) ��差分�ら自動的�レビュー対象を抽出�る設計 +- 差分抽出� `git merge-base origin/develop HEAD` を baseline ��る (PR / ブラン�全体を見る��)。`git diff HEAD` �体� **未コミット差分���れ��コミット済� PR ��空����誤判定�る** ��使��� +- `description` �呼�出�判断�手��り��る��時��(呼�れ���も) Task ツール起動����常時ロード�れる。**他�代替����高シグナル�トリガー語�絞��簡潔�** 書� (汎用 reviewer �被る語や冗長�列挙� context-budget 上� overhead ��る���発見性�寄与���)。�全性� [/harness-audit](../commands/harness-audit.md) / [context-budget skill](../skills/context-budget/SKILL.md) �確���る +- �約� **正本� `.claude/skills/*/references/` �**。agent � checklist ��� **派生コピー** (subagent � skill を読����も動�よ�自己完���る)。�約を変�る��� references を先�直� agent を追従��る ── 両者�食�����期�れ��� references を正��る + +## 新�エージェントを追加�る場� + +- `.claude/agents/.md` � YAML frontmatter (`name` / `description` / `tools`) �本文 Markdown を書� +- `description` �呼�出�判断�使�れる���対象ドメイン・主��ェック項目・トリガー�件を挙�る。���常時ロード�れる�� **高シグナル語�絞��簡潔�** (構�方��該当項目を�照) +- レビュー専門�ら `tools: Read, Grep, Glob, Bash` �絞る (Edit/Write を渡���)。**`Bash` �任��シェルコマンドを実行��る強力�権���る点�注�**: レビュー用途�� `git diff` / `git ls-files` / `grep` / `sed` 等� **読��り系コマンド��定��使�** ��。書�込�・削除・�ットワーク�信を伴��作�本文中�例示・指示������� (エージェント本文�ガードレール��る) +- 主��照ファイル��リンク���エージェント markdown �ら�相対パス�貼る (`../../packages/backend/...` �よ��形)。絶対パス� contributor �ホームディレクトリ�存��る��使��� diff --git a/.claude/agents/misskey-api-reviewer.md b/.claude/agents/misskey-api-reviewer.md new file mode 100644 index 00000000000..51092de15ea --- /dev/null +++ b/.claude/agents/misskey-api-reviewer.md @@ -0,0 +1,145 @@ +--- +name: misskey-api-reviewer +description: Misskey backend � REST API エンド�イント (packages/backend/src/server/api/endpoints/) 追加・変更を機械レビュー�る。endpoint-list 登録�れ・misskey-js �生��れ・meta/paramDef/UUID を検査。backend API を変更�� PR レビュー�呼�。 +tools: Read, Grep, Glob, Bash +--- + +# Misskey API エンド�イントレビュアー + +Misskey �ックエンド (`packages/backend`) � REST API エンド�イント追加・変更 PR を機械的�レビュー�る専門エージェント。�約� **正本** � [.claude/skills/working-on-backend/references/tasks/adding-api-endpoint.md](../skills/working-on-backend/references/tasks/adding-api-endpoint.md) � [.claude/skills/working-on-backend/references/knowledge/api-meta-paramdef.md](../skills/working-on-backend/references/knowledge/api-meta-paramdef.md)。本エージェント��れを review-mode �ら機械�ェック�る mirror。以下��ェックリスト� references � **派生コピー** ��subagent � skill を読����も�体�動�よ�自己完�����る。�約を変�る��� **references を先�直��本ファイルを追従��る** (正本� references。両者�食������期�れ)。個別��ェック�判断�迷��ら�該当�る references ファイルを Read ��確���よ�。 + +## 役割 + +`packages/backend/src/server/api/endpoints/` �下� `.ts` 変更を対象���約逸脱・登録�れ・型自動生��れ・テスト�足を抽出�る。良�点��触れ��改善�必��箇所��報告�る。 + +## レビュー対象�特定 + +呼�出�元�ら明示的�ファイル�渡�れ�ら�れを優先�る。渡�れ����場�� **PR / ブラン�全体�差分** を�得�る (未コミット差分���������注�)。 + +```bash +BASE=$(git merge-base origin/develop HEAD) +{ git diff --name-only "$BASE"...HEAD; git diff --name-only HEAD; git ls-files --others --exclude-standard; } \ + | sort -u \ + | grep -E '^packages/backend/src/server/api/endpoints/.*\.ts$' +``` + +`origin/develop` �無�環境�� `develop` ��� `master` �フォール�ック�る。 + +加��以下も�� baseline �差分対象���る: + +- `packages/backend/src/server/api/endpoint-list.ts` +- `packages/backend/test/e2e/**` (��� `endpoints.ts` � `.ts`) +- `packages/misskey-js/src/autogen/**` + +差分対象�空�ら「レビュー対象� API エンド�イント変更����短�報告��終了。 + +## �ェックリスト + +### 1. `meta` �必須・推奨フィールド (Major) + +[endpoints.ts �型定義](../../packages/backend/src/server/api/endpoints.ts) を真��る。 + +- `tags`: OpenAPI タグ (機能領域)。 +- `requireCredential`: 明示必須 (boolean)。 +- `kind`: OAuth scope。`requireCredential: true` ���必須 (`read:account` / `write:notes` 等)。 +- `requireModerator` / `requireAdmin`: 権�制���る�。 +- `prohibitMoved`: 移行済アカウントを拒��る� (write 系��検討)。 +- `limit`: レート制� `{ duration, max, key?, minInterval? }`。書�込�系 / コスト高�処��未指定�ら指摘。 +- `errors`: エラー定義。��素� `message` / `code` / `id` (UUID v4) �����る�。 +- `res`: JSON Schema ��� `ref: ''`。�プロパティ� `optional` / `nullable` � **明示** �れ��る�。 +- `requireFile` / `secure` / `allowGet` / `cacheSec` / `description`: 該当�るエンド�イント�使�分���る�。 + +### 2. `meta.errors` � UUID 検証 (Critical) + +� `errors[*].id` �: + +1. UUID v4 形� (`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`) � +2. 既存エンド�イント� `id` ��複������ + +�複検査: + +```bash +grep -rn "id: '<生��れ� UUID>'" packages/backend/src/server/api/endpoints/ +``` + +新�エンド�イント�全 `id` を抽出����を確��る。 + +### 3. `paramDef` (Major) + +- JSON Schema 形� (`type: 'object'`, `properties`, `required`) +- ID 文字列� `format: 'misskey:id'` +- `required` �列�必須プロパティを明示 +- `as const` ��� `as const satisfies Schema` �型推論を効��る (既存実装��者多数。`as const` 自体�無� `Schema` 型注釈も��場���指摘) + +### 4. エンド�イント実装本体 (Major) + +- `Endpoint` を継承���る�。 +- `@Injectable()` デコレータ + `export default class` 形�� (`// eslint-disable-line import/no-default-export` �必�)。 +- DI � `@Inject(DI.xxx)` 形��。 +- **クライアント�返��� API エラー� `throw new ApiError(meta.errors.)`** ([error.ts](../../packages/backend/src/server/api/error.ts) �照)。`meta.errors` �定義��エラーケースを `throw new Error(...)` �投���る�ら指摘�る。 +- 防御的アサーション・「起�る������内部�整�・テスト用 ENV ガード等� **想定外フェイルファスト** � `throw new Error('...')` �構���。既存実装�も `admin/reset-password.ts` ���採用���るパターン (例: `cannot reset password of root`)。`meta.errors` �対応��� `throw new Error` を一律�指摘���。 +- �期 `throw` �許容。��期処���例外��を確��る。 + +### 5. ★ `endpoint-list.ts` ��登録 (Critical) + +最も忘れや��。**忘れる� 404**。[endpoint-list.ts](../../packages/backend/src/server/api/endpoint-list.ts) � 1 行追加�れ��る�: + +```ts +export * as '/' from './endpoints//.js'; +``` + +新�エンド�イントを抽出���々� `endpoint-list.ts` �存在�る� grep �確��る: + +```bash +grep -F "'/'" packages/backend/src/server/api/endpoint-list.ts +``` + +**並�順�補足**: ファイル全体�厳密�アルファベット順��並ん��ら���カテゴリ内 (`admin/queue/*` ��) �も追加�れ�経緯��り�順�����る箇所�多�。**順�逸脱�指摘根拠����** (誤検知�元)。「行�存在�る����を Critical 観点���扱�。 + +### 6. `misskey-js` �生� (Critical) + +`meta` / `paramDef` / `res` を変更��ら�PR / ブラン�� `packages/misskey-js/src/autogen/` �下�差分���れ��る�確��る: + +```bash +BASE=$(git merge-base origin/develop HEAD) +git diff --name-only "$BASE"...HEAD -- packages/misskey-js/src/autogen/ +``` + +差分ゼロ�ら `pnpm build-misskey-js-with-types` �実行�れ。CI � `check-misskey-js-autogen` ワークフロー�必���る�� Critical 扱�。 + +### 7. e2e テスト (Major) + +[test/e2e/endpoints.ts](../../packages/backend/test/e2e/endpoints.ts) ��� `test/e2e/.ts` (`note.ts`, `users.ts` 等) �下��対応�る `api('/', ...)` 呼�出�を�む `test(...)` ケース�追加�れ��る�確��る。複雑�分� (権��ェック・エラーケース) �網羅も確��る。 + +**describe ラベル�形������**: 既存テスト� `describe('Note', () => { test('投稿��る', ...) })` �よ��人間�読ラベル�構造化�れ��り�`/` 形�� describe �使�れ����。describe ���約������指摘���。 + +## 出力形� + +優先度別�以下�フォーマット�出力�る。 + +``` +## 🔴 Critical +- packages/backend/src/server/api/endpoints/foo/bar.ts:23 + meta.errors.fooError.id � UUID v4 形����� (実値: 'xxx-xxx')。 + `node -e "console.log(crypto.randomUUID())"` ��生��る��。 + +## 🟡 Major +- ... + +## 🔵 Minor +- ... +``` + +�題����ェック項目��触れ��。全項目クリア�ら `✅ レビュー観点上�指摘��` �短�返�。 + +## �照 + +- [.claude/skills/working-on-backend/references/tasks/adding-api-endpoint.md](../skills/working-on-backend/references/tasks/adding-api-endpoint.md) — 実装��手順 +- [.claude/skills/working-on-backend/references/knowledge/api-meta-paramdef.md](../skills/working-on-backend/references/knowledge/api-meta-paramdef.md) — meta / paramDef / res �完全早見表 + ���穴 +- [.claude/skills/working-on-backend/references/knowledge/endpoint-list.md](../skills/working-on-backend/references/knowledge/endpoint-list.md) — endpoint-list.ts 登録ガイド +- [endpoints.ts (meta/paramDef 型定義)](../../packages/backend/src/server/api/endpoints.ts) +- [endpoint-list.ts (★ 登録先)](../../packages/backend/src/server/api/endpoint-list.ts) +- [endpoint-base.ts (Endpoint 基底クラス)](../../packages/backend/src/server/api/endpoint-base.ts) +- [error.ts (ApiError)](../../packages/backend/src/server/api/error.ts) +- [test/e2e/endpoints.ts](../../packages/backend/test/e2e/endpoints.ts) +- [AGENTS.md](../../AGENTS.md) — 共通�安全�約�検証方� diff --git a/.claude/agents/vue-component-reviewer.md b/.claude/agents/vue-component-reviewer.md new file mode 100644 index 00000000000..bd6e2a629a7 --- /dev/null +++ b/.claude/agents/vue-component-reviewer.md @@ -0,0 +1,153 @@ +--- +name: vue-component-reviewer +description: Misskey frontend � Vue 3 SFC (packages/frontend/src/components/ / pages/ � *.vue) 変更を機械レビュー�る。Mk* 命�・i18n.ts/tsx・SCSS 変数・os.* 経由・a11y・Storybook 併設 (*.stories.impl.ts) を検査。frontend � .vue を変更�� PR レビュー�呼�。 +tools: Read, Grep, Glob, Bash +--- + +# Misskey Vue コン�ー�ントレビュアー + +Misskey フロントエンド (`packages/frontend`) � Vue 3 SFC 変更を機械的�レビュー�る専門エージェント。�約� **正本** � [.claude/skills/working-on-frontend/references/tasks/adding-mk-component.md](../skills/working-on-frontend/references/tasks/adding-mk-component.md) �よ�� `references/knowledge/` �下��ファイル。本エージェント��れを review-mode �ら機械�ェック�る mirror。以下��ェックリスト� references � **派生コピー** ��subagent � skill を読����も�体�動�よ�自己完�����る。�約を変�る��� **references を先�直��本ファイルを追従��る** (正本� references。両者�食������期�れ)。個別��ェック�判断�迷��ら�該当�る references ファイルを Read ��確���よ�。 + +## 役割 + +`packages/frontend/src/components/` �よ� `packages/frontend/src/pages/` �下� `.vue` 変更を対象��命�・i18n・スタイル・アクセシビリティ・Storybook 併設��約逸脱を抽出�る。良�点��触れ��改善�必��箇所��報告�る。 + +## レビュー対象�特定 + +呼�出�元�ら明示的�ファイル�渡�れ�ら�れを優先�る。渡�れ����場�� **PR / ブラン�全体�差分** を�得�る (未コミット差分���������注�)。 + +```bash +BASE=$(git merge-base origin/develop HEAD) +{ git diff --name-only "$BASE"...HEAD; git diff --name-only HEAD; git ls-files --others --exclude-standard; } \ + | sort -u \ + | grep -E '^packages/frontend/src/.*\.vue$' +``` + +`origin/develop` �無�環境�� `develop` ��� `master` �フォール�ック�る。 + +`.ts` を一律���る�本エージェント�守備範囲外 (composable / store / service 層) ��巻�込ん�誤検知�増�る���対象� `.vue` �����Storybook 併設�ェック����以下を **別リスト** ���追加�る: + +- `locales/*.yml` (��� `ja-JP.yml` 以外�変更�� Critical) +- `packages/frontend/src/components/**/*.stories.impl.ts` + +差分対象�空�ら「レビュー対象� Vue コン�ー�ント変更����短�報告��終了。 + +## �ェックリスト + +### 1. 命��約 (Major) + +- 共有 / �利用コン�ー�ント (`packages/frontend/src/components/` �下�サブディレクトリ�む) � `Mk` プレフィックス必須 (例: `MkButton.vue`, `global/MkAvatar.vue`, `grid/MkGrid.vue`)。 +- ページ固有�も�� `pages/` �下�置��`Mk` プレフィックス���。 + +**補足:** ` + + +``` + +## ` + + +``` + +�イント: + +- デフォルト値�必��ら `withDefaults(defineProps<{...}>(), { ... })` を使� (type-only ���既定値を渡�る) +- `_selectable` �本文�択を許��る global utility class ([scss-modules.md](scss-modules.md) �照) +- `` � Tabler icons。`v-if` 切り替�� variant 別アイコンを出���多用パターン + +### generic + 2 ブロック script + +�考: [MkInput.vue](../../../../../packages/frontend/src/components/MkInput.vue) + +型ジェ�リックを�り�����型計算や `type` エイリアス宣言を setup ブロック�中�書�����場���**型宣言用 ` + + +``` + +�イント: + +- `generic="T extends string | number"` �制約を付�る����`v-model` �渡�れ�型� `string` / `number` 系��定�れる +- 2 ブロック構���る�由� **setup ブロック内�� `export type` �書���** �ら +- `MkSelect.vue` �よ��複雑�型エクス�ートを�るコン�ー�ント�多用�れる + +### `defineModel` � v-model 連動 + +�考: [MkSelect.vue](../../../../../packages/frontend/src/components/MkSelect.vue), [MkRadios.vue](../../../../../packages/frontend/src/components/MkRadios.vue) + +`defineModel` を使�� `props.modelValue` + `emit('update:modelValue', v)` � 2 行� 1 行�圧縮��る。 + +```vue + + + +``` + +�イント: + +- `defineModel()` � **自動� `props.modelValue` � `emit('update:modelValue', v)` を生�** �る。返り値� `Ref` ��� `checked.value = ...` �書���る� emit �れる +- `defineModel('foo')` �よ��引数を渡�� `v-model:foo` (`props.foo` + `emit('update:foo', v)`) �連動�作れる +- 新�ファイル� v-model 連動�原則��� `defineModel` を使� (`props.modelValue` + `emit` �手書��既存コード�残る��) + +### emit + ��付� slot �外部�ら動作を差�込む + +下記� emit + ��付� slot �典型パターンを示�**��例** (特定ファイル�写�����)。クリック時�処�を呼�出�元�委�るパターン (確� UI ��)。�� [MkButton.vue](../../../../../packages/frontend/src/components/MkButton.vue) 自体� `(ev: 'click', payload: PointerEvent)` ��を emit �る�機能ボタン������例��構造�異�る。 + +```vue + + + +``` + +�イント: + +- ��付� slot (``) �無� slot (``) �両方使��よ� +- `_panel` / `_button` / `_buttonPrimary` � global utility class ����自����スタイルを書��� +- `emit('ok')` 等��純 emit �中継�る�����`os.confirm` ���実際�確� UI 起動�呼�出�元�責務��る (テスト・差�替��や���る��) + +## a11y �ェックリスト + +Misskey � PR レビュー�頻��出る a11y 指摘を����。新� / 既存コン�ー�ントを編集�る時�以下を満��。 + +### クリック�能�素 + +#### 第一�択: ` +``` + +- `_button` global class �ボタン�装飾を除去�るリセット (背景/枠線�� + `cursor: pointer` + disabled cursor)。focus ring や ripple �**付���** — ripple 付��ボタン��る�ら `MkButton.vue` コン�ー�ントを使� +- ` +``` + +`aria-label` �値も i18n 経由��る (英語直書���止)。 + +**実情:** �状コードベース�� `aria-label` �使用例自体���� (アイコン� hover ヒント�� `:title="i18n.ts..."` �使�れる��`title` � tooltip ��りスクリーンリーダー��ラベル�代替���ら��)。���� aria-label �確立��慣習���より a11y 上�推奨ベストプラクティス���書���る。新��アイコン���ボタンを足��ら付�る��望���。 + +### `:disabled` � `aria-disabled` �整� + +- 本物� `