Appearance
Metanaka Nuxt Coding
Rule Levels
[必須]: 違反は必須修正として扱う。[推奨]: 原則として採用する。合理的な理由がある逸脱は許容する。[条件付き]: 条件成立時だけ適用し、根拠不足なら確認事項とする。
レビュー判定に使う規則は level tag 付きの箇条書きだけとする。tag のない文章と sample は理由と例を示す。
Scope
[必須]この skill は.ts、.test.ts、Vue<script setup lang="ts">のコード表現を扱う。[必須]配置、Vue/composable/model の責務、i18n、Firestore 境界はmetanaka-nuxt-architectureへ委ねる。[必須]unit test の構造、命名、検証内容、mock はmetanaka-nuxt-testingへ委ねる。[必須]observable production behavior を変更する実行順序はmetanaka-nuxt-tddへ委ねる。[条件付き]この skill と formatter/linter に規則がない表現は近傍 code と検証結果に合わせ、未定義の好みを違反にしない。
Declarations and Functions
[推奨]local declaration はconstを使い、再代入より早期 return、式、配列 method、小さな関数分割を優先する。[条件付き]platform/library API、明確な loop、測定済み hot path、try 外へ値を持ち出す必要がある場合は scope を限定してletを使ってよい。[必須]新規・変更する関数は arrow function で定義する。[条件付き]framework/library が function declaration、method syntax、thisbinding を要求する場合はその contract を優先する。[必須]object の callable member は arrow function property、type の callable member は property function type を使う。[推奨]単純な guard clause は single-line return を使ってよい。複数 statement、cleanup、副作用を伴う場合は block にする。
ts
type RoomActions = {
submit: () => Promise<RoomResult>
}
const handleJoin = async () => {
const roomId = await getRoomId()
if (!roomId) return
await navigateTo({ path: "/room/join", query: { roomId } })
}Pure Core and Side-effect Boundary
[推奨]入力から出力を決める domain rule、validation 補助、状態遷移、表示 model は pure function にする。[必須]pure function は外部 mutable state、DOM、storage、network、database、現在時刻、乱数、global singleton を直接読書きしない。[必須]HTTP、Firestore、Firebase Auth、router、timer、logging などの副作用は composable、adapter、event handler、注入 dependency に閉じ込める。[必須]現在時刻と乱数が domain logic に必要なら値または dependency として渡す。[条件付き]その場で読める短い guard や object 組み立ては、pure 化を理由に無理に helper へ分けない。
Export and Helper Scope
[必須]他 module へ提供する安定 contract だけを export する。test のためだけに implementation helper を export しない。[推奨]helper scope は inline、factory/composable 内、file-local top-level、export の順に必要最小へ寄せる。[推奨]複数 module から使う stable utility、公開 model/schema/type、独立した複雑な domain contract は export してよい。[条件付き]helper の仕様が公開 contract として育った場合は責務に合う module へ移し、型・命名・test を公開 API として整える。
Line Breaks
[推奨]formatter が折らない短い式、単一の浅い object argument、短い return object は1行に保つ。[条件付き]引数が複数、object が深い、callback や条件式を含む場合は意味単位で改行する。[必須]formatter/linter の出力を正とし、縦揃えだけを目的とした手動改行を増やさない。
Vue and Test Code
[必須]handler、computed/watch callback、Vitest callback、lifecycle callback にも arrow function rule を適用する。[推奨]test helper は複数 test で意味のある前提を共有するときだけ作り、1箇所だけの薄い arrange を抽象化しない。[必須]mock、fixture、test helper も外部利用の意図がなければ export しない。
Verification
[必須]TypeScript、Vue script、test code を変更したら Nuxt project root でpnpm tcを実行する。[条件付き]behavior または test を変更した場合は関連 unit test も実行する。TDD 対象の順序はmetanaka-nuxt-tddを正とする。[必須]metanaka-nuxt-tdd適用中は同 workflow の test 実行と最後の typecheck で共同充足し、中間編集ごとに重複実行しない。