AgentSkillsCN

review-web-launch-checklist

以项目发布前的检查清单为基础,对项目进行全方位审查,并将改进建议以 issue 的形式记录下来。

SKILL.md
--- frontmatter
name: review-web-launch-checklist
description: Webサービス公開前のチェックリストをベースにプロジェクトをレビューし、改善候補をissue化する。
globs:
  - "app/src/**/*"
  - "packages/**/*"

Review Web Launch Checklist Skill

Zenn記事「Webサービス公開前のチェックリスト」をベースに、プロジェクトをレビューし、改善候補をissue化する。

ワークフロー

1. プロジェクト確認

  • プロジェクトの構成を把握
  • 使用している技術スタック(Auth0、NextAuth.js、Prisma等)を確認
  • 既存のissues/ディレクトリを確認し重複を避ける

2. チェック実行

以下のカテゴリについて順にチェック:

チェックカテゴリ(優先度順)

1. セキュリティ (CRITICAL/HIGH)
PriorityCheck ItemDescription
CRITICAL認証Cookie設定HttpOnly、SameSite、Secure、Domain属性が適切に設定されているか
CRITICALユーザー入力バリデーションクライアント・サーバー両方でバリデーションしているか
CRITICALURLバリデーションオープンリダイレクト脆弱性がないか
CRITICALHTMLエスケープXSS対策が適切に行われているか
CRITICALSQLインジェクション対策Prisma等ORMの適切な使用、生SQLの回避
HIGHレスポンスヘッダHSTS、X-Frame-Options、X-Content-Type-Optionsが設定されているか
HIGHユーザーハンドルネーム検証リザーブド文字列(admin, api等)のチェック
HIGH重要操作での再認証パスワード変更、退会等で再認証を求めているか
HIGHキャッシュ制御機密データを含むレスポンスにno-storeが設定されているか
HIGHファイルアップロード検証ファイルタイプ、サイズ、内容の検証
HIGHDB・ストレージバックアップ自動バックアップが設定されているか
MEDIUM二要素認証2FAオプションが提供されているか
2. メール・認証 (HIGH/MEDIUM)
PriorityCheck ItemDescription
HIGHメール本人確認登録時にメールアドレスの確認を行っているか
HIGHメールアドレス列挙防止ログイン/登録時に存在有無を漏らさないか
MEDIUM複数ログイン方法の統一ソーシャルログイン等の仕様が統一されているか
MEDIUMSPF/DKIM/DMARC設定メール認証が適切に設定されているか
MEDIUM重複送信防止メール送信のレートリミット
LOWメルマガ購読解除ワンクリック解除が可能か
3. SEO/OGP (MEDIUM)
PriorityCheck ItemDescription
MEDIUMtitleタグ各ページに適切なtitleが設定されているか
MEDIUMcanonical URL正規URLが設定されているか
MEDIUMnoindex設定インデックスすべきでないページにnoindexがあるか
MEDIUMサイトマップsitemap.xmlが生成されているか
MEDIUMOGP設定og:title、og:description、og:imageが設定されているか
MEDIUMTwitter Cardtwitter:cardが設定されているか
4. 決済機能 (HIGH) ※該当する場合
PriorityCheck ItemDescription
HIGH決済データ不整合検知Webhook処理とDB状態の整合性チェック
HIGH重複決済防止冪等性キーの使用
HIGHサブスクリプション自動キャンセル失敗時の自動解約処理
MEDIUM返金・日割り計算規約規約の明記
MEDIUMカード期限切れ対応事前通知と更新フロー
MEDIUMインボイス制度対応適格請求書の発行
5. アクセシビリティ・パフォーマンス・運用 (MEDIUM/LOW)
PriorityCheck ItemDescription
MEDIUM画像alt属性すべての意味のある画像にaltがあるか
MEDIUMスクリーンリーダー対応aria属性、セマンティックHTML
MEDIUMバンドルサイズ最適化不要なライブラリの除去
MEDIUMCDN活用静的アセットがCDN経由か
MEDIUM画像最適化next/image等の最適化使用
MEDIUMクロスブラウザ対応主要ブラウザでの動作確認
LOWファビコンfavicon.ico、apple-touch-iconの設定
LOWエラー通知Sentry等でエラー監視しているか
LOWローカライズhtml lang属性の設定

3. Issue作成

  • 検出した各問題をissues/ディレクトリにmarkdownファイルとして作成
  • ファイル名: web-launch-{番号}-{短い説明}.md
  • web-launch-001から採番

制約

  • 1問題 = 1issueファイル: 複数の問題を1つのファイルにまとめない
  • 具体的なコード参照: 抽象的な指摘ではなく、具体的なファイル・行を示す
  • 実装は行わない: このスキルはレビューとissue作成のみ
  • 既存issueと重複しない: issues/の既存ファイルを確認
  • 該当しない項目はスキップ: 決済機能がなければ決済チェックは不要

出力形式

markdown
# Issue: {問題のタイトル}

## Metadata

| Field | Value |
|-------|-------|
| **Category** | {Security/Email-Auth/SEO-OGP/Payment/Accessibility-Performance} |
| **Priority** | {CRITICAL/HIGH/MEDIUM/LOW} |
| **Check Item** | {チェック項目名} |
| **Affected File** | `{file-path}` |

## Problem Description

{問題の説明}

### Current Code/Configuration

\`\`\`typescript
{現在のコード/設定}
\`\`\`

### Issues

1. {問題点1}
2. {問題点2}

## Recommendation

{推奨される対応}

### Suggested Fix

\`\`\`typescript
{修正例}
\`\`\`

## Implementation Steps

1. [ ] ステップ1
2. [ ] ステップ2

## References

- https://zenn.dev/catnose99/articles/547cbf57e5ad28
- {その他の参考リンク}

チェックポイント詳細

セキュリティ

認証Cookie設定

typescript
// 確認ポイント: next-auth設定
// app/src/app/api/auth/[...nextauth]/route.ts
cookies: {
  sessionToken: {
    httpOnly: true,
    sameSite: 'lax', // または 'strict'
    secure: process.env.NODE_ENV === 'production',
  }
}

ユーザー入力バリデーション

typescript
// NG: サーバーサイドのみ
const data = await request.json();
await db.insert(data);

// OK: Zodスキーマでバリデーション
const validated = schema.parse(await request.json());
await db.insert(validated);

レスポンスヘッダ

typescript
// next.config.js での設定確認
headers: async () => [
  {
    source: '/:path*',
    headers: [
      { key: 'X-Frame-Options', value: 'DENY' },
      { key: 'X-Content-Type-Options', value: 'nosniff' },
      { key: 'Strict-Transport-Security', value: 'max-age=31536000; includeSubDomains' },
    ],
  },
],

メール・認証

メールアドレス列挙防止

typescript
// NG: 存在有無を明かす
if (!user) return res.error('User not found');
if (wrongPassword) return res.error('Wrong password');

// OK: 同じメッセージ
return res.error('Invalid credentials');

SEO/OGP

メタデータ設定

typescript
// Next.js App Router
export const metadata: Metadata = {
  title: 'Page Title',
  description: 'Description',
  openGraph: {
    title: 'OG Title',
    description: 'OG Description',
    images: ['/og-image.png'],
  },
  twitter: {
    card: 'summary_large_image',
  },
};

アクセシビリティ

画像alt属性

tsx
// NG
<img src="/hero.png" />
<Image src="/hero.png" />

// OK
<img src="/hero.png" alt="ヒーロー画像の説明" />
<Image src="/hero.png" alt="ヒーロー画像の説明" />

注意事項

  • 既存のissues/ファイルと重複しないよう確認する
  • CRITICALとHIGHの問題を優先的に検出する
  • プロジェクト固有の設計(Auth0、NextAuth.js等)を考慮する
  • Next.js 15のベストプラクティスに従う
  • 過度な指摘を避け、実用的な改善を提案する