@einja/dev-cli 0.1.6

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 (243) hide show
  1. package/README.md +179 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +49 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/init.d.ts +3 -0
  7. package/dist/commands/init.d.ts.map +1 -0
  8. package/dist/commands/init.js +243 -0
  9. package/dist/commands/init.js.map +1 -0
  10. package/dist/commands/list.d.ts +2 -0
  11. package/dist/commands/list.d.ts.map +1 -0
  12. package/dist/commands/list.js +23 -0
  13. package/dist/commands/list.js.map +1 -0
  14. package/dist/commands/sync.d.ts +7 -0
  15. package/dist/commands/sync.d.ts.map +1 -0
  16. package/dist/commands/sync.js +294 -0
  17. package/dist/commands/sync.js.map +1 -0
  18. package/dist/commands/sync.test.d.ts +2 -0
  19. package/dist/commands/sync.test.d.ts.map +1 -0
  20. package/dist/commands/sync.test.js +593 -0
  21. package/dist/commands/sync.test.js.map +1 -0
  22. package/dist/commands/task-loop.d.ts +11 -0
  23. package/dist/commands/task-loop.d.ts.map +1 -0
  24. package/dist/commands/task-loop.js +81 -0
  25. package/dist/commands/task-loop.js.map +1 -0
  26. package/dist/index.d.ts +4 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +3 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/file-system.d.ts +39 -0
  31. package/dist/lib/file-system.d.ts.map +1 -0
  32. package/dist/lib/file-system.js +79 -0
  33. package/dist/lib/file-system.js.map +1 -0
  34. package/dist/lib/mcp-config.d.ts +43 -0
  35. package/dist/lib/mcp-config.d.ts.map +1 -0
  36. package/dist/lib/mcp-config.js +109 -0
  37. package/dist/lib/mcp-config.js.map +1 -0
  38. package/dist/lib/mcp-config.test.d.ts +2 -0
  39. package/dist/lib/mcp-config.test.d.ts.map +1 -0
  40. package/dist/lib/mcp-config.test.js +285 -0
  41. package/dist/lib/mcp-config.test.js.map +1 -0
  42. package/dist/lib/merger.d.ts +41 -0
  43. package/dist/lib/merger.d.ts.map +1 -0
  44. package/dist/lib/merger.js +164 -0
  45. package/dist/lib/merger.js.map +1 -0
  46. package/dist/lib/preset-update/cli-repo-detector.d.ts +35 -0
  47. package/dist/lib/preset-update/cli-repo-detector.d.ts.map +1 -0
  48. package/dist/lib/preset-update/cli-repo-detector.js +83 -0
  49. package/dist/lib/preset-update/cli-repo-detector.js.map +1 -0
  50. package/dist/lib/preset-update/cli-repo-detector.test.d.ts +2 -0
  51. package/dist/lib/preset-update/cli-repo-detector.test.d.ts.map +1 -0
  52. package/dist/lib/preset-update/cli-repo-detector.test.js +120 -0
  53. package/dist/lib/preset-update/cli-repo-detector.test.js.map +1 -0
  54. package/dist/lib/preset-update/file-copier.d.ts +59 -0
  55. package/dist/lib/preset-update/file-copier.d.ts.map +1 -0
  56. package/dist/lib/preset-update/file-copier.js +220 -0
  57. package/dist/lib/preset-update/file-copier.js.map +1 -0
  58. package/dist/lib/preset-update/file-copier.test.d.ts +2 -0
  59. package/dist/lib/preset-update/file-copier.test.d.ts.map +1 -0
  60. package/dist/lib/preset-update/file-copier.test.js +297 -0
  61. package/dist/lib/preset-update/file-copier.test.js.map +1 -0
  62. package/dist/lib/preset-update/preset-finder.d.ts +39 -0
  63. package/dist/lib/preset-update/preset-finder.d.ts.map +1 -0
  64. package/dist/lib/preset-update/preset-finder.js +92 -0
  65. package/dist/lib/preset-update/preset-finder.js.map +1 -0
  66. package/dist/lib/preset-update/preset-finder.test.d.ts +2 -0
  67. package/dist/lib/preset-update/preset-finder.test.d.ts.map +1 -0
  68. package/dist/lib/preset-update/preset-finder.test.js +128 -0
  69. package/dist/lib/preset-update/preset-finder.test.js.map +1 -0
  70. package/dist/lib/preset.d.ts +14 -0
  71. package/dist/lib/preset.d.ts.map +1 -0
  72. package/dist/lib/preset.js +52 -0
  73. package/dist/lib/preset.js.map +1 -0
  74. package/dist/lib/sync/backup-manager.d.ts +50 -0
  75. package/dist/lib/sync/backup-manager.d.ts.map +1 -0
  76. package/dist/lib/sync/backup-manager.js +117 -0
  77. package/dist/lib/sync/backup-manager.js.map +1 -0
  78. package/dist/lib/sync/backup-manager.test.d.ts +2 -0
  79. package/dist/lib/sync/backup-manager.test.d.ts.map +1 -0
  80. package/dist/lib/sync/backup-manager.test.js +155 -0
  81. package/dist/lib/sync/backup-manager.test.js.map +1 -0
  82. package/dist/lib/sync/batch-processor.d.ts +27 -0
  83. package/dist/lib/sync/batch-processor.d.ts.map +1 -0
  84. package/dist/lib/sync/batch-processor.js +46 -0
  85. package/dist/lib/sync/batch-processor.js.map +1 -0
  86. package/dist/lib/sync/batch-processor.test.d.ts +2 -0
  87. package/dist/lib/sync/batch-processor.test.d.ts.map +1 -0
  88. package/dist/lib/sync/batch-processor.test.js +110 -0
  89. package/dist/lib/sync/batch-processor.test.js.map +1 -0
  90. package/dist/lib/sync/category-validator.d.ts +36 -0
  91. package/dist/lib/sync/category-validator.d.ts.map +1 -0
  92. package/dist/lib/sync/category-validator.js +46 -0
  93. package/dist/lib/sync/category-validator.js.map +1 -0
  94. package/dist/lib/sync/category-validator.test.d.ts +2 -0
  95. package/dist/lib/sync/category-validator.test.d.ts.map +1 -0
  96. package/dist/lib/sync/category-validator.test.js +89 -0
  97. package/dist/lib/sync/category-validator.test.js.map +1 -0
  98. package/dist/lib/sync/conflict-reporter.d.ts +57 -0
  99. package/dist/lib/sync/conflict-reporter.d.ts.map +1 -0
  100. package/dist/lib/sync/conflict-reporter.js +81 -0
  101. package/dist/lib/sync/conflict-reporter.js.map +1 -0
  102. package/dist/lib/sync/conflict-reporter.test.d.ts +2 -0
  103. package/dist/lib/sync/conflict-reporter.test.d.ts.map +1 -0
  104. package/dist/lib/sync/conflict-reporter.test.js +132 -0
  105. package/dist/lib/sync/conflict-reporter.test.js.map +1 -0
  106. package/dist/lib/sync/diff-engine.d.ts +28 -0
  107. package/dist/lib/sync/diff-engine.d.ts.map +1 -0
  108. package/dist/lib/sync/diff-engine.js +118 -0
  109. package/dist/lib/sync/diff-engine.js.map +1 -0
  110. package/dist/lib/sync/diff-engine.test.d.ts +2 -0
  111. package/dist/lib/sync/diff-engine.test.d.ts.map +1 -0
  112. package/dist/lib/sync/diff-engine.test.js +133 -0
  113. package/dist/lib/sync/diff-engine.test.js.map +1 -0
  114. package/dist/lib/sync/file-filter.d.ts +40 -0
  115. package/dist/lib/sync/file-filter.d.ts.map +1 -0
  116. package/dist/lib/sync/file-filter.js +171 -0
  117. package/dist/lib/sync/file-filter.js.map +1 -0
  118. package/dist/lib/sync/file-filter.test.d.ts +2 -0
  119. package/dist/lib/sync/file-filter.test.d.ts.map +1 -0
  120. package/dist/lib/sync/file-filter.test.js +179 -0
  121. package/dist/lib/sync/file-filter.test.js.map +1 -0
  122. package/dist/lib/sync/hash-cache.d.ts +34 -0
  123. package/dist/lib/sync/hash-cache.d.ts.map +1 -0
  124. package/dist/lib/sync/hash-cache.js +51 -0
  125. package/dist/lib/sync/hash-cache.js.map +1 -0
  126. package/dist/lib/sync/hash-cache.test.d.ts +2 -0
  127. package/dist/lib/sync/hash-cache.test.d.ts.map +1 -0
  128. package/dist/lib/sync/hash-cache.test.js +110 -0
  129. package/dist/lib/sync/hash-cache.test.js.map +1 -0
  130. package/dist/lib/sync/integration.test.d.ts +2 -0
  131. package/dist/lib/sync/integration.test.d.ts.map +1 -0
  132. package/dist/lib/sync/integration.test.js +317 -0
  133. package/dist/lib/sync/integration.test.js.map +1 -0
  134. package/dist/lib/sync/marker-processor.d.ts +54 -0
  135. package/dist/lib/sync/marker-processor.d.ts.map +1 -0
  136. package/dist/lib/sync/marker-processor.js +208 -0
  137. package/dist/lib/sync/marker-processor.js.map +1 -0
  138. package/dist/lib/sync/marker-processor.test.d.ts +2 -0
  139. package/dist/lib/sync/marker-processor.test.d.ts.map +1 -0
  140. package/dist/lib/sync/marker-processor.test.js +245 -0
  141. package/dist/lib/sync/marker-processor.test.js.map +1 -0
  142. package/dist/lib/sync/metadata-manager.d.ts +46 -0
  143. package/dist/lib/sync/metadata-manager.d.ts.map +1 -0
  144. package/dist/lib/sync/metadata-manager.js +129 -0
  145. package/dist/lib/sync/metadata-manager.js.map +1 -0
  146. package/dist/lib/sync/metadata-manager.test.d.ts +2 -0
  147. package/dist/lib/sync/metadata-manager.test.d.ts.map +1 -0
  148. package/dist/lib/sync/metadata-manager.test.js +137 -0
  149. package/dist/lib/sync/metadata-manager.test.js.map +1 -0
  150. package/dist/lib/sync/performance.test.d.ts +2 -0
  151. package/dist/lib/sync/performance.test.d.ts.map +1 -0
  152. package/dist/lib/sync/performance.test.js +126 -0
  153. package/dist/lib/sync/performance.test.js.map +1 -0
  154. package/dist/types/index.d.ts +59 -0
  155. package/dist/types/index.d.ts.map +1 -0
  156. package/dist/types/index.js +2 -0
  157. package/dist/types/index.js.map +1 -0
  158. package/dist/types/preset-update.d.ts +106 -0
  159. package/dist/types/preset-update.d.ts.map +1 -0
  160. package/dist/types/preset-update.js +5 -0
  161. package/dist/types/preset-update.js.map +1 -0
  162. package/dist/types/sync.d.ts +169 -0
  163. package/dist/types/sync.d.ts.map +1 -0
  164. package/dist/types/sync.js +19 -0
  165. package/dist/types/sync.js.map +1 -0
  166. package/package.json +72 -0
  167. package/presets/minimal/.claude/agents/einja/docs/docs-updater.md +161 -0
  168. package/presets/minimal/.claude/agents/einja/frontend/design-engineer.md +685 -0
  169. package/presets/minimal/.claude/agents/einja/frontend/frontend-architect.md +747 -0
  170. package/presets/minimal/.claude/agents/einja/frontend/frontend-coder.md +441 -0
  171. package/presets/minimal/.claude/agents/einja/git/conflict-resolver.md +148 -0
  172. package/presets/minimal/.claude/agents/einja/specs/spec-design-generator.md +462 -0
  173. package/presets/minimal/.claude/agents/einja/specs/spec-qa-generator.md +466 -0
  174. package/presets/minimal/.claude/agents/einja/specs/spec-requirements-generator.md +416 -0
  175. package/presets/minimal/.claude/agents/einja/specs/spec-tasks-generator.md +608 -0
  176. package/presets/minimal/.claude/agents/einja/task/task-committer.md +82 -0
  177. package/presets/minimal/.claude/agents/einja/task/task-executer.md +352 -0
  178. package/presets/minimal/.claude/agents/einja/task/task-modification-analyzer.md +369 -0
  179. package/presets/minimal/.claude/agents/einja/task/task-qa.md +74 -0
  180. package/presets/minimal/.claude/agents/einja/task/task-reviewer.md +169 -0
  181. package/presets/minimal/.claude/commands/einja/frontend-implement.md +322 -0
  182. package/presets/minimal/.claude/commands/einja/spec-create.md +254 -0
  183. package/presets/minimal/.claude/commands/einja/start-dev.md +98 -0
  184. package/presets/minimal/.claude/commands/einja/sync-cursor-commands.md +203 -0
  185. package/presets/minimal/.claude/commands/einja/task-exec.md +390 -0
  186. package/presets/minimal/.claude/commands/einja/update-docs-by-task-specs.md +448 -0
  187. package/presets/minimal/.claude/hooks/einja/biome-format.sh +49 -0
  188. package/presets/minimal/.claude/hooks/einja/design-doc-check.sh +61 -0
  189. package/presets/minimal/.claude/hooks/einja/detect-secrets.sh +62 -0
  190. package/presets/minimal/.claude/hooks/einja/large-file-warning.sh +42 -0
  191. package/presets/minimal/.claude/hooks/einja/playwright-resize.sh +36 -0
  192. package/presets/minimal/.claude/hooks/einja/typecheck.sh +37 -0
  193. package/presets/minimal/.claude/hooks/einja/unset-volta-recursion.sh +32 -0
  194. package/presets/minimal/.claude/hooks/einja/validate-git-commit.sh +239 -0
  195. package/presets/minimal/.claude/hooks/einja/warn-index-ts.sh +34 -0
  196. package/presets/minimal/.claude/hooks/einja/warn-relative-import.sh +48 -0
  197. package/presets/minimal/.claude/settings.json +174 -0
  198. package/presets/minimal/.claude/skills/einja/api-development/SKILL.md +14 -0
  199. package/presets/minimal/.claude/skills/einja/backend-architecture/SKILL.md +14 -0
  200. package/presets/minimal/.claude/skills/einja/coding-standards/SKILL.md +120 -0
  201. package/presets/minimal/.claude/skills/einja/coding-standards/reference/naming-conventions.md +107 -0
  202. package/presets/minimal/.claude/skills/einja/coding-standards/reference/prohibited-patterns.md +169 -0
  203. package/presets/minimal/.claude/skills/einja/coding-standards/reference/typescript-rules.md +247 -0
  204. package/presets/minimal/.claude/skills/einja/component-design/SKILL.md +109 -0
  205. package/presets/minimal/.claude/skills/einja/component-design/reference/directory-structure.md +117 -0
  206. package/presets/minimal/.claude/skills/einja/component-design/reference/props-patterns.md +159 -0
  207. package/presets/minimal/.claude/skills/einja/component-design/reference/styling-guide.md +200 -0
  208. package/presets/minimal/.claude/skills/einja/conflict-resolver/SKILL.md +190 -0
  209. package/presets/minimal/.claude/skills/einja/frontend-development/SKILL.md +14 -0
  210. package/presets/minimal/.claude/skills/einja/general-context-loader/SKILL.md +254 -0
  211. package/presets/minimal/.claude/skills/einja/output-format/SKILL.md +137 -0
  212. package/presets/minimal/.claude/skills/einja/spec-context-loader/SKILL.md +177 -0
  213. package/presets/minimal/.claude/skills/einja/task-commit/SKILL.md +269 -0
  214. package/presets/minimal/.claude/skills/einja/task-qa/SKILL.md +306 -0
  215. package/presets/minimal/.claude/skills/einja/task-qa/reference/failure-patterns.md +69 -0
  216. package/presets/minimal/.claude/skills/einja/task-qa/reference/troubleshooting.md +65 -0
  217. package/presets/minimal/.claude/skills/einja/task-qa/reference/usage-patterns.md +52 -0
  218. package/presets/minimal/.claude/skills/einja/task-qa/templates/qa-test-template.md +128 -0
  219. package/presets/minimal/preset.yaml +111 -0
  220. package/presets/minimal/symlinks.json +45 -0
  221. package/scaffolds/.mcp.json +45 -0
  222. package/scaffolds/CLAUDE.md.template +318 -0
  223. package/scaffolds/steering/README.md +170 -0
  224. package/scaffolds/steering/acceptance-criteria-and-qa-guide.md +415 -0
  225. package/scaffolds/steering/architecture.md +481 -0
  226. package/scaffolds/steering/branch-strategy.md +362 -0
  227. package/scaffolds/steering/commit-rules.md +217 -0
  228. package/scaffolds/steering/db-schema-design.md +609 -0
  229. package/scaffolds/steering/development/api-development.md +783 -0
  230. package/scaffolds/steering/development/backend-architecture.md +731 -0
  231. package/scaffolds/steering/development/frontend-development.md +1537 -0
  232. package/scaffolds/steering/development/review-guidelines.md +365 -0
  233. package/scaffolds/steering/development/testing-strategy.md +819 -0
  234. package/scaffolds/steering/development-workflow.md +429 -0
  235. package/scaffolds/steering/infrastructure/deployment.md +277 -0
  236. package/scaffolds/steering/infrastructure/environment-variables.md +298 -0
  237. package/scaffolds/steering/product.md +540 -0
  238. package/scaffolds/steering/task-management.md +367 -0
  239. package/templates/README.md +159 -0
  240. package/templates/design-simple.md.template +172 -0
  241. package/templates/design.md.template +327 -0
  242. package/templates/qa-test.md.template +125 -0
  243. package/templates/requirements.md.template +254 -0
@@ -0,0 +1,277 @@
1
+ # デプロイメント・CI/CD設計方針
2
+
3
+ ## 概要
4
+
5
+ このドキュメントでは、プロジェクトのデプロイメントとCI/CDパイプラインの**設計方針**を説明します。
6
+
7
+ 具体的な設定手順については以下を参照してください:
8
+ - [デプロイセットアップ手順](../../instructions/deployment-setup.md)
9
+ - [環境変数セットアップ手順](../../instructions/environment-setup.md)
10
+
11
+ ---
12
+
13
+ ## 目次
14
+
15
+ 1. [デプロイメントアーキテクチャ](#1-デプロイメントアーキテクチャ)
16
+ 2. [プラットフォーム選定理由](#2-プラットフォーム選定理由)
17
+ 3. [CI/CDパイプライン設計](#3-cicdパイプライン設計)
18
+ 4. [キャッシュ戦略](#4-キャッシュ戦略)
19
+ 5. [Worktree対応設計](#5-worktree対応設計)
20
+ 6. [ロールバック戦略](#6-ロールバック戦略)
21
+
22
+ ---
23
+
24
+ ## 1. デプロイメントアーキテクチャ
25
+
26
+ ### 全体構成
27
+
28
+ ```mermaid
29
+ graph TB
30
+ subgraph "GitHub Repository"
31
+ Main[main branch]
32
+ Feature[feature branches]
33
+ end
34
+
35
+ subgraph "Vercel Platform"
36
+ WebProd[web - Production]
37
+ WebPreview[web - Preview]
38
+ end
39
+
40
+ subgraph "Railway Platform"
41
+ CronProd[cron-worker - Production]
42
+ CronStaging[cron-worker - Staging]
43
+ end
44
+
45
+ subgraph "Database"
46
+ DB[(PostgreSQL)]
47
+ end
48
+
49
+ Main -->|Auto Deploy| WebProd
50
+ Main -->|Auto Deploy| CronProd
51
+
52
+ Feature -->|PR Deploy| WebPreview
53
+ Feature -->|Manual Deploy| CronStaging
54
+
55
+ WebProd --> DB
56
+ CronProd --> DB
57
+ ```
58
+
59
+ ### デプロイメント対象
60
+
61
+ | アプリケーション | プラットフォーム | デプロイトリガー | 環境 |
62
+ |----------------|--------------|--------------|------|
63
+ | web | Vercel | main push, PR作成 | Production, Preview |
64
+ | cron-worker | Railway | main push | Production |
65
+
66
+ ---
67
+
68
+ ## 2. プラットフォーム選定理由
69
+
70
+ ### Vercel(Web/Admin)
71
+
72
+ **選定理由**:
73
+ - Next.jsの開発元であり、最適化が保証されている
74
+ - Edge NetworkによるグローバルCDN配信
75
+ - Preview Deploymentsによる迅速なレビュー
76
+ - Turborepo Remote Cacheとの統合
77
+
78
+ **採用機能**:
79
+ - Standalone Build(コンテナサイズ最小化)
80
+ - ISR(Incremental Static Regeneration)
81
+ - Edge Middleware
82
+
83
+ ### Railway(Cron Worker)
84
+
85
+ **選定理由**:
86
+ - ネイティブCronジョブサポート
87
+ - Dockerコンテナのシンプルなデプロイ
88
+ - 環境変数のシームレスな管理
89
+ - 従量課金で低コスト運用可能
90
+
91
+ **採用機能**:
92
+ - Cron Job Scheduling
93
+ - Docker Image Deploy
94
+ - Health Checks
95
+
96
+ ---
97
+
98
+ ## 3. CI/CDパイプライン設計
99
+
100
+ ### パイプラインフロー
101
+
102
+ ```mermaid
103
+ sequenceDiagram
104
+ participant Dev as 開発者
105
+ participant GH as GitHub
106
+ participant CI as GitHub Actions
107
+ participant Turbo as Turborepo
108
+ participant Cache as Vercel Cache
109
+ participant Vercel as Vercel
110
+ participant Railway as Railway
111
+
112
+ Dev->>GH: git push
113
+ GH->>CI: Workflow トリガー
114
+ CI->>CI: 環境セットアップ
115
+ CI->>Turbo: turbo login
116
+ Turbo->>Cache: キャッシュ認証
117
+
118
+ CI->>Turbo: turbo run lint
119
+ Turbo->>Cache: キャッシュチェック
120
+ Cache-->>Turbo: キャッシュヒット/ミス
121
+ Turbo-->>CI: Lint完了
122
+
123
+ CI->>Turbo: turbo run build
124
+ Turbo->>Cache: キャッシュチェック
125
+ Turbo->>Turbo: ビルド実行
126
+ Turbo->>Cache: 結果アップロード
127
+ Turbo-->>CI: ビルド完了
128
+
129
+ CI->>Turbo: turbo run test
130
+ Turbo-->>CI: テスト完了
131
+
132
+ alt main ブランチ
133
+ CI->>Vercel: web デプロイ
134
+ CI->>Railway: cron-worker デプロイ
135
+ end
136
+
137
+ CI-->>Dev: ステータス通知
138
+ ```
139
+
140
+ ### ステージ構成
141
+
142
+ | ステージ | タスク | 並列実行 | キャッシュ |
143
+ |---------|-------|---------|----------|
144
+ | Setup | pnpm install, turbo login | - | ✅ |
145
+ | Lint | turbo run lint | ✅ | ✅ |
146
+ | Type Check | turbo run typecheck | ✅ | ✅ |
147
+ | Test | turbo run test | ✅ | ✅ |
148
+ | Build | turbo run build | ✅ | ✅ |
149
+ | Deploy | Vercel, Railway | ✅ | ❌ |
150
+
151
+ ### 設計方針
152
+
153
+ 1. **高速フィードバック**: Lint・Type Checkを並列実行し、早期エラー検出
154
+ 2. **キャッシュ最大活用**: Turborepo Remote Cacheで86%の時間削減
155
+ 3. **環境分離**: dotenvxによる暗号化環境変数でセキュアなCI/CD
156
+
157
+ ---
158
+
159
+ ## 4. キャッシュ戦略
160
+
161
+ ### Turborepo Remote Cache
162
+
163
+ **設計方針**:
164
+ - ビルド成果物をVercel Remote Cacheに保存
165
+ - チーム間でキャッシュを共有し、ビルド時間を大幅短縮
166
+ - 環境変数の変更時は自動でキャッシュ無効化
167
+
168
+ ### キャッシュ対象
169
+
170
+ | タスク | キャッシュ | 理由 |
171
+ |--------|----------|------|
172
+ | build | ✅ | ビルド成果物を再利用 |
173
+ | lint | ✅ | ソースコード未変更時はスキップ |
174
+ | typecheck | ✅ | 型定義未変更時はスキップ |
175
+ | test | ✅ | テストコード・対象未変更時はスキップ |
176
+ | dev | ❌ | 開発サーバーは継続実行 |
177
+ | db:* | ❌ | データベース操作は冪等性なし |
178
+
179
+ ### キャッシュ効果
180
+
181
+ | タスク | キャッシュなし | キャッシュあり | 削減率 |
182
+ |--------|--------------|--------------|--------|
183
+ | lint | 10s | 2s | 80% |
184
+ | typecheck | 15s | 3s | 80% |
185
+ | build | 45s | 5s | 89% |
186
+ | test | 30s | 4s | 87% |
187
+ | **合計** | **100s** | **14s** | **86%** |
188
+
189
+ ---
190
+
191
+ ## 5. Worktree対応設計
192
+
193
+ ### 課題
194
+
195
+ 複数のブランチを並行開発する際、ポート番号が衝突する問題がある。
196
+
197
+ ### 解決策
198
+
199
+ SHA-256ハッシュベースの動的ポート割り当てを採用。
200
+
201
+ **設計方針**:
202
+ 1. ブランチ名からSHA-256ハッシュを生成
203
+ 2. ハッシュ値からポート番号を算出(衝突確率を最小化)
204
+ 3. 環境変数に自動設定し、Turborepoに引き継ぎ
205
+
206
+ ### ポート割り当て設計
207
+
208
+ ```mermaid
209
+ sequenceDiagram
210
+ participant Dev as 開発者
211
+ participant Script as scripts/worktree/dev.ts
212
+ participant Git as Git
213
+ participant Calc as calculatePorts
214
+ participant Turbo as Turborepo
215
+ participant App as web/cron-worker
216
+
217
+ Dev->>Script: pnpm dev
218
+ Script->>Git: git branch --show-current
219
+ Git-->>Script: ブランチ名(例: feature/auth)
220
+ Script->>Calc: calculatePorts(branch)
221
+ Calc->>Calc: SHA-256ハッシュ計算
222
+ Calc-->>Script: ポート番号セット
223
+ Note over Script: PORT_WEB=3120<br/>POSTGRES_PORT=35432
224
+ Script->>Script: process.env設定
225
+ Script->>Script: DATABASE_URL組み立て
226
+ Script->>Turbo: pnpm turbo run dev
227
+ Turbo->>App: 各アプリ起動
228
+ App-->>Dev: ブランチ固有ポートで起動完了
229
+ ```
230
+
231
+ ### ポート範囲設計
232
+
233
+ | ポート | 範囲 | 用途 |
234
+ |--------|------|------|
235
+ | PORT_WEB | 3000-3999 | Webアプリ |
236
+ | POSTGRES_PORT | 35432 (固定) | PostgreSQL |
237
+
238
+ ---
239
+
240
+ ## 6. ロールバック戦略
241
+
242
+ ### 設計方針
243
+
244
+ 1. **即時ロールバック**: デプロイ履歴から1クリックで前バージョンに戻す
245
+ 2. **DB互換性**: マイグレーションは常に後方互換を維持
246
+ 3. **Feature Flags**: 大きな変更はフラグで制御し、段階的リリース
247
+
248
+ ### Vercelロールバック
249
+
250
+ **方針**: Instant Rollbackを活用し、ダウンタイムなしでロールバック
251
+
252
+ 1. Vercel Dashboardで過去のデプロイを選択
253
+ 2. "Promote to Production" で即座に切り替え
254
+ 3. DNS/CDN自動更新で反映
255
+
256
+ ### Railwayロールバック
257
+
258
+ **方針**: Dockerイメージタグによるバージョン管理
259
+
260
+ 1. 各デプロイにgit SHAタグを付与
261
+ 2. 問題発生時は前バージョンのイメージを再デプロイ
262
+
263
+ ### データベースロールバック
264
+
265
+ **方針**: 破壊的マイグレーションを避け、後方互換を維持
266
+
267
+ - カラム削除は2フェーズで実施(非推奨化 → 削除)
268
+ - 型変更は新カラム追加 → データ移行 → 旧カラム削除
269
+ - インデックス追加は`CREATE CONCURRENTLY`で無停止実行
270
+
271
+ ---
272
+
273
+ ## 関連ドキュメント
274
+
275
+ - [環境変数設計方針](./environment-variables.md)
276
+ - [デプロイセットアップ手順](../../instructions/deployment-setup.md)
277
+ - [環境変数セットアップ手順](../../instructions/environment-setup.md)
@@ -0,0 +1,298 @@
1
+ # 環境変数設計方針
2
+
3
+ ## 概要
4
+
5
+ このドキュメントでは、環境変数管理の**設計方針**と**dotenvx採用理由**を説明します。
6
+
7
+ 具体的な設定手順については以下を参照してください:
8
+ - [環境変数セットアップ手順](../../instructions/environment-setup.md)
9
+
10
+ ---
11
+
12
+ ## 目次
13
+
14
+ 1. [設計原則](#1-設計原則)
15
+ 2. [ローカル開発のファイル構成](#2-ローカル開発のファイル構成)
16
+ 3. [dotenvx採用理由](#3-dotenvx採用理由)
17
+ 4. [ファイル構成設計](#4-ファイル構成設計)
18
+ 5. [階層的ロード設計](#5-階層的ロード設計)
19
+ 6. [命名規約](#6-命名規約)
20
+ 7. [シークレット管理方針](#7-シークレット管理方針)
21
+
22
+ ---
23
+
24
+ ## 1. 設計原則
25
+
26
+ ### 環境変数管理の三原則
27
+
28
+ 1. **暗号化**: 秘密情報は必ず暗号化してGit管理
29
+ 2. **環境分離**: 開発・ステージング・本番で明確に分離
30
+ 3. **ローカル優先**: ローカル開発では復号不要で即座に起動可能
31
+
32
+ ### 環境別の管理方針
33
+
34
+ | 環境 | 管理ファイル | 暗号化 | Git追跡 |
35
+ |------|-------------|--------|--------|
36
+ | ローカル開発 | `.env.local` → `.env` + `.env.personal` | ✅ | `.env.local`のみ |
37
+ | dev検証 | `.env.development` | ✅ | ✅ |
38
+ | ステージング | `.env.staging` | ✅ | ✅ |
39
+ | 本番 | `.env.production` | ✅ | ✅ |
40
+ | CI/CD | `.env.ci` | ✅ | ✅ |
41
+
42
+ **ポイント**: ローカル開発も暗号化ファイル(`.env.local`)を使用。`pnpm dev:setup`で復号して`.env`を生成。
43
+
44
+ ---
45
+
46
+ ## 2. ローカル開発のファイル構成
47
+
48
+ ### ファイルの関係
49
+
50
+ ```
51
+ ┌─────────────────────────────────────────────────────────────────┐
52
+ │ .env.local(暗号化済み・Gitで共有) │
53
+ │ ├─ DATABASE_URL=encrypted:xxxxx... │
54
+ │ ├─ AUTH_SECRET=encrypted:xxxxx... │
55
+ │ └─ チーム全員が使う共通設定 │
56
+ └─────────────────────────────────────────────────────────────────┘
57
+
58
+ │ pnpm dev:setup で自動復号
59
+
60
+ ┌─────────────────────────────────────────────────────────────────┐
61
+ │ .env(平文・Gitで共有しない) │
62
+ │ ├─ DATABASE_URL=postgresql://... │
63
+ │ ├─ AUTH_SECRET=your-secret-key │
64
+ │ └─ direnvが読み込む作業用ファイル │
65
+ │ ⚠️ pnpm dev で毎回再生成される │
66
+ └─────────────────────────────────────────────────────────────────┘
67
+ +
68
+ ┌─────────────────────────────────────────────────────────────────┐
69
+ │ .env.personal(平文・Gitで共有しない) │
70
+ │ ├─ GITHUB_TOKEN=ghp_xxxx...(あなた専用) │
71
+ │ └─ 個人固有のトークン │
72
+ └─────────────────────────────────────────────────────────────────┘
73
+ ```
74
+
75
+ ### 各ファイルの役割
76
+
77
+ | ファイル | 暗号化 | Git追跡 | 内容 | 編集するとき |
78
+ |---------|:-----:|:------:|------|------------|
79
+ | `.env.local` | ✅ | ✅ | ローカル開発の共通設定 | チーム共有の設定を変更したいとき |
80
+ | `.env` | ❌ | ❌ | ↑を復号したもの | **直接編集しない**(pnpm devで再生成) |
81
+ | `.env.personal` | ❌ | ❌ | 個人トークン | 自分のトークンを設定するとき |
82
+
83
+ ### よくある質問
84
+
85
+ **Q: なぜ `.env.local` を direnv で直接読まないの?**
86
+
87
+ A: `.env.local` は暗号化されているため、direnv では読めません。
88
+ `pnpm dev:setup` が復号して `.env` を作成し、それを direnv が読みます。
89
+
90
+ **Q: チームで共有する設定を変えたいときは?**
91
+
92
+ A: `pnpm env:update` を実行して「チーム共有設定を変更」を選択します。
93
+ 対話式で復号→編集→再暗号化まで案内されます。
94
+
95
+ **Q: 個人のGITHUB_TOKENはどこに書く?**
96
+
97
+ A: `pnpm env:update` を実行して「個人トークンを設定」を選択するか、
98
+ 直接 `.env.personal` を編集します。このファイルはGitに含まれません。
99
+
100
+ **Q: pnpm dev を実行すると秘密情報が消える?**
101
+
102
+ A: `.env` は毎回再生成されますが、秘密情報は `.env.local`(暗号化)から
103
+ マージされます。個人トークンは `.env.personal` に書いておけば消えません。
104
+
105
+ ---
106
+
107
+ ## 3. dotenvx採用理由
108
+
109
+ ### 課題
110
+
111
+ 従来の環境変数管理には以下の問題があった:
112
+
113
+ 1. **秘密情報の共有困難**: `.env`ファイルをGit管理できず、チーム間で安全に共有できない
114
+ 2. **環境間の不整合**: 手動設定によるミスで環境ごとに設定が異なる
115
+ 3. **CI/CDでの秘密管理**: GitHub Secretsの数が増え、管理が煩雑
116
+
117
+ ### dotenvxの解決策
118
+
119
+ **dotenvx**は環境変数を暗号化し、安全にGit管理できるツール:
120
+
121
+ ```
122
+ ┌─────────────────────────────────────────────────────────────┐
123
+ │ dotenvx暗号化フロー │
124
+ ├─────────────────────────────────────────────────────────────┤
125
+ │ │
126
+ │ .env.production dotenvx encrypt 暗号化済み │
127
+ │ ┌──────────────┐ ────────────────> ┌──────────┐ │
128
+ │ │ SECRET=plain │ │ encrypted │ │
129
+ │ │ API_KEY=xxx │ │ xxxxxxxx │ │
130
+ │ └──────────────┘ └──────────┘ │
131
+ │ │ │ │
132
+ │ │ │ │
133
+ │ ▼ ▼ │
134
+ │ .gitignore Git追跡可能 │
135
+ │ (Git除外) │
136
+ │ │
137
+ │ .env.keys(秘密鍵) │
138
+ │ ┌──────────────────────────────────────────────────────┐ │
139
+ │ │ DOTENV_PRIVATE_KEY_PRODUCTION=xxxx │ │
140
+ │ │ DOTENV_PRIVATE_KEY_STAGING=xxxx │ │
141
+ │ └──────────────────────────────────────────────────────┘ │
142
+ │ │ │
143
+ │ ▼ │
144
+ │ .gitignore(Git除外)+ 1Password等で安全に保管 │
145
+ │ │
146
+ └─────────────────────────────────────────────────────────────┘
147
+ ```
148
+
149
+ ### 採用メリット
150
+
151
+ | 観点 | 従来手法 | dotenvx |
152
+ |------|---------|---------|
153
+ | Git管理 | ❌ 不可 | ✅ 暗号化して可能 |
154
+ | チーム共有 | ❌ 手動共有 | ✅ Git経由で自動 |
155
+ | CI/CD設定 | ❌ 多数のSecrets | ✅ 1つの秘密鍵のみ |
156
+ | 環境一貫性 | ❌ 手動で不整合 | ✅ コードと同期 |
157
+ | 監査証跡 | ❌ なし | ✅ Gitコミット履歴 |
158
+
159
+ ---
160
+
161
+ ## 4. ファイル構成設計
162
+
163
+ ### ファイル一覧
164
+
165
+ | ファイル | Git追跡 | 暗号化 | 役割 |
166
+ |---------|:------:|:-----:|------|
167
+ | `.env.example` | ✅ | ❌ | `.env`の参考テンプレート |
168
+ | `.env.personal.example` | ✅ | ❌ | 個人用トークンのテンプレート |
169
+ | `.env.local` | ✅ | ✅ | ローカル開発用(チーム共有) |
170
+ | `.env.development` | ✅ | ✅ | dev検証サーバー用 |
171
+ | `.env.staging` | ✅ | ✅ | ステージング用 |
172
+ | `.env.production` | ✅ | ✅ | 本番環境用 |
173
+ | `.env.ci` | ✅ | ✅ | CI/CD用 |
174
+ | `.env.keys` | ❌ | - | 全環境の秘密鍵(1Password等で共有) |
175
+ | `.env` | ❌ | ❌ | `.env.local`を復号したもの |
176
+ | `.env.personal` | ❌ | ❌ | 個人固有のトークン |
177
+
178
+ ### ディレクトリ構成
179
+
180
+ ```
181
+ プロジェクトルート/
182
+ ├── .env.example # 参考テンプレート(Git追跡)
183
+ ├── .env.personal.example # 個人用トークンテンプレート(Git追跡)
184
+ ├── .env.local # ローカル開発用・暗号化済み(Git追跡)★
185
+ ├── .env.development # dev検証・暗号化済み(Git追跡)
186
+ ├── .env.staging # ステージング・暗号化済み(Git追跡)
187
+ ├── .env.production # 本番・暗号化済み(Git追跡)
188
+ ├── .env.ci # CI/CD・暗号化済み(Git追跡)
189
+ ├── .env.keys # 秘密鍵(Git除外・1Password等で共有)
190
+ ├── .env # .env.localを復号したもの(Git除外)
191
+ └── .env.personal # 個人用トークン(Git除外)
192
+ ```
193
+
194
+ **★ポイント**: `.env.local`は暗号化されてGitで共有。`pnpm dev:setup`で復号して`.env`が生成される。
195
+
196
+ ---
197
+
198
+ ## 5. 階層的ロード設計
199
+
200
+ ### ローカル開発時のフロー
201
+
202
+ ```mermaid
203
+ sequenceDiagram
204
+ participant Dev as 開発者
205
+ participant Setup as pnpm dev:setup
206
+ participant Direnv as direnv
207
+ participant App as アプリケーション
208
+
209
+ Dev->>Setup: pnpm dev:setup(初回のみ)
210
+ Setup->>Setup: .env.local(暗号化)を復号
211
+ Setup->>Setup: .env を生成
212
+ Setup->>Setup: .env.personal をテンプレートから作成
213
+ Setup-->>Dev: セットアップ完了
214
+
215
+ Dev->>Direnv: ディレクトリに入る
216
+ Direnv->>Direnv: .env を読み込み
217
+ Direnv->>Direnv: .env.personal を読み込み(オーバーライド)
218
+ Note over Direnv: .env.personal > .env
219
+
220
+ Dev->>App: pnpm dev
221
+ App-->>Dev: 開発サーバー起動完了
222
+ ```
223
+
224
+ ### ロード順序(後勝ち)
225
+
226
+ 1. **`.env`**: チーム共有設定(`.env.local`から復号して自動生成)
227
+ 2. **`.env.personal`**: 個人固有のトークン(GITHUB_TOKEN等)
228
+
229
+ ### 設計意図
230
+
231
+ - **全環境で暗号化を統一**: ローカル開発もデプロイ環境と同じ暗号化方式
232
+ - **個人トークンの分離**: `.env.personal`で個人固有の設定を管理
233
+ - **direnv連携**: ディレクトリに入るだけで環境変数が自動ロード
234
+
235
+ ---
236
+
237
+ ## 6. 命名規約
238
+
239
+ ### 環境変数の命名
240
+
241
+ | プレフィックス | 用途 | 例 |
242
+ |--------------|------|-----|
243
+ | `NEXT_PUBLIC_` | クライアント側で使用 | `NEXT_PUBLIC_API_URL` |
244
+ | `DATABASE_` | データベース関連 | `DATABASE_URL` |
245
+ | `NEXTAUTH_` | 認証関連 | `NEXTAUTH_SECRET` |
246
+ | `TURBO_` | Turborepo関連 | `TURBO_TOKEN` |
247
+ | `PORT_` | ポート番号 | `PORT_WEB` |
248
+ | `DOTENV_` | dotenvx関連 | `DOTENV_PRIVATE_KEY_PRODUCTION` |
249
+
250
+ ### 環境識別子
251
+
252
+ | 識別子 | 説明 |
253
+ |--------|------|
254
+ | `_LOCAL` | ローカル開発用 |
255
+ | `_DEVELOPMENT` | dev検証環境用 |
256
+ | `_STAGING` | ステージング環境用 |
257
+ | `_PRODUCTION` | 本番環境用 |
258
+ | `_CI` | CI/CD環境用 |
259
+
260
+ ---
261
+
262
+ ## 7. シークレット管理方針
263
+
264
+ ### 秘密鍵の保管
265
+
266
+ **`.env.keys`の保管先**:
267
+
268
+ | 保管場所 | 用途 | アクセス権限 |
269
+ |---------|------|------------|
270
+ | 1Password | チーム共有 | 開発者全員 |
271
+ | GitHub Secrets | CI/CD | GitHub Actions |
272
+ | Vercel Dashboard | 本番デプロイ | 管理者のみ |
273
+ | Railway Variables | Cronワーカー | 管理者のみ |
274
+
275
+ ### GitHub Secretsの最小化
276
+
277
+ dotenvx採用により、GitHub Secretsは**環境ごとに1つの秘密鍵のみ**に削減:
278
+
279
+ | Secret名 | 用途 |
280
+ |---------|------|
281
+ | `DOTENV_PRIVATE_KEY_CI` | CI/CD環境の復号 |
282
+ | `DOTENV_PRIVATE_KEY_PRODUCTION` | 本番デプロイ時の復号 |
283
+
284
+ **注**: `DOTENV_PRIVATE_KEY_LOCAL`はローカル開発用なのでGitHub Secretsには不要。`.env.keys`でチーム内共有。
285
+
286
+ ### ローテーション方針
287
+
288
+ 1. **定期ローテーション**: 90日ごとに秘密鍵を更新
289
+ 2. **漏洩時対応**: 即座に全環境の秘密鍵を再生成
290
+ 3. **手順**: `dotenvx encrypt`で新しい鍵を生成し、保管先を更新
291
+
292
+ ---
293
+
294
+ ## 関連ドキュメント
295
+
296
+ - [デプロイメント・CI/CD設計方針](./deployment.md)
297
+ - [環境変数セットアップ手順](../../instructions/environment-setup.md)
298
+ - [デプロイセットアップ手順](../../instructions/deployment-setup.md)