create-einja-app 0.2.15 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/package.json +2 -2
  2. package/templates/default/.claude/hooks/einja/biome-format.sh +2 -2
  3. package/templates/default/.claude/hooks/einja/playwright-resize.sh +12 -2
  4. package/templates/default/.claude/settings.json +15 -0
  5. package/templates/default/.cursor/commands/task-vibe-kanban-loop.md +107 -42
  6. package/templates/default/.env.develop +0 -4
  7. package/templates/default/.env.example +1 -0
  8. package/templates/default/.env.preview +0 -4
  9. package/templates/default/.env.staging +19 -0
  10. package/templates/default/.github/actions/ci/action.yml +39 -0
  11. package/templates/default/.github/actions/migrate/action.yml +39 -0
  12. package/templates/default/.github/actions/neon-export-env/action.yml +28 -0
  13. package/templates/default/.github/actions/setup/action.yml +20 -0
  14. package/templates/default/.github/workflows/claude.yml +1 -0
  15. package/templates/default/.github/workflows/{cleanup-neon-branches.yml → cleanup-pr-preview-db.yml} +28 -24
  16. package/templates/default/.github/workflows/cleanup-pr-preview-on-close.yml +50 -0
  17. package/templates/default/.github/workflows/deploy-pr-preview.yml +398 -0
  18. package/templates/default/.github/workflows/deploy-stable-branches.yml +259 -0
  19. package/templates/default/.github/workflows/release-create-einja-app.yml +95 -0
  20. package/templates/default/.mcp.json +6 -9
  21. package/templates/default/.serena/project.yml +22 -1
  22. package/templates/default/CLAUDE.md +52 -10
  23. package/templates/default/README.md +5 -14
  24. package/templates/default/apps/admin/next.config.ts +11 -0
  25. package/templates/default/apps/admin/package.json +55 -0
  26. package/templates/default/apps/admin/postcss.config.cjs +5 -0
  27. package/templates/default/apps/admin/src/app/(auth)/forgot-password/page.tsx +97 -0
  28. package/templates/default/apps/admin/src/app/(auth)/layout.tsx +18 -0
  29. package/templates/default/apps/admin/src/app/(auth)/otp/page.tsx +121 -0
  30. package/templates/default/apps/admin/src/app/(auth)/sign-in/page.tsx +145 -0
  31. package/templates/default/apps/admin/src/app/(auth)/sign-up/page.tsx +199 -0
  32. package/templates/default/apps/admin/src/app/(errors)/401/page.tsx +27 -0
  33. package/templates/default/apps/admin/src/app/(errors)/403/page.tsx +28 -0
  34. package/templates/default/apps/admin/src/app/(errors)/500/page.tsx +29 -0
  35. package/templates/default/apps/admin/src/app/(errors)/layout.tsx +7 -0
  36. package/templates/default/apps/admin/src/app/(errors)/maintenance/page.tsx +25 -0
  37. package/templates/default/apps/admin/src/app/dashboard/_components/analytics-chart.tsx +68 -0
  38. package/templates/default/apps/admin/src/app/dashboard/_components/analytics.tsx +182 -0
  39. package/templates/default/apps/admin/src/app/dashboard/_components/dashboard-page.tsx +74 -0
  40. package/templates/default/apps/admin/src/app/dashboard/_components/metric-cards.tsx +49 -0
  41. package/templates/default/apps/admin/src/app/dashboard/_components/overview-chart.tsx +73 -0
  42. package/templates/default/apps/admin/src/app/dashboard/_components/recent-sales.tsx +75 -0
  43. package/templates/default/apps/admin/src/app/dashboard/apps/_components/apps-page.tsx +135 -0
  44. package/templates/default/apps/admin/src/app/dashboard/apps/page.tsx +10 -0
  45. package/templates/default/apps/admin/src/app/dashboard/chats/_components/chat-list.tsx +82 -0
  46. package/templates/default/apps/admin/src/app/dashboard/chats/_components/chat-messages.tsx +194 -0
  47. package/templates/default/apps/admin/src/app/dashboard/chats/_components/chats-page.tsx +99 -0
  48. package/templates/default/apps/admin/src/app/dashboard/chats/_components/new-chat.tsx +118 -0
  49. package/templates/default/apps/admin/src/app/dashboard/chats/page.tsx +10 -0
  50. package/templates/default/apps/admin/src/app/dashboard/layout.tsx +9 -0
  51. package/templates/default/apps/admin/src/app/dashboard/not-found.tsx +14 -0
  52. package/templates/default/apps/admin/src/app/dashboard/page.tsx +10 -0
  53. package/templates/default/apps/admin/src/app/dashboard/settings/_components/content-section.tsx +20 -0
  54. package/templates/default/apps/admin/src/app/dashboard/settings/_components/sidebar-nav.tsx +66 -0
  55. package/templates/default/apps/admin/src/app/dashboard/settings/account/page.tsx +173 -0
  56. package/templates/default/apps/admin/src/app/dashboard/settings/appearance/page.tsx +156 -0
  57. package/templates/default/apps/admin/src/app/dashboard/settings/display/page.tsx +125 -0
  58. package/templates/default/apps/admin/src/app/dashboard/settings/layout.tsx +30 -0
  59. package/templates/default/apps/admin/src/app/dashboard/settings/notifications/page.tsx +196 -0
  60. package/templates/default/apps/admin/src/app/dashboard/settings/page.tsx +5 -0
  61. package/templates/default/apps/admin/src/app/dashboard/settings/profile/page.tsx +176 -0
  62. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/data-table-bulk-actions.tsx +183 -0
  63. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/data-table-row-actions.tsx +79 -0
  64. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-columns.tsx +107 -0
  65. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-dialogs.tsx +71 -0
  66. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-import-dialog.tsx +106 -0
  67. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-multi-delete-dialog.tsx +90 -0
  68. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-mutate-drawer.tsx +207 -0
  69. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-page.tsx +31 -0
  70. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-primary-buttons.tsx +19 -0
  71. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-provider.tsx +37 -0
  72. package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-table.tsx +155 -0
  73. package/templates/default/apps/admin/src/app/dashboard/tasks/page.tsx +14 -0
  74. package/templates/default/apps/admin/src/app/dashboard/users/_components/data-table-bulk-actions.tsx +136 -0
  75. package/templates/default/apps/admin/src/app/dashboard/users/_components/data-table-row-actions.tsx +62 -0
  76. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-action-dialog.tsx +297 -0
  77. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-columns.tsx +121 -0
  78. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-delete-dialog.tsx +72 -0
  79. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-dialogs.tsx +49 -0
  80. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-invite-dialog.tsx +139 -0
  81. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-multi-delete-dialog.tsx +89 -0
  82. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-page.tsx +30 -0
  83. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-primary-buttons.tsx +19 -0
  84. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-provider.tsx +35 -0
  85. package/templates/default/apps/admin/src/app/dashboard/users/_components/users-table.tsx +157 -0
  86. package/templates/default/apps/admin/src/app/dashboard/users/page.tsx +10 -0
  87. package/templates/default/apps/admin/src/app/globals.css +109 -0
  88. package/templates/default/apps/admin/src/app/layout.tsx +32 -0
  89. package/templates/default/apps/admin/src/app/not-found.tsx +14 -0
  90. package/templates/default/apps/admin/src/app/page.tsx +5 -0
  91. package/templates/default/apps/admin/src/components/layout/admin-layout.tsx +16 -0
  92. package/templates/default/apps/admin/src/components/layout/app-sidebar.tsx +52 -0
  93. package/templates/default/apps/admin/src/components/layout/nav-config.ts +131 -0
  94. package/templates/default/apps/admin/src/components/providers/theme-provider.tsx +10 -0
  95. package/templates/default/apps/admin/src/components/shared/long-text.tsx +78 -0
  96. package/templates/default/apps/admin/src/components/shared/search-input.tsx +16 -0
  97. package/templates/default/apps/admin/src/components/shared/select-dropdown.tsx +64 -0
  98. package/templates/default/apps/admin/src/data/apps.tsx +116 -0
  99. package/templates/default/apps/admin/src/data/chats.ts +114 -0
  100. package/templates/default/apps/admin/src/data/tasks.ts +114 -0
  101. package/templates/default/apps/admin/src/data/users.ts +90 -0
  102. package/templates/default/apps/admin/src/hooks/use-dialog-state.ts +17 -0
  103. package/templates/default/apps/admin/src/hooks/use-table-url-state.ts +243 -0
  104. package/templates/default/apps/admin/src/lib/show-submitted-data.tsx +12 -0
  105. package/templates/default/apps/admin/src/types/table.d.ts +9 -0
  106. package/templates/default/apps/admin/tsconfig.json +32 -0
  107. package/templates/default/apps/web/next.config.ts +1 -0
  108. package/templates/default/apps/web/package.json +1 -22
  109. package/templates/default/apps/web/postcss.config.cjs +0 -1
  110. package/templates/default/apps/web/src/app/(authenticated)/dashboard/page.tsx +4 -20
  111. package/templates/default/apps/web/src/app/(authenticated)/data/_components/UserTable.tsx +4 -4
  112. package/templates/default/apps/web/src/app/(authenticated)/data/page.tsx +1 -1
  113. package/templates/default/apps/web/src/app/(authenticated)/profile/page.tsx +1 -1
  114. package/templates/default/apps/web/src/app/error.tsx +8 -70
  115. package/templates/default/apps/web/src/app/global-error.tsx +8 -70
  116. package/templates/default/apps/web/src/app/globals.css +20 -0
  117. package/templates/default/apps/web/src/app/not-found.tsx +5 -39
  118. package/templates/default/apps/web/src/app/page.tsx +27 -203
  119. package/templates/default/apps/web/src/app/signin/page.tsx +27 -191
  120. package/templates/default/apps/web/src/app/signup/page.tsx +33 -240
  121. package/templates/default/apps/web/src/components/dashboard/dashboard-stats.tsx +11 -75
  122. package/templates/default/apps/web/src/components/shared/Sidebar.tsx +3 -3
  123. package/templates/default/apps/web/src/components/shared/header.tsx +17 -112
  124. package/templates/default/apps/web/tsconfig.json +0 -6
  125. package/templates/default/biome.json +30 -2
  126. package/templates/default/components.json +2 -2
  127. package/templates/default/docker-compose.yml +1 -1
  128. package/templates/default/gitignore +4 -0
  129. package/templates/default/package.json +2 -0
  130. package/templates/default/packages/admin-ui/catalog/catalog.css +54 -0
  131. package/templates/default/packages/admin-ui/catalog/catalog.tsx +401 -0
  132. package/templates/default/packages/admin-ui/catalog/index.html +12 -0
  133. package/templates/default/packages/admin-ui/catalog/main.tsx +9 -0
  134. package/templates/default/packages/admin-ui/components.json +21 -0
  135. package/templates/default/packages/admin-ui/package.json +105 -0
  136. package/templates/default/packages/admin-ui/src/command-menu/index.tsx +174 -0
  137. package/templates/default/packages/admin-ui/src/data-table/bulk-actions.tsx +215 -0
  138. package/templates/default/packages/admin-ui/src/data-table/column-header.tsx +73 -0
  139. package/templates/default/packages/admin-ui/src/data-table/data-table.tsx +127 -0
  140. package/templates/default/packages/admin-ui/src/data-table/faceted-filter.tsx +148 -0
  141. package/templates/default/packages/admin-ui/src/data-table/index.tsx +9 -0
  142. package/templates/default/packages/admin-ui/src/data-table/pagination.tsx +101 -0
  143. package/templates/default/packages/admin-ui/src/data-table/toolbar.tsx +87 -0
  144. package/templates/default/packages/admin-ui/src/data-table/view-options.tsx +57 -0
  145. package/templates/default/packages/admin-ui/src/hooks/use-mobile.tsx +23 -0
  146. package/templates/default/packages/admin-ui/src/layout/header.tsx +55 -0
  147. package/templates/default/packages/admin-ui/src/layout/index.ts +10 -0
  148. package/templates/default/packages/admin-ui/src/layout/main.tsx +23 -0
  149. package/templates/default/packages/admin-ui/src/layout/nav-group.tsx +111 -0
  150. package/templates/default/packages/admin-ui/src/layout/nav-user.tsx +114 -0
  151. package/templates/default/packages/admin-ui/src/layout/theme-switch.tsx +40 -0
  152. package/templates/default/packages/admin-ui/src/layout/types.ts +21 -0
  153. package/templates/default/packages/admin-ui/src/lib/utils.ts +6 -0
  154. package/templates/default/packages/admin-ui/src/styles/base.css +65 -0
  155. package/templates/default/packages/admin-ui/src/styles/tokens.css +91 -0
  156. package/templates/default/packages/admin-ui/src/tanstack-table.d.ts +10 -0
  157. package/templates/default/packages/admin-ui/src/ui/alert-dialog.tsx +157 -0
  158. package/templates/default/packages/admin-ui/src/ui/alert.tsx +66 -0
  159. package/templates/default/packages/admin-ui/src/ui/avatar.tsx +53 -0
  160. package/templates/default/packages/admin-ui/src/ui/badge.tsx +46 -0
  161. package/templates/default/packages/admin-ui/src/ui/breadcrumb.tsx +108 -0
  162. package/templates/default/packages/admin-ui/src/ui/button.tsx +59 -0
  163. package/templates/default/packages/admin-ui/src/ui/calendar.tsx +69 -0
  164. package/templates/default/packages/admin-ui/src/ui/card.tsx +92 -0
  165. package/templates/default/packages/admin-ui/src/ui/chart.tsx +345 -0
  166. package/templates/default/packages/admin-ui/src/ui/checkbox.tsx +32 -0
  167. package/templates/default/packages/admin-ui/src/ui/collapsible.tsx +27 -0
  168. package/templates/default/packages/admin-ui/src/ui/command.tsx +161 -0
  169. package/templates/default/packages/admin-ui/src/ui/confirm-dialog.tsx +72 -0
  170. package/templates/default/packages/admin-ui/src/ui/date-picker.tsx +53 -0
  171. package/templates/default/packages/admin-ui/src/ui/dialog.tsx +143 -0
  172. package/templates/default/packages/admin-ui/src/ui/dropdown-menu.tsx +257 -0
  173. package/templates/default/packages/admin-ui/src/ui/form.tsx +168 -0
  174. package/templates/default/packages/admin-ui/src/ui/input-otp.tsx +84 -0
  175. package/templates/default/packages/admin-ui/src/ui/input.tsx +21 -0
  176. package/templates/default/packages/admin-ui/src/ui/label.tsx +24 -0
  177. package/templates/default/packages/admin-ui/src/ui/pagination.tsx +126 -0
  178. package/templates/default/packages/admin-ui/src/ui/password-input.tsx +46 -0
  179. package/templates/default/packages/admin-ui/src/ui/popover.tsx +48 -0
  180. package/templates/default/packages/admin-ui/src/ui/progress.tsx +31 -0
  181. package/templates/default/packages/admin-ui/src/ui/radio-group.tsx +45 -0
  182. package/templates/default/packages/admin-ui/src/ui/scroll-area.tsx +52 -0
  183. package/templates/default/packages/admin-ui/src/ui/select.tsx +185 -0
  184. package/templates/default/packages/admin-ui/src/ui/separator.tsx +28 -0
  185. package/templates/default/packages/admin-ui/src/ui/sheet.tsx +149 -0
  186. package/templates/default/packages/admin-ui/src/ui/sidebar.tsx +728 -0
  187. package/templates/default/packages/admin-ui/src/ui/skeleton.tsx +13 -0
  188. package/templates/default/packages/admin-ui/src/ui/sonner.tsx +25 -0
  189. package/templates/default/packages/admin-ui/src/ui/switch.tsx +31 -0
  190. package/templates/default/packages/admin-ui/src/ui/table.tsx +116 -0
  191. package/templates/default/packages/admin-ui/src/ui/tabs.tsx +66 -0
  192. package/templates/default/packages/admin-ui/src/ui/textarea.tsx +18 -0
  193. package/templates/default/packages/admin-ui/src/ui/toggle-group.tsx +60 -0
  194. package/templates/default/packages/admin-ui/src/ui/toggle.tsx +44 -0
  195. package/templates/default/packages/admin-ui/src/ui/tooltip.tsx +61 -0
  196. package/templates/default/packages/admin-ui/tsconfig.json +8 -0
  197. package/templates/default/packages/admin-ui/vite.config.ts +11 -0
  198. package/templates/default/packages/config/package.json +0 -2
  199. package/templates/default/packages/server-core/package.json +2 -0
  200. package/templates/default/packages/ui/components.json +21 -0
  201. package/templates/default/packages/ui/package.json +42 -5
  202. package/templates/default/packages/ui/src/accordion.tsx +1 -1
  203. package/templates/default/packages/ui/src/alert-dialog.tsx +4 -4
  204. package/templates/default/packages/ui/src/alert.tsx +1 -1
  205. package/templates/default/packages/ui/src/avatar.tsx +1 -1
  206. package/templates/default/packages/ui/src/badge.tsx +1 -1
  207. package/templates/default/packages/ui/src/breadcrumb.tsx +1 -1
  208. package/templates/default/packages/ui/src/button.tsx +1 -1
  209. package/templates/default/packages/ui/src/card.tsx +1 -1
  210. package/templates/default/packages/ui/src/checkbox.tsx +1 -1
  211. package/templates/default/packages/ui/src/dialog.tsx +3 -3
  212. package/templates/default/packages/ui/src/drawer.tsx +3 -3
  213. package/templates/default/packages/ui/src/dropdown-menu.tsx +3 -3
  214. package/templates/default/packages/ui/src/form.tsx +2 -2
  215. package/templates/default/packages/ui/src/hover-card.tsx +2 -2
  216. package/templates/default/packages/ui/src/input.tsx +1 -1
  217. package/templates/default/packages/ui/src/label.tsx +1 -1
  218. package/templates/default/packages/ui/src/pagination.tsx +2 -2
  219. package/templates/default/packages/ui/src/popover.tsx +2 -2
  220. package/templates/default/packages/ui/src/progress.tsx +1 -1
  221. package/templates/default/packages/ui/src/select.tsx +2 -2
  222. package/templates/default/packages/ui/src/separator.tsx +1 -1
  223. package/templates/default/packages/ui/src/skeleton.tsx +1 -1
  224. package/templates/default/packages/ui/src/table.tsx +1 -1
  225. package/templates/default/packages/ui/src/tabs.tsx +1 -1
  226. package/templates/default/packages/ui/src/textarea.tsx +1 -1
  227. package/templates/default/packages/ui/src/tooltip.tsx +3 -3
  228. package/templates/default/packages/ui/src/typography.tsx +1 -1
  229. package/templates/default/packages/ui/tsconfig.json +1 -6
  230. package/templates/default/pnpm-lock.yaml +1319 -936
  231. package/templates/default/postcss.config.cjs +0 -1
  232. package/templates/default/turbo.json +17 -8
  233. package/templates/default/worktree.config.json +5 -0
  234. package/templates/default/.env.ci +0 -32
  235. package/templates/default/.github/workflows/ci.yml +0 -99
  236. package/templates/default/.github/workflows/preview-db.yml +0 -134
  237. package/templates/default/.playwright-mcp/dashboard.png +0 -0
  238. package/templates/default/.playwright-mcp/web-home.png +0 -0
  239. package/templates/default/apps/web/panda.config.ts +0 -114
  240. package/templates/default/apps/web/src/components/ui/accordion.tsx +0 -64
  241. package/templates/default/apps/web/src/components/ui/alert-dialog.tsx +0 -135
  242. package/templates/default/apps/web/src/components/ui/alert.tsx +0 -60
  243. package/templates/default/apps/web/src/components/ui/aspect-ratio.tsx +0 -9
  244. package/templates/default/apps/web/src/components/ui/avatar.tsx +0 -41
  245. package/templates/default/apps/web/src/components/ui/badge.tsx +0 -39
  246. package/templates/default/apps/web/src/components/ui/breadcrumb.tsx +0 -101
  247. package/templates/default/apps/web/src/components/ui/button.tsx +0 -56
  248. package/templates/default/apps/web/src/components/ui/card.tsx +0 -75
  249. package/templates/default/apps/web/src/components/ui/checkbox.tsx +0 -29
  250. package/templates/default/apps/web/src/components/ui/data-table.tsx +0 -189
  251. package/templates/default/apps/web/src/components/ui/dialog-hook.tsx +0 -210
  252. package/templates/default/apps/web/src/components/ui/dialog.tsx +0 -129
  253. package/templates/default/apps/web/src/components/ui/drawer.tsx +0 -124
  254. package/templates/default/apps/web/src/components/ui/dropdown-menu.tsx +0 -228
  255. package/templates/default/apps/web/src/components/ui/form.tsx +0 -152
  256. package/templates/default/apps/web/src/components/ui/hover-card.tsx +0 -38
  257. package/templates/default/apps/web/src/components/ui/input.tsx +0 -21
  258. package/templates/default/apps/web/src/components/ui/label.tsx +0 -21
  259. package/templates/default/apps/web/src/components/ui/pagination.tsx +0 -105
  260. package/templates/default/apps/web/src/components/ui/popover.tsx +0 -42
  261. package/templates/default/apps/web/src/components/ui/progress.tsx +0 -28
  262. package/templates/default/apps/web/src/components/ui/select.tsx +0 -170
  263. package/templates/default/apps/web/src/components/ui/separator.tsx +0 -28
  264. package/templates/default/apps/web/src/components/ui/skeleton.tsx +0 -13
  265. package/templates/default/apps/web/src/components/ui/sonner.tsx +0 -25
  266. package/templates/default/apps/web/src/components/ui/table.tsx +0 -92
  267. package/templates/default/apps/web/src/components/ui/tabs.tsx +0 -54
  268. package/templates/default/apps/web/src/components/ui/textarea.tsx +0 -18
  269. package/templates/default/apps/web/src/components/ui/tooltip.tsx +0 -57
  270. package/templates/default/apps/web/src/components/ui/typography.tsx +0 -158
  271. package/templates/default/packages/config/panda.config.ts +0 -114
  272. package/templates/default/panda.config.ts +0 -114
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-einja-app",
3
- "version": "0.2.15",
3
+ "version": "0.2.18",
4
4
  "description": "CLI tool to create new projects with Einja Management Template",
5
5
  "type": "module",
6
6
  "bin": {
@@ -55,7 +55,7 @@
55
55
  "dev": "tsup --watch",
56
56
  "typecheck": "tsc --noEmit",
57
57
  "lint": "biome lint .",
58
- "test": "vitest",
58
+ "test": "vitest run",
59
59
  "test:coverage": "vitest run --coverage",
60
60
  "template:update": "tsx scripts/template-update.ts"
61
61
  }
@@ -18,10 +18,10 @@ if [[ "$file_path" =~ \.(ts|tsx|js|jsx|json)$ ]]; then
18
18
  cd "$CLAUDE_PROJECT_DIR" 2>/dev/null || exit 0
19
19
 
20
20
  # biome check(format + lint)を実行、自動修正可能なものは修正
21
- npx biome check --write "$file_path" 2>/dev/null || true
21
+ pnpm exec biome check --write "$file_path" 2>/dev/null || true
22
22
 
23
23
  # 修正後に残っているlintエラーをチェック(any型など自動修正できないもの)
24
- lint_errors=$(npx biome lint "$file_path" 2>&1 | grep -E "lint/|noExplicitAny|error" | head -20)
24
+ lint_errors=$(pnpm exec biome lint "$file_path" 2>&1 | grep -E "lint/|noExplicitAny|error" | head -20)
25
25
 
26
26
  if [ -n "$lint_errors" ]; then
27
27
  echo "" >&2
@@ -2,8 +2,18 @@
2
2
  # playwright-resize.sh - Playwright使用前にリサイズを強制するhook
3
3
  # PreToolUseで実行され、リサイズ未実施ならブロックする
4
4
 
5
- input=$(cat)
6
- tool_name=$(echo "$input" | jq -r '.tool_name // empty')
5
+ # stdin読み込み(3秒タイムアウト)
6
+ input=""
7
+ while IFS= read -r -t 3 line; do
8
+ input="${input}${line}"
9
+ done
10
+
11
+ tool_name=$(echo "$input" | jq -r '.tool_name // empty' 2>/dev/null)
12
+
13
+ # inputが空またはtool_name取得失敗時 → 安全側で許可(hookをスキップ)
14
+ if [ -z "$tool_name" ]; then
15
+ exit 0
16
+ fi
7
17
 
8
18
  # Playwrightツール以外は無視
9
19
  if [[ ! "$tool_name" =~ ^mcp__playwright__ ]]; then
@@ -38,11 +38,15 @@
38
38
  "MultiEdit(**)",
39
39
  "Write",
40
40
  "Task(*)",
41
+ "Skill",
42
+ "Skill(*)",
41
43
  "TodoRead(*)",
42
44
  "TodoWrite(*)",
45
+ "AskUserQuestion",
43
46
  "NotebookRead(*)",
44
47
  "NotebookEdit(*)",
45
48
  "mcp__codex__codex",
49
+ "mcp__codex__codex-reply",
46
50
  "mcp__github__get_pull_request",
47
51
  "mcp__github__get_pull_request_files",
48
52
  "mcp__github__update_pull_request",
@@ -50,6 +54,7 @@
50
54
  "mcp__github__get_commit",
51
55
  "mcp__github__get_file_contents",
52
56
  "mcp__github__search_code",
57
+ "mcp__github__issue_read",
53
58
  "mcp__playwright",
54
59
  "mcp__playwright__browser_navigate",
55
60
  "mcp__playwright__browser_click",
@@ -59,6 +64,16 @@
59
64
  "mcp__playwright__browser_console_messages",
60
65
  "mcp__playwright__browser_handle_dialog",
61
66
  "mcp__playwright__browser_type",
67
+ "mcp__playwright__browser_take_screenshot",
68
+ "mcp__playwright__browser_fill_form",
69
+ "mcp__playwright__browser_press_key",
70
+ "mcp__playwright__browser_hover",
71
+ "mcp__playwright__browser_select_option",
72
+ "mcp__playwright__browser_drag",
73
+ "mcp__playwright__browser_tabs",
74
+ "mcp__playwright__browser_network_requests",
75
+ "mcp__playwright__browser_close",
76
+ "mcp__playwright__browser_resize",
62
77
  "mcp__serena",
63
78
  "mcp__serena__activate_project",
64
79
  "mcp__serena__check_onboarding_performed",
@@ -162,7 +162,21 @@ GitHub Issueから Issue番号を取得し、ブランチ名を生成して作
162
162
  - 実行対象の各フェーズについて、フェーズブランチを確認
163
163
  - 存在しない場合 → タスクブランチから作成してプッシュ
164
164
 
165
- 6. **設定の表示**
165
+ 6a. **REST APIヘルスチェック(probeCapability)**
166
+ - `GET /api/remote/issues` を呼び出してREST APIの疎通を確認
167
+ - 成功した場合のみ親Issue作成機能を有効化
168
+ - 失敗した場合はREST API機能をスキップし、サブIssueのparent_issue_id設定をスキップ
169
+
170
+ 6b. **Phase毎に親Issue作成**
171
+
172
+ 実行対象の各Phaseについて:
173
+ - タイトル形式: `[Issue{N} Phase{M}] {Phase名}`
174
+ - 例: `[Issue21 Phase1] 認証基盤構築`
175
+ - 既存チェック(再開サポート): 同名の親Issueが既に存在する場合はスキップ
176
+ - `mcp__vibe_kanban__create_issue` で親Issue作成
177
+ - stateManagerにPhaseID → 親Issue UUIDのマッピングを登録
178
+
179
+ 7. **設定の表示**
166
180
  ```markdown
167
181
  📋 タスク実行設定:
168
182
  - タスクファイル: {task_file_path}
@@ -170,6 +184,7 @@ GitHub Issueから Issue番号を取得し、ブランチ名を生成して作
170
184
  - タスクブランチ: feat/{ディレクトリ}/{タスク名}(新規作成 / 既存)
171
185
  - 実行フェーズ: Phase {N}まで
172
186
  - フェーズブランチ: feat/{ディレクトリ}/{タスク名}-phase{N}
187
+ - 親Issue: [Issue{N} Phase{M}] {Phase名}(各フェーズに作成済み)
173
188
  ```
174
189
 
175
190
  以下の処理をループで繰り返し実行します:
@@ -237,13 +252,22 @@ GitHub Issueから Issue番号を取得し、ブランチ名を生成して作
237
252
  - ✅ **task-starterが選定したタスクのみを作成**
238
253
  - ✅ **task-starterが「実行可能なタスクなし」の場合、このフェーズはスキップして待機フェーズへ移行**
239
254
 
240
- 1. **Vibe-Kanbanにタスクを作成**(task-starterが選定したタスクのみ)
255
+ 1. **Vibe-KanbanにサブIssueを作成**(task-starterが選定したタスクのみ)
256
+
257
+ **サブIssue作成手順**:
258
+
259
+ 1. `mcp__vibe_kanban__create_issue` で通常のIssueを作成
260
+ 2. REST PATCH `/api/remote/issues/{id}` を呼び出して `{"parent_issue_id": "{parent_uuid}"}` を設定
261
+ - `{parent_uuid}` は初期化フェーズ(6b)で登録した該当PhaseのIssue UUID
262
+ 3. **PATCH失敗時のリトライ**:
263
+ - 最大3回リトライ
264
+ - 全失敗時は `mcp__vibe_kanban__delete_issue` でIssueを削除し、エラーを再スロー
265
+ 4. **冪等性チェック**: Issue作成前に同名タイトル + 同じ `parent_issue_id` のIssueが存在しないか確認し、存在する場合はスキップ
241
266
 
242
267
  **選定タスクが1個の場合**:
243
268
 
244
- - タイトル形式: `/task-exec <タスクグループ番号> <タスクグループ名>`
245
- - 例: `/task-exec 4.1 Turborepoビルドパイプライン最適化`
246
- - `/task-exec` プレフィックスは**必須**です
269
+ - タイトル形式: `[Issue{N} {X.Y}] {タスクグループ名}` ※ `/task-exec` プレフィックスはtitleに**含めない**
270
+ - 例: `[Issue21 4.1] Turborepoビルドパイプライン最適化`
247
271
  - 説明:
248
272
  ```
249
273
  ## タスクファイル
@@ -258,8 +282,8 @@ GitHub Issueから Issue番号を取得し、ブランチ名を生成して作
258
282
 
259
283
  **選定タスクが複数の場合**:
260
284
 
261
- - タイトル形式: `/task-exec <タスクグループ番号1>, <タスクグループ番号2>, ... <グループ名>`
262
- - 例: `/task-exec 4.1, 4.2 Phase 4 ビルド最適化タスク`
285
+ - タイトル形式: `[Issue{N} {X.Y}, {X.Z}] {グループ名}`
286
+ - 例: `[Issue21 4.1, 4.2] Phase 4 ビルド最適化タスク`
263
287
  - グループ名は粒度指定から生成、または「まとめて実装」など
264
288
  - 説明:
265
289
  ```
@@ -278,14 +302,14 @@ GitHub Issueから Issue番号を取得し、ブランチ名を生成して作
278
302
  <tasks.mdから抽出したタスク一覧とサブタスク2>
279
303
  ```
280
304
 
281
- **実装時の注意**: `mcp__vibe_kanban__create_task` を呼び出す際、titleパラメータには必ず `/task-exec ` で始まる文字列を渡すこと
305
+ **実装時の注意**: `mcp__vibe_kanban__create_issue` を呼び出す際、titleパラメータには `[Issue{N} {X.Y}]` 形式の文字列を渡すこと(Workspace起動時にtitleをコマンドとして解釈させるため)
282
306
 
283
307
  2. **ステータスを "in-progress" に更新**
284
- - `mcp__vibe_kanban__update_task` を使用
308
+ - `mcp__vibe_kanban__update_issue` を使用
285
309
  - status パラメータには `"in-progress"` を指定(ハイフン区切り)
286
310
 
287
311
  3. **タスクの実行を開始**
288
- - `mcp__vibe_kanban__start_task_attempt` を呼び出し
312
+ - `mcp__vibe_kanban__start_workspace_session` を呼び出し
289
313
  - executor: CLAUDE_CODE
290
314
  - base_branch: **タスクが属するフェーズのフェーズブランチ**
291
315
  - 例: Phase 1のタスク → `feat/monorepo/20251104-turborepo-setup-phase1`
@@ -304,6 +328,17 @@ GitHub Issueから Issue番号を取得し、ブランチ名を生成して作
304
328
 
305
329
  ### 4. 完了・待機フェーズ
306
330
 
331
+ #### 4.0 Phase完了判定(タスク選定フェーズの結果を受けて実行)
332
+
333
+ - **Phase内の全サブIssueがDone** → Phase完了と判定
334
+ - Done検知では **親IssueをIDベースで除外** し、サブIssueのみを監視する
335
+ - 初期化フェーズ(6b)で登録した親Issue UUIDをフィルタリングに使用
336
+ - **Phase完了時の処理**:
337
+ 1. 該当Phaseの親Issue用Workspaceを作成(フェーズブランチをベースに)
338
+ 2. フェーズブランチのPRを作成・マージ
339
+ 3. 親IssueをDone状態に更新(自動Done)
340
+ 4. **タイムアウト(2分)でPR/マージが完了しない場合**: `mcp__vibe_kanban__update_issue` で手動Doneにフォールバック
341
+
307
342
  #### 4.1 最大タスク番号に到達した場合
308
343
 
309
344
  - メッセージを出力:
@@ -350,10 +385,14 @@ model: haiku # コスト削減のため軽量モデルを使用
350
385
 
351
386
  ### 使用ツール
352
387
  - **タスク読み取り**: GitHub MCP(GitHub Issueからタスク一覧を読み取り)
353
- - **Vibe-Kanban操作**:
354
- - `mcp__vibe_kanban__create_task`
355
- - `mcp__vibe_kanban__update_task`
356
- - `mcp__vibe_kanban__start_task_attempt`
388
+ - **Vibe-Kanban操作(MCP)**:
389
+ - `mcp__vibe_kanban__create_issue`(Issue/サブIssue作成)
390
+ - `mcp__vibe_kanban__update_issue`(ステータス更新、手動Done)
391
+ - `mcp__vibe_kanban__delete_issue`(PATCH失敗時のロールバック)
392
+ - `mcp__vibe_kanban__start_workspace_session`(Workspace起動)
393
+ - **Vibe-Kanban操作(REST API)**:
394
+ - `GET /api/remote/issues` — ヘルスチェック(probeCapability)
395
+ - `PATCH /api/remote/issues/{id}` — `parent_issue_id` 設定(サブIssue関連付け)
357
396
 
358
397
  **注意**: GitHub Issueの書き込みは行わない(実行エージェントが完了時に自動更新)
359
398
 
@@ -440,32 +479,43 @@ Vibe-Kanbanでタスクを管理する際に必要な情報:
440
479
  **プロジェクトID**: `<project_id>`
441
480
  **プロジェクト名**: `<project_name>`
442
481
 
443
- ## 作成されたタスク一覧
482
+ ## 親Issue一覧
483
+
484
+ | フェーズ | 親Issueタイトル | 親Issue UUID | 作成日時 |
485
+ |---------|---------------|-------------|---------|
486
+ | Phase 1 | [Issue21 Phase1] 認証基盤構築 | `<parent_uuid>` | YYYY-MM-DD HH:MM |
487
+ | Phase 2 | [Issue21 Phase2] UI実装 | `<parent_uuid>` | YYYY-MM-DD HH:MM |
444
488
 
445
- | タスクグループ番号 | タスクグループ名 | Vibe-Kanban タスクID | ステータス | 作成日時 |
446
- |-----------|---------|---------------------|----------|---------|
447
- | 4.1 | Turborepoビルドパイプライン最適化 | `<task_id>` | in-progress | YYYY-MM-DD HH:MM |
448
- | 4.2 | リモートキャッシュ設定 | `<task_id>` | todo | YYYY-MM-DD HH:MM |
489
+ ## 作成されたサブIssue一覧
449
490
 
450
- ## タスク実行試行情報
491
+ | タスクグループ番号 | タスクグループ名 | Vibe-Kanban IssueID | 親Issue UUID | ステータス | 作成日時 |
492
+ |-----------|---------|---------------------|------------|----------|---------|
493
+ | 4.1 | Turborepoビルドパイプライン最適化 | `<issue_id>` | `<parent_uuid>` | in-progress | YYYY-MM-DD HH:MM |
494
+ | 4.2 | リモートキャッシュ設定 | `<issue_id>` | `<parent_uuid>` | todo | YYYY-MM-DD HH:MM |
451
495
 
452
- | タスクグループ番号 | 試行ID | Executor | Base Branch | 開始日時 |
453
- |-----------|--------|----------|-------------|---------|
454
- | 4.1 | `<attempt_id>` | CLAUDE_CODE | main | YYYY-MM-DD HH:MM |
496
+ ## Workspace実行情報
497
+
498
+ | タスクグループ番号 | WorkspaceセッションID | Executor | Base Branch | 開始日時 |
499
+ |-----------|----------------------|----------|-------------|---------|
500
+ | 4.1 | `<session_id>` | CLAUDE_CODE | feat/.../phase1 | YYYY-MM-DD HH:MM |
455
501
  ```
456
502
 
457
503
  ### 記録すべき情報
458
504
 
459
505
  1. **プロジェクトID** (`project_id`)
460
506
  - `mcp__vibe_kanban__list_projects` で取得
461
- - 全タスク操作で必要
507
+ - 全Issue操作で必要
508
+
509
+ 2. **親Issue UUID** (`parent_uuid`)
510
+ - `mcp__vibe_kanban__create_issue` のレスポンスから取得
511
+ - 各Phaseに1つ作成し、サブIssueの `parent_issue_id` として使用
462
512
 
463
- 2. **タスクID** (`task_id`)
464
- - `mcp__vibe_kanban__create_task` のレスポンスから取得
465
- - タスク更新・削除時に必要
513
+ 3. **サブIssue ID** (`issue_id`)
514
+ - `mcp__vibe_kanban__create_issue` のレスポンスから取得
515
+ - Issue更新・削除時に必要
466
516
 
467
- 3. **タスク実行試行ID** (`attempt_id`)
468
- - `mcp__vibe_kanban__start_task_attempt` のレスポンスから取得
517
+ 4. **WorkspaceセッションID** (`session_id`)
518
+ - `mcp__vibe_kanban__start_workspace_session` のレスポンスから取得
469
519
  - 実行状況の追跡に使用
470
520
 
471
521
  ### 情報の取得方法
@@ -475,30 +525,45 @@ Vibe-Kanbanでタスクを管理する際に必要な情報:
475
525
  const projects = await mcp__vibe_kanban__list_projects({});
476
526
  // => プロジェクトID: projects.data[0].id
477
527
 
478
- // タスク作成
479
- const task = await mcp__vibe_kanban__create_task({
528
+ // 親Issue作成(Phase単位)
529
+ const parentIssue = await mcp__vibe_kanban__create_issue({
530
+ project_id: "<project_id>",
531
+ title: "[Issue21 Phase1] 認証基盤構築",
532
+ description: "..."
533
+ });
534
+ // => 親Issue UUID: parentIssue.id
535
+
536
+ // サブIssue作成
537
+ const subIssue = await mcp__vibe_kanban__create_issue({
480
538
  project_id: "<project_id>",
481
- title: "1.1.1 プロジェクトルート初期化",
539
+ title: "[Issue21 4.1] Turborepoビルドパイプライン最適化",
482
540
  description: "..."
483
541
  });
484
- // => タスクID: task.id
542
+ // => サブIssue ID: subIssue.id
543
+
544
+ // parent_issue_id 設定(REST PATCH)
545
+ await fetch(`/api/remote/issues/${subIssue.id}`, {
546
+ method: "PATCH",
547
+ body: JSON.stringify({ parent_issue_id: parentIssue.id })
548
+ });
485
549
 
486
- // タスク実行開始
487
- const attempt = await mcp__vibe_kanban__start_task_attempt({
488
- task_id: "<task_id>",
489
- executor: "CLAUDE_CODE",
490
- base_branch: "main"
550
+ // Workspace起動
551
+ const session = await mcp__vibe_kanban__start_workspace_session({
552
+ issue_id: "<issue_id>",
553
+ base_branch: "feat/.../phase1"
491
554
  });
492
- // => 試行ID: attempt.id
555
+ // => セッションID: session.id
493
556
  ```
494
557
 
495
558
  ## 注意事項
496
559
 
497
560
  **⚠️ 厳守事項**:
498
561
  1. **待機時間は必ず120秒**: `sleep 120` を使用。60秒や300秒など他の値に変更してはいけません
499
- 2. **実行可能なタスクのみ作成**: 依存関係が満たされていないタスクのVibe-Kanbanタスクを事前に作成してはいけません
562
+ 2. **実行可能なタスクのみ作成**: 依存関係が満たされていないタスクのVibe-KanbanサブIssueを事前に作成してはいけません
500
563
  3. **タスク開始後は即座にタスク選定へ**: 次のタスクを事前に作成せず、必ずタスク選定フェーズから開始します
501
564
  4. **完了報告で止まらない**: タスク完了を確認したら、報告だけで止まらず、即座に次のタスク選定フェーズに進みます
565
+ 5. **Done検知では親IssueをIDベースで除外**: 初期化時に登録した親Issue UUIDを使い、サブIssueのみを完了監視対象とすること
566
+ 6. **Phase完了時の親Issue自動Done**: タイムアウト2分でPR/マージが完了しない場合、`mcp__vibe_kanban__update_issue` で手動Doneにフォールバックすること
502
567
 
503
568
  - **最大タスク番号が指定されている場合、その番号に到達したらループを自動終了します**
504
569
  - **最大タスク番号が `all` の場合、すべてのタスクが完了するまで継続します(手動停止が必要)**
@@ -513,8 +578,8 @@ const attempt = await mcp__vibe_kanban__start_task_attempt({
513
578
  - **タスク作成時は必ず返却されたIDを記録し、後続の操作で使用してください**
514
579
  - **タスクブランチの作成元は初期化時に1度だけ確認します(デフォルト: リモートのデフォルトブランチを自動取得)**
515
580
  - **各タスクは属するフェーズのフェーズブランチをベースブランチとして実行します**
516
- - **粒度指定がある場合、指定された粒度(Phase/タスクグループ/タスク)に応じて実行可能なタスクをまとめて1つのVibe-Kanbanタスクとして作成します**
517
- - **複数タスクをまとめて実行する場合、Vibe-Kanbanタスクのタイトルには `/task-exec <タスク番号1>, <タスク番号2>, ... <グループ名>` 形式を使用します**
581
+ - **粒度指定がある場合、指定された粒度(Phase/タスクグループ/タスク)に応じて実行可能なタスクをまとめて1つのVibe-KanbanサブIssueとして作成します**
582
+ - **複数タスクをまとめて実行する場合、VIbe-KanbanサブIssueのタイトルには `[Issue{N} {X.Y}, {X.Z}] {グループ名}` 形式を使用します**
518
583
 
519
584
  ## タスク番号の比較ルール
520
585
 
@@ -14,10 +14,6 @@ DOTENV_PUBLIC_KEY_DEVELOP="02e723fedf2667d7fd82b661d6c9c541d945bb5a3b0c9dcd792bb
14
14
  # 編集方法: pnpm env:update → 「環境設定を変更」→「開発環境」
15
15
  # ============================================
16
16
 
17
- # NextAuth設定
18
- NEXTAUTH_SECRET=encrypted:BMTnqvWY5Q6wkO8yK88NjZENbuHmeiG1AzbkCMQS1sptkO5yBbF4S53DcJFua8KbwUzmHZQ3YchPaSYeP5TCfzpZMhFHthMqlyYDC/SDtEAK1lMxrRpTs90xAx4luuzaB1mp9Ke5d/E5jidsZLmH2wSy+h52zPhCfoIgqcj8x4x5
19
- NEXTAUTH_URL=encrypted:BMGo5wIaRGkvx1SOHy1j9QozQRYXNzPVDdkaPx1eE9mwCW8a2+UGZERvq/wZbvTU9L0rQKu/q7xTa2RES9ywA5fNmv+DE8a5k/D7RhC7FraShBr5D9h/bzLh6y8KUzIRkJILowbnctWv7vm4VU84DC2MYMWv5RUo
20
-
21
17
  # データベース設定
22
18
  DATABASE_URL="encrypted:BAUzyWU+Q7zA3KKoDbWfcf3/eAPoa/34i6D8UcK+yqDwe4YZhE1TpbU30bBCX3iUn0H44n55lFXRJIpoVCHGb9s4NN7UXZDlmWaXvBnVYmfqquk8HbVIFADErvDToAAsnLbUo13BowqYo4LT/c1XY1TkUiH6WLatJfWdW3TWkQNEaic2M1xp0sjb+rk1w2YPUbtaSNpq8lwZrO3zh+U5ubaCqMltKg=="
23
19
 
@@ -33,3 +33,4 @@ DATABASE_URL="postgresql://postgres:postgres@localhost:25432/main?schema=public"
33
33
  # アプリケーションポート(複数アプリ対応)
34
34
  # pnpm dev 実行時にブランチ名から自動計算されます
35
35
  PORT_WEB=3000
36
+ PORT_ADMIN=4000
@@ -14,10 +14,6 @@ DOTENV_PUBLIC_KEY_PREVIEW="02c67d6a9b0801daaa8da8b6551ca9926caaabe66bc026eef21fe
14
14
  # 編集方法: pnpm env:update → 「環境設定を変更」→「プレビュー環境」
15
15
  # ============================================
16
16
 
17
- # NextAuth設定
18
- NEXTAUTH_SECRET=encrypted:BMKN/5u9wfDSKiM59bDYhUGJWXsfx8WK0gjBQh7lrUc3fJQq8xUU3V9nIquJp6ItgdsaLxnbYfDHDIMatqZMHywPjrRLLYjlwM3PgOQd8eyO7I5USMVoIi0zJ8OzxThFxtnRCciibEPZdc77p4hvUOd2oVJffQEVXaCFUKA=
19
- NEXTAUTH_URL=encrypted:BKfwQ8NiyWCxEY3KbCkt7HylNjt2fSbzDqba46P2HXLqCrj/3fZFc9M/p29ZhQ6EiXPzsT9ULfCZwCaRA1+FmQDE5aejR4vAad5csHbozTnFJgkMmigeHpKbLJK0nhQjIQ==
20
-
21
17
  # データベース設定
22
18
  DATABASE_URL="encrypted:BFLDc6fRsdz0mfkrXWFk3p2ECSzyaTHea4IC3gSJ90uTaAPwc02JYnI5MMmj1iJFFyxgIs8gLrmINxl1dP2KYW/QnvgmqEl/cIRq1jwmFnRPLLU4Amv/AGGtmGyau9XICJgaWv3w2t8nAiPDgmZpz1cdeHXA563Qx0YJovzW3CJgWaga/sFerRUXyaQGLRy0+8r5uasBJAAWw4tn27ZlwIhsLLNVTC+kBz5EnVx+BeReEb0="
23
19
 
@@ -0,0 +1,19 @@
1
+ #/-------------------[DOTENV_PUBLIC_KEY]--------------------/
2
+ #/ public-key encryption for .env files /
3
+ #/ [how it works](https://dotenvx.com/encryption) /
4
+ #/----------------------------------------------------------/
5
+ DOTENV_PUBLIC_KEY_STAGING="031e7154973033a21597798caa7ceaf27927ee3073788711f9b4a6a1727285f8ac"
6
+
7
+ # .env.staging
8
+ # ============================================
9
+ # Staging Environment
10
+ # ============================================
11
+ # ステージング環境用(本番相当)
12
+ # dotenvxで暗号化されます
13
+ #
14
+ # 編集方法: pnpm env:update → 「環境設定を変更」→「ステージング環境」
15
+ # ============================================
16
+ NEXTAUTH_SECRET="encrypted:BHdN/pBxM3TkugLJ3vZ+nuRb/POLBpvaJYcoIU/pyqSBnELJd/BjalQuUYzjCXDZRJd/qJG0Uh2F1cYu6ooho+2MZ+Wg3JnyoA20VPn1EfxKkqL0TO31pZBlwHlYxnyjXsj0KHkIjzzB7AshRSCxDqU3NTXJEAgNOYsCPnUw4dJ6ZoYtuIQs2Pw/Cq0KXZBv"
17
+ NEXTAUTH_URL="encrypted:BLAUuQnCBaANueROEDzqmJR2QhaQQSDbzZWoR4B8twW45gnth5H3xAjtAeriBvKLcQKXo9WaGdp3ZUq6MvnwUD70LfpQuQz4lweB6wwOYap583cxMhfljyBj3wyqXEtatN5CPnwkYxBunLSxGkgQpNIiq8HoW22Ranx8nw=="
18
+ DATABASE_URL="encrypted:BJT7hgGWawtCKUpOU4k17KMx9sabu8AMWiXY4+Vvevsuinl4KuH5F91Pt7FCi4BNbB/ebN99nY0rWckgvj0BBZ+fQvfNqb9hLFdbKWRSNcdFQEQKlpM4yyEJm4rNFhcy/BP8FfGf9bMakCpXUyt55wIaK1ruAk90BsqbeoMD/Vl8vZ989vbspTQxgcmdB3K8fbNpkLx/XtZouTea/6xoSQ=="
19
+ NODE_ENV="encrypted:BLuNV9VTbw4ojF8HW4dGOVCdXj5En9/+GszwFftnYSIlUtXpldA/2ilwSs7ImM+l5BTnCSpuogczRBYy0uulYuRsGrcLBUSLvrSUsLoMFrIY2bfyXlVB2f6NRV9qlaTL0E9aN3/mDpuImXo="
@@ -0,0 +1,39 @@
1
+ name: 'CI Checks'
2
+ description: 'Run CI checks including setup, type check, lint, and tests'
3
+
4
+ inputs:
5
+ database-url:
6
+ description: 'Database URL for running tests with DB connection'
7
+ required: false
8
+ default: ''
9
+
10
+ runs:
11
+ using: 'composite'
12
+ steps:
13
+ - name: Setup Environment
14
+ uses: ./.github/actions/setup
15
+
16
+ - name: Generate artifacts
17
+ run: pnpm generate
18
+ shell: bash
19
+
20
+ - name: Prisma migrate deploy
21
+ if: inputs.database-url != ''
22
+ run: pnpm db:migrate:deploy
23
+ shell: bash
24
+ env:
25
+ DATABASE_URL: ${{ inputs.database-url }}
26
+
27
+ - name: Run TypeScript type check
28
+ run: pnpm typecheck
29
+ shell: bash
30
+
31
+ - name: Run lint
32
+ run: pnpm lint
33
+ shell: bash
34
+
35
+ - name: Run tests
36
+ run: pnpm test
37
+ shell: bash
38
+ env:
39
+ DATABASE_URL: ${{ inputs.database-url }}
@@ -0,0 +1,39 @@
1
+ name: 'Database Migration'
2
+ description: 'Run Prisma migration and optional seed'
3
+
4
+ inputs:
5
+ dotenv-file:
6
+ description: 'dotenvx file path (e.g., $GITHUB_WORKSPACE/.env.production)'
7
+ required: true
8
+ dotenv-private-key:
9
+ description: 'dotenvx private key for decrypting the dotenv file'
10
+ required: true
11
+ run-seed:
12
+ description: 'Whether to run seed (true/false)'
13
+ required: false
14
+ default: 'false'
15
+
16
+ runs:
17
+ using: 'composite'
18
+ steps:
19
+ - name: Setup Environment
20
+ uses: ./.github/actions/setup
21
+
22
+ # DB マイグレーション
23
+ - name: Run Prisma migrate deploy
24
+ run: |
25
+ npx dotenvx run -f ${{ inputs.dotenv-file }} -- \
26
+ pnpm db:migrate:deploy
27
+ shell: bash
28
+ env:
29
+ DOTENV_PRIVATE_KEY: ${{ inputs.dotenv-private-key }}
30
+
31
+ # シード(オプション)
32
+ - name: Run Seed
33
+ if: inputs.run-seed == 'true'
34
+ run: |
35
+ npx dotenvx run -f ${{ inputs.dotenv-file }} -- \
36
+ pnpm --filter @repo/server-core db:seed
37
+ shell: bash
38
+ env:
39
+ DOTENV_PRIVATE_KEY: ${{ inputs.dotenv-private-key }}
@@ -0,0 +1,28 @@
1
+ name: 'Export Neon Environment Variables'
2
+ description: 'Export NEON_API_KEY and NEON_PROJECT_ID from .env.preview via dotenvx'
3
+ inputs:
4
+ dotenv-private-key-preview:
5
+ description: 'DOTENV_PRIVATE_KEY_PREVIEW secret'
6
+ required: true
7
+ runs:
8
+ using: 'composite'
9
+ steps:
10
+ - name: Export Neon environment variables
11
+ run: |
12
+ npx dotenvx run -f .env.preview -- bash -c '
13
+ echo "NEON_API_KEY=$NEON_API_KEY" >> $GITHUB_ENV
14
+ echo "NEON_PROJECT_ID=$NEON_PROJECT_ID" >> $GITHUB_ENV
15
+ '
16
+ shell: bash
17
+ env:
18
+ DOTENV_PRIVATE_KEY_PREVIEW: ${{ inputs.dotenv-private-key-preview }}
19
+
20
+ - name: Validate and mask Neon environment variables
21
+ run: |
22
+ if [ -z "$NEON_API_KEY" ] || [ -z "$NEON_PROJECT_ID" ]; then
23
+ echo "::error::Failed to export Neon environment variables. Check DOTENV_PRIVATE_KEY_PREVIEW."
24
+ exit 1
25
+ fi
26
+ echo "::add-mask::$NEON_API_KEY"
27
+ echo "Neon environment variables exported successfully (project: $NEON_PROJECT_ID)"
28
+ shell: bash
@@ -0,0 +1,20 @@
1
+ name: 'Setup Environment'
2
+ description: 'Setup pnpm, Node.js, and install dependencies'
3
+
4
+ runs:
5
+ using: 'composite'
6
+ steps:
7
+ - name: Setup pnpm
8
+ uses: pnpm/action-setup@v4
9
+ with:
10
+ version: 10.14.0
11
+
12
+ - name: Setup Node.js
13
+ uses: actions/setup-node@v4
14
+ with:
15
+ node-version: '22.16.0'
16
+ cache: 'pnpm'
17
+
18
+ - name: Install dependencies
19
+ run: pnpm install --frozen-lockfile
20
+ shell: bash
@@ -26,6 +26,7 @@ jobs:
26
26
  contents: write
27
27
  pull-requests: write
28
28
  issues: write
29
+ id-token: write
29
30
  steps:
30
31
  - name: Checkout repository
31
32
  uses: actions/checkout@v4
@@ -15,37 +15,41 @@ jobs:
15
15
  steps:
16
16
  - uses: actions/checkout@v4
17
17
 
18
- - name: Setup pnpm
19
- uses: pnpm/action-setup@v4
20
- with:
21
- version: 10.14.0
22
-
23
- - name: Setup Node.js
24
- uses: actions/setup-node@v4
25
- with:
26
- node-version: '22.16.0'
27
- cache: 'pnpm'
28
-
29
- - name: Install dependencies
30
- run: pnpm install --frozen-lockfile
18
+ - name: Setup Environment
19
+ uses: ./.github/actions/setup
31
20
 
32
21
  - name: Export Neon environment variables
33
- run: |
34
- npx dotenvx run -f .env.preview -- bash -c 'echo "NEON_API_KEY=$NEON_API_KEY" >> $GITHUB_ENV'
35
- npx dotenvx run -f .env.preview -- bash -c 'echo "NEON_PROJECT_ID=$NEON_PROJECT_ID" >> $GITHUB_ENV'
36
- env:
37
- DOTENV_PRIVATE_KEY_PREVIEW: ${{ secrets.DOTENV_PRIVATE_KEY_PREVIEW }}
22
+ uses: ./.github/actions/neon-export-env
23
+ with:
24
+ dotenv-private-key-preview: ${{ secrets.DOTENV_PRIVATE_KEY_PREVIEW }}
38
25
 
39
26
  - name: Cleanup orphaned preview branches
40
27
  run: |
41
- # NOTE: Neon APIはページングされる可能性あり。ブランチ数が多い場合は要対応
42
- echo "Fetching branches from Neon..."
43
- BRANCHES=$(curl -s "https://console.neon.tech/api/v2/projects/${{ env.NEON_PROJECT_ID }}/branches" \
44
- -H "Authorization: Bearer ${{ env.NEON_API_KEY }}" \
45
- -H "Accept: application/json")
28
+ echo "Fetching all branches from Neon (with pagination)..."
29
+ CURSOR=""
30
+ ALL_BRANCHES="[]"
31
+ while true; do
32
+ # Neon APIの1リクエストあたり最大取得数は100
33
+ URL="https://console.neon.tech/api/v2/projects/${{ env.NEON_PROJECT_ID }}/branches?limit=100"
34
+ if [ -n "$CURSOR" ]; then
35
+ URL="${URL}&cursor=${CURSOR}"
36
+ fi
37
+ RESPONSE=$(curl -s "$URL" \
38
+ -H "Authorization: Bearer ${{ env.NEON_API_KEY }}" \
39
+ -H "Accept: application/json")
40
+ PAGE=$(echo "$RESPONSE" | jq '.branches')
41
+ ALL_BRANCHES=$(echo "$ALL_BRANCHES $PAGE" | jq -s '.[0] + .[1]')
42
+ NEXT=$(echo "$RESPONSE" | jq -r '.pagination.next // empty')
43
+ if [ -z "$NEXT" ]; then
44
+ break
45
+ fi
46
+ CURSOR="$NEXT"
47
+ echo "Fetching next page (cursor: $CURSOR)..."
48
+ done
49
+ echo "Total branches fetched: $(echo "$ALL_BRANCHES" | jq length)"
46
50
 
47
51
  # preview/pr-{番号}形式のブランチを抽出
48
- echo "$BRANCHES" | jq -r '.branches[] | select(.name | startswith("preview/pr-")) | "\(.id) \(.name)"' | \
52
+ echo "$ALL_BRANCHES" | jq -r '.[] | select(.name | startswith("preview/pr-")) | "\(.id) \(.name)"' | \
49
53
  while read -r BRANCH_ID BRANCH_NAME; do
50
54
  if [ -n "$BRANCH_ID" ]; then
51
55
  # ブランチ名からPR番号を抽出
@@ -0,0 +1,50 @@
1
+ name: Cleanup PR Preview (on close)
2
+
3
+ on:
4
+ pull_request:
5
+ types: [closed]
6
+
7
+ concurrency:
8
+ group: pr-preview-${{ github.event.number }}
9
+ cancel-in-progress: true
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ cleanup:
16
+ if: github.event.pull_request.head.repo.full_name == github.repository
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ - uses: ./.github/actions/setup
21
+ - name: Export Neon environment variables
22
+ uses: ./.github/actions/neon-export-env
23
+ with:
24
+ dotenv-private-key-preview: ${{ secrets.DOTENV_PRIVATE_KEY_PREVIEW }}
25
+ - name: Remove Vercel preview aliases
26
+ continue-on-error: true
27
+ env:
28
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
29
+ run: |
30
+ pnpm add -g vercel@latest
31
+ for PROJECT_ID in "${{ secrets.VERCEL_PROJECT_ID_WEB }}" "${{ secrets.VERCEL_PROJECT_ID_ADMIN }}"; do
32
+ PROJECT_NAME=$(curl -s \
33
+ "https://api.vercel.com/v9/projects/$PROJECT_ID" \
34
+ -H "Authorization: Bearer $VERCEL_TOKEN" | jq -r '.name')
35
+ if [ -n "$PROJECT_NAME" ] && [ "$PROJECT_NAME" != "null" ]; then
36
+ PROJECT_NAME=$(echo "$PROJECT_NAME" | tr '[:upper:]' '[:lower:]')
37
+ ALIAS="${PROJECT_NAME}-pr-${{ github.event.number }}.vercel.app"
38
+ echo "Removing alias: $ALIAS"
39
+ vercel alias rm "$ALIAS" --token=$VERCEL_TOKEN --yes || true
40
+ else
41
+ echo "::warning::プロジェクト名を取得できませんでした (project_id: $PROJECT_ID)"
42
+ fi
43
+ done
44
+ - name: Delete Neon Branch
45
+ continue-on-error: true
46
+ uses: neondatabase/delete-branch-action@v3
47
+ with:
48
+ project_id: ${{ env.NEON_PROJECT_ID }}
49
+ branch: preview/pr-${{ github.event.number }}
50
+ api_key: ${{ env.NEON_API_KEY }}