Skip to content

Commit 4834b4a

Browse files
yn1323renovate[bot]claudecloudflare-workers-and-pages[bot]
authored
release (#309)
* chore(deps): update dependency @biomejs/biome to v2.2.5 (#78) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @clerk/testing to v1.13.2 (#79) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @tanstack/react-devtools to v0.7.2 (#80) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency dotenv to v17.2.3 (#81) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency chromatic to v13.3.0 (#87) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.50.0 (#88) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency vite to v7.1.9 (#83) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency react-hook-form to v7.64.0 (#89) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update react monorepo to v19.2.0 (#90) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.132.37 (#85) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update storybook monorepo to v9.1.10 (#84) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency typescript to v5.9.3 (#82) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: y-natani <yn1323@gmail.com> * chore(deps): update dependency @types/node to v24.6.2 (#86) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: y-natani <yn1323@gmail.com> * 店舗登録 (#91) * lint * temp * fix: delete * git ignore * fix * fix * ignore * fix: delete serena * fix * fix * fix: error message test * fix: 店舗一覧 * chore * feat: e2e * fix * chore(deps): update dependency @clerk/testing to v1.13.3 (#92) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @tanstack/react-devtools to v0.7.6 (#93) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update react monorepo (#94) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @chakra-ui/react to v3.27.1 (#95) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency convex to v1.27.5 (#96) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix: tasks.json * fix(deps): update dependency zod to v4.1.12 (#97) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo (#98) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/node to v24.7.2 (#99) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency react-hook-form to v7.65.0 (#102) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.51.0 (#101) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Feat/1012 (#103) * fix * fix * fix: seed * fix * chore * feat: shop top * fix * f * Feat/1013 (#104) * fix * fix * fix * Feat/1013 (#105) * fix * feat: breadcrumb * feat: edit * fix * fix * Feat/1013 (#106) * fix * feat: breadcrumb * feat: edit * fix * fix * fix * chore(deps): update dependency @biomejs/biome to v2.2.6 (#107) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @clerk/testing to v1.13.7 (#108) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @tanstack/react-devtools to v0.7.7 (#109) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/react-dom to v19.2.2 (#110) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency jsdom to v27.0.1 (#111) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency vite to v7.1.10 (#112) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update storybook monorepo to v9.1.13 (#113) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix: ci * chore(deps): update actions/setup-node action to v6 * chore(deps): update dependency @types/node to v24.8.1 (#114) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update playwright monorepo to v1.56.1 (#100) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.53.2 * fix(deps): update dependency convex to v1.28.0 * fix(deps): update tanstack-router monorepo to v1.133.13 * fix (#119) * fix * fix * fix * chore(deps): update dependency @clerk/testing to v1.13.8 (#121) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @tanstack/react-devtools to v0.7.8 (#122) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency chromatic to v13.3.2 (#123) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency vite to v7.1.12 (#124) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update storybook monorepo to v9.1.15 (#125) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.53.3 (#126) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo (#127) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @biomejs/biome to v2.3.0 (#128) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency node to v24 (#129) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @vitejs/plugin-react to v5.1.0 (#130) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @chakra-ui/react to v3.28.0 (#131) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update actions/upload-artifact action to v5 (#132) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @biomejs/biome to v2.3.2 (#134) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @clerk/testing to v1.13.9 (#135) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/node to v24.9.2 (#136) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency chromatic to v13.3.3 (#137) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update storybook monorepo to v9.1.16 (#138) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.53.4 (#139) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency jotai to v2.15.1 (#142) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @tanstack/react-devtools to v0.8.0 (#140) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency jsdom to v27.1.0 (#141) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency react-hook-form to v7.66.0 (#143) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.134.9 (#144) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @biomejs/biome to v2.3.4 (#146) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @clerk/testing to v1.13.12 (#147) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @tanstack/react-devtools to v0.8.1 (#148) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.53.8 (#149) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency convex to v1.28.2 (#150) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.134.15 (#151) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/node to v24.10.0 (#152) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency vite to v7.2.2 (#153) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @chakra-ui/react to v3.29.0 (#154) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.135.0 (#155) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Feat/1019 (#156) * fix * fix: layout * fix * fix * fix * fix: test * Feat/1113 (#157) * fix: dashboard * fix: shop list * fix: shop register * fix: form * fix: ShopDetail * fix: user detail * fix: ci * fix * fix * fix * chore(deps): update dependency @biomejs/biome to v2.3.5 (#158) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @clerk/testing to v1.13.15 (#159) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Feat/1115 (#164) * fix * fix * chore(deps): update dependency @types/node to v24.10.1 (#160) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @vitejs/plugin-react to v5.1.1 (#161) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update react monorepo (#162) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency jsdom to v27.2.0 (#163) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.55.0 (#165) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Feat/1115 (#168) * fix * tmp * f * f * f * fix * f * f * f * f * fix * fix(deps): update dependency convex to v1.29.1 (#166) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.136.5 (#167) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.136.6 (#169) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat: introduce shift template management with new UI components and routing (#170) * chore(deps): update dependency @biomejs/biome to v2.3.7 (#171) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @clerk/testing to v1.13.18 (#172) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/react to v19.2.6 (#173) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency chromatic to v13.3.4 (#174) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat: Implement ShopList and ShopDetail InfoTab components, and add agent rules with gitignore update * chore(deps): update dependency vite to v7.2.4 (#175) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency convex to v1.29.3 (#176) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update actions/checkout action to v6 (#180) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency react-hook-form to v7.66.1 (#177) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @chakra-ui/react to v3.30.0 (#182) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.56.2 (#178) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.139.3 (#179) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Feat/1122 (#181) * feat: add `InfoTab` component to display shop details like operating hours, shift deadlines, and description. * fix * fix: invite * f * f * fix: tab * remove: word member * fix * fix * fix * Feat/1124 (#183) * fix: shop staff count * fix * fix: tab * fix * wip * fix * fix: e2e * fix: format * fix: workflow * fix * fix * fix * fix: sho * fix * fix: delete debug * Add user invitation feature (#184) * docs: ユーザー招待機能の仕様書を追加 - 権限(owner/manager のみ招待可能) - 招待リンクの仕様(トークン形式、有効期限14日) - 招待フロー(作成、キャンセル、再送) - 受け入れフロー(状態判定、ログイン状態分岐) - データモデル、API一覧、エラーコード * docs: 招待時に付与可能なロールを修正 ownerロールも招待時に付与可能であることを明記 * fix: ownerロールを招待・ロール変更で付与可能に修正 - convex/shop.ts: addUserToShopでownerロールを許可 - doc/spec/2025-10-04_店舗管理機能.md: ownerロール制限に関する 誤った記載を修正 * style: フォーマット修正 --------- Co-authored-by: Claude <noreply@anthropic.com> * Sort staff list by role hierarchy (#185) * feat: スタッフ一覧を役割順(オーナー→マネージャー→一般)でソート 役割の優先度に基づいてユーザー間のソートを追加。 各ユーザーの最も高い役割を基準にソートすることで、 オーナー、マネージャー、一般の順に表示されるようになる。 * refactor: sortをtoSortedに変更 非破壊的なソートメソッドtoSortedを使用するよう変更。 TypeScript libをES2023に更新してtoSortedをサポート。 --------- Co-authored-by: Claude <noreply@anthropic.com> * ユーザー編集ボタンの表示制御を役割に基づいて実装 (#186) - オーナー: 全員編集可能 - マネージャー: 全員編集可能、ただしオーナーは編集不可 - 一般ユーザー: 自分のものだけ編集可能 Co-authored-by: Claude <noreply@anthropic.com> * Fix unauthorized access to other user information (#187) * ユーザー情報アクセス制御の仕様書を追加 - 背景・課題、要件、実装方針をまとめた - 役割ベースのアクセス制御設計を記載 - 影響範囲とテスト観点を整理 * E2Eテストのfixture追加とスケルトン作成 - constants: manager, general用のauth jsonファイルパス追加 - login.setup.ts: manager, general用のログイン処理追加 - playwright.config.ts: manager, general用のプロジェクト追加 - E2Eテストスケルトン: staff, manager, general用のアクセス制御テスト - 仕様書: E2Eテスト計画を追記 * ユーザー情報アクセス制御を実装 - getUsersInShopにロール別フィルタリングを追加(generalはactiveのみ表示) - getUserByIdに制限ビュー対応を追加(他人は名前・役割のみ) - getUserShopsにアクセス制御を追加 - UserDetailコンポーネントに制限ビュー表示を実装 - StaffEditPageに権限チェックを追加 - E2Eテストを追加(owner/manager/general各ロール) - Storybookに制限ビューパターンを追加 * 制限ビュー時のメッセージを非表示に変更 - 権限がない場合は何も表示しない仕様に変更 - E2Eテストからメッセージ確認を削除 * E2Eテストのセレクタ修正とプロジェクト設定を調整 - スタッフ一覧のセレクタをCard.Root構造に合わせて修正 - Manager/General用プロジェクトを環境変数条件で有効化 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> * Claude/fix user info access 012c5 z somom4 ptgb5 zjgov tz (#188) * ユーザー情報アクセス制御の仕様書を追加 - 背景・課題、要件、実装方針をまとめた - 役割ベースのアクセス制御設計を記載 - 影響範囲とテスト観点を整理 * E2Eテストのfixture追加とスケルトン作成 - constants: manager, general用のauth jsonファイルパス追加 - login.setup.ts: manager, general用のログイン処理追加 - playwright.config.ts: manager, general用のプロジェクト追加 - E2Eテストスケルトン: staff, manager, general用のアクセス制御テスト - 仕様書: E2Eテスト計画を追記 * ユーザー情報アクセス制御を実装 - getUsersInShopにロール別フィルタリングを追加(generalはactiveのみ表示) - getUserByIdに制限ビュー対応を追加(他人は名前・役割のみ) - getUserShopsにアクセス制御を追加 - UserDetailコンポーネントに制限ビュー表示を実装 - StaffEditPageに権限チェックを追加 - E2Eテストを追加(owner/manager/general各ロール) - Storybookに制限ビューパターンを追加 * 制限ビュー時のメッセージを非表示に変更 - 権限がない場合は何も表示しない仕様に変更 - E2Eテストからメッセージ確認を削除 * E2Eテストのセレクタ修正とプロジェクト設定を調整 - スタッフ一覧のセレクタをCard.Root構造に合わせて修正 - Manager/General用プロジェクトを環境変数条件で有効化 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix --------- Co-authored-by: Claude <noreply@anthropic.com> * 画面遷移後に戻った際のタブ状態を維持する機能を追加 (#189) - 店舗詳細→ユーザー詳細、店舗詳細→招待画面への遷移時にfromTabパラメータを追加 - 戻るリンクにfromTabの値を引き継ぎ、タブ状態を復元 Co-authored-by: Claude <noreply@anthropic.com> * Refactor code for consistency and quality (#190) * コード一貫性を向上させるリファクタリング CLAUDE.mdルール準拠: - interface → type 変換 (color-mode.tsx, tooltip.tsx) - Function Declaration → Arrow Function 変換 - Promise.then → async/await 変換 (reportWebVitals.ts) エラーハンドリング統一: - console.error 削除、toaster.create に統一 - pages/Invite の責務分離 (useMutation を features に移動) - SendTab, UserRegister のエラーハンドリング統一 コンポーネント改善: - LoadingState 共通コンポーネント作成 - TopPage をセクションコンポーネントに分割 (643行 → 33行) - ShiftTemplateList の JSX ネスト削減と命名改善 アクセシビリティ改善: - ShiftTemplateForm の曜日選択を Badge → Button に変更 - MyPage のお知らせカードを Box → Button に変更 * 招待受け入れ時のレースコンディションを修正 問題: Convexのリアルタイム更新により、mutationが成功すると即座に invitation.isAcceptedがtrueになり、InvitePageがAlreadyAccepted を表示してしまう。LoggedIn内でAcceptedを表示する前にUIが切り替わる。 解決: - acceptedShop状態をInvitePageレベルで管理 - リアルタイム更新チェック前にローカル状態をチェック - LoggedInはonAcceptedコールバックで親に成功を通知 * フォーマット修正 --------- Co-authored-by: Claude <noreply@anthropic.com> * Add employee resignation feature for stores (#191) * スタッフ退職機能を実装 - shopUserBelongingsにresignedAt, resignationReasonフィールドを追加 - resignUserFromShop mutationを追加(権限チェック、自己退職禁止を含む) - StaffTabのステータスフィルターを retired から resigned に統一 - UserEditに退職処理モーダルを実装(退職理由の任意入力対応) - 退職機能の仕様書を追加 * 退職機能のE2Eテストを追加 - getShopsByAuthIdで退職済みユーザーの店舗を除外するように修正 - オーナーがスタッフを退職処理するE2Eテストを追加 - 退職後のgeneralユーザーが店舗一覧で店舗を見れないことを確認するテストを追加 - playwright.config.tsに退職後テストの依存関係を設定 * E2Eテストのセレクタを修正 getByText('退職処理')が複数要素にマッチするため、getByRole('button')を使用するように修正 * E2Eテストのフィルター待機ロジックを修正 退職済みフィルター適用後、スタッフ一覧または空メッセージのいずれかを待機するように修正 --------- Co-authored-by: Claude <noreply@anthropic.com> * Review E2E testing approach and efficiency (#192) * refactor: E2Eテストのナビゲーション処理を共通化 - e2e/helpers/navigation.ts: ナビゲーションヘルパー関数を追加 - e2e/helpers/staff-access-tests.ts: Owner/Manager共通テスト関数を追加 - 各テストファイルでヘルパーを使用するようリファクタ - playwright.config.ts: テスト間依存関係を明確化するコメントを追加 - 各テストファイルに依存関係のドキュメントコメントを追加 * fix: E2Eテストヘルパーの未使用パラメータを削除 - testFullStaffListVisible, testFullStaffDetailVisibleから未使用のroleパラメータを削除 - フォーマット修正を適用 --------- Co-authored-by: Claude <noreply@anthropic.com> * Review current store user editing features (#193) * スタッフ管理情報の編集機能を実装 - Convexスキーマに管理用フィールド追加(memo, workStyleNote, maxWorkingHoursPerMonth, hourlyWage) - getShopUserInfo query追加(owner/managerのみ閲覧可能) - updateShopUserInfo mutation追加(owner/managerのみ編集可能) - UserEditフォームをConvexに接続 - 働き方メモTextareaを新規追加(AIシフト作成用) - E2Eテスト追加(値変更・保存確認) * useQueryをpages配下に移動(コンポーネント責務の整理) - StaffEditPageでgetShopUserInfo、getShopByIdを呼び出すように変更 - UserEditはpropsでshopUserInfo、shopNameを受け取るように変更 - UserEditからuseQueryを削除 - Storybookの引数を更新 --------- Co-authored-by: Claude <noreply@anthropic.com> * タイムカードモックページを追加 (#194) 打刻機能、履歴表示、月間サマリーを含むタイムカードUIのモックを作成 Co-authored-by: Claude <noreply@anthropic.com> * fix: yml (#196) * Review code for refactoring opportunities (#195) * リファクタリング: コード品質改善 - スキーマ重複解消(ShopRegister/ShopEdit → ShopForm/schema.ts) - convex/helpers.ts拡張(共通ヘルパー関数・セキュアなトークン生成) - convex/shop.ts, invite.ts, user.tsでヘルパー関数を使用 - convex/user.tsでv.id()を使用・Promise.then()をasync/awaitに変換 - useAtom → useAtomValue最適化(読み取り専用の場合) - Storybookのanyコメント解消(Id型を適切にインポート) - isNumber → isDigitString命名改善 * fix(storybook): ダミールーターにキャッチオールルートを追加 Storybook内でLink to="/shops/$shopId"などの動的パスを使用する コンポーネントがエラーになる問題を修正 * fix(storybook): Pages層ストーリーのIDを有効なConvex ID形式に修正 Convexは"shop123"のようなIDを受け付けず、バリデーションエラーを 発生させていた。有効なConvex ID形式に修正 --------- Co-authored-by: Claude <noreply@anthropic.com> * Refactor Convex directory with better file structure (#197) * feat: Feature Slices + CQRSアーキテクチャのサンプル実装 convex/shop/配下にqueries.tsとmutations.tsを作成し、 読み取り操作と書き込み操作を分離するアーキテクチャパターンを示す * feat: policies.tsを追加しロール判定ロジックを集約 - shop/policies.ts: 権限判定の純粋関数を集約 - queries.ts/mutations.tsからpoliciesを参照するよう更新 - コロケーションパターンでドメイン内に閉じ込め * docs: Convexアーキテクチャ設計方針をCLAUDE.mdに追加 Feature Slices + CQRS + Policy Patternの設計方針を文書化 * refactor: Convexを Feature Slices + CQRS + Policy Patternに移行 - shop/, user/, invite/ ディレクトリに分割 - 各ドメインに queries.ts, mutations.ts, policies.ts を配置 - 旧ファイル (shop.ts, user.ts, invite.ts) を削除 - ロール判定ロジックを policies.ts に集約 * fix: フロントエンドのAPI参照を新しいディレクトリ構造に更新 - すべてのフロントエンドファイルでConvex APIパスを更新 - api.shop -> api.shop.queries/mutations - api.user -> api.user.queries/mutations - api.invite -> api.invite.queries/mutations - convex/_generated/api.d.tsを新しいディレクトリ構造に対応 - uniqueBy関数の型定義を改善(Record<string, unknown> -> object) - Biomeによるフォーマット適用 --------- Co-authored-by: Claude <noreply@anthropic.com> * chore(deps): update dependency @biomejs/biome to v2.3.8 (#198) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @clerk/testing to v1.13.19 (#199) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @tanstack/react-devtools to v0.8.2 (#200) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Review and plan product direction changes (#204) * docs: プロダクト方向性v2を追加 スタッフ認証をマジックリンク方式に変更する方針を文書化 - スタッフのアカウント登録不要化 - タイムカード・勤怠機能の削除 - スキル管理、週労働時間上限の追加 - 時間帯別必要人員設定(未確定) * docs: 旧仕様からv2へのリンクを追加 * docs: v2移行作業の範囲をまとめたドキュメントを追加 * feat: Phase 1 - タイムカード・勤怠機能削除、useTimeCard削除 - routes: timecard.tsx, attendance.tsx 削除 - components: Timecard/, AttendanceTab/, TimecardPage/ 削除 - schema: shops.useTimeCard フィールド削除 - ShopForm: useTimeCard関連のUI・バリデーション削除 - Convex API: create/update からuseTimeCard引数削除 - stories: 各種storiesファイルからuseTimeCard削除 - docs: Phase 1-4の移行作業ドキュメント追加 * fix: シードデータからuseTimeCard削除 スキーマ変更に合わせてシードデータを更新 * fix: メニューから勤怠記録リンク削除 BottomMenu, SideMenuから/attendanceへのリンクを削除 * feat: Phase 2 - staffsテーブル追加、スキル関連定数追加 - shopUserBelongingsテーブルをstaffsテーブルに変更 - skills, maxWeeklyHoursフィールド追加 - スキル関連の定数をconvex/constants.tsに追加 * refactor: Phase 3 - API修正(ロール制御から所有者制御へ) - helpers.ts: isShopOwner, requireShopOwner追加 - shop/queries.ts: listStaffsに変更、所有者チェック追加 - shop/mutations.ts: addStaff, resignStaff, updateStaffInfoに変更 - user/queries.ts: 不要なクエリを削除 * remove: ポリシーファイルとinvite機能を削除 - shop/policies.ts: ロールベースポリシー削除 - user/policies.ts: 不要なポリシー削除 - invite/: 旧招待機能を完全削除 * refactor: フロントエンドコンポーネントをstaffsモデルに対応 - ShopDetail: userRoleをisOwnerに変更、usersをstaffsに変更 - ShopEdit: userRoleをisOwnerに変更 - ShopList: ロールバッジと招待メッセージを削除 - StaffTab: 新しいStaffType構造に対応、スキル表示追加 - AuthGuard: /welcomeから/shopsへリダイレクト変更 - convertShopData: convertRole関数を削除 * remove: User機能コンポーネントを削除 - UserDetail: 旧ユーザー詳細画面削除 - UserEdit: 旧ユーザー編集画面削除 - UserRegister: 旧ユーザー登録画面削除 - Join: 招待参加画面削除 * refactor: ページコンポーネントをstaffsモデルに対応 - DetailPage: listStaffsクエリ使用、isOwner計算に変更 - EditPage: isOwner計算に変更 - ListPage: canCreateクエリを削除 - 不要なページ削除: InvitePage, WelcomePage, Staffs関連 * remove: 不要なルートを削除 - /shops/$shopId/invite: 招待ページルート削除 - /shops/$shopId/staff: 旧スタッフルート削除 - /shops/$shopId/staffs: スタッフ管理ルート削除 - /invite: 招待参加ルート削除 - /welcome: ウェルカムページルート削除 * style: フォーマット修正 * fix: モバイルメニューのログインボタンが動作しない問題を修正 SignInButtonでラップされていなかったモバイルメニュー内の ログインボタンを修正 * fix: 新規ユーザーログイン時に画面が真っ白になる問題を修正 - user/mutations.ts: getOrCreate mutation追加(既存ユーザー取得または新規作成) - AuthGuard: 新規ユーザーを自動作成するロジック追加 - Clerkでログイン後、Convexにユーザーレコードがない場合は自動作成 --------- Co-authored-by: Claude <noreply@anthropic.com> * Analyze and fix failing end-to-end tests (#209) * refactor(e2e): v2移行に伴うE2Eテストの再構築 ## 変更内容 ### seedデータのv2スキーマ対応 - shopUserBelongings.jsonl → staffs.jsonl に変換 - users.jsonlからuserB(テストユーザーB)を削除(新規店長テスト用) - Manager/Generalユーザーを削除(v2では権限区分廃止) ### 削除したテスト(v2で不要) - shop/invite.test.ts(Clerk招待→マジックリンクに変更) - staff/access-control.test.ts(権限区分廃止) - staff/edit.test.ts(編集UI未実装) - staff/resign.test.ts(退職UI未実装) - userB/accept.test.ts(招待受け入れ廃止) - manager/staff-access.test.ts(Manager権限廃止) - general/staff-access.test.ts(General権限廃止) - general/after-resign.test.ts(General権限廃止) ### 新規作成したテスト - shop/list.test.ts: 店舗一覧表示、遷移 - shop/detail.test.ts: 店舗詳細、タブ切替、編集遷移 - shop/edit.test.ts: 店舗情報編集、保存 - staff/list.test.ts: スタッフ一覧、検索、フィルター - userB/new-owner.test.ts: 新規店長の初回ログイン〜店舗登録 ### 設定ファイル修正 - playwright.config.ts: Manager/General project削除 - login.setup.ts: Manager/Generalログイン削除 - constants/index.ts: 不要な定数削除 - helpers/navigation.ts: 不要なヘルパー関数削除 * fix(e2e): lint/type-checkエラーを修正 - 未使用インポートを削除(goToStaffTab, goToFirstShop) - Number.parseIntにradixパラメータを追加 * fix(e2e): Link内ButtonのgetByRole修正 「〜に戻る」ボタンはLink内のButtonなのでgetByRole("button")に修正 * fix * fi * fix: test * fix * fix --------- Co-authored-by: Claude <noreply@anthropic.com> * fix (#210) * Fix/claudemd (#211) * fix * fix: skills * fix * fix * fix * fix(deps): update tanstack-router monorepo to v1.139.12 (#203) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/react to v19.2.7 (#201) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency zod to v4.1.13 (#202) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update playwright monorepo to v1.57.0 (#205) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Design store manager invitation system (#212) * feat: マネージャー招待機能を実装 - Convexスキーマにrole, inviteToken, inviteExpiresAtフィールドを追加 - 招待関連の定数(STAFF_ROLES, INVITE_EXPIRY_DAYS等)を追加 - 招待用ヘルパー関数(getStaffByInviteToken, isShopOwnerOrManager等)を追加 - convex/invite/ に招待のミューテーション・クエリを実装 - create: 招待作成 - accept: 招待受け入れ - cancel: 招待キャンセル - resend: 招待再送 - getByToken: トークンで招待情報取得 - listByShopId: 店舗の招待一覧取得 - ManagerInviteModal: 招待作成モーダルコンポーネント - InvitePage: 招待受け入れページ(/invite?token=xxx) - StaffTabにマネージャー招待ボタンを追加 Note: npx convex dev を実行して型生成が必要です * feat: InvitePageのStorybookを追加 - Basic: トークンありの場合 - NoToken: トークンなしの場合(エラー表示) * chore: 自動生成ファイルを更新 - convex/_generated/api.d.ts: invite モジュールを追加 - src/routeTree.gen.ts: /invite ルートを追加 * refactor: マネージャー招待モーダルからロール選択を削除 招待されるのはマネージャーのみのため、ロール選択UIを削除し 固定でmanagerロールとして招待するように変更 * test: マネージャー招待機能のE2Eテストを追加 - 招待作成テスト(メインユーザー) - モーダルの開閉テスト - 招待リンク作成テスト - 必須項目バリデーションテスト - tmpファイルへのURL保存テスト(クロスユーザーテスト用) - 招待受け入れテスト(サブユーザー) - 招待リンクから店舗に参加できることのテスト - 無効なトークンのエラーハンドリングテスト - トークンなしのエラーハンドリングテスト - ヘルパー関数とtmpファイルパス定数を追加 * fix: E2Eテストのlocatorを修正 - [font-family="mono"]属性セレクタがChakra UIで機能しないためgetByTextに変更 * fix * fix: empty * fix: e2e * fix * fix * fix * fix * fix --------- Co-authored-by: Claude <noreply@anthropic.com> * fix(deps): update dependency @clerk/clerk-react to v5.57.1 (#206) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update actions/github-script action to v8 (#208) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @clerk/testing to v1.13.21 (#213) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency vite to v7.2.6 (#214) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency jotai to v2.15.2 (#215) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update react monorepo to v19.2.1 (#216) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo (#217) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency tsx to v4.21.0 (#218) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.58.0 (#219) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency convex to v1.30.0 (#220) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.140.0 (#221) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency react-hook-form to v7.68.0 (#207) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix: renovate (#222) * Feat/1209 (#223) * fix * fix * chore(deps): update dependency @clerk/testing to v1.13.23 (#224) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @tanstack/react-devtools to v0.8.4 (#225) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/node to v24.10.3 (#226) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @vitejs/plugin-react to v5.1.2 (#227) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency vite to v7.2.7 (#228) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.58.1 (#229) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update react monorepo to v19.2.3 (#230) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency jsdom to v27.3.0 (#231) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency convex to v1.31.1 (#232) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/node to v24.10.4 (#237) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency jotai to v2.16.0 (#233) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo (#234) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update actions/cache action to v5 (#235) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update actions/upload-artifact action to v6 (#236) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @biomejs/biome to v2.3.10 (#238) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @clerk/testing to v1.13.26 (#239) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @testing-library/react to v16.3.1 (#240) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update storybook monorepo to v9.1.17 (#241) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency convex to v1.31.2 (#242) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Feat/1222 (#249) * chore: ui * fix: toolbar(wip) * fix * fix: sidebar * fix: toolbar * fix: メンバーを追加ボタン * fix * fix * fix * fix * fix(deps): update tanstack-router monorepo (#243) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency vite to v7.3.0 (#244) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @clerk/clerk-react to v5.59.2 (#245) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency react-hook-form to v7.69.0 (#246) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency zod to v4.2.1 (#247) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency vite-tsconfig-paths to v6 (#248) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Feat/0105 (#250) * fix * fix * fix * fix(deps): update dependency jotai to v2.16.1 (#251) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @tanstack/react-devtools to v0.9.0 (#252) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency jsdom to v27.4.0 (#253) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.143.11 (#254) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update tanstack-router monorepo to v1.144.0 (#255) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Feat/0113 (#256) * feat: shop change * feat: 募集ページ * feat: shift recruit mocks * feat: mock (#257) * Feat/0120 (#258) * tmp * fix * feat * fix * feat: シフトテーブルUI改善・ソート機能・充足度グラデーション表示 (#259) * fix: time span * fix: vertical line * feat: md * fix: toolbar * fix: toolbar * feat: summary as gradation color * fix: 充足度合計 * fix: add colors to gradation * chore * fix: tab * fix: resize * del: right click menu * tmp * fix * fix * feat: sort * fix: sort * fix: fixed table (WIP) * fix: footer space * fix: radius * fix: border * fix: height * fix: spec * Feat/0128 (#260) * fix: staff modal * fix: content * fix: toolbar * fix * fix: 微調整 * fix * Feat/0128 (#261) * fix: staff modal * fix: content * fix: toolbar * fix * fix: 微調整 * fix * feat: overview * fix: matrix (#262) * feat: シフト俯瞰ビュー切替・統一ソート・バグ修正 (#263) * feat: claude * feat: over view * fix * fix * feat: ShiftForm リファクタリング(統合・旧コンポーネント削除) (#264) * fix: SP * fix: Shift SP * sp * fix: read only mode * feat: refactor * fix: phase1 * feat: phase2 * fix: phase3 * f * feat: StaffingRequirement UX改善(リネーム・祝日追加・曜日カラーリング・新コンポーネント) (#265) * fix * fix: add sp storybook * feat: staffing requirement * fix * fix * feat: StaffingRequirement UX改善・SP対応・仕様書更新 (#266) * f * fix * fix * feat: スタッフ用シフト提出ページ + 募集メール送信機能 (#267) * fix: スタッフ一覧のマネージャーバッジを上下中央寄せ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: シフト募集CREATE バックエンド実装 recruitmentsテーブル追加・create mutation作成・フロントエンド接続 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: スタッフ詳細ページの重複表示を解消しレイアウト修正 Title内の重複アバター・名前を削除し、編集ボタンをStaffDetailContentの ヘッダー行(アバター+名前の右端)に移動。スキル表示をチップスタイルに変更。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: シフト管理画面をDB接続(モックデータ削除) recruitment queries作成・ShiftsPageでuseQueryに切り替え Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: シフト募集一覧を開始日の降順ソートに変更・募集詳細UIリファクタ - recruitmentsテーブルにby_shop_and_startDateインデックス追加 - listByShopクエリでバックエンド側降順ソートを実装 - フロントエンドの冗長なソート処理を削除 - RecruitmentDetailのレイアウトをTitle/Card/Animation構成に統一 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: シフト募集詳細レイアウト改善・テーブル背景色被り修正 - RecruitmentDetailにContainer/Title/Animation標準パターンを適用 - ボタンを「締切・編集へ」1つに統合(LuPencilLine + teal) - テーブル構造要素のbg="gray.50"→"white"に変更(ページ背景との境界明確化) - ShiftForm内部のpx={4}を削除しpadding責務を呼び出し側に移動 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: シフト募集開始時のメール送信機能を追加 Resend + Convex Action で募集作成時にスタッフへメール通知する基盤を構築。 - convex/email/actions.ts: Resend APIによるメール送信internalAction - convex/recruitment/mutations.ts: magicLink生成・メール送信スケジュール追加 - scripts/setupEnv.ts: .envからConvex環境変数を一括設定するスクリプト Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: implement shift submit page flow and UX copy * feat: ShiftSubmit関連コンポーネントのStorybook追加 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: Storybookから未インストールの@storybook/test依存を削除 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * feat: シフト募集・申請・確定フローの実装とmagicLinksテーブル導入 (#268) * fix: スタッフ一覧のマネージャーバッジを上下中央寄せ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: シフト募集CREATE バックエンド実装 recruitmentsテーブル追加・create mutation作成・フロントエンド接続 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: スタッフ詳細ページの重複表示を解消しレイアウト修正 Title内の重複アバター・名前を削除し、編集ボタンをStaffDetailContentの ヘッダー行(アバター+名前の右端)に移動。スキル表示をチップスタイルに変更。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: シフト管理画面をDB接続(モックデータ削除) recruitment queries作成・ShiftsPageでuseQueryに切り替え Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: シフト募集一覧を開始日の降順ソートに変更・募集詳細UIリファクタ - recruitmentsテーブルにby_shop_and_startDateインデックス追加 - listByShopクエリでバックエンド側降順ソートを実装 - フロントエンドの冗長なソート処理を削除 - RecruitmentDetailのレイアウトをTitle/Card/Animation構成に統一 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: シフト募集詳細レイアウト改善・テーブル背景色被り修正 - RecruitmentDetailにContainer/Title/Animation標準パターンを適用 - ボタンを「締切・編集へ」1つに統合(LuPencilLine + teal) - テーブル構造要素のbg="gray.50"→"white"に変更(ページ背景との境界明確化) - ShiftForm内部のpx={4}を削除しpadding責務を呼び出し側に移動 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: シフト募集開始時のメール送信機能を追加 Resend + Convex Action で募集作成時にスタッフへメール通知する基盤を構築。 - convex/email/actions.ts: Resend APIによるメール送信internalAction - convex/recruitment/mutations.ts: magicLink生成・メール送信スケジュール追加 - scripts/setupEnv.ts: .envからConvex環境変数を一括設定するスクリプト Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: implement shift submit page flow and UX copy * feat: ShiftSubmit関連コンポーネントのStorybook追加 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: Storybookから未インストールの@storybook/test依存を削除 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * add: pen file * feat: シフト編集・確定 * fix * del --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * refactor: コード重複解消・責務分離・N+1クエリ最適化 (#269) * refactor: コード重複解消・責務分離・N+1クエリ最適化 - convex/helpers.ts と position/mutations.ts の重複関数を一本化 - shop/mutations.ts からスタッフ操作を staff/mutations.ts に分離 - staffSkill/queries.ts の listByShop でポジション一括取得に最適化 - PositionManager/PositionEditor の共通部品を抽出(SortablePositionItem, PositionAddForm, validatePositionName) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * `chore: @yn1323/cognac導入と設定ファイル追加` --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * f * Feat/0323 (#270) * chore: 不要スキルの削除(create-pr, doc-update, resume-plan, save-plan) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: commitスキルの追加(自動コミット分割) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: CLAUDE.mdの説明充実・自動生成ファイルの注意事項追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: 充足度の数値表示がグリッドラインとずれる問題を修正 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: discussスキルの追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: ShiftFormデザインガイド・デザインファイルの追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: ShiftForm DailyViewの消しゴムモード削除・空状態ガイド追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: Claude Code権限設定の更新・discussスキルの改善 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: ShiftForm情報設計プランの追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: undo/redo・toolMode・scrollDragの廃止とPositionToolbar簡素化 情報設計改善プランStep1: selectモード・undo/redo・スクロールドラッグを削除し、 ポジションボタンのみのシンプルなツールバーに変更。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ポジション間ギャップの休憩ストライプ表示 情報設計改善プランStep2: computeVisualBreaksでポジション間の空き時間を検出し、 ストライプパターンで休憩を可視化。PC・SP両対応。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ピーク帯設定・充足度アラート・DateTabsバッジの追加 情報設計改善プランStep3-5: ピーク帯定義+最低人員の簡易入力モード、 DailyView/OverviewViewの充足度アラート表示、DateTabsの曜日色分け・⚠️/✅バッジ。 dateStatuses計算をuseDateStatuses hookに共通化。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: StaffEditModalの参照専用モード追加 情報設計改善プランStep7: viewOnly propでShiftFormからの スタッフ名クリック時は参照のみ表示に変更。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: 実装ルールの追加 lint・type-check・test実行後の/simplify実行を必須化。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: ShiftFormのドラッグ操作時にカーソルがcrosshairに変わる挙動を削除 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ポジションバーのホバーカーソルとPopoverの時間順ソートを追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: ドラッグ操作後の同一ポジション隣接セグメントが統合されない問題を修正 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: SummaryFooterRowのラベルを「出勤数」から「人数」に変更 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: ポジション色バーのホバー時にcursor: pointerが表示されない問題を修正 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ShiftForm日別ビューのUI改善(二重テキスト削除・ホバー強化・時刻ラベル視認性・タブ強調) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ShiftFormのUI全体改善(充足度バー未着手グレー化・一覧ビュートーンダウン・ガイドバーアニメーション・ツールバー背景色) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ShiftFormのビュー切替とポジション選択を統合ツールバーに集約 ビュー切替(日別/一覧)とポジションボタンを1本のツールバーにまとめ、 視覚的な散漫さを解消。日付タブのbold削除・ツールバー高さ固定で レイアウトシフトも防止。一覧ビューのborderRadiusもlgに統一。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: CLAUDE.mdのデザインセクションをdoc/design/構成に更新 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * f * f * feat: 必要人員設定のヘッダーアイコン追加と休日タブのフォント色を赤に変更 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: convex自動生成ファイルのimport順序更新 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: デザインシステムの.penファイルを追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: 未使用のStaffingRequirementを削除し、必要なファイルをPeakBandSettingsに移動 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: スタッフからmaxWeeklyHoursとhourlyWageフィールドを削除 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: スタッフ閲覧画面でメモ欄を常時表示し、未入力時は「記入なし」を表示 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: スタッフからmaxWeeklyHoursとhourlyWageフィールドを削除 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: ピーク帯設定のバリデーション追加とUI改善 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: CLAUDE.mdにコンポーネント分割ルール追加、biomeスキーマ更新 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: ピーク帯設定バグ修正の計画ドキュメント追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * f --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update wrangler config name to dev-yps-crispy-carnival * Feat/0323 (#274) * chore: 不要スキルの削除(create-pr, doc-update, resume-plan, save-plan) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: commitスキルの追加(自動コミット分割) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: CLAUDE.mdの説明充実・自動生成ファイルの注意事項追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: 充足度の数値表示がグリッドラインとずれる問題を修正 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: discussスキルの追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: ShiftFormデザインガイド・デザインファイルの追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: ShiftForm DailyViewの消しゴムモード削除・空状態ガイド追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: Claude Code権限設定の更新・discussスキルの改善 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: ShiftForm情報設計プランの追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: undo/redo・toolMode・scrollDragの廃止とPositionToolbar簡素化 情報設計改善プランStep1: selectモード・undo/redo・スクロールドラッグを削除し、 ポジションボタンのみのシンプルなツールバーに変更。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ポジション間ギャップの休憩ストライプ表示 情報設計改善プランStep2: computeVisualBreaksでポジション間の空き時間を検出し、 ストライプパターンで休憩を可視化。PC・SP両対応。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ピーク帯設定・充足度アラート・DateTabsバッジの追加 情報設計改善プランStep3-5: ピーク帯定義+最低人員の簡易入力モード、 DailyView/OverviewViewの充足度アラート表示、DateTabsの曜日色分け・⚠️/✅バッジ。 dateStatuses計算をuseDateStatuses hookに共通化。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: StaffEditModalの参照専用モード追加 情報設計改善プランStep7: viewOnly propでShiftFormからの スタッフ名クリック時は参照のみ表示に変更。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: 実装ルールの追加 lint・type-check・test実行後の/simplify実行を必須化。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: ShiftFormのドラッグ操作時にカーソルがcrosshairに変わる挙動を削除 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ポジションバーのホバーカーソルとPopoverの時間順ソートを追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: ドラッグ操作後の同一ポジション隣接セグメントが統合されない問題を修正 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: SummaryFooterRowのラベルを「出勤数」から「人数」に変更 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: ポジション色バーのホバー時にcursor: pointerが表示されない問題を修正 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ShiftForm日別ビューのUI改善(二重テキスト削除・ホバー強化・時刻ラベル視認性・タブ強調) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ShiftFormのUI全体改善(充足度バー未着手グレー化・一覧ビュートーンダウン・ガイドバーアニメーション・ツールバー背景色) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ShiftFormのビュー切替とポジション選択を統合ツールバーに集約 ビュー切替(日別/一覧)とポジションボタンを1本のツールバーにまとめ、 視覚的な散漫さを解消。日付タブのbold削除・ツールバー高さ固定で レイアウトシフトも防止。一覧ビューのborderRadiusもlgに統一。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: CLAUDE.mdのデザインセクションをdoc/design/構成に更新 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * f * f * chore: v2のConvexバックエンドを削除・スキーマ簡素化 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: v3プロダクト定義書・Convexアーキテクチャ規約の追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: v2の不要コードを一括削除 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: v3に向けたコード簡素化(ShiftForm・テンプレート・ルーティング) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ダッシュボードページの追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: ShiftFormのドラッグ操作・SP版シフト編集を簡素化 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: v3再構築に向けた旧ドキュメントの一括削除 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: ARCHITECTURE.md・INDEX.mdを現在のコードベース実態に合わせて更新 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: プロダクト定義書の追加 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: プロダクト定義書のファイル名に日付プレフィックスを付与 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 情報設計書の追加 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * doc * chore: Chakra UIテーマ設定ファイルの追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: デザイン関連ファイルをdesign/ディレクトリに整理 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: system.penにリユーザブルコンポーネントとインデックスを追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: CLAUDE.mdにペルソナとレイアウトルールを追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: デザインファイルのリネームとダッシュボード画面の追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: デザインインデックスのSP画面ID追加とContentWrapperコンポーネント定義 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ContentWrapperテンプレートコンポーネントの作成 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ダッシュボード画面の実装(モックデータ版) 募集セクション・スタッフセクション・作成/追加モーダルを含む レスポンシブ対応(PC: Dialog / SP: BottomSheet) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: BottomSheetにアクションボタン(送信・キャンセル)を追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ダッシュボード画面のUI改善 募集カードにシフトボード遷移ボタン・日付フォーマット・ステータス表示を改善。 募集フォームのフィールドラベル整理、スタッフ一覧の簡素化、statusをcompletedに変更。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: CLAUDE.mdの実装ルール説明を更新 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: BottomSheetデザインにアクションボタン(送信・キャンセル)を追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: ダッシュボード画面のSPデザインを追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: concurrentlyを導入しdev:allスクリプトを追加 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: セキュリティ・認証設計書を追加し関連ドキュメントを更新 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: シフトボードのUX設計書…
1 parent bc98d0e commit 4834b4a

File tree

561 files changed

+80078
-5747
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

561 files changed

+80078
-5747
lines changed
Lines changed: 284 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,284 @@
1+
---
2+
name: convex-create-component
3+
description: Designs and builds Convex components with isolated tables, clear boundaries, and app-facing wrappers. Use this skill when creating a new Convex component, extracting reusable backend logic into a component, building a third-party integration that owns its own tables, packaging Convex functionality for reuse, or when the user mentions defineComponent, app.use, ComponentApi, ctx.runQuery/runMutation across component boundaries, or wants to separate concerns into isolated Convex modules.
4+
---
5+
6+
# Convex Create Component
7+
8+
Create reusable Convex components with clear boundaries and a small app-facing API.
9+
10+
## When to Use
11+
12+
- Creating a new Convex component in an existing app
13+
- Extracting reusable backend logic into a component
14+
- Building a third-party integration that should own its own tables and workflows
15+
- Packaging Convex functionality for reuse across multiple apps
16+
17+
## When Not to Use
18+
19+
- One-off business logic that belongs in the main app
20+
- Thin utilities that do not need Convex tables or functions
21+
- App-level orchestration that should stay in `convex/`
22+
- Cases where a normal TypeScript library is enough
23+
24+
## Workflow
25+
26+
1. Ask the user what they are building and what the end goal is. If the repo already makes the answer obvious, say so and confirm before proceeding.
27+
2. Choose the shape using the decision tree below and read the matching reference file.
28+
3. Decide whether a component is justified. Prefer normal app code or a regular library if the feature does not need isolated tables, backend functions, or reusable persistent state.
29+
4. Make a short plan for:
30+
- what tables the component owns
31+
- what public functions it exposes
32+
- what data must be passed in from the app (auth, env vars, parent IDs)
33+
- what stays in the app as wrappers or HTTP mounts
34+
5. Create the component structure with `convex.config.ts`, `schema.ts`, and function files.
35+
6. Implement functions using the component's own `./_generated/server` imports, not the app's generated files.
36+
7. Wire the component into the app with `app.use(...)`. If the app does not already have `convex/convex.config.ts`, create it.
37+
8. Call the component from the app through `components.<name>` using `ctx.runQuery`, `ctx.runMutation`, or `ctx.runAction`.
38+
9. If React clients, HTTP callers, or public APIs need access, create wrapper functions in the app instead of exposing component functions directly.
39+
10. Run `npx convex dev` and fix codegen, type, or boundary issues before finishing.
40+
41+
## Choose the Shape
42+
43+
Ask the user, then pick one path:
44+
45+
| Goal | Shape | Reference |
46+
|------|-------|-----------|
47+
| Component for this app only | Local | `references/local-components.md` |
48+
| Publish or share across apps | Packaged | `references/packaged-components.md` |
49+
| User explicitly needs local + shared library code | Hybrid | `references/hybrid-components.md` |
50+
| Not sure | Default to local | `references/local-components.md` |
51+
52+
Read exactly one reference file before proceeding.
53+
54+
## Default Approach
55+
56+
Unless the user explicitly wants an npm package, default to a local component:
57+
58+
- Put it under `convex/components/<componentName>/`
59+
- Define it with `defineComponent(...)` in its own `convex.config.ts`
60+
- Install it from the app's `convex/convex.config.ts` with `app.use(...)`
61+
- Let `npx convex dev` generate the component's own `_generated/` files
62+
63+
## Component Skeleton
64+
65+
A minimal local component with a table and two functions, plus the app wiring.
66+
67+
```ts
68+
// convex/components/notifications/convex.config.ts
69+
import { defineComponent } from "convex/server";
70+
71+
export default defineComponent("notifications");
72+
```
73+
74+
```ts
75+
// convex/components/notifications/schema.ts
76+
import { defineSchema, defineTable } from "convex/server";
77+
import { v } from "convex/values";
78+
79+
export default defineSchema({
80+
notifications: defineTable({
81+
userId: v.string(),
82+
message: v.string(),
83+
read: v.boolean(),
84+
}).index("by_user", ["userId"]),
85+
});
86+
```
87+
88+
```ts
89+
// convex/components/notifications/lib.ts
90+
import { v } from "convex/values";
91+
import { mutation, query } from "./_generated/server.js";
92+
93+
export const send = mutation({
94+
args: { userId: v.string(), message: v.string() },
95+
returns: v.id("notifications"),
96+
handler: async (ctx, args) => {
97+
return await ctx.db.insert("notifications", {
98+
userId: args.userId,
99+
message: args.message,
100+
read: false,
101+
});
102+
},
103+
});
104+
105+
export const listUnread = query({
106+
args: { userId: v.string() },
107+
returns: v.array(
108+
v.object({
109+
_id: v.id("notifications"),
110+
_creationTime: v.number(),
111+
userId: v.string(),
112+
message: v.string(),
113+
read: v.boolean(),
114+
})
115+
),
116+
handler: async (ctx, args) => {
117+
return await ctx.db
118+
.query("notifications")
119+
.withIndex("by_user", (q) => q.eq("userId", args.userId))
120+
.filter((q) => q.eq(q.field("read"), false))
121+
.collect();
122+
},
123+
});
124+
```
125+
126+
```ts
127+
// convex/convex.config.ts
128+
import { defineApp } from "convex/server";
129+
import notifications from "./components/notifications/convex.config.js";
130+
131+
const app = defineApp();
132+
app.use(notifications);
133+
134+
export default app;
135+
```
136+
137+
```ts
138+
// convex/notifications.ts (app-side wrapper)
139+
import { v } from "convex/values";
140+
import { mutation, query } from "./_generated/server";
141+
import { components } from "./_generated/api";
142+
import { getAuthUserId } from "@convex-dev/auth/server";
143+
144+
export const sendNotification = mutation({
145+
args: { message: v.string() },
146+
returns: v.null(),
147+
handler: async (ctx, args) => {
148+
const userId = await getAuthUserId(ctx);
149+
if (!userId) throw new Error("Not authenticated");
150+
151+
await ctx.runMutation(components.notifications.lib.send, {
152+
userId,
153+
message: args.message,
154+
});
155+
return null;
156+
},
157+
});
158+
159+
export const myUnread = query({
160+
args: {},
161+
handler: async (ctx) => {
162+
const userId = await getAuthUserId(ctx);
163+
if (!userId) throw new Error("Not authenticated");
164+
165+
return await ctx.runQuery(components.notifications.lib.listUnread, {
166+
userId,
167+
});
168+
},
169+
});
170+
```
171+
172+
Note the reference path shape: a function in `convex/components/notifications/lib.ts` is called as `components.notifications.lib.send` from the app.
173+
174+
## Critical Rules
175+
176+
- Keep authentication in the app, because `ctx.auth` is not available inside components.
177+
- Keep environment access in the app, because component functions cannot read `process.env`.
178+
- Pass parent app IDs across the boundary as strings, because `Id` types become plain strings in the app-facing `ComponentApi`.
179+
- Do not use `v.id("parentTable")` for app-owned tables inside component args or schema, because the component has no access to the app's table namespace.
180+
- Import `query`, `mutation`, and `action` from the component's own `./_generated/server`, not the app's generated files.
181+
- Do not expose component functions directly to clients. Create app wrappers when client access is needed, because components are internal and need auth/env wiring the app provides.
182+
- If the component defines HTTP handlers, mount the routes in the app's `convex/http.ts`, because components cannot register their own HTTP routes.
183+
- If the component needs pagination, use `paginator` from `convex-helpers` instead of built-in `.paginate()`, because `.paginate()` does not work across the component boundary.
184+
- Add `args` and `returns` validators to all public component functions, because the component boundary requires explicit type contracts.
185+
186+
## Patterns
187+
188+
### Authentication and environment access
189+
190+
```ts
191+
// Bad: component code cannot rely on app auth or env
192+
const identity = await ctx.auth.getUserIdentity();
193+
const apiKey = process.env.OPENAI_API_KEY;
194+
```
195+
196+
```ts
197+
// Good: the app resolves auth and env, then passes explicit values
198+
const userId = await getAuthUserId(ctx);
199+
if (!userId) throw new Error("Not authenticated");
200+
201+
await ctx.runAction(components.translator.translate, {
202+
userId,
203+
apiKey: process.env.OPENAI_API_KEY,
204+
text: args.text,
205+
});
206+
```
207+
208+
### Client-facing API
209+
210+
```ts
211+
// Bad: assuming a component function is directly callable by clients
212+
export const send = components.notifications.send;
213+
```
214+
215+
```ts
216+
// Good: re-export through an app mutation or query
217+
export const sendNotification = mutation({
218+
args: { message: v.string() },
219+
returns: v.null(),
220+
handler: async (ctx, args) => {
221+
const userId = await getAuthUserId(ctx);
222+
if (!userId) throw new Error("Not authenticated");
223+
224+
await ctx.runMutation(components.notifications.lib.send, {
225+
userId,
226+
message: args.message,
227+
});
228+
return null;
229+
},
230+
});
231+
```
232+
233+
### IDs across the boundary
234+
235+
```ts
236+
// Bad: parent app table IDs are not valid component validators
237+
args: { userId: v.id("users") }
238+
```
239+
240+
```ts
241+
// Good: treat parent-owned IDs as strings at the boundary
242+
args: { userId: v.string() }
243+
```
244+
245+
### Advanced Patterns
246+
247+
For additional patterns including function handles for callbacks, deriving validators from schema, static configuration with a globals table, and class-based client wrappers, see `references/advanced-patterns.md`.
248+
249+
## Validation
250+
251+
Try validation in this order:
252+
253+
1. `npx convex codegen --component-dir convex/components/<name>`
254+
2. `npx convex codegen`
255+
3. `npx convex dev`
256+
257+
Important:
258+
259+
- Fresh repos may fail these commands until `CONVEX_DEPLOYMENT` is configured.
260+
- Until codegen runs, component-local `./_generated/*` imports and app-side `components.<name>...` references will not typecheck.
261+
- If validation blocks on Convex login or deployment setup, stop and ask the user for that exact step instead of guessing.
262+
263+
## Reference Files
264+
265+
Read exactly one of these after the user confirms the goal:
266+
267+
- `references/local-components.md`
268+
- `references/packaged-components.md`
269+
- `references/hybrid-components.md`
270+
271+
Official docs: [Authoring Components](https://docs.convex.dev/components/authoring)
272+
273+
## Checklist
274+
275+
- [ ] Asked the user what they want to build and confirmed the shape
276+
- [ ] Read the matching reference file
277+
- [ ] Confirmed a component is the right abstraction
278+
- [ ] Planned tables, public API, boundaries, and app wrappers
279+
- [ ] Component lives under `convex/components/<name>/` (or package layout if publishing)
280+
- [ ] Component imports from its own `./_generated/server`
281+
- [ ] Auth, env access, and HTTP routes stay in the app
282+
- [ ] Parent app IDs cross the boundary as `v.string()`
283+
- [ ] Public functions have `args` and `returns` validators
284+
- [ ] Ran `npx convex dev` and fixed codegen or type issues
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
interface:
2+
display_name: "Convex Create Component"
3+
short_description: "Design and build reusable Convex components with clear boundaries."
4+
icon_small: "./assets/icon.svg"
5+
icon_large: "./assets/icon.svg"
6+
brand_color: "#14B8A6"
7+
default_prompt: "Help me create a Convex component for this feature. First check that a component is actually justified, then design the tables, API surface, and app-facing wrappers before implementing it."
8+
9+
policy:
10+
allow_implicit_invocation: true
Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)