@einja/dev-cli 0.1.39 → 0.1.41

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 (183) hide show
  1. package/README.md +89 -1
  2. package/dist/cli.js +1 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +71 -1
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/list.js.map +1 -1
  8. package/dist/commands/sync.d.ts.map +1 -1
  9. package/dist/commands/sync.js +187 -13
  10. package/dist/commands/sync.js.map +1 -1
  11. package/dist/lib/dependency-checker.d.ts.map +1 -1
  12. package/dist/lib/merger.d.ts +12 -0
  13. package/dist/lib/merger.d.ts.map +1 -1
  14. package/dist/lib/merger.js +28 -0
  15. package/dist/lib/merger.js.map +1 -1
  16. package/dist/lib/preset-update/cli-repo-detector.d.ts.map +1 -1
  17. package/dist/lib/preset-update/file-copier.d.ts.map +1 -1
  18. package/dist/lib/preset-update/preset-finder.d.ts.map +1 -1
  19. package/dist/lib/preset.d.ts.map +1 -1
  20. package/dist/lib/sync/category-validator.d.ts +1 -1
  21. package/dist/lib/sync/category-validator.d.ts.map +1 -1
  22. package/dist/lib/sync/category-validator.js +2 -1
  23. package/dist/lib/sync/category-validator.js.map +1 -1
  24. package/dist/lib/sync/category-validator.test.js +3 -1
  25. package/dist/lib/sync/category-validator.test.js.map +1 -1
  26. package/dist/lib/sync/conflict-reporter.d.ts.map +1 -1
  27. package/dist/lib/sync/diff-engine.d.ts.map +1 -1
  28. package/dist/lib/sync/file-filter.d.ts.map +1 -1
  29. package/dist/lib/sync/file-filter.js +1 -0
  30. package/dist/lib/sync/file-filter.js.map +1 -1
  31. package/dist/lib/sync/integration.test.js +255 -69
  32. package/dist/lib/sync/integration.test.js.map +1 -1
  33. package/dist/lib/sync/json-processor.d.ts +4 -4
  34. package/dist/lib/sync/json-processor.d.ts.map +1 -1
  35. package/dist/lib/sync/json-processor.js +11 -11
  36. package/dist/lib/sync/json-processor.js.map +1 -1
  37. package/dist/lib/sync/marker-processor.d.ts +60 -8
  38. package/dist/lib/sync/marker-processor.d.ts.map +1 -1
  39. package/dist/lib/sync/marker-processor.js +117 -26
  40. package/dist/lib/sync/marker-processor.js.map +1 -1
  41. package/dist/lib/sync/marker-processor.test.js +261 -40
  42. package/dist/lib/sync/marker-processor.test.js.map +1 -1
  43. package/dist/lib/sync/metadata-manager.d.ts +4 -0
  44. package/dist/lib/sync/metadata-manager.d.ts.map +1 -1
  45. package/dist/lib/sync/metadata-manager.js +15 -0
  46. package/dist/lib/sync/metadata-manager.js.map +1 -1
  47. package/dist/lib/sync/metadata-manager.test.js +68 -0
  48. package/dist/lib/sync/metadata-manager.test.js.map +1 -1
  49. package/dist/lib/sync/orphan-cleaner.d.ts +29 -0
  50. package/dist/lib/sync/orphan-cleaner.d.ts.map +1 -0
  51. package/dist/lib/sync/orphan-cleaner.js +80 -0
  52. package/dist/lib/sync/orphan-cleaner.js.map +1 -0
  53. package/dist/lib/sync/orphan-cleaner.test.d.ts +2 -0
  54. package/dist/lib/sync/orphan-cleaner.test.d.ts.map +1 -0
  55. package/dist/lib/sync/orphan-cleaner.test.js +169 -0
  56. package/dist/lib/sync/orphan-cleaner.test.js.map +1 -0
  57. package/dist/lib/sync/project-private-synchronizer.d.ts +52 -0
  58. package/dist/lib/sync/project-private-synchronizer.d.ts.map +1 -0
  59. package/dist/lib/sync/project-private-synchronizer.js +106 -0
  60. package/dist/lib/sync/project-private-synchronizer.js.map +1 -0
  61. package/dist/lib/sync/project-private-synchronizer.test.d.ts +2 -0
  62. package/dist/lib/sync/project-private-synchronizer.test.d.ts.map +1 -0
  63. package/dist/lib/sync/project-private-synchronizer.test.js +348 -0
  64. package/dist/lib/sync/project-private-synchronizer.test.js.map +1 -0
  65. package/dist/types/index.d.ts +1 -0
  66. package/dist/types/index.d.ts.map +1 -1
  67. package/dist/types/sync.d.ts +36 -6
  68. package/dist/types/sync.d.ts.map +1 -1
  69. package/dist/types/sync.js +2 -2
  70. package/dist/types/sync.js.map +1 -1
  71. package/package.json +5 -4
  72. package/presets/default/.claude/agents/einja/Explore.md +140 -0
  73. package/presets/default/.claude/agents/einja/backend-architect.md +4 -0
  74. package/presets/default/.claude/agents/einja/codex-agent.md +4 -0
  75. package/presets/default/.claude/agents/einja/design-engineer.md +4 -0
  76. package/presets/default/.claude/agents/einja/docs/docs-updater.md +4 -0
  77. package/presets/default/.claude/agents/einja/frontend-architect.md +4 -0
  78. package/presets/default/.claude/agents/einja/frontend-coder.md +4 -0
  79. package/presets/default/.claude/agents/einja/git/conflict-resolver.md +4 -0
  80. package/presets/default/.claude/agents/einja/specs/spec-design-generator.md +4 -1
  81. package/presets/default/.claude/agents/einja/specs/spec-qa-generator.md +4 -0
  82. package/presets/default/.claude/agents/einja/specs/spec-requirements-generator.md +4 -1
  83. package/presets/default/.claude/agents/einja/specs/spec-tasks-generator.md +6 -2
  84. package/presets/default/.claude/agents/einja/specs/spec-tasks-validator.md +4 -0
  85. package/presets/default/.claude/agents/einja/task/task-executer.md +57 -115
  86. package/presets/default/.claude/agents/einja/task/task-modification-analyzer.md +4 -0
  87. package/presets/default/.claude/agents/einja/task/task-qa.md +4 -0
  88. package/presets/default/.claude/agents/einja/task/task-reviewer.md +4 -0
  89. package/presets/default/.claude/commands/einja/einja-sync.md +5 -1
  90. package/presets/default/.claude/commands/einja/frontend-implement.md +3 -1
  91. package/presets/default/.claude/commands/einja/issue-exec.md +403 -0
  92. package/presets/default/.claude/commands/einja/spec-create.md +15 -1
  93. package/presets/default/.claude/commands/einja/start-dev.md +4 -0
  94. package/presets/default/.claude/commands/einja/sync-cursor-commands.md +4 -0
  95. package/presets/default/.claude/commands/einja/task-exec.md +106 -14
  96. package/presets/default/.claude/commands/einja/update-docs-by-task-specs.md +4 -0
  97. package/presets/default/.claude/hooks/einja/plan-mode-skill-loader.sh +23 -0
  98. package/presets/default/.claude/settings.json +15 -1
  99. package/presets/default/.claude/skills/einja-conflict-resolver/SKILL.md +4 -0
  100. package/presets/default/.claude/skills/einja-general-context-loader/SKILL.md +4 -0
  101. package/presets/default/.claude/skills/einja-output-format/SKILL.md +4 -0
  102. package/presets/default/.claude/skills/einja-project-overview/SKILL.md +7 -3
  103. package/presets/default/.claude/skills/einja-skill-creator/SKILL.md +266 -274
  104. package/presets/default/.claude/skills/einja-skill-creator/agents/analyzer.md +274 -0
  105. package/presets/default/.claude/skills/einja-skill-creator/agents/comparator.md +202 -0
  106. package/presets/default/.claude/skills/einja-skill-creator/agents/grader.md +195 -0
  107. package/presets/default/.claude/skills/einja-skill-creator/assets/eval_review.html +146 -0
  108. package/presets/default/.claude/skills/einja-skill-creator/eval-viewer/generate_review.py +471 -0
  109. package/presets/default/.claude/skills/einja-skill-creator/eval-viewer/viewer.html +1325 -0
  110. package/presets/default/.claude/skills/einja-skill-creator/references/schemas.md +430 -0
  111. package/presets/default/.claude/skills/einja-skill-creator/scripts/aggregate_benchmark.py +154 -0
  112. package/presets/default/.claude/skills/einja-skill-creator/scripts/generate_report.py +265 -0
  113. package/presets/default/.claude/skills/einja-skill-creator/scripts/improve_description.py +252 -0
  114. package/presets/default/.claude/skills/einja-skill-creator/scripts/init_skill.py +13 -19
  115. package/presets/default/.claude/skills/einja-skill-creator/scripts/package_skill.py +36 -7
  116. package/presets/default/.claude/skills/einja-skill-creator/scripts/run_eval.py +310 -0
  117. package/presets/default/.claude/skills/einja-skill-creator/scripts/run_loop.py +295 -0
  118. package/presets/default/.claude/skills/einja-skill-creator/scripts/utils.py +48 -0
  119. package/presets/default/.claude/skills/einja-spec-context-loader/SKILL.md +4 -0
  120. package/presets/default/.claude/skills/einja-task-commit/SKILL.md +4 -0
  121. package/presets/default/.claude/skills/einja-task-qa/SKILL.md +4 -0
  122. package/presets/default/.envrc +5 -0
  123. package/presets/default/.mcp.json +2 -12
  124. package/presets/default/CLAUDE.md.template +26 -4
  125. package/presets/default/docs/einja/example/specs/issues/issue999-example-task/tasks.md +1 -1
  126. package/presets/default/docs/einja/instructions/deployment-setup.md +3 -8
  127. package/presets/default/docs/einja/instructions/environment-setup.md +3 -8
  128. package/presets/default/docs/einja/instructions/issue-exec-workflow.md +276 -0
  129. package/presets/default/docs/einja/instructions/local-server-environment-and-worktree.md +70 -8
  130. package/presets/default/docs/einja/instructions/neon-cli-reference.md +3 -8
  131. package/presets/default/docs/einja/instructions/task-execute.md +23 -28
  132. package/presets/default/docs/einja/instructions/vercel-cli-reference.md +17 -10
  133. package/presets/default/docs/einja/steering/README.md +11 -11
  134. package/presets/default/docs/einja/steering/acceptance-criteria-and-qa-guide.md +3 -8
  135. package/presets/default/docs/einja/steering/architecture.md +3 -8
  136. package/presets/default/docs/einja/steering/branch-strategy.md +63 -70
  137. package/presets/default/docs/einja/steering/commit-rules.md +3 -8
  138. package/presets/default/docs/einja/steering/db-schema-design.md +3 -8
  139. package/presets/default/docs/einja/steering/development/api-development.md +3 -8
  140. package/presets/default/docs/einja/steering/development/backend-architecture.md +3 -8
  141. package/presets/default/docs/einja/steering/development/coding-standards.md +723 -0
  142. package/presets/default/docs/einja/steering/development/component-design.md +502 -0
  143. package/presets/default/docs/einja/steering/development/database-guidelines.md +54 -5
  144. package/presets/default/docs/einja/steering/development/frontend-development.md +3 -8
  145. package/presets/default/docs/einja/steering/development/playwright-guidelines.md +59 -0
  146. package/presets/default/docs/einja/steering/development/review-guidelines.md +3 -8
  147. package/presets/default/docs/einja/steering/development/testing-strategy.md +3 -8
  148. package/presets/default/docs/einja/steering/development-workflow.md +71 -124
  149. package/presets/default/docs/einja/steering/infrastructure/deployment.md +49 -55
  150. package/presets/default/docs/einja/steering/infrastructure/environment-variables.md +4 -8
  151. package/presets/default/docs/einja/steering/product.md +3 -8
  152. package/presets/default/docs/einja/steering/task-management.md +14 -98
  153. package/presets/default/scripts/ensure-serena.sh +75 -0
  154. package/presets/default/scripts/env-rotate-secrets.ts +336 -0
  155. package/presets/default/scripts/env-show.ts +130 -0
  156. package/presets/default/scripts/env.ts +479 -0
  157. package/presets/default/scripts/init.sh +92 -0
  158. package/presets/default/scripts/lib/env-common.ts +108 -0
  159. package/presets/default/scripts/lib/worktree-config.ts +64 -0
  160. package/presets/default/scripts/setup-dev.ts +640 -0
  161. package/presets/default/scripts/stop-serena.sh +25 -0
  162. package/presets/default/scripts/worktree/dev.ts +872 -0
  163. package/dist/lib/sync/seed-synchronizer.d.ts +0 -27
  164. package/dist/lib/sync/seed-synchronizer.d.ts.map +0 -1
  165. package/dist/lib/sync/seed-synchronizer.js +0 -72
  166. package/dist/lib/sync/seed-synchronizer.js.map +0 -1
  167. package/dist/lib/sync/seed-synchronizer.test.d.ts +0 -2
  168. package/dist/lib/sync/seed-synchronizer.test.d.ts.map +0 -1
  169. package/dist/lib/sync/seed-synchronizer.test.js +0 -147
  170. package/dist/lib/sync/seed-synchronizer.test.js.map +0 -1
  171. package/presets/default/.claude/skills/einja-api-development/SKILL.md +0 -14
  172. package/presets/default/.claude/skills/einja-backend-architecture/SKILL.md +0 -18
  173. package/presets/default/.claude/skills/einja-coding-standards/SKILL.md +0 -132
  174. package/presets/default/.claude/skills/einja-coding-standards/references/import-conventions.md +0 -69
  175. package/presets/default/.claude/skills/einja-coding-standards/references/naming-conventions.md +0 -107
  176. package/presets/default/.claude/skills/einja-coding-standards/references/prohibited-patterns.md +0 -169
  177. package/presets/default/.claude/skills/einja-coding-standards/references/typescript-rules.md +0 -247
  178. package/presets/default/.claude/skills/einja-component-design/SKILL.md +0 -109
  179. package/presets/default/.claude/skills/einja-component-design/references/directory-structure.md +0 -117
  180. package/presets/default/.claude/skills/einja-component-design/references/props-patterns.md +0 -159
  181. package/presets/default/.claude/skills/einja-component-design/references/styling-guide.md +0 -122
  182. package/presets/default/.claude/skills/einja-frontend-development/SKILL.md +0 -14
  183. package/presets/default/docs/einja/instructions/task-vibe-kanban-loop.md +0 -565
@@ -1,27 +0,0 @@
1
- /**
2
- * @einja:seedマーカーの同期を行うクラス
3
- *
4
- * seedマーカーはプロジェクト固有のテンプレートを提供します。
5
- * - ファイルにseed(ID)がない場合: テンプレートから追加
6
- * - ファイルにseed(ID)がある場合: 保持(上書きしない)
7
- */
8
- export declare class SeedSynchronizer {
9
- private readonly processor;
10
- /**
11
- * seedセクションを同期する
12
- *
13
- * @param localContent - ローカルファイルの内容
14
- * @param templateContent - テンプレートファイルの内容
15
- * @returns 同期後の内容
16
- */
17
- syncSeeds(localContent: string, templateContent: string): string;
18
- /**
19
- * ファイル全体がseed扱い(マーカーなし)の場合の同期処理
20
- *
21
- * @param localExists - ローカルにファイルが存在するか
22
- * @param templateContent - テンプレートファイルの内容
23
- * @returns 同期後の内容(ローカルが存在する場合はnull)
24
- */
25
- syncUnmarkedFile(localExists: boolean, templateContent: string): string | null;
26
- }
27
- //# sourceMappingURL=seed-synchronizer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"seed-synchronizer.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/seed-synchronizer.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAEnD;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM;IA4ChE;;;;;;OAMG;IACH,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAU/E"}
@@ -1,72 +0,0 @@
1
- import { MarkerProcessor } from "./marker-processor.js";
2
- /**
3
- * @einja:seedマーカーの同期を行うクラス
4
- *
5
- * seedマーカーはプロジェクト固有のテンプレートを提供します。
6
- * - ファイルにseed(ID)がない場合: テンプレートから追加
7
- * - ファイルにseed(ID)がある場合: 保持(上書きしない)
8
- */
9
- export class SeedSynchronizer {
10
- constructor() {
11
- this.processor = new MarkerProcessor();
12
- }
13
- /**
14
- * seedセクションを同期する
15
- *
16
- * @param localContent - ローカルファイルの内容
17
- * @param templateContent - テンプレートファイルの内容
18
- * @returns 同期後の内容
19
- */
20
- syncSeeds(localContent, templateContent) {
21
- // Given: ローカルとテンプレートのセクションをパース
22
- const localSections = this.processor.parseMarkers(localContent);
23
- const templateSections = this.processor.parseMarkers(templateContent);
24
- // Given: ローカルに存在するseedのIDを収集
25
- const localSeedIds = new Set();
26
- for (const section of localSections) {
27
- if (section.type === "seed" && section.id) {
28
- localSeedIds.add(section.id);
29
- }
30
- }
31
- // When: テンプレートのseedセクションを取得
32
- const templateSeeds = templateSections.filter((section) => section.type === "seed");
33
- // When: ローカルに存在しないseedセクションを抽出
34
- const seedsToAdd = templateSeeds.filter((seed) => seed.id && !localSeedIds.has(seed.id));
35
- // Then: ローカルに追加するseedがない場合は、ローカルをそのまま返す
36
- if (seedsToAdd.length === 0) {
37
- return localContent;
38
- }
39
- // Then: ローカルの末尾にseedセクションを追加
40
- const lines = localContent.split("\n");
41
- const result = [...lines];
42
- // 末尾に空行がない場合は追加
43
- if (result.length > 0 && result[result.length - 1].trim() !== "") {
44
- result.push("");
45
- }
46
- for (const seed of seedsToAdd) {
47
- // セクション間に空行を追加
48
- if (result[result.length - 1] !== "") {
49
- result.push("");
50
- }
51
- result.push(seed.content);
52
- }
53
- return result.join("\n");
54
- }
55
- /**
56
- * ファイル全体がseed扱い(マーカーなし)の場合の同期処理
57
- *
58
- * @param localExists - ローカルにファイルが存在するか
59
- * @param templateContent - テンプレートファイルの内容
60
- * @returns 同期後の内容(ローカルが存在する場合はnull)
61
- */
62
- syncUnmarkedFile(localExists, templateContent) {
63
- // Given: ローカルにファイルが存在しない場合
64
- if (!localExists) {
65
- // When: テンプレートをそのまま追加
66
- return templateContent;
67
- }
68
- // Then: ローカルが存在する場合は何もしない(利用者管理)
69
- return null;
70
- }
71
- }
72
- //# sourceMappingURL=seed-synchronizer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"seed-synchronizer.js","sourceRoot":"","sources":["../../../src/lib/sync/seed-synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,OAAO,gBAAgB;IAA7B;QACmB,cAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IAsErD,CAAC;IApEC;;;;;;OAMG;IACH,SAAS,CAAC,YAAoB,EAAE,eAAuB;QACrD,+BAA+B;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QAEtE,6BAA6B;QAC7B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QACvC,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;gBAC1C,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAEpF,+BAA+B;QAC/B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzF,wCAAwC;QACxC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,6BAA6B;QAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAa,CAAC,GAAG,KAAK,CAAC,CAAC;QAEpC,gBAAgB;QAChB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,eAAe;YACf,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,WAAoB,EAAE,eAAuB;QAC5D,2BAA2B;QAC3B,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,sBAAsB;YACtB,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,iCAAiC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=seed-synchronizer.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"seed-synchronizer.test.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/seed-synchronizer.test.ts"],"names":[],"mappings":""}
@@ -1,147 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { SeedSynchronizer } from "./seed-synchronizer.js";
3
- describe("SeedSynchronizer", () => {
4
- const synchronizer = new SeedSynchronizer();
5
- describe("syncSeeds", () => {
6
- it("ローカルに存在しないseedセクションがテンプレートに存在する場合、ローカルに追加されること", () => {
7
- // Given: ローカルにseedがない
8
- const localContent = `ローカル行1
9
- ローカル行2`;
10
- // Given: テンプレートにseedがある
11
- const templateContent = `テンプレート行1
12
- <!-- @einja:seed:start id="seed-1" -->
13
- シードセクション1
14
- <!-- @einja:seed:end -->
15
- テンプレート行2`;
16
- // When: seedを同期
17
- const result = synchronizer.syncSeeds(localContent, templateContent);
18
- // Then: ローカルの末尾にseedが追加される
19
- expect(result).toContain("ローカル行1");
20
- expect(result).toContain("ローカル行2");
21
- expect(result).toContain('<!-- @einja:seed:start id="seed-1" -->');
22
- expect(result).toContain("シードセクション1");
23
- expect(result).toContain("<!-- @einja:seed:end -->");
24
- });
25
- it("ローカルに既に存在するseedセクションは上書きされないこと", () => {
26
- // Given: ローカルにseedがある
27
- const localContent = `ローカル行1
28
- <!-- @einja:seed:start id="seed-1" -->
29
- ローカルシードセクション1
30
- <!-- @einja:seed:end -->
31
- ローカル行2`;
32
- // Given: テンプレートに同じIDのseedがある
33
- const templateContent = `テンプレート行1
34
- <!-- @einja:seed:start id="seed-1" -->
35
- テンプレートシードセクション1
36
- <!-- @einja:seed:end -->
37
- テンプレート行2`;
38
- // When: seedを同期
39
- const result = synchronizer.syncSeeds(localContent, templateContent);
40
- // Then: ローカルがそのまま保持される
41
- expect(result).toBe(localContent);
42
- expect(result).toContain("ローカルシードセクション1");
43
- expect(result).not.toContain("テンプレートシードセクション1");
44
- });
45
- it("ローカルに一部のseedが存在し、テンプレートに新しいseedがある場合、新しいseedのみ追加されること", () => {
46
- // Given: ローカルにseed-1がある
47
- const localContent = `ローカル行1
48
- <!-- @einja:seed:start id="seed-1" -->
49
- ローカルシードセクション1
50
- <!-- @einja:seed:end -->
51
- ローカル行2`;
52
- // Given: テンプレートにseed-1とseed-2がある
53
- const templateContent = `テンプレート行1
54
- <!-- @einja:seed:start id="seed-1" -->
55
- テンプレートシードセクション1
56
- <!-- @einja:seed:end -->
57
- テンプレート行2
58
- <!-- @einja:seed:start id="seed-2" -->
59
- テンプレートシードセクション2
60
- <!-- @einja:seed:end -->
61
- テンプレート行3`;
62
- // When: seedを同期
63
- const result = synchronizer.syncSeeds(localContent, templateContent);
64
- // Then: seed-1はそのまま、seed-2が追加される
65
- expect(result).toContain("ローカルシードセクション1");
66
- expect(result).not.toContain("テンプレートシードセクション1");
67
- expect(result).toContain('<!-- @einja:seed:start id="seed-2" -->');
68
- expect(result).toContain("テンプレートシードセクション2");
69
- expect(result).toContain("<!-- @einja:seed:end -->");
70
- });
71
- it("複数の新しいseedセクションが追加される場合、全て追加されること", () => {
72
- // Given: ローカルにseedがない
73
- const localContent = "ローカル行1";
74
- // Given: テンプレートに複数のseedがある
75
- const templateContent = `テンプレート行1
76
- <!-- @einja:seed:start id="seed-1" -->
77
- シードセクション1
78
- <!-- @einja:seed:end -->
79
- テンプレート行2
80
- <!-- @einja:seed:start id="seed-2" -->
81
- シードセクション2
82
- <!-- @einja:seed:end -->
83
- テンプレート行3`;
84
- // When: seedを同期
85
- const result = synchronizer.syncSeeds(localContent, templateContent);
86
- // Then: 全てのseedが追加される
87
- expect(result).toContain('<!-- @einja:seed:start id="seed-1" -->');
88
- expect(result).toContain("シードセクション1");
89
- expect(result).toContain('<!-- @einja:seed:start id="seed-2" -->');
90
- expect(result).toContain("シードセクション2");
91
- });
92
- it("managedセクションとseedセクションが混在する場合、seedのみが同期対象となること", () => {
93
- // Given: ローカルにmanagedとseedがある
94
- const localContent = `ローカル行1
95
- <!-- @einja:managed:start -->
96
- ローカル管理セクション
97
- <!-- @einja:managed:end -->
98
- <!-- @einja:seed:start id="seed-1" -->
99
- ローカルシードセクション
100
- <!-- @einja:seed:end -->
101
- ローカル行2`;
102
- // Given: テンプレートにmanagedとseed-1、seed-2がある
103
- const templateContent = `テンプレート行1
104
- <!-- @einja:managed:start -->
105
- テンプレート管理セクション
106
- <!-- @einja:managed:end -->
107
- <!-- @einja:seed:start id="seed-1" -->
108
- テンプレートシードセクション1
109
- <!-- @einja:seed:end -->
110
- <!-- @einja:seed:start id="seed-2" -->
111
- テンプレートシードセクション2
112
- <!-- @einja:seed:end -->
113
- テンプレート行2`;
114
- // When: seedを同期
115
- const result = synchronizer.syncSeeds(localContent, templateContent);
116
- // Then: seed-2のみ追加、seed-1とmanagedは元のまま
117
- expect(result).toContain("ローカル管理セクション");
118
- expect(result).toContain("ローカルシードセクション");
119
- expect(result).not.toContain("テンプレートシードセクション1");
120
- expect(result).toContain('<!-- @einja:seed:start id="seed-2" -->');
121
- expect(result).toContain("テンプレートシードセクション2");
122
- });
123
- });
124
- describe("syncUnmarkedFile", () => {
125
- it("ローカルにファイルが存在しない場合、テンプレート内容を返すこと", () => {
126
- // Given: ローカルにファイルが存在しない
127
- const localExists = false;
128
- const templateContent = `テンプレート行1
129
- テンプレート行2`;
130
- // When: マーカーなしファイルを同期
131
- const result = synchronizer.syncUnmarkedFile(localExists, templateContent);
132
- // Then: テンプレート内容が返る
133
- expect(result).toBe(templateContent);
134
- });
135
- it("ローカルにファイルが存在する場合、nullを返すこと(何もしない)", () => {
136
- // Given: ローカルにファイルが存在する
137
- const localExists = true;
138
- const templateContent = `テンプレート行1
139
- テンプレート行2`;
140
- // When: マーカーなしファイルを同期
141
- const result = synchronizer.syncUnmarkedFile(localExists, templateContent);
142
- // Then: nullが返る(何もしない)
143
- expect(result).toBeNull();
144
- });
145
- });
146
- });
147
- //# sourceMappingURL=seed-synchronizer.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"seed-synchronizer.test.js","sourceRoot":"","sources":["../../../src/lib/sync/seed-synchronizer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,YAAY,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAE5C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,sBAAsB;YACtB,MAAM,YAAY,GAAG;OACpB,CAAC;YAEF,wBAAwB;YACxB,MAAM,eAAe,GAAG;;;;SAIrB,CAAC;YAEJ,gBAAgB;YAChB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YAErE,2BAA2B;YAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,sBAAsB;YACtB,MAAM,YAAY,GAAG;;;;OAIpB,CAAC;YAEF,6BAA6B;YAC7B,MAAM,eAAe,GAAG;;;;SAIrB,CAAC;YAEJ,gBAAgB;YAChB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YAErE,uBAAuB;YACvB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,wBAAwB;YACxB,MAAM,YAAY,GAAG;;;;OAIpB,CAAC;YAEF,iCAAiC;YACjC,MAAM,eAAe,GAAG;;;;;;;;SAQrB,CAAC;YAEJ,gBAAgB;YAChB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YAErE,iCAAiC;YACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,sBAAsB;YACtB,MAAM,YAAY,GAAG,QAAQ,CAAC;YAE9B,2BAA2B;YAC3B,MAAM,eAAe,GAAG;;;;;;;;SAQrB,CAAC;YAEJ,gBAAgB;YAChB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YAErE,sBAAsB;YACtB,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,8BAA8B;YAC9B,MAAM,YAAY,GAAG;;;;;;;OAOpB,CAAC;YAEF,yCAAyC;YACzC,MAAM,eAAe,GAAG;;;;;;;;;;SAUrB,CAAC;YAEJ,gBAAgB;YAChB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YAErE,uCAAuC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,yBAAyB;YACzB,MAAM,WAAW,GAAG,KAAK,CAAC;YAC1B,MAAM,eAAe,GAAG;SACrB,CAAC;YAEJ,sBAAsB;YACtB,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAE3E,oBAAoB;YACpB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,wBAAwB;YACxB,MAAM,WAAW,GAAG,IAAI,CAAC;YACzB,MAAM,eAAe,GAAG;SACrB,CAAC;YAEJ,sBAAsB;YACtB,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAE3E,uBAAuB;YACvB,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,14 +0,0 @@
1
- ---
2
- name: api-development
3
- description: "Hono + Zodを使用したAPI実装のガイドライン"
4
- ---
5
-
6
- # API開発ガイド Skill
7
-
8
- ## 概要
9
-
10
- このSkillは、API実装時に参照すべきガイドラインを提供します。
11
-
12
- ## 詳細ドキュメント
13
-
14
- @docs/einja/steering/development/api-development.md
@@ -1,18 +0,0 @@
1
- ---
2
- name: backend-architecture
3
- description: "4層レイヤードアーキテクチャ、Repositoryパターン、Result型パターンのガイドライン"
4
- ---
5
-
6
- # バックエンドアーキテクチャ Skill
7
-
8
- ## 概要
9
-
10
- このSkillは、バックエンド実装時に参照すべきアーキテクチャガイドラインを提供します。
11
-
12
- ## 詳細ドキュメント
13
-
14
- @docs/einja/steering/development/backend-architecture.md
15
-
16
- ## 関連ドキュメント
17
-
18
- - @docs/einja/steering/development/database-guidelines.md
@@ -1,132 +0,0 @@
1
- ---
2
- name: coding-standards
3
- description: "TypeScript/React/Next.jsのコーディング規約とベストプラクティス"
4
- ---
5
-
6
- # Coding Standards Skill
7
-
8
- ## 概要
9
-
10
- このSkillは、プロジェクトのコーディング規約を提供します。一貫性のある高品質なコードを維持し、チーム全体の開発効率を向上させることを目的とします。
11
-
12
- ## 基本原則
13
-
14
- ### 1. 可読性の重視
15
- - コードは書くよりも読まれることが多い
16
- - 明確で理解しやすいコードを書く
17
- - 適切な命名と構造化を心がける
18
-
19
- ### 2. 一貫性の保持
20
- - プロジェクト全体で統一されたスタイルを維持
21
- - 既存のコードパターンに従う
22
- - ツールによる自動化を活用
23
-
24
- ### 3. 保守性の向上
25
- - 変更に強いコード設計
26
- - 適切な分離と抽象化
27
- - テスタブルなコード構造
28
-
29
- ## 詳細ドキュメント
30
-
31
- 各カテゴリの詳細な規約は以下を参照してください:
32
-
33
- - [TypeScript規約](./references/typescript-rules.md) - 型安全性、型定義、禁止事項
34
- - [命名規則](./references/naming-conventions.md) - 変数・関数・型の命名規則
35
- - [禁止事項](./references/prohibited-patterns.md) - 絶対に使用禁止のパターン
36
- - [インポートパス規約](./references/import-conventions.md) - パッケージ間・アプリ内のインポートルール
37
-
38
- ## クイックリファレンス
39
-
40
- ### 必須チェック項目
41
-
42
- - [ ] **any型を使用していない**(最重要)
43
- - [ ] 適切な型定義がされている
44
- - [ ] 命名規約に従っている
45
- - [ ] early return パターンを使用している
46
- - [ ] エラーハンドリングが適切に実装されている
47
- - [ ] 禁止事項に該当するコードがない
48
-
49
- ### インポート順序
50
-
51
- ```typescript
52
- // 1. Node.js標準ライブラリ
53
- import { readFile } from 'fs/promises';
54
-
55
- // 2. 外部ライブラリ
56
- import React from 'react';
57
- import { NextRequest } from 'next/server';
58
-
59
- // 3. 内部ライブラリ(@/から始まる)
60
- import { Button } from '@/components/ui/button';
61
- import { auth } from '@/lib/auth';
62
-
63
- // 4. 相対インポート
64
- import './styles.css';
65
- import { localUtil } from '../utils';
66
- ```
67
-
68
- ### スタイリング(Tailwind CSS)
69
-
70
- ```typescript
71
- // ✅ Tailwind CSSユーティリティクラスの使用
72
- export function Card({ children }: CardProps) {
73
- return (
74
- <div className="rounded-lg bg-white p-6 shadow-md hover:shadow-lg transition-shadow">
75
- {children}
76
- </div>
77
- );
78
- }
79
-
80
- // ✅ cva によるバリアント管理
81
- import { cva } from "class-variance-authority";
82
-
83
- const buttonVariants = cva(
84
- "inline-flex items-center justify-center rounded-md font-medium transition-colors",
85
- {
86
- variants: {
87
- variant: {
88
- primary: "bg-primary text-primary-foreground hover:bg-primary/90",
89
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
90
- },
91
- size: {
92
- sm: "h-8 px-3 text-sm",
93
- md: "h-10 px-4 text-base",
94
- lg: "h-12 px-6 text-lg",
95
- },
96
- },
97
- defaultVariants: {
98
- variant: "primary",
99
- size: "md",
100
- },
101
- }
102
- );
103
- ```
104
-
105
- ## ツール設定
106
-
107
- ### 必須ツール
108
- 1. **Biome**: linting と formatting
109
- 2. **TypeScript**: 型チェック
110
- 3. **Husky**: Git hooks
111
- 4. **lint-staged**: ステージングファイルのチェック
112
-
113
- ### VS Code 推奨設定
114
-
115
- ```json
116
- {
117
- "editor.codeActionsOnSave": {
118
- "source.organizeImports": true,
119
- "source.fixAll": true
120
- },
121
- "editor.formatOnSave": true,
122
- "typescript.preferences.noSemicolons": false,
123
- "typescript.preferences.quoteStyle": "double"
124
- }
125
- ```
126
-
127
- ## 関連Skill・ドキュメント
128
-
129
- - [component-design](../einja-component-design/SKILL.md) - コンポーネント設計ガイドライン
130
- - `docs/einja/steering/development/testing-strategy.md` - テスト戦略
131
- - `docs/einja/steering/development/review-guidelines.md` - コードレビューガイドライン
132
- - `docs/einja/steering/commit-rules.md` - コミットルール
@@ -1,69 +0,0 @@
1
- # インポートパスの規約
2
-
3
- ## パッケージ間のインポート
4
-
5
- ```typescript
6
- // 認証機能(共通設定)
7
- import { baseAuthOptions, mergeAuthOptions } from "@repo/front-core/auth";
8
-
9
- // 認証機能(アプリローカル)
10
- import { auth, signIn, signOut } from "@/lib/auth";
11
- import { requireAuth, withAuth } from "@/lib/auth/guard";
12
-
13
- // データベース
14
- import { prisma } from "@repo/server-core";
15
-
16
- // UIコンポーネント
17
- import { Button } from "@repo/ui/button";
18
- import { Card } from "@repo/ui/card";
19
- import { cn } from "@repo/ui/utils";
20
-
21
- // 型定義
22
- import type { Session } from "next-auth"; // 型拡張はfront-coreで定義済み
23
- ```
24
-
25
- ## アプリ内のインポート
26
-
27
- ```typescript
28
- // apps/web内では従来通り@/を使用
29
- import { Component } from "@/components/...";
30
- import { helper } from "@/lib/...";
31
- ```
32
-
33
- ## 認証設定のパターン
34
-
35
- アプリ固有の認証設定は `@/lib/auth/index.ts` で `baseAuthOptions` を拡張します:
36
-
37
- ```typescript
38
- import { baseAuthOptions, mergeAuthOptions } from "@repo/front-core/auth";
39
- import NextAuth from "next-auth";
40
-
41
- const authOptions = mergeAuthOptions(baseAuthOptions, {
42
- pages: { signIn: "/signin" }, // アプリ固有
43
- callbacks: {
44
- async redirect({ url, baseUrl }) {
45
- // アプリ固有のリダイレクトロジック
46
- },
47
- },
48
- });
49
-
50
- export const { handlers, signIn, signOut, auth } = NextAuth(authOptions);
51
- ```
52
-
53
- ## インポート順序
54
-
55
- インポート文は以下の順序で記述してください:
56
-
57
- 1. **Node.js標準ライブラリ**
58
- 2. **外部ライブラリ**
59
- 3. **内部パッケージ** (`@repo/*`)
60
- 4. **アプリ内インポート** (`@/`, `@web/`, `@admin/` 等)
61
- 5. **相対インポート**
62
-
63
- 各グループ間には空行を入れてください。
64
-
65
- ## 禁止事項
66
-
67
- - **相対パスの使用禁止**: import文で `../` や `./` を使用しない(CSS importやindex.tsからの同階層re-exportを除く)
68
- - 必ずアプリ固有エイリアス(`@web/*`, `@admin/*` 等)またはパッケージ名(`@repo/server-core` 等)を使用すること
69
- - **index.ts不使用**: パッケージエクスポートにindex.tsは使わず、直接ファイルパスを指定する(`@repo/server-core/infrastructure/database/client` 等)
@@ -1,107 +0,0 @@
1
- # 命名規則
2
-
3
- ## ファイル・ディレクトリ命名
4
-
5
- ### 基本的な命名原則
6
-
7
- - **Reactコンポーネント**: PascalCase(例: `UserProfile.tsx`)
8
- - **ユーティリティファイル**: camelCase(例: `authConfig.ts`)
9
- - **Next.jsファイル**: lowercase(例: `page.tsx`, `layout.tsx`)
10
-
11
- **注意**: shadcn/uiで生成されたコンポーネントはkebab-caseファイル名(例: `button.tsx`, `input.tsx`)を使用しており、この命名規則の例外となります。
12
-
13
- ## 変数・関数命名
14
-
15
- ### 変数名
16
-
17
- ```typescript
18
- // ✅ camelCase
19
- const userName = 'john';
20
- const isLoggedIn = true;
21
- const userList = [];
22
-
23
- // ✅ boolean値は is/has/can などで開始
24
- const isVisible = true;
25
- const hasPermission = false;
26
- const canEdit = true;
27
-
28
- // ✅ 定数はSCREAMING_SNAKE_CASE
29
- const API_ENDPOINT = 'https://api.example.com';
30
- const MAX_RETRY_COUNT = 3;
31
- ```
32
-
33
- ### 関数名
34
-
35
- ```typescript
36
- // ✅ 動詞で開始
37
- function getUserById(id: string): User | null { }
38
- function validateEmail(email: string): boolean { }
39
- function handleSubmit(): void { }
40
-
41
- // ✅ イベントハンドラーは "handle" または "on" で開始
42
- function handleClick(): void { }
43
- function onUserSelect(user: User): void { }
44
-
45
- // ✅ 戻り値がbooleanの場合は is/has/can で開始
46
- function isValidUser(user: User): boolean { }
47
- function hasPermission(user: User, action: string): boolean { }
48
- ```
49
-
50
- ### インターフェース・型名
51
-
52
- ```typescript
53
- // ✅ PascalCase
54
- interface User {
55
- id: string;
56
- name: string;
57
- }
58
-
59
- // ✅ Props は "Props" サフィックス
60
- interface UserCardProps {
61
- user: User;
62
- onEdit?: () => void;
63
- }
64
-
65
- // ✅ 型は Type サフィックス(必要に応じて)
66
- type ApiResponseType<T> = {
67
- data: T;
68
- status: string;
69
- };
70
-
71
- // ✅ Union型は具体的な名前
72
- type ButtonVariant = 'primary' | 'secondary' | 'danger';
73
- type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
74
- ```
75
-
76
- ## コメント規約
77
-
78
- ### JSDoc の使用
79
-
80
- ```typescript
81
- /**
82
- * ユーザー情報を取得する
83
- * @param id - ユーザーID
84
- * @returns ユーザー情報、見つからない場合はnull
85
- * @throws {ApiError} API呼び出しが失敗した場合
86
- */
87
- async function getUserById(id: string): Promise<User | null> {
88
- // 実装
89
- }
90
- ```
91
-
92
- ### インラインコメント
93
-
94
- ```typescript
95
- // ✅ 「なぜ」を説明するコメント
96
- // Safari では transform-origin が正しく動作しないため、明示的に設定
97
- element.style.transformOrigin = 'center center';
98
-
99
- // ✅ 複雑なビジネスロジックの説明
100
- // 管理者は全てのデータにアクセス可能、
101
- // 一般ユーザーは自分のデータのみアクセス可能
102
- const hasAccess = user.role === 'admin' || user.id === resourceOwnerId;
103
-
104
- // ❌ 「何を」するかのコメント(不要)
105
- // ユーザー名を取得
106
- const userName = user.name;
107
- ```