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.
- package/package.json +2 -2
- package/templates/default/.claude/hooks/einja/biome-format.sh +2 -2
- package/templates/default/.claude/hooks/einja/playwright-resize.sh +12 -2
- package/templates/default/.claude/settings.json +15 -0
- package/templates/default/.cursor/commands/task-vibe-kanban-loop.md +107 -42
- package/templates/default/.env.develop +0 -4
- package/templates/default/.env.example +1 -0
- package/templates/default/.env.preview +0 -4
- package/templates/default/.env.staging +19 -0
- package/templates/default/.github/actions/ci/action.yml +39 -0
- package/templates/default/.github/actions/migrate/action.yml +39 -0
- package/templates/default/.github/actions/neon-export-env/action.yml +28 -0
- package/templates/default/.github/actions/setup/action.yml +20 -0
- package/templates/default/.github/workflows/claude.yml +1 -0
- package/templates/default/.github/workflows/{cleanup-neon-branches.yml → cleanup-pr-preview-db.yml} +28 -24
- package/templates/default/.github/workflows/cleanup-pr-preview-on-close.yml +50 -0
- package/templates/default/.github/workflows/deploy-pr-preview.yml +398 -0
- package/templates/default/.github/workflows/deploy-stable-branches.yml +259 -0
- package/templates/default/.github/workflows/release-create-einja-app.yml +95 -0
- package/templates/default/.mcp.json +6 -9
- package/templates/default/.serena/project.yml +22 -1
- package/templates/default/CLAUDE.md +52 -10
- package/templates/default/README.md +5 -14
- package/templates/default/apps/admin/next.config.ts +11 -0
- package/templates/default/apps/admin/package.json +55 -0
- package/templates/default/apps/admin/postcss.config.cjs +5 -0
- package/templates/default/apps/admin/src/app/(auth)/forgot-password/page.tsx +97 -0
- package/templates/default/apps/admin/src/app/(auth)/layout.tsx +18 -0
- package/templates/default/apps/admin/src/app/(auth)/otp/page.tsx +121 -0
- package/templates/default/apps/admin/src/app/(auth)/sign-in/page.tsx +145 -0
- package/templates/default/apps/admin/src/app/(auth)/sign-up/page.tsx +199 -0
- package/templates/default/apps/admin/src/app/(errors)/401/page.tsx +27 -0
- package/templates/default/apps/admin/src/app/(errors)/403/page.tsx +28 -0
- package/templates/default/apps/admin/src/app/(errors)/500/page.tsx +29 -0
- package/templates/default/apps/admin/src/app/(errors)/layout.tsx +7 -0
- package/templates/default/apps/admin/src/app/(errors)/maintenance/page.tsx +25 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/analytics-chart.tsx +68 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/analytics.tsx +182 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/dashboard-page.tsx +74 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/metric-cards.tsx +49 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/overview-chart.tsx +73 -0
- package/templates/default/apps/admin/src/app/dashboard/_components/recent-sales.tsx +75 -0
- package/templates/default/apps/admin/src/app/dashboard/apps/_components/apps-page.tsx +135 -0
- package/templates/default/apps/admin/src/app/dashboard/apps/page.tsx +10 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/_components/chat-list.tsx +82 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/_components/chat-messages.tsx +194 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/_components/chats-page.tsx +99 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/_components/new-chat.tsx +118 -0
- package/templates/default/apps/admin/src/app/dashboard/chats/page.tsx +10 -0
- package/templates/default/apps/admin/src/app/dashboard/layout.tsx +9 -0
- package/templates/default/apps/admin/src/app/dashboard/not-found.tsx +14 -0
- package/templates/default/apps/admin/src/app/dashboard/page.tsx +10 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/_components/content-section.tsx +20 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/_components/sidebar-nav.tsx +66 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/account/page.tsx +173 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/appearance/page.tsx +156 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/display/page.tsx +125 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/layout.tsx +30 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/notifications/page.tsx +196 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/page.tsx +5 -0
- package/templates/default/apps/admin/src/app/dashboard/settings/profile/page.tsx +176 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/data-table-bulk-actions.tsx +183 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/data-table-row-actions.tsx +79 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-columns.tsx +107 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-dialogs.tsx +71 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-import-dialog.tsx +106 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-multi-delete-dialog.tsx +90 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-mutate-drawer.tsx +207 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-page.tsx +31 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-primary-buttons.tsx +19 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-provider.tsx +37 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/_components/tasks-table.tsx +155 -0
- package/templates/default/apps/admin/src/app/dashboard/tasks/page.tsx +14 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/data-table-bulk-actions.tsx +136 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/data-table-row-actions.tsx +62 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-action-dialog.tsx +297 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-columns.tsx +121 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-delete-dialog.tsx +72 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-dialogs.tsx +49 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-invite-dialog.tsx +139 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-multi-delete-dialog.tsx +89 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-page.tsx +30 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-primary-buttons.tsx +19 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-provider.tsx +35 -0
- package/templates/default/apps/admin/src/app/dashboard/users/_components/users-table.tsx +157 -0
- package/templates/default/apps/admin/src/app/dashboard/users/page.tsx +10 -0
- package/templates/default/apps/admin/src/app/globals.css +109 -0
- package/templates/default/apps/admin/src/app/layout.tsx +32 -0
- package/templates/default/apps/admin/src/app/not-found.tsx +14 -0
- package/templates/default/apps/admin/src/app/page.tsx +5 -0
- package/templates/default/apps/admin/src/components/layout/admin-layout.tsx +16 -0
- package/templates/default/apps/admin/src/components/layout/app-sidebar.tsx +52 -0
- package/templates/default/apps/admin/src/components/layout/nav-config.ts +131 -0
- package/templates/default/apps/admin/src/components/providers/theme-provider.tsx +10 -0
- package/templates/default/apps/admin/src/components/shared/long-text.tsx +78 -0
- package/templates/default/apps/admin/src/components/shared/search-input.tsx +16 -0
- package/templates/default/apps/admin/src/components/shared/select-dropdown.tsx +64 -0
- package/templates/default/apps/admin/src/data/apps.tsx +116 -0
- package/templates/default/apps/admin/src/data/chats.ts +114 -0
- package/templates/default/apps/admin/src/data/tasks.ts +114 -0
- package/templates/default/apps/admin/src/data/users.ts +90 -0
- package/templates/default/apps/admin/src/hooks/use-dialog-state.ts +17 -0
- package/templates/default/apps/admin/src/hooks/use-table-url-state.ts +243 -0
- package/templates/default/apps/admin/src/lib/show-submitted-data.tsx +12 -0
- package/templates/default/apps/admin/src/types/table.d.ts +9 -0
- package/templates/default/apps/admin/tsconfig.json +32 -0
- package/templates/default/apps/web/next.config.ts +1 -0
- package/templates/default/apps/web/package.json +1 -22
- package/templates/default/apps/web/postcss.config.cjs +0 -1
- package/templates/default/apps/web/src/app/(authenticated)/dashboard/page.tsx +4 -20
- package/templates/default/apps/web/src/app/(authenticated)/data/_components/UserTable.tsx +4 -4
- package/templates/default/apps/web/src/app/(authenticated)/data/page.tsx +1 -1
- package/templates/default/apps/web/src/app/(authenticated)/profile/page.tsx +1 -1
- package/templates/default/apps/web/src/app/error.tsx +8 -70
- package/templates/default/apps/web/src/app/global-error.tsx +8 -70
- package/templates/default/apps/web/src/app/globals.css +20 -0
- package/templates/default/apps/web/src/app/not-found.tsx +5 -39
- package/templates/default/apps/web/src/app/page.tsx +27 -203
- package/templates/default/apps/web/src/app/signin/page.tsx +27 -191
- package/templates/default/apps/web/src/app/signup/page.tsx +33 -240
- package/templates/default/apps/web/src/components/dashboard/dashboard-stats.tsx +11 -75
- package/templates/default/apps/web/src/components/shared/Sidebar.tsx +3 -3
- package/templates/default/apps/web/src/components/shared/header.tsx +17 -112
- package/templates/default/apps/web/tsconfig.json +0 -6
- package/templates/default/biome.json +30 -2
- package/templates/default/components.json +2 -2
- package/templates/default/docker-compose.yml +1 -1
- package/templates/default/gitignore +4 -0
- package/templates/default/package.json +2 -0
- package/templates/default/packages/admin-ui/catalog/catalog.css +54 -0
- package/templates/default/packages/admin-ui/catalog/catalog.tsx +401 -0
- package/templates/default/packages/admin-ui/catalog/index.html +12 -0
- package/templates/default/packages/admin-ui/catalog/main.tsx +9 -0
- package/templates/default/packages/admin-ui/components.json +21 -0
- package/templates/default/packages/admin-ui/package.json +105 -0
- package/templates/default/packages/admin-ui/src/command-menu/index.tsx +174 -0
- package/templates/default/packages/admin-ui/src/data-table/bulk-actions.tsx +215 -0
- package/templates/default/packages/admin-ui/src/data-table/column-header.tsx +73 -0
- package/templates/default/packages/admin-ui/src/data-table/data-table.tsx +127 -0
- package/templates/default/packages/admin-ui/src/data-table/faceted-filter.tsx +148 -0
- package/templates/default/packages/admin-ui/src/data-table/index.tsx +9 -0
- package/templates/default/packages/admin-ui/src/data-table/pagination.tsx +101 -0
- package/templates/default/packages/admin-ui/src/data-table/toolbar.tsx +87 -0
- package/templates/default/packages/admin-ui/src/data-table/view-options.tsx +57 -0
- package/templates/default/packages/admin-ui/src/hooks/use-mobile.tsx +23 -0
- package/templates/default/packages/admin-ui/src/layout/header.tsx +55 -0
- package/templates/default/packages/admin-ui/src/layout/index.ts +10 -0
- package/templates/default/packages/admin-ui/src/layout/main.tsx +23 -0
- package/templates/default/packages/admin-ui/src/layout/nav-group.tsx +111 -0
- package/templates/default/packages/admin-ui/src/layout/nav-user.tsx +114 -0
- package/templates/default/packages/admin-ui/src/layout/theme-switch.tsx +40 -0
- package/templates/default/packages/admin-ui/src/layout/types.ts +21 -0
- package/templates/default/packages/admin-ui/src/lib/utils.ts +6 -0
- package/templates/default/packages/admin-ui/src/styles/base.css +65 -0
- package/templates/default/packages/admin-ui/src/styles/tokens.css +91 -0
- package/templates/default/packages/admin-ui/src/tanstack-table.d.ts +10 -0
- package/templates/default/packages/admin-ui/src/ui/alert-dialog.tsx +157 -0
- package/templates/default/packages/admin-ui/src/ui/alert.tsx +66 -0
- package/templates/default/packages/admin-ui/src/ui/avatar.tsx +53 -0
- package/templates/default/packages/admin-ui/src/ui/badge.tsx +46 -0
- package/templates/default/packages/admin-ui/src/ui/breadcrumb.tsx +108 -0
- package/templates/default/packages/admin-ui/src/ui/button.tsx +59 -0
- package/templates/default/packages/admin-ui/src/ui/calendar.tsx +69 -0
- package/templates/default/packages/admin-ui/src/ui/card.tsx +92 -0
- package/templates/default/packages/admin-ui/src/ui/chart.tsx +345 -0
- package/templates/default/packages/admin-ui/src/ui/checkbox.tsx +32 -0
- package/templates/default/packages/admin-ui/src/ui/collapsible.tsx +27 -0
- package/templates/default/packages/admin-ui/src/ui/command.tsx +161 -0
- package/templates/default/packages/admin-ui/src/ui/confirm-dialog.tsx +72 -0
- package/templates/default/packages/admin-ui/src/ui/date-picker.tsx +53 -0
- package/templates/default/packages/admin-ui/src/ui/dialog.tsx +143 -0
- package/templates/default/packages/admin-ui/src/ui/dropdown-menu.tsx +257 -0
- package/templates/default/packages/admin-ui/src/ui/form.tsx +168 -0
- package/templates/default/packages/admin-ui/src/ui/input-otp.tsx +84 -0
- package/templates/default/packages/admin-ui/src/ui/input.tsx +21 -0
- package/templates/default/packages/admin-ui/src/ui/label.tsx +24 -0
- package/templates/default/packages/admin-ui/src/ui/pagination.tsx +126 -0
- package/templates/default/packages/admin-ui/src/ui/password-input.tsx +46 -0
- package/templates/default/packages/admin-ui/src/ui/popover.tsx +48 -0
- package/templates/default/packages/admin-ui/src/ui/progress.tsx +31 -0
- package/templates/default/packages/admin-ui/src/ui/radio-group.tsx +45 -0
- package/templates/default/packages/admin-ui/src/ui/scroll-area.tsx +52 -0
- package/templates/default/packages/admin-ui/src/ui/select.tsx +185 -0
- package/templates/default/packages/admin-ui/src/ui/separator.tsx +28 -0
- package/templates/default/packages/admin-ui/src/ui/sheet.tsx +149 -0
- package/templates/default/packages/admin-ui/src/ui/sidebar.tsx +728 -0
- package/templates/default/packages/admin-ui/src/ui/skeleton.tsx +13 -0
- package/templates/default/packages/admin-ui/src/ui/sonner.tsx +25 -0
- package/templates/default/packages/admin-ui/src/ui/switch.tsx +31 -0
- package/templates/default/packages/admin-ui/src/ui/table.tsx +116 -0
- package/templates/default/packages/admin-ui/src/ui/tabs.tsx +66 -0
- package/templates/default/packages/admin-ui/src/ui/textarea.tsx +18 -0
- package/templates/default/packages/admin-ui/src/ui/toggle-group.tsx +60 -0
- package/templates/default/packages/admin-ui/src/ui/toggle.tsx +44 -0
- package/templates/default/packages/admin-ui/src/ui/tooltip.tsx +61 -0
- package/templates/default/packages/admin-ui/tsconfig.json +8 -0
- package/templates/default/packages/admin-ui/vite.config.ts +11 -0
- package/templates/default/packages/config/package.json +0 -2
- package/templates/default/packages/server-core/package.json +2 -0
- package/templates/default/packages/ui/components.json +21 -0
- package/templates/default/packages/ui/package.json +42 -5
- package/templates/default/packages/ui/src/accordion.tsx +1 -1
- package/templates/default/packages/ui/src/alert-dialog.tsx +4 -4
- package/templates/default/packages/ui/src/alert.tsx +1 -1
- package/templates/default/packages/ui/src/avatar.tsx +1 -1
- package/templates/default/packages/ui/src/badge.tsx +1 -1
- package/templates/default/packages/ui/src/breadcrumb.tsx +1 -1
- package/templates/default/packages/ui/src/button.tsx +1 -1
- package/templates/default/packages/ui/src/card.tsx +1 -1
- package/templates/default/packages/ui/src/checkbox.tsx +1 -1
- package/templates/default/packages/ui/src/dialog.tsx +3 -3
- package/templates/default/packages/ui/src/drawer.tsx +3 -3
- package/templates/default/packages/ui/src/dropdown-menu.tsx +3 -3
- package/templates/default/packages/ui/src/form.tsx +2 -2
- package/templates/default/packages/ui/src/hover-card.tsx +2 -2
- package/templates/default/packages/ui/src/input.tsx +1 -1
- package/templates/default/packages/ui/src/label.tsx +1 -1
- package/templates/default/packages/ui/src/pagination.tsx +2 -2
- package/templates/default/packages/ui/src/popover.tsx +2 -2
- package/templates/default/packages/ui/src/progress.tsx +1 -1
- package/templates/default/packages/ui/src/select.tsx +2 -2
- package/templates/default/packages/ui/src/separator.tsx +1 -1
- package/templates/default/packages/ui/src/skeleton.tsx +1 -1
- package/templates/default/packages/ui/src/table.tsx +1 -1
- package/templates/default/packages/ui/src/tabs.tsx +1 -1
- package/templates/default/packages/ui/src/textarea.tsx +1 -1
- package/templates/default/packages/ui/src/tooltip.tsx +3 -3
- package/templates/default/packages/ui/src/typography.tsx +1 -1
- package/templates/default/packages/ui/tsconfig.json +1 -6
- package/templates/default/pnpm-lock.yaml +1319 -936
- package/templates/default/postcss.config.cjs +0 -1
- package/templates/default/turbo.json +17 -8
- package/templates/default/worktree.config.json +5 -0
- package/templates/default/.env.ci +0 -32
- package/templates/default/.github/workflows/ci.yml +0 -99
- package/templates/default/.github/workflows/preview-db.yml +0 -134
- package/templates/default/.playwright-mcp/dashboard.png +0 -0
- package/templates/default/.playwright-mcp/web-home.png +0 -0
- package/templates/default/apps/web/panda.config.ts +0 -114
- package/templates/default/apps/web/src/components/ui/accordion.tsx +0 -64
- package/templates/default/apps/web/src/components/ui/alert-dialog.tsx +0 -135
- package/templates/default/apps/web/src/components/ui/alert.tsx +0 -60
- package/templates/default/apps/web/src/components/ui/aspect-ratio.tsx +0 -9
- package/templates/default/apps/web/src/components/ui/avatar.tsx +0 -41
- package/templates/default/apps/web/src/components/ui/badge.tsx +0 -39
- package/templates/default/apps/web/src/components/ui/breadcrumb.tsx +0 -101
- package/templates/default/apps/web/src/components/ui/button.tsx +0 -56
- package/templates/default/apps/web/src/components/ui/card.tsx +0 -75
- package/templates/default/apps/web/src/components/ui/checkbox.tsx +0 -29
- package/templates/default/apps/web/src/components/ui/data-table.tsx +0 -189
- package/templates/default/apps/web/src/components/ui/dialog-hook.tsx +0 -210
- package/templates/default/apps/web/src/components/ui/dialog.tsx +0 -129
- package/templates/default/apps/web/src/components/ui/drawer.tsx +0 -124
- package/templates/default/apps/web/src/components/ui/dropdown-menu.tsx +0 -228
- package/templates/default/apps/web/src/components/ui/form.tsx +0 -152
- package/templates/default/apps/web/src/components/ui/hover-card.tsx +0 -38
- package/templates/default/apps/web/src/components/ui/input.tsx +0 -21
- package/templates/default/apps/web/src/components/ui/label.tsx +0 -21
- package/templates/default/apps/web/src/components/ui/pagination.tsx +0 -105
- package/templates/default/apps/web/src/components/ui/popover.tsx +0 -42
- package/templates/default/apps/web/src/components/ui/progress.tsx +0 -28
- package/templates/default/apps/web/src/components/ui/select.tsx +0 -170
- package/templates/default/apps/web/src/components/ui/separator.tsx +0 -28
- package/templates/default/apps/web/src/components/ui/skeleton.tsx +0 -13
- package/templates/default/apps/web/src/components/ui/sonner.tsx +0 -25
- package/templates/default/apps/web/src/components/ui/table.tsx +0 -92
- package/templates/default/apps/web/src/components/ui/tabs.tsx +0 -54
- package/templates/default/apps/web/src/components/ui/textarea.tsx +0 -18
- package/templates/default/apps/web/src/components/ui/tooltip.tsx +0 -57
- package/templates/default/apps/web/src/components/ui/typography.tsx +0 -158
- package/templates/default/packages/config/panda.config.ts +0 -114
- 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.
|
|
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
|
-
|
|
21
|
+
pnpm exec biome check --write "$file_path" 2>/dev/null || true
|
|
22
22
|
|
|
23
23
|
# 修正後に残っているlintエラーをチェック(any型など自動修正できないもの)
|
|
24
|
-
lint_errors=$(
|
|
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
|
-
|
|
6
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
- 例:
|
|
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
|
-
- タイトル形式:
|
|
262
|
-
- 例:
|
|
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
|
-
**実装時の注意**: `
|
|
305
|
+
**実装時の注意**: `mcp__vibe_kanban__create_issue` を呼び出す際、titleパラメータには `[Issue{N} {X.Y}]` 形式の文字列を渡すこと(Workspace起動時にtitleをコマンドとして解釈させるため)
|
|
282
306
|
|
|
283
307
|
2. **ステータスを "in-progress" に更新**
|
|
284
|
-
- `
|
|
308
|
+
- `mcp__vibe_kanban__update_issue` を使用
|
|
285
309
|
- status パラメータには `"in-progress"` を指定(ハイフン区切り)
|
|
286
310
|
|
|
287
311
|
3. **タスクの実行を開始**
|
|
288
|
-
- `
|
|
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
|
-
- `
|
|
355
|
-
- `
|
|
356
|
-
- `
|
|
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
|
-
|
|
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
|
-
|
|
453
|
-
|
|
454
|
-
|
|
|
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
|
-
|
|
464
|
-
- `
|
|
465
|
-
-
|
|
513
|
+
3. **サブIssue ID** (`issue_id`)
|
|
514
|
+
- `mcp__vibe_kanban__create_issue` のレスポンスから取得
|
|
515
|
+
- Issue更新・削除時に必要
|
|
466
516
|
|
|
467
|
-
|
|
468
|
-
- `
|
|
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
|
|
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: "
|
|
539
|
+
title: "[Issue21 4.1] Turborepoビルドパイプライン最適化",
|
|
482
540
|
description: "..."
|
|
483
541
|
});
|
|
484
|
-
// =>
|
|
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
|
|
488
|
-
|
|
489
|
-
|
|
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
|
-
// =>
|
|
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
|
-
- **複数タスクをまとめて実行する場合、
|
|
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
|
|
|
@@ -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
|
package/templates/default/.github/workflows/{cleanup-neon-branches.yml → cleanup-pr-preview-db.yml}
RENAMED
|
@@ -15,37 +15,41 @@ jobs:
|
|
|
15
15
|
steps:
|
|
16
16
|
- uses: actions/checkout@v4
|
|
17
17
|
|
|
18
|
-
- name: Setup
|
|
19
|
-
uses:
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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 "$
|
|
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 }}
|