README
TERASU Lens — HP超厳しいチェックツール
TERASU で作った納品前HPを業界トップ100社レベルで超厳しく評価する独立ツール。
Claude Opus 4.7 + PageSpeed Insights + 業種別評価基準で、10カテゴリ・1000点満点で品質判定。
30秒で全体像
| 観点 | 一言 |
|---|---|
| 核心 | AIが業界トップクラスの厳しさで評価 → 人手不要レベルの自動品質保証 |
| 本番URL | https://terasu-lens.pages.dev/ |
| ローカル | /Users/oogushiyuuki/terasu-lens/ |
| 技術 | Next.js 16 + React 19 / Tailwind v4 / Recharts / Cloudflare Pages Functions / Supabase / Anthropic Claude Opus 4.7 / PageSpeed Insights API |
| DB | Supabase (terasu_lens_jobs / terasu_lens_results / terasu_lens_industry_rules) |
| 開発状況 | Phase 1 / Phase 2 / Phase 3 全て完了 (2026-04-28・1セッション完結) — A2 ZIP のみ R2 セットアップ要のため Phase 4 として未実装 |
| 環境変数 | ANTHROPIC_API_KEY / SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY / PAGESPEED_API_KEY / TERASU_LENS_API_KEY |
注意事項(重要)
日本語パス問題でルートを変更
依頼書では /Users/oogushiyuuki/株式会社SCALE/terasu-lens/ を推奨だったが、Next.js 16 (Turbopack) は日本語パスで panic するため、/Users/oogushiyuuki/terasu-lens/ (英語パス)に配置している。
scale-base と同じく、Next.js 系は英語パスがマスト。
環境変数とSupabase
初回セットアップは SETUP.md を参照。
完了するまで /api/health で has_* が全部 false になり、評価は動かない。
保護資産(絶対に消さない・変えない)
機能(Phase 1 / Phase 2 / Phase 3 全完了)
| ID | 機能 | 実装ファイル |
|---|---|---|
| A1 | URLからHP取得・解析 | functions/_lib/parse.ts fetchPage() |
| A3 | TERASU案件管理 API連携 受信 | functions/api/jobs.ts (x-terasu-lens-key) + functions/api/webhook/reevaluate.ts |
| A4 | スクショ取得(PageSpeed Insights screenshot) | functions/_lib/pagespeed.ts runPageSpeed() |
| A5 | HTML/CSS/JS パース・前処理 | functions/_lib/parse.ts parseHtml() |
| B1 | デザイン評価(Vision 70% + 自動シグナル 30%) | score.ts buildAutoDesignSignals() + Vision |
| B2 | コピー評価(Vision 40% + Claude Text 40% + 自動 20%) | score.ts buildAutoCopySignals() + Claude Text + Vision |
| B3 | UX評価(Vision 65% + 自動シグナル 35%) | score.ts buildAutoUxSignals() + Vision |
| B4 | モバイル対応評価 | score.ts buildMobileScore() |
| B5 | パフォーマンス評価(Lighthouse相当) | score.ts buildPerformanceFromPageSpeed() |
| B6 | SEO評価 | score.ts buildSeoCategoryScore() |
| B7 | アクセシビリティ評価 | score.ts buildAccessibilityFromPageSpeed() |
| B8 | セキュリティ評価 | score.ts buildSecurityScore() |
| B9 | 法的要件評価 | score.ts buildLegalScore() |
| B10 | 業種適合度評価 | score.ts buildVisionDrivenScore('industry_fit') + 9業種ルール |
| C1 | Claude Vision 超厳しい3視点プロンプト | prompts.ts buildVisionPrompt() + claude.ts claudeVision() |
| C2 | Claude Text コピー添削 | prompts.ts buildCopyPrompt() + claude.ts claudeText() |
| C3 | 業界トップ100社目線 | _lib/industries.ts (9業種×3-5社の代表例) |
| C4 | 競合HP比較分析 | functions/_lib/competitor.ts analyzeCompetitors() |
| D1 | スコアダッシュボード + レーダーチャート | src/components/CategoryRadar.tsx + ScoreOverview.tsx |
| D2 | 致命的・改善必須・できれば改善の3段階リスト | src/components/IssueList.tsx |
| D3 | Claude Code 改修指示書 Markdown 自動生成 | src/lib/instructionDoc.ts + InstructionDocActions.tsx |
| D4 | TERASU案件管理 結果送信 webhook | functions/_lib/terasu.ts sendToTerasuMgmt() |
| D5 | PDF レポート出力(印刷専用CSS + window.print) | globals.css @media print + InstructionDocActions.tsx |
| E1 | スコア850以上で自動承認フラグ | evaluate.ts で approved を result に保存 |
| E2 | 改修後の再評価自動トリガー | functions/api/webhook/reevaluate.ts |
| E3 | 5回ループでエスカレーション | parent_job_id を辿った iteration カウント |
| E4 | 完全自動モード DB 対応 | terasu_lens_jobs.auto_approve カラム |
関数(grepで必ず存在確認)
functions/_lib/parse.ts:
- export async function fetchPage()
- export function parseHtml() (内部)
functions/_lib/pagespeed.ts:
- export async function runPageSpeed()
functions/_lib/claude.ts:
- export async function claudeVision()
- export async function claudeText()
- export function extractJson()
functions/_lib/score.ts:
- export function buildSeoCategoryScore()
- export function buildAccessibilityFromPageSpeed()
- export function buildPerformanceFromPageSpeed()
- export function buildSecurityScore()
- export function buildLegalScore()
- export function buildMobileScore()
- export function buildVisionDrivenScore()
- export function buildAutoDesignSignals() ← Phase 2
- export function buildAutoCopySignals() ← Phase 2
- export function buildAutoUxSignals() ← Phase 2
- export function mergeVisionIssues()
- export function mergeCopyTextIssues() ← Phase 2
- export function calcOverallScore()
- export function scoreToTier()
functions/_lib/evaluate.ts:
- export async function evaluateJob() ← メイン評価フロー
functions/_lib/competitor.ts: ← Phase 3
- export async function analyzeCompetitors()
functions/_lib/terasu.ts: ← Phase 3
- export async function sendToTerasuMgmt()
functions/api/jobs.ts:
- export const onRequestPost
- export const onRequestGet
functions/api/jobs/[id].ts:
- export const onRequestGet
functions/api/health.ts:
- export const onRequestGet
functions/api/webhook/reevaluate.ts: ← Phase 3
- export const onRequestPost (E2 再評価トリガー)
src/lib/instructionDoc.ts: ← Phase 2
- export function buildInstructionMarkdown()
- export function downloadMarkdown()
- export function copyMarkdownToClipboard()
評価10カテゴリ(各100点・総合1000点)
死守する評価軸:
1. デザイン(Vision駆動)
2. コピー(Vision駆動)
3. UX(Vision駆動)
4. モバイル(PageSpeed Mobile + viewport + tap-targets + Vision)
5. パフォーマンス(PageSpeed Mobile Performance + LCP/CLS/TBT/画像/JS/CSS/フォント)
6. SEO(title/meta/OGP/JSON-LD/canonical/internal_links)
7. アクセシビリティ(PageSpeed Accessibility + 主要audit)
8. セキュリティ(HTTPS/HSTS/CSP/X-Frame/Mixed-Content/SSL/inline-script)
9. 法的要件(プライバシー/特商法/Cookie/著作権/業種別広告ガイドライン/連絡先)
10. 業種適合度(Vision駆動)
「超厳しい」プロンプトの3視点
functions/_lib/prompts.ts の buildVisionPrompt():
1. 年商10億円規模 BtoB CEO(顧客視点)
2. ベイジ・LIG・グッドパッチ主席ディレクター(制作視点)
3. 業界誌「Web Designing」月間レビュー担当(業界視点)
→ お世辞・遠慮・忖度を一切禁止する明示プロンプト。ここを薄めるのは絶対NG。
過去FB対応済みポイント
| FB(一般原則) | 対応 |
|---|---|
| changelog 必須 | src/lib/changelog.ts 最上段に追記 |
| 関数を消さない | 上記関数リストを grep で確認 |
| デプロイ前バックアップ | tar.gz を ~/terasu-lens-backups/ に |
| ハッシュ付きURL を共有しない | 本番は https://terasu-lens.pages.dev/ |
| 日本語パス禁止(Next.js) | 実装は /Users/oogushiyuuki/terasu-lens/ |
スモークテスト項目
□ https://terasu-lens.pages.dev/ にアクセスして HTTP 200
□ /api/health が has_anthropic / has_supabase_url / has_supabase_key 全部 true
□ トップフォームで baigie.me を投げて 5〜10分以内に結果が出る
□ 結果ページに 10カテゴリスコア + レーダーチャート + 3段階リストが描画される
□ 致命的問題(fatal)を最低1件は検出(業種EC で特商法なし などで再現可能)
□ /api/jobs/[id] が job + result を返す
□ コンソールエラーが出ない
残タスク
Phase 4(任意・将来拡張)
- A2 ZIPアップロード対応:Cloudflare R2 一時ホスティング基盤の構築が前提(独立タスク)
- C4 拡張:競合 PageSpeed 評価追加(現状は HTML+text のみで Claude Text 比較)
- E4 UI 露出:フォームに
auto_approveチェックボックスを露出(DB スキーマは対応済)
TERASU 案件管理連携フロー(参考)
TERASU 案件管理 TERASU Lens
| POST /api/jobs (terasu_project_id付) |
| + x-terasu-lens-key |
|------------------------------------------>|
| {job_id, status: pending} |
|<------------------------------------------|
| | (5-10分の評価)
| POST {TERASU_MGMT_WEBHOOK_URL} |
| + x-terasu-lens-signature |
| Body: {overall_score, approved, issues, differentiation_proposals, ...}
|<------------------------------------------|
| 改修タスクをworkflowに自動展開 |
| (改修完了後) |
| POST /api/webhook/reevaluate |
| {parent_job_id, terasu_project_id, url} |
|------------------------------------------>|
| | iteration++ で再評価
| | 5回以上でescalation
7. 実装記録
2026-04-28 — Phase 1 / Phase 2 / Phase 3 全完了(1セッション完結)
Phase 1(ミニマム動作):
- 新規リポジトリ作成(Next.js 16 + React 19 + Tailwind v4 + Cloudflare Pages Functions)
- Supabase スキーマ作成(terasu_lens_jobs / terasu_lens_results / terasu_lens_industry_rules)
- A1/A4/A5/B5/B6/B7/C1/D1/D2 実装
Phase 2(自動シグナル拡充・Claude Text・改修指示書):
- B1/B2/B3 自動シグナル評価追加
- C2 Claude Text コピー添削
- C3 業界トップ100社リスト 9業種×3-5社
- D3 改修指示書 Markdown 自動生成 + ダウンロード/クリップボード
Phase 3(TERASU連携・自動ループ・PDF・競合分析):
- C4 競合HP比較分析
- D4 TERASU 案件管理 webhook 送信
- D5 PDF レポート(印刷専用CSS)
- E1/E2/E3/E4 自動ループ機構
- 本番デプロイ:https://terasu-lens.pages.dev/
- コード規模:約 4,000行・28ファイル
- セットアップ手順書(SETUP.md)
関連ノート
- TERASU 事業構想
- TERASU Lens 開発依頼書 ← 元仕様
- TERASU 案件管理 v1(25項目完了)
- TERASU 案件管理 v2(A群が Lens 連携)
- 全システム配置マップ
- 退化禁止ルール
更新履歴
| 日付 | 内容 |
|---|---|
| 2026-04-28 | 初版作成(Phase 1 完了:A1/A4/A5/B5-B10/C1/D1/D2 + デプロイ) |