Communitygithub.com

コーディング規約

命名規則、可読性、不変性、コード品質レビューのためのプロジェクト横断的な基本コーディング規約です。フレームワーク固有のパターンについては、詳細なフロントエンドまたはバックエンドスキルを使用してください。

コーディング規約 とは?

このスキルは、プロジェクト全体に適用される基本的なコーディング規約とベストプラクティスを提供します。可読性、KISS、DRY、YAGNIといった原則に加え、命名規則、不変性パターン、エラーハンドリング、型安全性など、言語やフレームワークに依存しない普遍的なルールを網羅しています。TypeScript/JavaScript、React、API設計、ファイル構成、テスト規約など、具体的なコード例を通じて実践的なガイドラインを示します。`frontend-patterns`や`backend-patterns`などのフレームワーク固有スキルとは補完関係にあり、あくまで基本レイヤーとして機能します。新しいプロジェクトの開始時やコードレビュー、リファクタリング、新規メンバーのオンボーディングなど、様々な場面で活用できます。

対応~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/coding-standards

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

コーディング規約とベストプラクティス

プロジェクト横断的に適用可能な基本コーディング規約です。

このスキルは共有の基盤であり、フレームワーク固有の詳細なプレイブックではありません。

  • React、状態管理、フォーム、レンダリング、UI アーキテクチャには frontend-patterns を使用してください。
  • リポジトリ/サービス層、エンドポイント設計、バリデーション、サーバー固有の事項には backend-patterns または api-design を使用してください。
  • スキルの完全なウォークスルーではなく、最も短く再利用可能なルール層が必要な場合は rules/common/coding-style.md を使用してください。

アクティブ化タイミング

  • 新しいプロジェクトやモジュールを開始するとき
  • コードの品質と保守性をレビューするとき
  • 既存のコードを規約に沿ってリファクタリングするとき
  • 命名、フォーマット、構造の一貫性を強制するとき
  • リンター、フォーマッター、型チェックのルールを設定するとき
  • 新規コントリビューターをコーディング規約にオンボーディングするとき

スコープの境界

このスキルは以下にアクティブ化します:

  • 説明的な命名
  • 不変性のデフォルト
  • 可読性、KISS、DRY、YAGNI の強制
  • エラーハンドリングの期待値とコードスメルレビュー

このスキルを以下の主要なソースとして使用しないでください:

  • React のコンポジション、フック、レンダリングパターン
  • バックエンドアーキテクチャ、API 設計、データベースレイヤリング
  • より狭い ECC スキルがすでに存在する場合のドメイン固有のフレームワークガイダンス

コード品質の原則

1. 可読性優先

  • コードは書かれるよりも読まれる
  • 明確な変数名と関数名
  • コメントよりも自己文書化コードを優先
  • 一貫性のあるフォーマット

2. KISS(Keep It Simple, Stupid)

  • 動作する最もシンプルな解決策
  • 過剰エンジニアリングを避ける
  • 時期尚早な最適化はしない
  • 理解しやすさ > 巧妙なコード

3. DRY(Don't Repeat Yourself)

  • 共通ロジックを関数に抽出する
  • 再利用可能なコンポーネントを作成する
  • モジュール間でユーティリティを共有する
  • コピー&ペーストプログラミングを避ける

4. YAGNI(You Aren't Gonna Need It)

  • 必要になる前に機能を構築しない
  • 推測による汎用性を避ける
  • 必要な場合にのみ複雑性を追加する
  • シンプルに始め、必要に応じてリファクタリングする

TypeScript/JavaScript 標準

変数命名

// 合格: 良い: 説明的な名前
const marketSearchQuery = 'election'
const isUserAuthenticated = true
const totalRevenue = 1000

// 不合格: 悪い: 不明瞭な名前
const q = 'election'
const flag = true
const x = 1000

関数命名

// 合格: 良い: 動詞-名詞パターン
async function fetchMarketData(marketId: string) { }
function calculateSimilarity(a: number[], b: number[]) { }
function isValidEmail(email: string): boolean { }

// 不合格: 悪い: 不明瞭、または名詞のみ
async function market(id: string) { }
function similarity(a, b) { }
function email(e) { }

不変性パターン(重要)

// 合格: 常にスプレッド演算子を使用
const updatedUser = {
  ...user,
  name: 'New Name'
}

const updatedArray = [...items, newItem]

// 不合格: 絶対に直接ミューテーションしない
user.name = 'New Name'  // 悪い
items.push(newItem)     // 悪い

エラーハンドリング

// 合格: 良い: 包括的なエラーハンドリング
async function fetchData(url: string) {
  try {
    const response = await fetch(url)

    if (!response.ok) {
      throw new Error(`HTTP ${response.status}: ${response.statusText}`)
    }

    return await response.json()
  } catch (error) {
    console.error('Fetch failed:', error)
    throw new Error('Failed to fetch data')
  }
}

// 不合格: 悪い: エラーハンドリングなし
async function fetchData(url) {
  const response = await fetch(url)
  return response.json()
}

Async/Await のベストプラクティス

// 合格: 良い: 可能な場合は並列実行
const [users, markets, stats] = await Promise.all([
  fetchUsers(),
  fetchMarkets(),
  fetchStats()
])

// 不合格: 悪い: 不要な逐次実行
const users = await fetchUsers()
const markets = await fetchMarkets()
const stats = await fetchStats()

型安全性

// 合格: 良い: 適切な型
interface Market {
  id: string
  name: string
  status: 'active' | 'resolved' | 'closed'
  created_at: Date
}

function getMarket(id: string): Promise<Market> {
  // 実装
}

// 不合格: 悪い: 'any' の使用
function getMarket(id: any): Promise<any> {
  // 実装
}

React のベストプラクティス

コンポーネント構造

// 合格: 良い: 型を持つ関数コンポーネント
interface ButtonProps {
  children: React.ReactNode
  onClick: () => void
  disabled?: boolean
  variant?: 'primary' | 'secondary'
}

export function Button({
  children,
  onClick,
  disabled = false,
  variant = 'primary'
}: ButtonProps) {
  return (
    <button
      onClick={onClick}
      disabled={disabled}
      className={`btn btn-${variant}`}
    >
      {children}
    </button>
  )
}

// 不合格: 悪い: 型なし、不明瞭な構造
export function Button(props) {
  return <button onClick={props.onClick}>{props.children}</button>
}

カスタムフック

// 合格: 良い: 再利用可能なカスタムフック
export function useDebounce<T>(value: T, delay: number): T {
  const [debouncedValue, setDebouncedValue] = useState<T>(value)

  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value)
    }, delay)

    return () => clearTimeout(handler)
  }, [value, delay])

  return debouncedValue
}

// 使用例
const debouncedQuery = useDebounce(searchQuery, 500)

状態管理

// 合格: 良い: 適切な状態更新
const [count, setCount] = useState(0)

// 前の状態に基づく関数型更新
setCount(prev => prev + 1)

// 不合格: 悪い: 状態への直接参照
setCount(count + 1)  // 非同期シナリオで古くなる可能性がある

条件付きレンダリング

// 合格: 良い: 明確な条件付きレンダリング
{isLoading && <Spinner />}
{error && <ErrorMessage error={error} />}
{data && <DataDisplay data={data} />}

// 不合格: 悪い: 三項演算子の入れ子
{isLoading ? <Spinner /> : error ? <ErrorMessage error={error} /> : data ? <DataDisplay data={data} /> : null}

API 設計標準

REST API 規約

GET    /api/markets              # すべてのマーケット一覧
GET    /api/markets/:id          # 特定のマーケット取得
POST   /api/markets              # 新しいマーケット作成
PUT    /api/markets/:id          # マーケット更新(全体)
PATCH  /api/markets/:id          # マーケット更新(部分)
DELETE /api/markets/:id          # マーケット削除

# フィルタリング用クエリパラメータ
GET /api/markets?status=active&limit=10&offset=0

レスポンス形式

// 合格: 良い: 一貫性のあるレスポンス構造
interface ApiResponse<T> {
  success: boolean
  data?: T
  error?: string
  meta?: {
    total: number
    page: number
    limit: number
  }
}

// 成功レスポンス
return NextResponse.json({
  success: true,
  data: markets,
  meta: { total: 100, page: 1, limit: 10 }
})

// エラーレスポンス
return NextResponse.json({
  success: false,
  error: 'Invalid request'
}, { status: 400 })

入力バリデーション

import { z } from 'zod'

// 合格: 良い: スキーマバリデーション
const CreateMarketSchema = z.object({
  name: z.string().min(1).max(200),
  description: z.string().min(1).max(2000),
  endDate: z.string().datetime(),
  categories: z.array(z.string()).min(1)
})

export async function POST(request: Request) {
  const body = await request.json()

  try {
    const validated = CreateMarketSchema.parse(body)
    // バリデーション済みデータで処理を進める
  } catch (error) {
    if (error instanceof z.ZodError) {
      return NextResponse.json({
        success: false,
        error: 'Validation failed',
        details: error.issues
      }, { status: 400 })
    }
  }
}

ファイル構成

プロジェクト構造

src/
├── app/                    # Next.js App Router
│   ├── api/               # API ルート
│   ├── markets/           # マーケットページ
│   └── (auth)/           # 認証ページ(ルートグループ)
├── components/            # React コンポーネント
│   ├── ui/               # 汎用 UI コンポーネント
│   ├── forms/            # フォームコンポーネント
│   └── layouts/          # レイアウトコンポーネント
├── hooks/                # カスタム React フック
├── lib/                  # ユーティリティと設定
│   ├── api/             # API クライアント
│   ├── utils/           # ヘルパー関数
│   └── constants/       # 定数
├── types/                # TypeScript 型
└── styles/              # グローバルスタイル

ファイル命名

components/Button.tsx          # コンポーネントは PascalCase
hooks/useAuth.ts              # 'use' プレフィックス付き camelCase
lib/formatDate.ts             # ユーティリティは camelCase
styles/market.types.ts         # 型は camelCase で .types サフィックス

コメントとドキュメント

コメントを書くタイミング

// 合格: 良い: 何をするかではなく、なぜそうするのかを説明する
// 障害発生時に API を過負荷にしないために指数バックオフを使用
const delay = Math.min(1000 * Math.pow(2, retryCount), 30000)

// パフォーマンス上の理由から、大きな配列では意図的にミューテーションを使用
items.push(newItem)

// 不合格: 悪い: 自明なことを書く
// カウンターを1増やす
count++

// 名前をユーザー名に設定
name = user.name

公開 API 用の JSDoc

/**
 * セマンティック類似度を使用してマーケットを検索します。
 *
 * @param query - 自然言語による検索クエリ
 * @param limit - 最大結果数(デフォルト: 10)
 * @returns 類似度スコアでソートされたマーケットの配列
 * @throws {Error} OpenAI API が失敗した場合、または Redis が利用不可の場合
 *
 * @example
 * ```typescript
 * const results = await searchMarkets('election', 5)
 * console.log(results[0].name) // "Trump vs Biden"
 * ```
 */
export async function searchMarkets(
  query: string,
  limit: number = 10
): Promise<Market[]> {
  // 実装
}

パフォーマンスのベストプラクティス

メモ化

import { useMemo, useCallback } from 'react'

// 合格: 良い: 高コストな計算をメモ化
// ソート前にコピーを作成 - Array.prototype.sort は元の配列をミューテーションする
const sortedMarkets = useMemo(() => {
  return [...markets].sort((a, b) => b.volume - a.volume)
}, [markets])

// 合格: 良い: コールバックをメモ化
const handleSearch = useCallback((query: string) => {
  setSearchQuery(query)
}, [])

遅延ロード

import { lazy, Suspense } from 'react'

// 合格: 良い: 重いコンポーネントを遅延ロード
const HeavyChart = lazy(() => import('./HeavyChart'))

export function Dashboard() {
  return (
    <Suspense fallback={<Spinner />}>
      <HeavyChart />
    </Suspense>
  )
}

データベースクエリ

// 合格: 良い: 必要な列のみ選択
const { data } = await supabase
  .from('markets')
  .select('id, name, status')
  .limit(10)

// 不合格: 悪い: すべてを選択
const { data } = await supabase
  .from('markets')
  .select('*')

テスト標準

テスト構造(AAA パターン)

test('類似度を正しく計算する', () => {
  // Arrange
  const vector1 = [1, 0, 0]
  const vector2 = [0, 1, 0]

  // Act
  const similarity = calculateCosineSimilarity(vector1, vector2)

  // Assert
  expect(similarity).toBe(0)
})

テスト命名

// 合格: 良い: 説明的なテスト名
test('クエリに一致するマーケットがない場合、空の配列を返す', () => { })
test('OpenAI API キーがない場合、エラーをスローする', () => { })
test('Redis が利用不可の場合、部分文字列検索にフォールバックする', () => { })

// 不合格: 悪い: 曖昧なテスト名
test('works', () => { })
test('test search', () => { })

コードスメル検出

以下のアンチパターンに注意してください:

1. 長い関数

// 不合格: 悪い: 50行を超える関数
function processMarketData() {
  // 100行のコード
}

// 合格: 良い: 小さな関数に分割
function processMarketData() {
  const validated = validateData()
  const transformed = transformData(validated)
  return saveData(transformed)
}

2. 深い入れ子

// 不合格: 悪い: 5段階以上の入れ子
if (user) {
  if (user.isAdmin) {
    if (market) {
      if (market.isActive) {
        if (hasPermission) {
          // 何かをする
        }
      }
    }
  }
}

// 合格: 良い: 早期リターン
if (!user) return
if (!user.isAdmin) return
if (!market) return
if (!market.isActive) return
if (!hasPermission) return

// 何かをする

3. マジックナンバー

// 不合格: 悪い: 説明のない数字
if (retryCount > 3) { }
setTimeout(callback, 500)

// 合格: 良い: 名前付き定数
const MAX_RETRIES = 3
const DEBOUNCE_DELAY_MS = 500

if (retryCount > MAX_RETRIES) { }
setTimeout(callback, DEBOUNCE_DELAY_MS)

覚えておいてください:コード品質は交渉の余地がありません。明確で保守しやすいコードは、迅速な開発と自信を持ったリファクタリングを可能にします。

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

関連スキル