@einja/dev-cli 0.1.9 → 0.1.11

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 (251) hide show
  1. package/README.md +30 -2
  2. package/dist/cli.js +3 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +11 -6
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/list.js +1 -1
  8. package/dist/commands/list.js.map +1 -1
  9. package/dist/commands/sync.d.ts.map +1 -1
  10. package/dist/commands/sync.js +69 -7
  11. package/dist/commands/sync.js.map +1 -1
  12. package/dist/commands/sync.test.js +11 -25
  13. package/dist/commands/sync.test.js.map +1 -1
  14. package/dist/commands/task-loop/index.d.ts.map +1 -1
  15. package/dist/commands/task-loop/index.js +5 -2
  16. package/dist/commands/task-loop/index.js.map +1 -1
  17. package/dist/commands/task-loop/lib/__mocks__/child-process.mock.d.ts +227 -0
  18. package/dist/commands/task-loop/lib/__mocks__/child-process.mock.d.ts.map +1 -0
  19. package/dist/commands/task-loop/lib/__mocks__/child-process.mock.js +351 -0
  20. package/dist/commands/task-loop/lib/__mocks__/child-process.mock.js.map +1 -0
  21. package/dist/commands/task-loop/lib/__mocks__/sample-issues.d.ts +46 -0
  22. package/dist/commands/task-loop/lib/__mocks__/sample-issues.d.ts.map +1 -0
  23. package/dist/commands/task-loop/lib/__mocks__/sample-issues.js +224 -0
  24. package/dist/commands/task-loop/lib/__mocks__/sample-issues.js.map +1 -0
  25. package/dist/commands/task-loop/lib/branch-manager.d.ts.map +1 -1
  26. package/dist/commands/task-loop/lib/branch-manager.js +14 -8
  27. package/dist/commands/task-loop/lib/branch-manager.js.map +1 -1
  28. package/dist/commands/task-loop/lib/branch-manager.test.d.ts +2 -0
  29. package/dist/commands/task-loop/lib/branch-manager.test.d.ts.map +1 -0
  30. package/dist/commands/task-loop/lib/branch-manager.test.js +539 -0
  31. package/dist/commands/task-loop/lib/branch-manager.test.js.map +1 -0
  32. package/dist/commands/task-loop/lib/conflict-handler.js +1 -1
  33. package/dist/commands/task-loop/lib/conflict-handler.js.map +1 -1
  34. package/dist/commands/task-loop/lib/dependency-resolver.test.d.ts +2 -0
  35. package/dist/commands/task-loop/lib/dependency-resolver.test.d.ts.map +1 -0
  36. package/dist/commands/task-loop/lib/dependency-resolver.test.js +1129 -0
  37. package/dist/commands/task-loop/lib/dependency-resolver.test.js.map +1 -0
  38. package/dist/commands/task-loop/lib/gh-setup.d.ts.map +1 -1
  39. package/dist/commands/task-loop/lib/gh-setup.js.map +1 -1
  40. package/dist/commands/task-loop/lib/github-client.d.ts.map +1 -1
  41. package/dist/commands/task-loop/lib/github-client.js +3 -3
  42. package/dist/commands/task-loop/lib/github-client.js.map +1 -1
  43. package/dist/commands/task-loop/lib/github-client.test.d.ts +2 -0
  44. package/dist/commands/task-loop/lib/github-client.test.d.ts.map +1 -0
  45. package/dist/commands/task-loop/lib/github-client.test.js +377 -0
  46. package/dist/commands/task-loop/lib/github-client.test.js.map +1 -0
  47. package/dist/commands/task-loop/lib/issue-parser.js +4 -4
  48. package/dist/commands/task-loop/lib/issue-parser.js.map +1 -1
  49. package/dist/commands/task-loop/lib/issue-parser.test.d.ts +2 -0
  50. package/dist/commands/task-loop/lib/issue-parser.test.d.ts.map +1 -0
  51. package/dist/commands/task-loop/lib/issue-parser.test.js +854 -0
  52. package/dist/commands/task-loop/lib/issue-parser.test.js.map +1 -0
  53. package/dist/commands/task-loop/lib/pull-request-manager.d.ts +35 -0
  54. package/dist/commands/task-loop/lib/pull-request-manager.d.ts.map +1 -0
  55. package/dist/commands/task-loop/lib/pull-request-manager.js +150 -0
  56. package/dist/commands/task-loop/lib/pull-request-manager.js.map +1 -0
  57. package/dist/commands/task-loop/lib/task-number-utils.d.ts +10 -4
  58. package/dist/commands/task-loop/lib/task-number-utils.d.ts.map +1 -1
  59. package/dist/commands/task-loop/lib/task-number-utils.js +19 -10
  60. package/dist/commands/task-loop/lib/task-number-utils.js.map +1 -1
  61. package/dist/commands/task-loop/lib/task-number-utils.test.d.ts +2 -0
  62. package/dist/commands/task-loop/lib/task-number-utils.test.d.ts.map +1 -0
  63. package/dist/commands/task-loop/lib/task-number-utils.test.js +379 -0
  64. package/dist/commands/task-loop/lib/task-number-utils.test.js.map +1 -0
  65. package/dist/commands/task-loop/lib/task-state-manager.d.ts.map +1 -1
  66. package/dist/commands/task-loop/lib/task-state-manager.js +1 -1
  67. package/dist/commands/task-loop/lib/task-state-manager.js.map +1 -1
  68. package/dist/commands/task-loop/lib/task-state-manager.test.d.ts +2 -0
  69. package/dist/commands/task-loop/lib/task-state-manager.test.d.ts.map +1 -0
  70. package/dist/commands/task-loop/lib/task-state-manager.test.js +541 -0
  71. package/dist/commands/task-loop/lib/task-state-manager.test.js.map +1 -0
  72. package/dist/lib/file-system.js +1 -1
  73. package/dist/lib/file-system.js.map +1 -1
  74. package/dist/lib/mcp-config.d.ts.map +1 -1
  75. package/dist/lib/mcp-config.js +8 -4
  76. package/dist/lib/mcp-config.js.map +1 -1
  77. package/dist/lib/mcp-config.test.js +2 -2
  78. package/dist/lib/mcp-config.test.js.map +1 -1
  79. package/dist/lib/merger.d.ts.map +1 -1
  80. package/dist/lib/merger.js.map +1 -1
  81. package/dist/lib/preset-update/cli-repo-detector.test.js.map +1 -1
  82. package/dist/lib/preset-update/file-copier.d.ts +2 -0
  83. package/dist/lib/preset-update/file-copier.d.ts.map +1 -1
  84. package/dist/lib/preset-update/file-copier.js +12 -8
  85. package/dist/lib/preset-update/file-copier.js.map +1 -1
  86. package/dist/lib/preset-update/file-copier.test.js +36 -5
  87. package/dist/lib/preset-update/file-copier.test.js.map +1 -1
  88. package/dist/lib/preset-update/preset-finder.d.ts +1 -1
  89. package/dist/lib/preset-update/preset-finder.d.ts.map +1 -1
  90. package/dist/lib/preset-update/preset-finder.js +1 -1
  91. package/dist/lib/preset-update/preset-finder.js.map +1 -1
  92. package/dist/lib/preset-update/preset-finder.test.js +11 -11
  93. package/dist/lib/preset-update/preset-finder.test.js.map +1 -1
  94. package/dist/lib/preset.js +3 -3
  95. package/dist/lib/preset.js.map +1 -1
  96. package/dist/lib/sync/backup-manager.d.ts.map +1 -1
  97. package/dist/lib/sync/backup-manager.js +1 -1
  98. package/dist/lib/sync/backup-manager.js.map +1 -1
  99. package/dist/lib/sync/backup-manager.test.js +2 -2
  100. package/dist/lib/sync/backup-manager.test.js.map +1 -1
  101. package/dist/lib/sync/batch-processor.d.ts.map +1 -1
  102. package/dist/lib/sync/batch-processor.js.map +1 -1
  103. package/dist/lib/sync/batch-processor.test.js.map +1 -1
  104. package/dist/lib/sync/category-validator.d.ts.map +1 -1
  105. package/dist/lib/sync/category-validator.js.map +1 -1
  106. package/dist/lib/sync/category-validator.test.js +2 -11
  107. package/dist/lib/sync/category-validator.test.js.map +1 -1
  108. package/dist/lib/sync/conflict-reporter.d.ts.map +1 -1
  109. package/dist/lib/sync/conflict-reporter.js +1 -2
  110. package/dist/lib/sync/conflict-reporter.js.map +1 -1
  111. package/dist/lib/sync/conflict-reporter.test.js +2 -7
  112. package/dist/lib/sync/conflict-reporter.test.js.map +1 -1
  113. package/dist/lib/sync/diff-engine.d.ts.map +1 -1
  114. package/dist/lib/sync/diff-engine.js +2 -4
  115. package/dist/lib/sync/diff-engine.js.map +1 -1
  116. package/dist/lib/sync/diff-engine.test.js.map +1 -1
  117. package/dist/lib/sync/file-filter.d.ts.map +1 -1
  118. package/dist/lib/sync/file-filter.js +26 -3
  119. package/dist/lib/sync/file-filter.js.map +1 -1
  120. package/dist/lib/sync/file-filter.test.js +26 -2
  121. package/dist/lib/sync/file-filter.test.js.map +1 -1
  122. package/dist/lib/sync/hash-cache.d.ts.map +1 -1
  123. package/dist/lib/sync/hash-cache.js.map +1 -1
  124. package/dist/lib/sync/hash-cache.test.js +2 -2
  125. package/dist/lib/sync/hash-cache.test.js.map +1 -1
  126. package/dist/lib/sync/integration.test.js +289 -2
  127. package/dist/lib/sync/integration.test.js.map +1 -1
  128. package/dist/lib/sync/marker-processor.d.ts +34 -10
  129. package/dist/lib/sync/marker-processor.d.ts.map +1 -1
  130. package/dist/lib/sync/marker-processor.js +142 -41
  131. package/dist/lib/sync/marker-processor.js.map +1 -1
  132. package/dist/lib/sync/marker-processor.test.js +134 -1
  133. package/dist/lib/sync/marker-processor.test.js.map +1 -1
  134. package/dist/lib/sync/metadata-manager.d.ts.map +1 -1
  135. package/dist/lib/sync/metadata-manager.js.map +1 -1
  136. package/dist/lib/sync/metadata-manager.test.js +4 -6
  137. package/dist/lib/sync/metadata-manager.test.js.map +1 -1
  138. package/dist/lib/sync/performance.test.js +2 -2
  139. package/dist/lib/sync/performance.test.js.map +1 -1
  140. package/dist/lib/sync/seed-synchronizer.d.ts +27 -0
  141. package/dist/lib/sync/seed-synchronizer.d.ts.map +1 -0
  142. package/dist/lib/sync/seed-synchronizer.js +72 -0
  143. package/dist/lib/sync/seed-synchronizer.js.map +1 -0
  144. package/dist/lib/sync/seed-synchronizer.test.d.ts +2 -0
  145. package/dist/lib/sync/seed-synchronizer.test.d.ts.map +1 -0
  146. package/dist/lib/sync/seed-synchronizer.test.js +147 -0
  147. package/dist/lib/sync/seed-synchronizer.test.js.map +1 -0
  148. package/dist/types/index.d.ts.map +1 -1
  149. package/dist/types/preset-update.d.ts +1 -1
  150. package/dist/types/sync.d.ts +4 -2
  151. package/dist/types/sync.d.ts.map +1 -1
  152. package/dist/types/sync.js.map +1 -1
  153. package/package.json +1 -2
  154. package/presets/default/.claude/agents/einja/backend-architect.md +1131 -0
  155. package/presets/{minimal/.claude/agents/einja/frontend → default/.claude/agents/einja}/design-engineer.md +1 -1
  156. package/presets/{minimal/.claude/agents/einja/frontend → default/.claude/agents/einja}/frontend-architect.md +1 -1
  157. package/presets/{minimal/.claude/agents/einja/frontend → default/.claude/agents/einja}/frontend-coder.md +1 -37
  158. package/presets/{minimal → default}/.claude/agents/einja/task/task-committer.md +12 -6
  159. package/presets/{minimal → default}/.claude/agents/einja/task/task-executer.md +9 -9
  160. package/presets/{minimal → default}/.claude/commands/einja/frontend-implement.md +1 -1
  161. package/presets/{minimal → default}/.claude/commands/einja/update-docs-by-task-specs.md +6 -6
  162. package/presets/{minimal/.claude/skills/einja/api-development → default/.claude/skills/einja-api-development}/SKILL.md +5 -5
  163. package/presets/{minimal/.claude/skills/einja/backend-architecture → default/.claude/skills/einja-backend-architecture}/SKILL.md +5 -5
  164. package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/SKILL.md +6 -6
  165. package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/SKILL.md +6 -6
  166. package/presets/{minimal/.claude/skills/einja/frontend-development → default/.claude/skills/einja-frontend-development}/SKILL.md +5 -5
  167. package/presets/{minimal/.claude/skills/einja/output-format → default/.claude/skills/einja-output-format}/SKILL.md +54 -5
  168. package/presets/{minimal → default}/preset.yaml +1 -1
  169. package/presets/{minimal → default}/symlinks.json +10 -10
  170. package/scaffolds/cli/preset.yaml +110 -0
  171. package/scaffolds/example/README.md +35 -0
  172. package/scaffolds/example/specs/issues/issue999-example-task/design.md +879 -0
  173. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/README.md +150 -0
  174. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-1.md +268 -0
  175. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-2.md +179 -0
  176. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-3.md +392 -0
  177. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/evidence/.gitkeep +0 -0
  178. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/2-1.md +459 -0
  179. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/evidence/.gitkeep +0 -0
  180. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/scenarios.md +125 -0
  181. package/scaffolds/example/specs/issues/issue999-example-task/requirements.md +494 -0
  182. package/scaffolds/example/specs/issues/issue999-example-task/tasks.md +212 -0
  183. package/scaffolds/instructions/deployment-setup.md +458 -0
  184. package/scaffolds/instructions/environment-setup.md +509 -0
  185. package/scaffolds/instructions/local-server-environment-and-worktree.md +539 -0
  186. package/scaffolds/instructions/task-execute.md +649 -0
  187. package/scaffolds/instructions/task-vibe-kanban-loop.md +495 -0
  188. package/scaffolds/memory/archive/.gitkeep +0 -0
  189. package/scaffolds/memory/decisions.md +35 -0
  190. package/scaffolds/memory/patterns.md +37 -0
  191. package/scaffolds/steering/README.md +42 -0
  192. package/scaffolds/steering/acceptance-criteria-and-qa-guide.md +11 -0
  193. package/scaffolds/steering/architecture.md +11 -0
  194. package/scaffolds/steering/branch-strategy.md +11 -0
  195. package/scaffolds/steering/commit-rules.md +12 -1
  196. package/scaffolds/steering/db-schema-design.md +11 -0
  197. package/scaffolds/steering/development/api-development.md +15 -4
  198. package/scaffolds/steering/development/backend-architecture.md +11 -0
  199. package/scaffolds/steering/development/frontend-development.md +11 -0
  200. package/scaffolds/steering/development/review-guidelines.md +11 -0
  201. package/scaffolds/steering/development/testing-strategy.md +85 -0
  202. package/scaffolds/steering/development-workflow.md +11 -0
  203. package/scaffolds/steering/infrastructure/deployment.md +11 -0
  204. package/scaffolds/steering/infrastructure/environment-variables.md +11 -0
  205. package/scaffolds/steering/product.md +11 -0
  206. package/scaffolds/steering/task-management.md +11 -0
  207. package/scaffolds/CLAUDE.md.template +0 -386
  208. /package/presets/{minimal → default}/.claude/agents/einja/docs/docs-updater.md +0 -0
  209. /package/presets/{minimal → default}/.claude/agents/einja/git/conflict-resolver.md +0 -0
  210. /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-design-generator.md +0 -0
  211. /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-qa-generator.md +0 -0
  212. /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-requirements-generator.md +0 -0
  213. /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-tasks-generator.md +0 -0
  214. /package/presets/{minimal → default}/.claude/agents/einja/task/task-modification-analyzer.md +0 -0
  215. /package/presets/{minimal → default}/.claude/agents/einja/task/task-qa.md +0 -0
  216. /package/presets/{minimal → default}/.claude/agents/einja/task/task-reviewer.md +0 -0
  217. /package/presets/{minimal → default}/.claude/commands/einja/spec-create.md +0 -0
  218. /package/presets/{minimal → default}/.claude/commands/einja/start-dev.md +0 -0
  219. /package/presets/{minimal → default}/.claude/commands/einja/sync-cursor-commands.md +0 -0
  220. /package/presets/{minimal → default}/.claude/commands/einja/task-exec.md +0 -0
  221. /package/presets/{minimal → default}/.claude/hooks/einja/biome-format.sh +0 -0
  222. /package/presets/{minimal → default}/.claude/hooks/einja/design-doc-check.sh +0 -0
  223. /package/presets/{minimal → default}/.claude/hooks/einja/detect-secrets.sh +0 -0
  224. /package/presets/{minimal → default}/.claude/hooks/einja/large-file-warning.sh +0 -0
  225. /package/presets/{minimal → default}/.claude/hooks/einja/playwright-resize.sh +0 -0
  226. /package/presets/{minimal → default}/.claude/hooks/einja/typecheck.sh +0 -0
  227. /package/presets/{minimal → default}/.claude/hooks/einja/unset-volta-recursion.sh +0 -0
  228. /package/presets/{minimal → default}/.claude/hooks/einja/validate-git-commit.sh +0 -0
  229. /package/presets/{minimal → default}/.claude/hooks/einja/warn-index-ts.sh +0 -0
  230. /package/presets/{minimal → default}/.claude/hooks/einja/warn-relative-import.sh +0 -0
  231. /package/presets/{minimal → default}/.claude/settings.json +0 -0
  232. /package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/reference/naming-conventions.md +0 -0
  233. /package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/reference/prohibited-patterns.md +0 -0
  234. /package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/reference/typescript-rules.md +0 -0
  235. /package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/reference/directory-structure.md +0 -0
  236. /package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/reference/props-patterns.md +0 -0
  237. /package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/reference/styling-guide.md +0 -0
  238. /package/presets/{minimal/.claude/skills/einja/conflict-resolver → default/.claude/skills/einja-conflict-resolver}/SKILL.md +0 -0
  239. /package/presets/{minimal/.claude/skills/einja/general-context-loader → default/.claude/skills/einja-general-context-loader}/SKILL.md +0 -0
  240. /package/presets/{minimal/.claude/skills/einja/spec-context-loader → default/.claude/skills/einja-spec-context-loader}/SKILL.md +0 -0
  241. /package/presets/{minimal/.claude/skills/einja/task-commit → default/.claude/skills/einja-task-commit}/SKILL.md +0 -0
  242. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/SKILL.md +0 -0
  243. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/reference/failure-patterns.md +0 -0
  244. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/reference/troubleshooting.md +0 -0
  245. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/reference/usage-patterns.md +0 -0
  246. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/templates/qa-test-template.md +0 -0
  247. /package/{templates → scaffolds/templates}/README.md +0 -0
  248. /package/{templates → scaffolds/templates}/design-simple.md.template +0 -0
  249. /package/{templates → scaffolds/templates}/design.md.template +0 -0
  250. /package/{templates → scaffolds/templates}/qa-test.md.template +0 -0
  251. /package/{templates → scaffolds/templates}/requirements.md.template +0 -0
@@ -0,0 +1,509 @@
1
+ <!-- @einja:managed:start -->
2
+ # 環境変数セットアップ手順
3
+
4
+ 開発環境およびデプロイ環境の環境変数設定手順をまとめたドキュメントです。
5
+
6
+ 設計方針については以下を参照してください:
7
+ - [環境変数設計方針](../steering/infrastructure/environment-variables.md)
8
+
9
+ ---
10
+
11
+ ## 🔑 環境変数ファイルの仕組み
12
+
13
+ ```
14
+ .env.local(暗号化・Git共有)
15
+ ↓ pnpm dev:setup で復号
16
+ .env(作業用・毎回再生成)+ .env.personal(個人トークン)
17
+ ↓ direnv で自動読み込み
18
+ 開発サーバー
19
+ ```
20
+
21
+ | ファイル | Git | 用途 |
22
+ |---------|:---:|------|
23
+ | `.env.local` | ✅ | チーム共有の秘密情報(暗号化) |
24
+ | `.env` | ❌ | 作業用(pnpm devで毎回再生成) |
25
+ | `.env.personal` | ❌ | 個人トークン(GITHUB_TOKEN等) |
26
+
27
+ > 📖 **詳しい仕組み・FAQは「[環境変数設計方針](../steering/infrastructure/environment-variables.md#2-ローカル開発のファイル構成)」を参照**
28
+
29
+ ---
30
+
31
+ ## 目次
32
+
33
+ 1. [ローカル開発環境セットアップ](#1-ローカル開発環境セットアップ)
34
+ 2. [dotenvxの使用方法](#2-dotenvxの使用方法)
35
+ 3. [環境変数ファイルの作成](#3-環境変数ファイルの作成)
36
+ 4. [暗号化手順](#4-暗号化手順)
37
+ 5. [秘密鍵の管理](#5-秘密鍵の管理)
38
+ 6. [CI/CD環境での使用](#6-cicd環境での使用)
39
+ 7. [トラブルシューティング](#7-トラブルシューティング)
40
+
41
+ ---
42
+
43
+ ## 1. ローカル開発環境セットアップ
44
+
45
+ ### 自動セットアップ(推奨)
46
+
47
+ ```bash
48
+ # 開発環境の一括セットアップ
49
+ pnpm dev:setup
50
+
51
+ # セットアップ内容:
52
+ # - Volta(Node.jsバージョン管理)
53
+ # - direnv(環境変数自動読み込み)
54
+ # - dotenvx(環境変数暗号化)
55
+ # - .env ファイル作成
56
+ # - GITHUB_TOKEN設定(対話式)
57
+ ```
58
+
59
+ ### 環境変数の設定・変更(対話式ウィザード)
60
+
61
+ ```bash
62
+ # 環境変数設定ウィザードを起動
63
+ pnpm env:update
64
+ ```
65
+
66
+ 対話式で以下の操作ができます:
67
+ - **個人トークンを設定** - GITHUB_TOKEN等を`.env.personal`に設定
68
+ - **チーム共有設定を変更** - `.env.local`の復号→編集→再暗号化
69
+ - **現在の状態を確認** - 環境変数ファイルの存在状況を表示
70
+
71
+ ### 手動セットアップ
72
+
73
+ #### Step 1: dotenvxインストール
74
+
75
+ ```bash
76
+ # macOS/Linux(推奨)
77
+ curl -sfS https://dotenvx.sh/install.sh | sh
78
+
79
+ # または npm経由
80
+ npm install -g @dotenvx/dotenvx
81
+
82
+ # インストール確認
83
+ dotenvx --version
84
+ ```
85
+
86
+ #### Step 2: 環境変数ファイルの復号・作成
87
+
88
+ ```bash
89
+ # .env.local(暗号化済み)を復号して .env を作成
90
+ # ※ .env.keys に秘密鍵が必要(チームから共有を受けてください)
91
+ dotenvx decrypt -f .env.local -o .env
92
+
93
+ # 個人用トークンファイルをテンプレートからコピー
94
+ cp .env.personal.example .env.personal
95
+ ```
96
+
97
+ #### Step 3: 個人用トークンを設定
98
+
99
+ ```bash
100
+ # .env.personal を編集(GITHUB_TOKEN等の個人トークン)
101
+ # ※ .env は直接編集しない(.env.local から自動生成されるため)
102
+ ```
103
+
104
+ #### Step 4: direnv有効化
105
+
106
+ ```bash
107
+ direnv allow
108
+ ```
109
+
110
+ ---
111
+
112
+ ## 2. dotenvxの使用方法
113
+
114
+ ### 基本コマンド
115
+
116
+ ```bash
117
+ # 環境変数を読み込んでコマンド実行
118
+ dotenvx run -- <command>
119
+
120
+ # 特定の環境ファイルを指定
121
+ dotenvx run -f .env.production -- <command>
122
+
123
+ # 複数ファイルを指定(後勝ち)
124
+ dotenvx run -f .env -f .env.local -- <command>
125
+
126
+ # 環境変数を暗号化
127
+ dotenvx encrypt -f .env.production
128
+
129
+ # 暗号化ファイルを復号(確認用)
130
+ dotenvx decrypt -f .env.production
131
+ ```
132
+
133
+ ### package.jsonでの使用例
134
+
135
+ ```json
136
+ {
137
+ "scripts": {
138
+ "build": "dotenvx run -f .env.production -- turbo run build",
139
+ "build:staging": "dotenvx run -f .env.staging -- turbo run build",
140
+ "build:dev": "dotenvx run -f .env.development -- turbo run build",
141
+ "build:local": "turbo run build"
142
+ }
143
+ }
144
+ ```
145
+
146
+ ---
147
+
148
+ ## 3. 環境変数ファイルの作成
149
+
150
+ ### ファイル構成
151
+
152
+ ```
153
+ プロジェクトルート/
154
+ ├── .env.example # .envの参考テンプレート(Git追跡)
155
+ ├── .env.personal.example # 個人用トークンのテンプレート(Git追跡)
156
+ ├── .env.local # ローカル開発用(暗号化・Git追跡)★
157
+ ├── .env.development # dev検証サーバー用(暗号化・Git追跡)
158
+ ├── .env.staging # ステージング用(暗号化・Git追跡)
159
+ ├── .env.production # 本番環境用(暗号化・Git追跡)
160
+ ├── .env.ci # CI/CD用(暗号化・Git追跡)
161
+ ├── .env.keys # 秘密鍵(Git除外・1Password等で共有)
162
+ ├── .env # .env.localを復号したもの(Git除外)
163
+ └── .env.personal # 個人用トークン(Git除外)
164
+ ```
165
+
166
+ **★ポイント**: `.env.local` は暗号化されてGitで共有。`pnpm dev:setup` で復号して `.env` が生成される。
167
+
168
+ ### .env.personal.example(個人用トークンテンプレート)
169
+
170
+ ```bash
171
+ # GitHub MCP接続用(Claude Code開発時に必要)
172
+ # 取得方法: https://github.com/settings/tokens/new
173
+ # 必要なスコープ: repo, read:org
174
+ GITHUB_TOKEN=
175
+
176
+ # その他の個人用トークン(必要に応じて)
177
+ # OPENAI_API_KEY=
178
+ # ANTHROPIC_API_KEY=
179
+ ```
180
+
181
+ ### デプロイ環境ファイル作成
182
+
183
+ ```bash
184
+ # 開発サーバー用
185
+ cat > .env.development << 'EOF'
186
+ # Development Environment
187
+ DATABASE_URL="postgresql://user:pass@dev-db:5432/einja_dev"
188
+ NEXTAUTH_SECRET="dev-secret-key"
189
+ NEXTAUTH_URL="https://dev.example.com"
190
+ NODE_ENV="development"
191
+ EOF
192
+
193
+ # ステージング用
194
+ cat > .env.staging << 'EOF'
195
+ # Staging Environment
196
+ DATABASE_URL="postgresql://user:pass@staging-db:5432/einja_staging"
197
+ NEXTAUTH_SECRET="staging-secret-key"
198
+ NEXTAUTH_URL="https://staging.example.com"
199
+ NODE_ENV="staging"
200
+ EOF
201
+
202
+ # 本番環境用
203
+ cat > .env.production << 'EOF'
204
+ # Production Environment
205
+ DATABASE_URL="postgresql://user:pass@prod-db:5432/einja"
206
+ NEXTAUTH_SECRET="production-secret-key-generate-with-openssl"
207
+ NEXTAUTH_URL="https://example.com"
208
+ NODE_ENV="production"
209
+ EOF
210
+
211
+ # CI/CD用
212
+ cat > .env.ci << 'EOF'
213
+ # CI Environment
214
+ DATABASE_URL="postgresql://postgres:postgres@localhost:5432/einja_test"
215
+ NEXTAUTH_SECRET="ci-test-secret"
216
+ NEXTAUTH_URL="http://localhost:3000"
217
+ NODE_ENV="test"
218
+ EOF
219
+ ```
220
+
221
+ ---
222
+
223
+ ## 4. 暗号化手順
224
+
225
+ ### Step 1: 環境ファイルを暗号化
226
+
227
+ ```bash
228
+ # 各環境ファイルを暗号化
229
+ dotenvx encrypt -f .env.development
230
+ dotenvx encrypt -f .env.staging
231
+ dotenvx encrypt -f .env.production
232
+ dotenvx encrypt -f .env.ci
233
+ ```
234
+
235
+ ### Step 2: 暗号化結果の確認
236
+
237
+ 暗号化後、ファイルは以下のような形式になります:
238
+
239
+ ```bash
240
+ # .env.production(暗号化後)
241
+ #/-------------------[DOTENV_PUBLIC_KEY]--------------------/
242
+ #/ public-key encryption for .env files /
243
+ #/ [how it works](https://dotenvx.com/encryption) /
244
+ #/----------------------------------------------------------/
245
+ DOTENV_PUBLIC_KEY_PRODUCTION="03762856de9995b05b0bab64d15f4d23..."
246
+
247
+ # Production Environment
248
+ DATABASE_URL=encrypted:BKWps41fS2ZxysyF8QaWcaywV8koGwQB31/3...
249
+ NEXTAUTH_SECRET=encrypted:BIsPWaPuZKcIShhWg/mkQ4hAIb5XfJxHq8...
250
+ NEXTAUTH_URL=encrypted:BGqfAinM4i1q4jyFHGgDieBnatHXGHLbMsC1...
251
+ NODE_ENV=encrypted:BDqRRvYcNnJ5rYo4c8Zhu/lThghcW8b6+7u4+M...
252
+ ```
253
+
254
+ ### Step 3: 秘密鍵の確認
255
+
256
+ ```bash
257
+ # .env.keys に秘密鍵が生成される
258
+ cat .env.keys
259
+
260
+ # 出力例:
261
+ # DOTENV_PRIVATE_KEY_DEVELOPMENT=8afef18fa6e433593a5116cc406c83a44c4385b3f4f7d4cc25750e39f2baa320
262
+ # DOTENV_PRIVATE_KEY_STAGING=548887285654af264275d8c58e87c82dd7958ac6e99760fb5aa5eca8e1efb35d
263
+ # DOTENV_PRIVATE_KEY_PRODUCTION=73890d5288241cb6738b7172d5ee1bf2dd4aac8319442d951e31d123304f180d
264
+ # DOTENV_PRIVATE_KEY_CI=4165a821b257a073b2b0a4b4e180b86accc76eec773ec53c6443626615c7d979
265
+ ```
266
+
267
+ ### Step 4: Gitにコミット
268
+
269
+ ```bash
270
+ # 暗号化されたファイルをコミット
271
+ git add .env.development .env.staging .env.production .env.ci
272
+ git commit -m "chore: 環境変数ファイルを暗号化"
273
+ ```
274
+
275
+ ### 📝 チーム共有設定(.env.local)を変更するとき
276
+
277
+ ローカル開発用の共通設定を変更したい場合の手順:
278
+
279
+ ```bash
280
+ # 1. 現在の暗号化ファイルを復号(テンポラリファイルに出力)
281
+ dotenvx decrypt -f .env.local -o .env.local.tmp
282
+
283
+ # 2. テンポラリファイルを編集
284
+ vi .env.local.tmp # または好みのエディタで編集
285
+
286
+ # 3. 元のファイルを削除して、編集済みファイルをリネーム
287
+ rm .env.local
288
+ mv .env.local.tmp .env.local
289
+
290
+ # 4. 再暗号化
291
+ dotenvx encrypt -f .env.local
292
+
293
+ # 5. コミット&プッシュ
294
+ git add .env.local
295
+ git commit -m "chore: ローカル開発設定を更新"
296
+ git push
297
+
298
+ # 6. チームメンバーへの通知
299
+ # → メンバーは git pull 後に pnpm dev:setup で反映
300
+ ```
301
+
302
+ **注意**: `.env.keys` に対応する秘密鍵(`DOTENV_PRIVATE_KEY_LOCAL`)が必要です。
303
+
304
+ ---
305
+
306
+ ## 5. 秘密鍵の管理
307
+
308
+ ### 保管場所
309
+
310
+ | 保管場所 | 用途 | アクセス権限 |
311
+ |---------|------|------------|
312
+ | 1Password | チーム共有 | 開発者全員 |
313
+ | GitHub Secrets | CI/CD | GitHub Actions |
314
+ | Vercel Dashboard | 本番デプロイ | 管理者のみ |
315
+ | Railway Variables | Cronワーカー | 管理者のみ |
316
+
317
+ ### 1Passwordへの保存
318
+
319
+ ```bash
320
+ # .env.keys の内容を1Passwordに保存
321
+ # Vault: Development
322
+ # Item Name: einja-dotenvx-keys
323
+ # Type: Secure Note
324
+ ```
325
+
326
+ ### GitHub Secretsへの登録
327
+
328
+ ```bash
329
+ # CI用秘密鍵を登録
330
+ gh secret set DOTENV_PRIVATE_KEY_CI --body "$(grep DOTENV_PRIVATE_KEY_CI .env.keys | cut -d= -f2)"
331
+
332
+ # 本番用秘密鍵を登録(必要に応じて)
333
+ gh secret set DOTENV_PRIVATE_KEY_PRODUCTION --body "$(grep DOTENV_PRIVATE_KEY_PRODUCTION .env.keys | cut -d= -f2)"
334
+ ```
335
+
336
+ ### Vercel環境変数への登録
337
+
338
+ ```bash
339
+ # Vercel CLIで設定
340
+ vercel env add DOTENV_PRIVATE_KEY_PRODUCTION production
341
+
342
+ # または Vercel Dashboard から設定
343
+ # Settings > Environment Variables > Add
344
+ ```
345
+
346
+ ---
347
+
348
+ ## 6. CI/CD環境での使用
349
+
350
+ ### GitHub Actions設定例
351
+
352
+ ```yaml
353
+ # .github/workflows/ci.yml
354
+ name: CI
355
+
356
+ on:
357
+ push:
358
+ branches: [main]
359
+ pull_request:
360
+ branches: [main]
361
+
362
+ jobs:
363
+ test:
364
+ runs-on: ubuntu-latest
365
+
366
+ steps:
367
+ - uses: actions/checkout@v4
368
+
369
+ - name: Setup pnpm
370
+ uses: pnpm/action-setup@v4
371
+ with:
372
+ version: 10.14.0
373
+
374
+ - name: Setup Node.js
375
+ uses: actions/setup-node@v4
376
+ with:
377
+ node-version: '22.16.0'
378
+ cache: 'pnpm'
379
+
380
+ - name: Install dependencies
381
+ run: pnpm install --frozen-lockfile
382
+
383
+ - name: Generate Prisma Client
384
+ run: pnpm db:generate
385
+
386
+ - name: Run TypeScript type check
387
+ run: pnpm typecheck
388
+
389
+ - name: Run lint
390
+ run: pnpm lint
391
+
392
+ - name: Run tests
393
+ run: pnpm test
394
+ ```
395
+
396
+ ### 本番ビルド時の使用
397
+
398
+ ```yaml
399
+ # デプロイワークフローでの使用例
400
+ - name: Build for production
401
+ run: pnpm build
402
+ env:
403
+ DOTENV_PRIVATE_KEY_PRODUCTION: ${{ secrets.DOTENV_PRIVATE_KEY_PRODUCTION }}
404
+ ```
405
+
406
+ ---
407
+
408
+ ## 7. トラブルシューティング
409
+
410
+ ### dotenvxコマンドが見つからない
411
+
412
+ ```bash
413
+ # PATHを確認
414
+ which dotenvx
415
+
416
+ # 再インストール
417
+ curl -sfS https://dotenvx.sh/install.sh | sh
418
+
419
+ # または npm経由
420
+ npm install -g @dotenvx/dotenvx
421
+ ```
422
+
423
+ ### 復号エラー: "missing private key"
424
+
425
+ **原因**: 秘密鍵が環境変数にセットされていない
426
+
427
+ ```bash
428
+ # 秘密鍵を確認
429
+ echo $DOTENV_PRIVATE_KEY_PRODUCTION
430
+
431
+ # .env.keys から読み込み
432
+ source .env.keys
433
+ dotenvx run -f .env.production -- echo "OK"
434
+
435
+ # または直接指定
436
+ DOTENV_PRIVATE_KEY_PRODUCTION=xxx dotenvx run -f .env.production -- echo "OK"
437
+ ```
438
+
439
+ ### 暗号化エラー: "file already encrypted"
440
+
441
+ **原因**: 既に暗号化済みのファイルを再暗号化しようとした
442
+
443
+ ```bash
444
+ # 一度復号してから再暗号化
445
+ dotenvx decrypt -f .env.production
446
+ # ファイルを編集
447
+ dotenvx encrypt -f .env.production
448
+ ```
449
+
450
+ ### direnvで環境変数が読み込まれない
451
+
452
+ ```bash
453
+ # direnvを許可
454
+ direnv allow
455
+
456
+ # シェルフックを確認
457
+ # .zshrc または .bashrc に以下があるか確認
458
+ eval "$(direnv hook zsh)" # または bash
459
+
460
+ # シェルを再起動
461
+ exec $SHELL
462
+ ```
463
+
464
+ ### CI/CDで環境変数が見えない
465
+
466
+ **原因**: GitHub Secretsの設定ミス
467
+
468
+ ```bash
469
+ # Secretsを確認
470
+ gh secret list
471
+
472
+ # Secretを再設定
473
+ gh secret set DOTENV_PRIVATE_KEY_CI --body "正しい秘密鍵"
474
+ ```
475
+
476
+ ### 環境変数の優先順位が期待と異なる
477
+
478
+ **ロード順序(後勝ち)**:
479
+ 1. `.env` - 基本設定
480
+ 2. `.env.local` - ローカルオーバーライド
481
+
482
+ ```bash
483
+ # 明示的に順序を指定
484
+ dotenvx run -f .env -f .env.local -- <command>
485
+ ```
486
+
487
+ ---
488
+
489
+ ## 関連ドキュメント
490
+
491
+ - [デプロイセットアップ手順](./deployment-setup.md)
492
+ - [環境変数設計方針](../steering/infrastructure/environment-variables.md)
493
+ - [デプロイメント・CI/CD設計方針](../steering/infrastructure/deployment.md)
494
+
495
+ ## 参考リンク
496
+
497
+ - [dotenvx公式ドキュメント](https://dotenvx.com/docs)
498
+ - [dotenvx暗号化の仕組み](https://dotenvx.com/encryption)
499
+ - [direnv公式ドキュメント](https://direnv.net/)
500
+ <!-- @einja:managed:end -->
501
+
502
+ ---
503
+
504
+ <!-- @einja:seed:start id="environment-setup-project" -->
505
+ ## プロジェクト固有の設定
506
+
507
+ <!-- このセクションはプロジェクト固有の内容を追記する場所です -->
508
+ <!-- einja syncで上書きされません -->
509
+ <!-- @einja:seed:end -->