Skip to main content Skills Marketplace コミュニティが作成したAIスキルを発見・探索
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/tomevault-io/skills-registry --skill coding-standardsコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
Zipをダウンロード ダウンロード中... name coding-standards description TypeScript、JavaScript、React、Node.js開発のための汎用コーディング標準、ベストプラクティス、パターン。 Use when this capability is needed. metadata {"author":"affaan-m"}
コーディング標準とベストプラクティス
すべてのプロジェクトに適用される汎用的なコーディング標準。
コード品質の原則
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
x =
const
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 > {
}
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.errors
}, { 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
types/market.types.ts # 型定義は .types サフィックス付き camelCase
コメントとドキュメント
コメントを追加するタイミング
const delay = Math .min (1000 * Math .pow (2 , retryCount), 30000 )
items.push (newItem)
count++
name = user.name
パブリックAPIのJSDoc
export async function searchMarkets (
query : string ,
limit : number = 10
): Promise <Market []> {
}
パフォーマンスベストプラクティス
メモ化 import { useMemo, useCallback } from 'react'
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 ('calculates similarity correctly' , () => {
const vector1 = [1 , 0 , 0 ]
const vector2 = [0 , 1 , 0 ]
const similarity = calculateCosineSimilarity (vector1, vector2)
expect (similarity).toBe (0 )
})
テストの命名
test ('returns empty array when no markets match query' , () => { })
test ('throws error when OpenAI API key is missing' , () => { })
test ('falls back to substring search when Redis unavailable' , () => { })
test ('works' , () => { })
test ('test search' , () => { })
コードスメルの検出
1. 長い関数
function processMarketData ( ) {
}
function processMarketData ( ) {
const validated = validateData ()
const transformed = transformData (validated)
return saveData (transformed)
}
2. 深いネスト
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 )
覚えておいてください : コード品質は妥協できません。明確で保守可能なコードにより、迅速な開発と自信を持ったリファクタリングが可能になります。