Communitygithub.com

rajput-hemant/website

本番ポートフォリオサイトを起動、確認、ドライブする。Next.js 16、11の切り替え可能エディション、R3Fシーン、オプションのSanity CMS対応。ユーザーが明示的に確認を依頼したときにのみ手動で実行する。

website とは?

このスキルは、AIエージェント(Claude Code, Codex, Cursorなど)がポートフォリオサイト(Next.js 16ベース、11のエディション、R3Fシーン、オプションのSanity CMS)の変更を実際に動作するサイト上で検証するためのものです。主な特徴として、本番ビルドから分離されたサーバーを起動し、chrome-devtools-axiを介して実際のブラウザを操作し、各機能が正しく動作することを証明します。また、環境や依存関係、コミット状態をチェックする`doctor`スクリプト、検証結果を保存するエビデンス管理機能、クリーンアップ機構を備えています。重要なのは、このスキルはユーザーからの明示的な指示があった場合にのみ実行される点です(`disable-model-invocation: true`)。自動的なコミットフックやCIには組み込まれておらず、手動トリガーが必須です。すべての未検証の部分や既知の問題は`docs/verification/verification-issues.md`に一元管理され、各機能は`features/*.md`ファイルで定義されています。

対応✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/rajput-hemant/website/tree/HEAD/.agents/skills/verify

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

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

ドキュメント

ポートフォリオサイトの確認

ステータス: 起動、診断、クリーンアップ、および最初のフローセットはライブで実証済み(2026-10-02、82ec737 でテスト、chrome-devtools-axi、Apple M3 Pro上のリアルWebGL2)。カバレッジは部分的です:各 features/*.md ファイルの Last live proof: 行が、何が実行され、何が実行されなかったかを正確に示します。その行が none の機能は、一度もドライブされていません。このファイルが説明しているため、ここに「確認済み」のものはありません。

手動トリガーのみ(ユーザールール、2026-10-02):このスキルとPStackは、ユーザーが明示的に確認を要求した場合にのみ実行されます。コミット、プッシュ、PR、またはモードの有効化では開始されず、ここにあるものはgitフック、パッケージライフサイクルスクリプト、CIジョブ、スケジュールに配線してはいけません。frontmatterは disable-model-invocation: true を設定しているため、エージェントが単独でこのスキルを拾うことはありません。手動で開始してください:Claude Codeの場合は /verify、Codex(Codexが .agents/skills/verify を発見した場合)の場合は $verify、その他のエージェント:このファイルを読み、以下の手順を明示的に実行してください。2026-10-02の自動トリガーの監査結果、ブラウザを実行するものはありません:.husky/pre-commit(lint-staged、設定 .lintstagedrc:ステージングされたファイルに対するeslintとprettier)、.husky/commit-msg(commitlint)、package.json prepare(husky)、.github/workflows/ci.yml(type-check, lint, fmt:check, vitest, build, budget)。test:e2e と visual-baseline は手動スクリプトのみです。このチェックアウトの core.hooksPath は、.husky ではなく、リポジトリ外のfirstmateフックディレクトリを指しています。

ブラウザの使用は、明示的な確認実行時にのみ許可されます(2026-10-02の実行はキャプテンによって承認され、以前のブラウザ利用停止を置き換えました)。Driveレシピはユーザーアクションと観測可能な結果として記述されているため、chrome-devtools-axi または他のブラウザスキルで実行できます。

すべての未解決の問題、仮説、およびライブプルーフのギャップは、一つの台帳にまとめられています:docs/verification/verification-issues.md。機能ファイルはそこにリンクしており、内容を繰り返しません。何かをドライブする前に、マップとして features/README.md を読んでください。

サーフェスの概要

一つのNext.js 16アプリ(App Router、proxy.ts、静的プリレンダリング、React Compiler)。11のライブエディションが一つのコンテンツモデルと一つのルートセットを共有しています。訪問者のエディションがルックを決定します。プロキシは /<path> を /f/<edition>/<path> に書き換えます。/ は、hr_flavor クッキーがライブエディションIDを保持するまで、ピッカー(/flavors)を表示します。NEXT_PUBLIC_FLAVOR=<id> はビルドを一つのエディションに固定します。エディションリストは flavors/registry.ts です。エディションごとのルートリストは content/site.ts の pages に加えて /owner、/projects/<slug>、/lab/<slug>、/ask/<slug>、/ask/page/<n>、/md/* ミラー、/llms.txt、/sitemap.xml、/robots.txt です。

これは破壊的変更を含むNext.jsです。アプリコードに触れる前に、node_modules/next/dist/docs/ 内の該当するガイドを読んでください(リポジトリのAGENTS.mdにそう記載されています)。

既存のテストハーネス(再利用し、重複しないこと)

playwright.config.ts と e2e/*.spec.ts は既にほとんどのシェル動作をカバーしています。確認実行は、それらが証明しないものについてライブサイトをドライブし、証明するものについてはそれらを引用します。e2eアサーションを機能ファイルに2番目のスイートとしてコピーしないでください。

既存のカバレッジ場所証明する内容
ビルド出力がプリレンダリングされるe2e/static-routes.spec.ts (project build)公開ルートがリクエストごとにレンダリングされない、時間ベースの再検証がない
Minimal専用スイートhome、navigation、ask、lab、motion、preferences、print、disclosure、command-menu、link-preview、markdown スペック、projects desktop and mobileMinimalのみ(cookie hr_flavor=minimal)
Drawing Set専用スイートe2e/drawing-set.spec.ts、projects desktop-drawing-set、mobile-drawing-setシートインデックス、コマンドメニュー、Customizeの永続化、/now ログ、768でのオーバーフローなし
他の9エディションの共有シェルeditions.spec.ts、a11y.spec.ts、command-dialog.spec.ts、projects desktop-<id> and mobile-<id>すべてのルートが200で1つのh1を持つ、エディション404、コマンドメニュー、Customizeテーマ、ヘッダーテーマトグル、axe(ライト/ダーク/モーション減少)、コマンドダイアログのホイールとキーボードコントラクト

これらのスイートは bun run test:e2e で実行され、自身の bun run build && bun run start -p 3020 を開始します(CI外では reuseExistingServer: true で、すでに3020で動作しているプロセスがあれば黙って再利用されます)。これらはブラウザ自動化です:リクエストがあった場合のみ、1ワーカーで、3020が空いていることを確認して実行してください。これらは2026-10-02には実行されていません。その合否は、このマップがギャップとしてマークしているものの証明にはなりません(台帳を参照)。

存在する非ブラウザゲート:bun run lint、bun run type-check、bun run test(vitest)、bun run fmt:check、bun run check:identity、bun run budget(ビルド後)。これらの実行は許可されており、UI動作については何も語りません。

起動

タスクごとに1サーバー、タスク固有のポート、本番ビルドから起動します。これはe2e設定と static-routes.spec.ts が前提としているためです(next dev はこの計画の一部ではありません)。

.agents/skills/verify/scripts/doctor.sh                    # 環境とツリーの衛生チェック、サーバーは不要
.agents/skills/verify/scripts/serve.sh start 3071          # ビルド、起動、準備完了を待ち、PIDファイルを書き込む
.agents/skills/verify/scripts/doctor.sh 3071               # 実行中のインスタンスもプローブする

serve.sh start は正確にこれを行います:ポートが使用中であれば拒否し、bun run build と bun run start -p <port> をすべてのSanity、ask、フレーバー変数を未設定の状態で実行し(サイトがバンドルされたフォールバックコンテンツをレンダリングし、CMS呼び出しを行わないようにする)、サーバーPIDを $RUN_DIR/server.pid に記録し、GET /flavors が200を返すまで待機します。ポート3000と3020は拒否されます(3020はPlaywright設定用です)。ビルドは .next を上書きします。1つのチェックアウトで2つの実行を開始しないでください。

準備完了とは、すべての以下が満たされた状態です:serve.sh が ready と出力した、GET /flavors が200、そしてクッキー hr_flavor=minimal を付けた GET / が200で、1つの <h1> を含む。これら3つすべてを満たしていないものをドライブしないでください。

ティアダウン:.agents/skills/verify/scripts/serve.sh stop 3071(クリーンアップを参照)。

ドクター

.agents/skills/verify/scripts/doctor.sh [port] は読み取り専用です。「このインスタンスはドライブする価値があるか、そして安全か」を答えます。以下のいずれかが成立する場合、失敗します(exit 1):

  • .env、.env.local、.env.development*、.env.production* ファイルがリポジトリルートに存在する(NextがSanityまたはaskのシークレットをロードし、ドライブが実際のデータセットに書き込む可能性がある)。
  • NEXT_PUBLIC_SANITY_PROJECT_ID、SANITY_API_READ_TOKEN、SANITY_API_WRITE_TOKEN、SANITY_REVALIDATE_SECRET、ASK_COOKIE_SECRET、ASK_OWNER_PASSPHRASE、NEXT_PUBLIC_FLAVOR のいずれかが呼び出し元のシェルで設定されている。
  • HEAD が実行が主張するコミットではない、またはツリーがダーティである(両方を出力する)。
  • ポート指定あり:ポートが $RUN_DIR/server.pid のPIDによって所有されていない、/flavors が200ではない、/api/visits が503ではない(503でなければならない:フォールバックビルドが訪問者カウンターがCMSに書き込めないことを証明する方法である)、または hr_flavor=minimal を付けた / に <h1> がない。

何かおかしいと思ったら、最初にこれを実行してください。

実行時に明示すべき前提条件

  • コンテンツ:バンドルされたフォールバック(content/fallback/)、デフォルト。設定済みのSanityプロジェクトに対する実行は、オーナーの承認、使い捨てのデータセット、読み取り専用トークンを必要とする異なる実行です。features/cms-prerequisites.md を参照してください。CMSへの書き込み、オーナーコンテンツの変更、デプロイ、または資格情報へのアクセスを実行してはいけません。
  • ビューポート:デスクトップ1440x900と電話(Playwrightの「Pixel 7」プロファイル:タッチ、粗いポインター、ホバーなし)。e2e設定が使用する2つ。ライトとダーク。モーションオンと prefers-reduced-motion: reduce。
  • ストレージ:各フレーバードライブは、クッキー hr_flavor=<id> のみを持つ空のプロファイルから開始します(e2eの storageState が行うこと)。共有の認証済みブラウザセッションを決して使用しないでください。
  • シーンティア:シーンティアはWebGL2、Save-Data、prefers-reduced-data、deviceMemory、pointer に従います(lib/scene/tier.ts)。各シーンの証明とともにブラウザのティアシグナルを記録してください。GPUなしのヘッドレスブラウザは、T0とポスターを証明しますが、3Dは証明しません。

ドライブ

ブラウザ:自身のセッション、ポート、分離されたプロファイルを持つ chrome-devtools-axi。ユーザーのChromeに自動接続しないでください。実証済みのセットアップ(2026-10-02):

export CHROME_DEVTOOLS_AXI_SESSION=<unique-task-name> CHROME_DEVTOOLS_AXI_PORT=<free port> CHROME_DEVTOOLS_AXI_AUTO_CONNECT=0
export CHROME_DEVTOOLS_AXI_MCP_PATH="$(npm prefix -g)/lib/node_modules/chrome-devtools-mcp/build/src/bin/chrome-devtools-mcp.js"   # npx ブートストラップを回避
export CHROME_DEVTOOLS_AXI_HEADED=1 CHROME_DEVTOOLS_AXI_CHROME_ARGS="--enable-gpu --ignore-gpu-blocklist"   # リアルWebGL2; ヘッドレスはポスターのみを証明
chrome-devtools-axi emulate --viewport "1440x900x2"              # デスクトップ; "412x915x2.625,mobile,touch" は Pixel 7 プロファイル用
chrome-devtools-axi emulate --color-scheme dark|light
# モーション減少: ブリッジを再起動 (`chrome-devtools-axi stop`) し、CHROME_ARGS に --force-prefers-reduced-motion を追加
chrome-devtools-axi run <<'EOF' ... EOF                              # スクリプト化されたスイープ; 最後にブリッジを停止

実行からのツールノート:run スクリプト内で page.wait(ms) は "fn is not a function" をスローするため、await new Promise(r=>setTimeout(r,ms)) でスリープします。process.env はそこでは利用できないため、値をスクリプトテキストに埋め込みます。hr_flavor は document.cookie からクリアできないため、/?flavor=<id> を開いてエディションを選択します。emulate にはモーション減少フラグがありません。Pressの視覚的に隠された Paper ラジオボタンへのポインタークリックがタイムアウトしました(キーボードのArrowRightは動作しました、WEB-H8)。このシェルの zshz フックは cd で非ゼロを返すため、絶対パスを使用してください。features/ 以下の各機能ファイルには、アクション、安定したハンドル、観測可能な最終状態がリストされています。ハンドルの優先順位:ARIAロールとアクセシブル名、ルートパス、html[data-theme]、html[data-motion]、html[data-scene]、[data-scene-poster]、エディションごとの hr.*.prefs localStorageキー(e2e/support/site.ts prefsKeyFor)。座標は使用しません。

証明基準:

  • ストアセッターではなく、実際のルートとコントロールを行使してください。localStorage の編集よりも可視コントロールを優先します。ストレージは、機能ファイルが指定する開始状態を設定するためにのみ使用します。
  • アクションとその後の状態をキャプチャします:UIのARIAスナップショットとスクリーンショット、HTTPチェックのレスポンスステータスとヘッダー、すべてのドライブのコンソールと失敗したリクエストのログ。
  • ユニットテストやe2eスペックの合格は、未実行のフローの証明にはなりません。実際のフローが実行された後にのみ、日付、コミット、証拠パスを付けて機能の Last live proof: をマークしてください。
  • 到達不能なパスは、試行したステップと満たされない前提条件を報告してください。別のエントリポイントを介して検証されたとして、スキップされたエントリポイントを報告しないでください。

エビデンス

ディレクトリ:$EVIDENCE_DIR、デフォルト $HOME/.verify-evidence/website/<run-id>/、ここで <run-id> は <UTC timestamp>-<short HEAD> です。レイアウト:doctor.txt、server.log($RUN_DIR からコピー)、次に <feature-id>/<step>.aria.txt、<step>.png、console.txt、network.txt。ドライブ後、機能ファイルの Last live proof: 行に1行(日付、コミット、証拠パス)を追加し、台帳に1行を追加します。stop の前に $RUN_DIR/server.log をエビデンスディレクトリにコピーしてください。stop は $RUN_DIR を削除するためです。エビデンスはクリーンアップ後も存続し、このスキルによって削除されることはありません。

クリーンアップ

.agents/skills/verify/scripts/serve.sh stop <port> は、$RUN_DIR/server.pid 内のPID(およびそれが起動した子プロセス)のみを強制終了し、その後 $RUN_DIR を削除します。プロセス名で強制終了することは決してなく、自身が起動していないプロセスに触れることもありません。.next(チェックアウトが既に無視しているビルドアーティファクト)と $EVIDENCE_DIR はそのままにします。PIDファイルがない場合はその旨を報告し、何も強制終了しません。失敗した実行の後は、再試行する前にこれを実行して、ポートが占有されたままにならないようにしてください。

$RUN_DIR は ${TMPDIR:-/tmp}/website-verify-<port> です。PIDファイルとサーバーログのみを保持します。

ヘルパー

  • scripts/doctor.sh [port]:上記の読み取り専用チェック。正常ならexit 0、ドライブする価値がなければexit 1。
  • scripts/serve.sh start <port> および scripts/serve.sh stop <port>:上記の起動とティアダウン。

どちらも実行可能で、bash、curl、lsof、git、bun のみを使用します。

関連スキル