Imported from nijuni-yasu/bokudeli-event-yasu-2608 (
AGENTS.md). Install upstream withnpx skills add nijuni-yasu/bokudeli-event-yasu-2608. Copyright stays with the author.
AGENTS.md
AIエージェント向けプロジェクトガイド。
出力は必ず日本語で行ってください。
Skills スキル(定型タスクの手順書)
プロジェクトオリジナルのスキル。以下のタスクを依頼された場合、対応するスキルファイルを読み込んで手順に従うこと。
| タスク | スキル |
|---|---|
| コミット整理(fixup / squash / 分割 / 新規 / amend の自律判断) | /git-commit-workflow |
| コミットメッセージ生成(gh でイシュー検証。不一致時は create-issue) | /git-commit-message |
| GitHub イシュー作成 | /git-create-issue |
| PR 本文生成 | /git-create-pull-request |
| AI レビュー完了待ち → evaluate(watcher 起動時 Shell に notify_on_output 必須) | /wait-ai-pr-review |
| コードレビュー(実装完了時は必ずセルフレビュー) | /shokujii-code-review |
| lint・format・型・test チェック(PR / reflect 前。PR verify 相当) | /lint-and-format |
| fixup(追修正の統合・メッセージ維持。明示依頼時) | /git-fixup |
| squash(統合+メッセージ更新。明示依頼時) | /git-squash |
| レビューコメント検討 | /review-comments-evaluate |
| レビューコメント返信 | /review-comments-reply |
| コードレビュードキュメント更新 | /review-doc-update |
| 分割コミット(明示依頼時) | /git-split-commit |
| スキル提案 | /skill-propose |
| sandbox へ push + Actions デプロイ | /github-actions-deploy |
| sandbox WIP デプロイ | /github-sandbox-wip-deploy |
| コミット後の反映(PR + sandbox) | /git-reflect-after-commit |
| GCP Cloud Logging ERROR 取得・解析(gcloud / JSON 添付) | /gcp-logging-error-analysis |
推奨スキル(技術スタック別)
外部からインストールしたスキル。以下のタスク時は、該当スキルを /スキル名 で参照して利用すること。
| タスク | スキル | タイミング |
|---|---|---|
| Vue コンポーネント実装 | /vue-best-practices |
実装時、レビュー時 |
| ルーティング・ナビゲーション | /vue-router-best-practices |
実装時 |
| Vue のデバッグ | /vue-debug-guides |
デバッグ時 |
| Firestore の読み書き・ルール | /firebase-firestore-standard |
実装時 |
| Firestore store 操作(base/functions) | /shokujii-firestore |
store 追加・修正時、Firestore 読み書き時、仕様書に従った実装で Firestore を触る場合 |
| common の Zod スキーマ設計 | /shokujii-common-schemas |
新規スキーマ追加時、既存スキーマのフィールド追加時、common/src/schemas や common/src/apis を触る場合 |
| Firebase Functions 実装 | /shokujii-functions-implementation |
Callable / Scheduled / メール送信の Function 追加・修正時、functions/default を触る場合 |
| Stripe 決済実装 | /stripe-integration |
実装時 |
| UI の設計・実装 | /frontend-design |
新規ページ・コンポーネント作成時、スタイリング・ビジュアル改善時 |
| UI のレビュー・品質チェック | /web-design-guidelines |
ユーザーが明示依頼したときのみ(通常の PR レビューでは使わない。a11y 監査も Phase 1 対象外) |
| スキル作成・改善 | /skill-creator |
新規スキル作成時、既存スキルの編集・最適化時 |
| ユニットテスト (Vitest) | /vitest |
テスト作成時、common/functions のロジックテスト時 |
| 実装前の設計インタビュー(要件明確化) | /grill-me |
実装前の設計フェーズ、要件が固まっていない時、設計の壁打ち時 |
プロジェクト概要
プロジェクト名: Shokujii(食事でつながる)
概要: 食事関連のコミュニティイベント管理プラットフォーム。
アーキテクチャ: Firebase ベースのモノレポ(npm workspaces)。
関連リポジトリ
| リポジトリ | 役割 |
|---|---|
nijuniinc/bokudeli-event-batch |
Firestore 既存データの backfill / migration など、アプリ本体外で実行するバッチ処理 |
既存 Firestore データへの backfill は、原則として本リポジトリの functions/default ではなく bokudeli-event-batch 側で実装・実行する。アプリ本体側は schema / converter / store / Rules / index / テストを整備する。エンプラ MVP の enterprise_id null materialize バックフィル手順は documents/08_エンタープライズ/00_計画/02_developmentマージ.md §2.4 を参照。
ディレクトリ構造
アクティブ
| パス | 概要 | 技術スタック |
|---|---|---|
| /user | 一般ユーザー向けアプリ | Vue 3 + Vite + Vuetify 3 |
| /partner | 飲食店向け管理画面 | Vue 3 + Vite + Vuetify 3 |
| /enterprise | エンタープライズ向けアプリ | Vue 3 + Vite + Vuetify 3 |
| /functions/default | バックエンドロジック | Firebase Functions v2 (Node 24) + TypeScript |
| /common | 共有コード | TypeScript (Schema, Utils) |
| /base | 共有UIコンポーネント | Vue 3 (Materio Template) |
レガシー (Deprecated) — 新規コード生成時の参照禁止
| パス | 概要 |
|---|---|
| /manager | 運営向け管理画面 (Legacy) |
Slack / LINE bot および旧 legacy Functions は functions/default に統合済み(#2060 Phase 2/3)。
外部サービス連携
コードを書く際は各サービスの公式ドキュメントを参照してください。
- SendGrid - メールサービス
- Stripe - 決済処理
- Adobe PDF Services - ドキュメント生成
- Slack/LINE - ボット連携
技術スタック・ルール
- パッケージマネージャ:
npm(yarn禁止) - 言語: TypeScript(
any禁止) - Zod: スキーマ定義は
common/src/schemasとcommon/src/apisに置く。それ以外では新規に Zod スキーマを定義しない(ZodErrorの捕捉のみ可)。as回避は型ガードで行う - フォーマッタ: Prettier (
.prettierrc) - Linter: ESLint (
eslint.config.mjs)
UI 文言・i18n(日本語のみ)
- 表示言語は日本語のみ(Phase 1)。英語 UI・多言語切替は未対応。
- UI 文字列は
ja.tsにのみ追加する。base/src/locales/messages/ja.ts(共通)- 各アプリの
src/locales/messages/ja.ts(例:user/partner)
src/locales/messages/en.ts等の英語 locale ファイルは作らない(製品として多言語対応を始める明示指示がある場合を除く)。- i18n 基盤(
vue-i18n)は日本語用の$t集約のために使う。base/src/plugins/i18n/index.tsはlocale/fallbackLocaleともja。各アプリのthemeConfigのlangConfigも日本語のみとする。 - 日付・時刻の表示は
common/src/utils/datetime.tsのconvertToXxxを使う(vue-i18nのdatetimeFormats/$dは新規追加しない)。
Materio テンプレート(base/materio/)
base/materio/(@core/@layouts含む)は原則変更禁止。テンプレート更新時の diff 回避・マージ容易性のため。- レイアウト・スタイルの調整は
user/src/styles/、base/src/styles/、各 Vue コンポーネントの<style>で override する。 user/src/@core/@layoutsは materio へのシンボリックリンク。不足 util はbase/src/等のプロジェクト側に追加し、materio 直下に直接足さない。- 例外: Materio テンプレート本体のアップストリーム取り込み等、明示的なメンテナンス作業時のみ編集可。
開発コマンド
-m <env_file_postfix> は環境変数ファイルの接尾辞(例: -m development → .env.development)。
npm install
npm -w <pkg> run dev -- -m <env_file_postfix>
npm -w <pkg> run build -- -m <env_file_postfix>
npm -w <pkg> run lint
npm -w <pkg> run format:check
作業前の確認事項
documents/内の仕様書・各パッケージのREADME.mdを読んでプロジェクトの文脈を理解するcommon/baseにある再利用可能なコードを優先的に使用し、重複実装を避ける- Firebase Security Rules (
firestore.rules,storage.rules) へのセキュリティ影響を意識する - 仕様書・ドキュメントに基づく実装で、base/functions の store や Firestore の読み書きが含まれる場合は、shokujii-firestore を参照すること
- 仕様書・ドキュメントに基づく実装で、common のスキーマ(common/src/schemas、common/src/apis)を触る場合は、shokujii-common-schemas を参照すること
- functions/default で Function を追加・修正する場合は、shokujii-functions-implementation を参照すること
- セッション開始時、
.agents/state/pr-review-pending-wake.jsonに未処理 wake があればwait-ai-pr-review手順 6 に従い evaluate 未処理をユーザーへ報告する。対象のレビュー記録ファイル(review-<slug>.mdまたはレガシーpr-<n>.md)に当該since以降の評価セッションが無い場合は auto evaluate 未完了としてreview-comments-evaluateauto モード(手順 4a・4 まで)の実行を提案する - セッション開始時、
.agents/state/deploy-pending-wake.jsonに未処理 wake(consumed: false)があれば deploy 結果報告未処理としてユーザーへ報告する。ユーザーが報告を依頼した場合はgithub-actions-deployを mode=report で完走する - Agent 使用量の確認: Cursor 2.x 以降の stop hook は top-level の
input_tokens等を提供する環境では自動計上される。トークン未提供(aborted・旧版・CLI 等)の場合は ledger にnullが記録され followup も出ない(Phase 1 制限)。payload にトークンが無い場合はtranscript_pathから Claude 互換 transcript の usage をフォールバック取得する。stop hook が推定 ¥100 以上のターンのみfollowup_messageで使用量を表示する([agent-usage-report]プレフィックス。閾値は.agents/config/agent-usage-pricing.jsonのfollowup_min_jpy)。手動確認はpython3 .agents/scripts/agent_usage.py report --last-sessionまたは.agents/state/agent-usage/reports/を参照(hook による推定値)
作業完了前の必須手順(コード変更)
ソースコードやビルド・lint 対象となる設定を変更したタスクでは、完了報告の前に必ず /shokujii-code-review でセルフレビューを実行する(差分レビュー。RC がある場合のみ review doc 記録。lint / test は本段階では実行しない)。
Stop hook による機械的検証(Cursor / Claude 共通):
- 正本:
.agents/hooks/stop-gate-check.sh(セルフレビューのみ。lint は含まない) - Cursor:
.cursor/hooks/stop-gate.shがfollowup_messageで最大 3 回まで自動 retry(loop_limit)。Ask モード(composer_mode=chat)および Stop hook 自身が注入した[self-review]followup ターンでは gate をスキップ(.agents/hooks/stop-gate-check.shのself-review-gate-skip判定による) - Claude Code:
.claude/hooks/stop-gate.shがdecision:blockでターン終了を阻止 - review スコープの変更が無いターンでは検証をスキップ(
.agents/hooks/source-change-detect.sh)。未コミット差分(working tree / staged / untracked)のみを対象とするため、コミット済みで作業ツリー clean の場合も gate はスキップされる(RC-16 参照) - pending state:
.agents/state/self-review-pending.json(self_review_wake.py) - fingerprint: consume 時に review スコープ差分の
reviewed_scope_fingerprintを記録。consumed 後も同一未コミット差分なら合格。差分が変わったら手順 0 から再レビュー - 記録対象外ブランチ(
release/sync/hotfix/backup/tree/)では review doc への追記はスキップ可。consumed + fingerprint 一致で合格(指摘 0 件で review doc 未作成の場合も同様。未消費時は ledger のtask_skill=shokujii-code-reviewも可)。ledger 照合には Stop hook からconversation_id(またはsession_id) が渡る必要がある。旧 Cursor・CLI 等で ID が無い場合は gate がブロックされうる(review-doc-path.md 参照)
PR verify 相当チェック(push 前)
/lint-and-format は push / PR 作成 / sandbox デプロイの準備段階で必ず実行する。
/git-create-pull-request手順 0(単体実行時)/git-reflect-after-commit手順 3(push 前)
PR verify(pr-verify.yml)と同じ verify:functions-deploy / build / lint / format / 型 / vitest。format 失敗時はローカル自動修正。
コードレビュー(必須)
ソース変更タスクの完了報告前に 必ず /shokujii-code-review を実行する。
自動修正(shokujii-code-review 手順 3a・3b、auto-fix-policy.md):
- 🚨 必須修正: 仕様判断・スコープ外設計・セキュリティ影響確認が必要なものを除き、ユーザー確認なしで修正
- 🟡 修正提案(条件付き): 📌 スコープ内 + 工数 S + 種別 🔧 微修正 / 📄 ドキュメントのみ + 除外ラベルなし + 修正方針が一意のものをユーザー確認なしで修正
- 手順 1 から再レビューする(同一タスク内・最大 2 周・🚨 と 🟡 合算)
- 条件を満たさない 🟡・対象外の指摘は完了報告に列挙する
- 2 周後も自動修正できない指摘は一覧を報告して完了報告する
ユーザーが「レビュー不要」と明示した場合のみスキップしてよい。
Functions 追加時の CI 連携
functions/default で Cloud Functions として export する関数を新規追加・削除したら、同 PR で functions/default/src/index.ts に import と export を追加すること(deploy yml への手書きは不要。CI は --only functions で default codebase 全 export をデプロイ)。export 漏れすると development / production では Trigger・Callable が未デプロイのままになる。詳細は /shokujii-functions-implementation を参照。PR verify は npm run verify:functions-deploy で deploy 設定を検証する。CI の方針とデプロイ失敗時の対処は documents/実装メモ/functionsのCIデプロイ.md を参照。
Firestore 操作の必須ルール(厳守)
- DB 操作は必ず store 経由:
db.collection()、update、set、delete等を直接呼ばない。base/src/stores/またはfunctions/default/src/stores/の関数を経由すること。 - xxxRef は必ず withConverter 付き: DocumentReference を取得する際は store の
withConverter付き ref を使う(Zod バリデーションを維持するため)。 - Functions の Firestore 操作:
functions/defaultではdocuments/実装メモ/functionsにおける store の使い方.mdを参照し、store 関数のみで読み書きすること。
スキーマの日付・時刻フィールド(common/src/schemas/firebase)
- DbSchema: 日付・時刻フィールドには
TimestampSchemaを使う(Firestore に Timestamp 型で保存するため) - AppSchema: 日付・時刻フィールドには
EpochMillisSchemaを使う(Firestore の Timestamp を number に正規化し、アプリ側で扱いやすくするため)
パッケージ依存関係の注意
base は本来 common のみに依存すべきだが、現状 user 等との依存反転が発生している箇所がある。新規コード作成時はこの依存反転を避けて設計すること。
セキュリティ(必須)
.env,.secret,.firebasercはコミット禁止.secretをエージェントが読み込むことは禁止- Firebase Security Rules の既存の権限設定・バリデーションを壊さないこと
Git ルール
- コミットメッセージは日本語で記述する
- main ブランチへの直接コミット禁止
package-lock.jsonは必ずコミットする- タイトルの接頭辞に変更したディレクトリと Issue 番号を含める
- 例:
[partner] #1777 注文詳細画面の修正 - 例:
[base][common] #1799 withConverter の削除を禁止 - 例:
[ci] #2084 deploy_user の checkout を v6 に更新 - 例:
[firebase] #1901 firestore.indexes.json の重複インデックスを削除 - 例:
[ai] #1800 分割コミットスキルに ci と firebase タグを追加 - 例:
[enterprise] #2071 カート月次 usage を enterprise 側から注入 - 使用可能なタグ:
[user][partner][enterprise][base][common][functions][doc][ci][terraform][firebase][ai] - [doc]: documents/ 内の更新のみ。[ci]:
.github/workflows/。[terraform]:terraform/。[firebase]:firebase.json/.firebaserc/firestore.rules/storage.rules/firestore.indexes.json。[ai]:.cursor/.agents/.claude/CLAUDE.md/AGENTS.md/.github/copilot-instructions.md等の AI エージェント向け指示・設定 - ルートの
package.json/package-lock.json等、上記タグに該当しないモノレポ横断設定は接頭辞なし(#イシュー番号と要約タイトルのみ)。PR タイトルも同様。手順・判定ルール・例は/git-commit-messageと/git-create-pull-requestスキルを参照。
- 例:
エージェント向け Git 操作の禁止(本番・リリース系)
背景: documents/AIエージェント/03_branch_protection.md §5。
エージェントは次を実行してはならない(人間のリリース作業専用):
development/main/production/ リリースタグ(v+ 数字)への 直 pushnpm version(引数問わず全バリアント)git branch -f main/git branch -f production
許可される push: 現在の feature / release/* / sync/* / hotfix/* 等の作業ブランチへの git push origin HEAD:<ref>(PR 作成・更新用)。development の更新はこれらのブランチ + PR 経由のみ。
例外: ユーザーが「本番リリースを実行して」と明示した場合でも、エージェントは 自動実行せず documents/デプロイ手順/デプロイ手順.md の手順を提示に留める。
上記は Hook でも機械的にブロックされる(検査正本: .agents/hooks/protect-git-release-check.sh、Claude: .claude/hooks/、Cursor: .cursor/hooks/)。
コードレビュー
PR・コードレビューのコメントは必ず日本語で行う。 レビュー時はプロジェクト固有のチェックリストに従うこと。
チェックリスト: .agents/skills/shokujii-code-review/shokujii-code-review.md
レビューコメント対応記録(必須)
新規作業の RC 記録正本は documents/レビューコメント/review-<ブランチslug>.md とする(1 ブランチ = 1 ファイル。slug はブランチ名の / を - に置換。例: fix/2500 → review-fix-2500.md)。パス解決・記録対象外ブランチ・レガシー pr-*.md の扱いは review-doc-path.md を正本とする。
RC-n の対応を依頼され実装を進めたタスクでは、コード変更と同一作業内(コミット前)に当該レビュー記録ファイル(新規は review-<slug>.md、既存 pr-*.md への追記依頼時はそのファイル)を必ず更新する(lint-and-format と同様、完了報告の前提)。
| 状況 | 対応列 | 評価 | ステータス | PRスコープ |
|---|---|---|---|---|
| コードで解消した | [x] |
変更しない(🚨 / 🟡 のまま) | ✅ 対応済み | 📌 スコープ内(変更なし可) |
| 対応不要と確定 | [x] |
👌 修正不要 | — | — または 📤 スコープ外 |
| 本 PR では実装せず別 Issue へ切り出した | [x] |
変更しない(🚨 / 🟡 のまま) | 📤 #NNNN 別Issue化 | 📤 スコープ外 |
| 未着手 | [ ] |
🟡 修正提案 / 🚨 必須修正 | 未着手 | 評価時のまま |
- ❌ 未対応は使わない(
review-comments-evaluateと共通)。未着手は[ ]+ ステータス 未着手 + 評価 🟡 / 🚨 で表す。 - 「別 Issue で対応」「方針検討」等の文言だけで Issue を作らない状態は禁止。切り出す場合は
git-create-issueで Issue を作成し、ステータスに📤 #NNNN 別Issue化、要約列 2 行目に Issue URL または番号を明記する。 - Issue 作成まで完了したら 対応列は
[x]とする(本 PR 側の運用対応は完了)。
更新箇所(漏れ防止): ファイル冒頭の通し ### RC 一覧(サマリ) 表、直近評価セッション内サマリ表(あれば)、該当 RC 記録ブロックのステータス・PRスコープ・判断理由・要約(評価は変更しない)。詳細は /review-comments-evaluate を参照。
review-comments-evaluate の自動修正
/review-comments-evaluate 手順 4a および auto-fix-policy.md に従い、🚨 および条件付き 🟡(📌 + S + 🔧/📄 等)の RC はユーザー確認なしで自動修正する(shokujii-code-review 手順 3a・3b と同一の対象外ルール・最大 2 周)。ソース変更時は /lint-and-format を実行する。
- 条件を満たさない 🟡 は自動修正しない(未着手のまま記録し、完了報告に列挙)
- ユーザーが「修正しない」「自動修正しない」と明示した場合のみ手順 4a をスキップしてよい
エージェント用ファイルとシンボリックリンク
実装・修正は Cursor と Claude(Claude Code 等) のどちらでも行う。どちらの環境でも同じプロジェクトガイドとスキルを参照できるよう、次のように整理している。
AGENTS.md: AI 向けプロジェクトガイドの正本。CLAUDE.md:AGENTS.mdへのシンボリックリンク。Claude 側がプロジェクトルートのCLAUDE.mdを読む場合でも、常にAGENTS.mdと同じ内容になる。- スキル(
SKILL.md等)の正本:.agents/skills/。Cursor 用の.cursor/skillsと Claude 用の.claude/skillsは、どちらも.agents/skillsへのシンボリックリンクである。スキルを編集する場合は.agents/skills側(またはリンク経由で同一ファイル) を更新すればよい。
.cursor/ や .claude/ には、エディタ・ツールごとの設定(例: .cursor/rules.json、.claude/settings.json、hooks)が置かれることがあり、これらはスキル正本とは別パスとして扱う。
