jpskill.com
📦 その他 コミュニティ

no-hardcoding

コード内に直接値を書き込むことを禁止し、定数や環境変数、設定ファイルなどを活用することで、保守性や可読性の高いコードを実現するSkill。

📜 元の英語説明(参考)

Forbid hardcoded values in code. Use this when reviewing code, writing new features, or when magic numbers/strings are detected. Enforces constants, env variables, and config files.

🇯🇵 日本人クリエイター向け解説

一言でいうと

コード内に直接値を書き込むことを禁止し、定数や環境変数、設定ファイルなどを活用することで、保守性や可読性の高いコードを実現するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o no-hardcoding.zip https://jpskill.com/download/18879.zip && unzip -o no-hardcoding.zip && rm no-hardcoding.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/18879.zip -OutFile "$d\no-hardcoding.zip"; Expand-Archive "$d\no-hardcoding.zip" -DestinationPath $d -Force; ri "$d\no-hardcoding.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して no-hardcoding.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → no-hardcoding フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

[Skill 名] no-hardcoding

ハードコーディング禁止ポリシー

コードにハードコーディングされた値を禁止し、定数/環境変数/設定ファイルの使用を強制するスキルです。

コア原則

"コードに直接値を書き込んだ瞬間、変更がデプロイされる。"

ルール

タイプ 状態 代替案
Magic Number 🔴 禁止 定数/enum
Magic String 🔴 禁止 定数/enum
URL/パス 🔴 禁止 環境変数/config
クレデンシャル 🔴 絶対禁止 .env + secrets
タイムアウト/遅延 🔴 禁止 定数/config
ポート番号 🔴 禁止 環境変数
API キー 🔴 絶対禁止 環境変数 + secrets

検出パターン

Magic Numbers

// ❌ BAD: 意味不明確
if (users.length > 100) { ... }
setTimeout(callback, 3000);
const tax = price * 0.1;

// ✅ GOOD: 意味明確
const MAX_USERS = 100;
const DEBOUNCE_MS = 3000;
const TAX_RATE = 0.1;

if (users.length > MAX_USERS) { ... }
setTimeout(callback, DEBOUNCE_MS);
const tax = price * TAX_RATE;

Magic Strings

// ❌ BAD: 文字列の繰り返し、誤入力のリスク
if (status === 'pending') { ... }
if (status === 'pending') { ... }  // 別の場所で再度使用

// ✅ GOOD: 定数または enum
enum Status {
  PENDING = 'pending',
  APPROVED = 'approved',
  REJECTED = 'rejected',
}

if (status === Status.PENDING) { ... }

URLs/Endpoints

// ❌ BAD: URLのハードコーディング
const response = await fetch('https://api.example.com/users');

// ✅ GOOD: 環境変数
const API_URL = process.env.NEXT_PUBLIC_API_URL;
const response = await fetch(`${API_URL}/users`);

クレデンシャル (絶対禁止)

// ❌ CRITICAL: 絶対禁止 - セキュリティ上の脅威
const apiKey = 'sk-1234567890abcdef';
const password = 'admin123';
const dbConnection = 'mongodb://user:pass@host:27017';

// ✅ GOOD: 環境変数の使用
const apiKey = process.env.API_KEY;
const password = process.env.DB_PASSWORD;
const dbConnection = process.env.DATABASE_URL;

タイムアウト/遅延

// ❌ BAD: ハードコーディングされたタイムアウト
await page.waitForTimeout(5000);
time.sleep(3);

// ✅ GOOD: 条件ベースまたは定数
const ANIMATION_DURATION = 300;
await page.waitForSelector('#content');  // 条件ベース
await delay(ANIMATION_DURATION);          // 定数の使用

ファイル構成

src/
├── constants/
│   ├── index.ts         # Re-exports
│   ├── api.ts           # API関連定数
│   ├── ui.ts            # UI関連定数
│   └── business.ts      # ビジネスロジック定数
├── config/
│   ├── index.ts
│   └── env.ts           # 環境変数検証および型定義
└── types/
    └── enums.ts         # Enum定義

constants の例

// constants/api.ts
export const API = {
  TIMEOUT_MS: 30000,
  RETRY_COUNT: 3,
  ENDPOINTS: {
    USERS: '/api/users',
    POSTS: '/api/posts',
  },
} as const;

// constants/ui.ts
export const UI = {
  DEBOUNCE_MS: 300,
  ANIMATION_DURATION_MS: 200,
  MAX_ITEMS_PER_PAGE: 20,
  BREAKPOINTS: {
    MOBILE: 768,
    TABLET: 1024,
    DESKTOP: 1280,
  },
} as const;

環境変数検証

// config/env.ts
const requiredEnvVars = [
  'DATABASE_URL',
  'API_KEY',
  'NEXT_PUBLIC_API_URL',
] as const;

export function validateEnv() {
  for (const envVar of requiredEnvVars) {
    if (!process.env[envVar]) {
      throw new Error(`Missing required env var: ${envVar}`);
    }
  }
}

export const env = {
  DATABASE_URL: process.env.DATABASE_URL!,
  API_KEY: process.env.API_KEY!,
  API_URL: process.env.NEXT_PUBLIC_API_URL!,
} as const;

検出コマンド

# Magic Numbers 検索 (一般的なパターン)
grep -rn "[^a-zA-Z][0-9]\{3,\}[^a-zA-Z0-9]" --include="*.ts" --include="*.tsx" src/

# ハードコーディングされたURL検索
grep -rn "https\?://" --include="*.ts" --include="*.tsx" src/ | grep -v "node_modules"

# 潜在的なクレデンシャル検索
grep -rn "password\|apiKey\|secret\|token" --include="*.ts" --include="*.tsx" src/ | grep -v "\.d\.ts"

ワークフロー

1. コードレビュー時

ハードコーディング検出:
1. Magic Number/String 検索
2. URL/パスのハードコーディング確認
3. クレデンシャルのハードコーディング確認 (最優先)

違反発見時:
→ 定数抽出を推奨
→ 環境変数の使用を案内
→ .env.example の更新確認

2. 新機能作成時

値使用前のチェック:
- この値は変更される可能性があるか? → 環境変数/config
- この値は複数の場所で使用されるか? → 定数
- この値は機密情報か? → 環境変数 + secrets
- この値は意味を持つか? → 定数 (名前で意味を付与)

例外

許可されるケース

// 0, 1, -1 (一般的に明確な意味)
const index = array.indexOf(item);
if (index === -1) { ... }

// 配列の最初/最後の要素
const first = array[0];
const last = array[array.length - 1];

// 明確な数学的演算
const half = total / 2;
const percentage = (part / whole) * 100;

チェックリスト

  • [ ] Magic Number がないこと
  • [ ] Magic String がないこと (繰り返し文字列)
  • [ ] URL のハードコーディングがないこと
  • [ ] クレデンシャルのハードコーディングがないこと
  • [ ] 定数ファイルに整理されていること
  • [ ] .env.example が更新されていること
  • [ ] 環境変数検証ロジックがあること
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

No Hardcoding Policy

코드에 하드코딩된 값을 금지하고 상수/환경변수/설정 파일을 사용하도록 강제하는 스킬입니다.

Core Principle

"코드에 직접 값을 쓰는 순간, 변경이 배포가 된다."

Rules

유형 상태 대안
Magic Number 🔴 금지 상수/enum
Magic String 🔴 금지 상수/enum
URL/경로 🔴 금지 환경변수/config
크리덴셜 🔴 절대 금지 .env + secrets
타임아웃/딜레이 🔴 금지 상수/config
포트 번호 🔴 금지 환경변수
API 키 🔴 절대 금지 환경변수 + secrets

Detection Patterns

Magic Numbers

// ❌ BAD: 의미 불명확
if (users.length > 100) { ... }
setTimeout(callback, 3000);
const tax = price * 0.1;

// ✅ GOOD: 의미 명확
const MAX_USERS = 100;
const DEBOUNCE_MS = 3000;
const TAX_RATE = 0.1;

if (users.length > MAX_USERS) { ... }
setTimeout(callback, DEBOUNCE_MS);
const tax = price * TAX_RATE;

Magic Strings

// ❌ BAD: 문자열 반복, 오타 위험
if (status === 'pending') { ... }
if (status === 'pending') { ... }  // 다른 곳에서 또 사용

// ✅ GOOD: 상수 또는 enum
enum Status {
  PENDING = 'pending',
  APPROVED = 'approved',
  REJECTED = 'rejected',
}

if (status === Status.PENDING) { ... }

URLs/Endpoints

// ❌ BAD: URL 하드코딩
const response = await fetch('https://api.example.com/users');

// ✅ GOOD: 환경변수
const API_URL = process.env.NEXT_PUBLIC_API_URL;
const response = await fetch(`${API_URL}/users`);

Credentials (절대 금지)

// ❌ CRITICAL: 절대 금지 - 보안 위협
const apiKey = 'sk-1234567890abcdef';
const password = 'admin123';
const dbConnection = 'mongodb://user:pass@host:27017';

// ✅ GOOD: 환경변수 사용
const apiKey = process.env.API_KEY;
const password = process.env.DB_PASSWORD;
const dbConnection = process.env.DATABASE_URL;

Timeouts/Delays

// ❌ BAD: 하드코딩 타임아웃
await page.waitForTimeout(5000);
time.sleep(3);

// ✅ GOOD: 조건 기반 또는 상수
const ANIMATION_DURATION = 300;
await page.waitForSelector('#content');  // 조건 기반
await delay(ANIMATION_DURATION);          // 상수 사용

File Organization

src/
├── constants/
│   ├── index.ts         # Re-exports
│   ├── api.ts           # API 관련 상수
│   ├── ui.ts            # UI 관련 상수
│   └── business.ts      # 비즈니스 로직 상수
├── config/
│   ├── index.ts
│   └── env.ts           # 환경변수 검증 및 타입
└── types/
    └── enums.ts         # Enum 정의

constants 예시

// constants/api.ts
export const API = {
  TIMEOUT_MS: 30000,
  RETRY_COUNT: 3,
  ENDPOINTS: {
    USERS: '/api/users',
    POSTS: '/api/posts',
  },
} as const;

// constants/ui.ts
export const UI = {
  DEBOUNCE_MS: 300,
  ANIMATION_DURATION_MS: 200,
  MAX_ITEMS_PER_PAGE: 20,
  BREAKPOINTS: {
    MOBILE: 768,
    TABLET: 1024,
    DESKTOP: 1280,
  },
} as const;

환경변수 검증

// config/env.ts
const requiredEnvVars = [
  'DATABASE_URL',
  'API_KEY',
  'NEXT_PUBLIC_API_URL',
] as const;

export function validateEnv() {
  for (const envVar of requiredEnvVars) {
    if (!process.env[envVar]) {
      throw new Error(`Missing required env var: ${envVar}`);
    }
  }
}

export const env = {
  DATABASE_URL: process.env.DATABASE_URL!,
  API_KEY: process.env.API_KEY!,
  API_URL: process.env.NEXT_PUBLIC_API_URL!,
} as const;

Detection Commands

# Magic Numbers 검색 (일반적인 패턴)
grep -rn "[^a-zA-Z][0-9]\{3,\}[^a-zA-Z0-9]" --include="*.ts" --include="*.tsx" src/

# 하드코딩된 URL 검색
grep -rn "https\?://" --include="*.ts" --include="*.tsx" src/ | grep -v "node_modules"

# 잠재적 크리덴셜 검색
grep -rn "password\|apiKey\|secret\|token" --include="*.ts" --include="*.tsx" src/ | grep -v "\.d\.ts"

Workflow

1. 코드 리뷰 시

하드코딩 감지:
1. Magic Number/String 검색
2. URL/경로 하드코딩 확인
3. 크리덴셜 하드코딩 확인 (최우선)

위반 발견 시:
→ 상수 추출 권장
→ 환경변수 사용 안내
→ .env.example 업데이트 확인

2. 새 기능 작성 시

값 사용 전 체크:
- 이 값이 변경될 수 있는가? → 환경변수/config
- 이 값이 여러 곳에서 사용되는가? → 상수
- 이 값이 민감한가? → 환경변수 + secrets
- 이 값이 의미를 가지는가? → 상수 (이름으로 의미 부여)

Exceptions

허용되는 경우

// 0, 1, -1 (일반적으로 명확한 의미)
const index = array.indexOf(item);
if (index === -1) { ... }

// 배열 첫/마지막 요소
const first = array[0];
const last = array[array.length - 1];

// 명확한 수학적 연산
const half = total / 2;
const percentage = (part / whole) * 100;

Checklist

  • [ ] Magic Number 없음
  • [ ] Magic String 없음 (반복 문자열)
  • [ ] URL 하드코딩 없음
  • [ ] 크리덴셜 하드코딩 없음
  • [ ] 상수 파일에 정리됨
  • [ ] .env.example 업데이트됨
  • [ ] 환경변수 검증 로직 있음