create-ai-project 1.11.2

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 (150) hide show
  1. package/.claude/agents/acceptance-test-generator.md +316 -0
  2. package/.claude/agents/code-reviewer.md +193 -0
  3. package/.claude/agents/document-reviewer.md +182 -0
  4. package/.claude/agents/prd-creator.md +186 -0
  5. package/.claude/agents/quality-fixer.md +295 -0
  6. package/.claude/agents/requirement-analyzer.md +161 -0
  7. package/.claude/agents/rule-advisor.md +194 -0
  8. package/.claude/agents/task-decomposer.md +291 -0
  9. package/.claude/agents/task-executor.md +270 -0
  10. package/.claude/agents/technical-designer.md +343 -0
  11. package/.claude/agents/work-planner.md +181 -0
  12. package/.claude/agents-en/acceptance-test-generator.md +256 -0
  13. package/.claude/agents-en/code-reviewer.md +195 -0
  14. package/.claude/agents-en/design-sync.md +225 -0
  15. package/.claude/agents-en/document-reviewer.md +190 -0
  16. package/.claude/agents-en/integration-test-reviewer.md +195 -0
  17. package/.claude/agents-en/prd-creator.md +196 -0
  18. package/.claude/agents-en/quality-fixer-frontend.md +334 -0
  19. package/.claude/agents-en/quality-fixer.md +291 -0
  20. package/.claude/agents-en/requirement-analyzer.md +165 -0
  21. package/.claude/agents-en/rule-advisor.md +194 -0
  22. package/.claude/agents-en/task-decomposer.md +291 -0
  23. package/.claude/agents-en/task-executor-frontend.md +276 -0
  24. package/.claude/agents-en/task-executor.md +272 -0
  25. package/.claude/agents-en/technical-designer-frontend.md +441 -0
  26. package/.claude/agents-en/technical-designer.md +371 -0
  27. package/.claude/agents-en/work-planner.md +216 -0
  28. package/.claude/agents-ja/acceptance-test-generator.md +256 -0
  29. package/.claude/agents-ja/code-reviewer.md +195 -0
  30. package/.claude/agents-ja/design-sync.md +225 -0
  31. package/.claude/agents-ja/document-reviewer.md +192 -0
  32. package/.claude/agents-ja/integration-test-reviewer.md +195 -0
  33. package/.claude/agents-ja/prd-creator.md +194 -0
  34. package/.claude/agents-ja/quality-fixer-frontend.md +335 -0
  35. package/.claude/agents-ja/quality-fixer.md +292 -0
  36. package/.claude/agents-ja/requirement-analyzer.md +164 -0
  37. package/.claude/agents-ja/rule-advisor.md +194 -0
  38. package/.claude/agents-ja/task-decomposer.md +291 -0
  39. package/.claude/agents-ja/task-executor-frontend.md +276 -0
  40. package/.claude/agents-ja/task-executor.md +272 -0
  41. package/.claude/agents-ja/technical-designer-frontend.md +442 -0
  42. package/.claude/agents-ja/technical-designer.md +370 -0
  43. package/.claude/agents-ja/work-planner.md +213 -0
  44. package/.claude/commands/build.md +78 -0
  45. package/.claude/commands/design.md +27 -0
  46. package/.claude/commands/implement.md +79 -0
  47. package/.claude/commands/plan.md +43 -0
  48. package/.claude/commands/project-inject.md +76 -0
  49. package/.claude/commands/refine-rule.md +206 -0
  50. package/.claude/commands/review.md +78 -0
  51. package/.claude/commands/sync-rules.md +116 -0
  52. package/.claude/commands/task.md +13 -0
  53. package/.claude/commands-en/build.md +77 -0
  54. package/.claude/commands-en/design.md +39 -0
  55. package/.claude/commands-en/front-build.md +103 -0
  56. package/.claude/commands-en/front-design.md +42 -0
  57. package/.claude/commands-en/front-plan.md +40 -0
  58. package/.claude/commands-en/implement.md +75 -0
  59. package/.claude/commands-en/plan.md +45 -0
  60. package/.claude/commands-en/project-inject.md +76 -0
  61. package/.claude/commands-en/refine-rule.md +208 -0
  62. package/.claude/commands-en/review.md +78 -0
  63. package/.claude/commands-en/sync-rules.md +116 -0
  64. package/.claude/commands-en/task.md +13 -0
  65. package/.claude/commands-ja/build.md +75 -0
  66. package/.claude/commands-ja/design.md +37 -0
  67. package/.claude/commands-ja/front-build.md +103 -0
  68. package/.claude/commands-ja/front-design.md +42 -0
  69. package/.claude/commands-ja/front-plan.md +40 -0
  70. package/.claude/commands-ja/implement.md +73 -0
  71. package/.claude/commands-ja/plan.md +43 -0
  72. package/.claude/commands-ja/project-inject.md +76 -0
  73. package/.claude/commands-ja/refine-rule.md +206 -0
  74. package/.claude/commands-ja/review.md +78 -0
  75. package/.claude/commands-ja/sync-rules.md +116 -0
  76. package/.claude/commands-ja/task.md +13 -0
  77. package/.claude/settings.local.json +74 -0
  78. package/.husky/pre-commit +1 -0
  79. package/.husky/pre-push +3 -0
  80. package/.madgerc +14 -0
  81. package/.tsprunerc +11 -0
  82. package/CLAUDE.en.md +102 -0
  83. package/CLAUDE.ja.md +102 -0
  84. package/CLAUDE.md +111 -0
  85. package/LICENSE +21 -0
  86. package/README.ja.md +233 -0
  87. package/README.md +243 -0
  88. package/bin/create-project.js +87 -0
  89. package/biome.json +51 -0
  90. package/docs/adr/template-en.md +64 -0
  91. package/docs/adr/template-ja.md +64 -0
  92. package/docs/design/template-en.md +281 -0
  93. package/docs/design/template-ja.md +285 -0
  94. package/docs/guides/en/quickstart.md +111 -0
  95. package/docs/guides/en/rule-editing-guide.md +266 -0
  96. package/docs/guides/en/sub-agents.md +343 -0
  97. package/docs/guides/en/use-cases.md +308 -0
  98. package/docs/guides/ja/quickstart.md +112 -0
  99. package/docs/guides/ja/rule-editing-guide.md +266 -0
  100. package/docs/guides/ja/sub-agents.md +343 -0
  101. package/docs/guides/ja/use-cases.md +290 -0
  102. package/docs/guides/sub-agents.md +306 -0
  103. package/docs/plans/20250123-integration-test-improvement.md +993 -0
  104. package/docs/plans/template-en.md +130 -0
  105. package/docs/plans/template-ja.md +130 -0
  106. package/docs/prd/template-en.md +109 -0
  107. package/docs/prd/template-ja.md +109 -0
  108. package/docs/rules/ai-development-guide.md +260 -0
  109. package/docs/rules/architecture/implementation-approach.md +136 -0
  110. package/docs/rules/documentation-criteria.md +180 -0
  111. package/docs/rules/project-context.md +38 -0
  112. package/docs/rules/rules-index.yaml +137 -0
  113. package/docs/rules/technical-spec.md +47 -0
  114. package/docs/rules/typescript-testing.md +188 -0
  115. package/docs/rules/typescript.md +166 -0
  116. package/docs/rules-en/architecture/implementation-approach.md +136 -0
  117. package/docs/rules-en/coding-standards.md +333 -0
  118. package/docs/rules-en/documentation-criteria.md +184 -0
  119. package/docs/rules-en/frontend/technical-spec.md +143 -0
  120. package/docs/rules-en/frontend/typescript-testing.md +124 -0
  121. package/docs/rules-en/frontend/typescript.md +131 -0
  122. package/docs/rules-en/integration-e2e-testing.md +149 -0
  123. package/docs/rules-en/project-context.md +38 -0
  124. package/docs/rules-en/rules-index.yaml +211 -0
  125. package/docs/rules-en/technical-spec.md +86 -0
  126. package/docs/rules-en/typescript-testing.md +149 -0
  127. package/docs/rules-en/typescript.md +116 -0
  128. package/docs/rules-ja/architecture/implementation-approach.md +136 -0
  129. package/docs/rules-ja/coding-standards.md +333 -0
  130. package/docs/rules-ja/documentation-criteria.md +180 -0
  131. package/docs/rules-ja/frontend/technical-spec.md +143 -0
  132. package/docs/rules-ja/frontend/typescript-testing.md +124 -0
  133. package/docs/rules-ja/frontend/typescript.md +131 -0
  134. package/docs/rules-ja/integration-e2e-testing.md +149 -0
  135. package/docs/rules-ja/project-context.md +38 -0
  136. package/docs/rules-ja/rules-index.yaml +196 -0
  137. package/docs/rules-ja/technical-spec.md +86 -0
  138. package/docs/rules-ja/typescript-testing.md +149 -0
  139. package/docs/rules-ja/typescript.md +116 -0
  140. package/package.json +98 -0
  141. package/scripts/check-unused-exports.js +69 -0
  142. package/scripts/cleanup-test-processes.sh +32 -0
  143. package/scripts/post-setup.js +110 -0
  144. package/scripts/set-language.js +310 -0
  145. package/scripts/setup-project.js +199 -0
  146. package/scripts/show-coverage.js +74 -0
  147. package/src/index.ts +11 -0
  148. package/templates/.gitignore.template +52 -0
  149. package/tsconfig.json +50 -0
  150. package/vitest.config.mjs +47 -0
@@ -0,0 +1,86 @@
1
+ # ๆŠ€่ก“่จญ่จˆใƒซใƒผใƒซ
2
+
3
+ ## ๆŠ€่ก“ใ‚นใ‚ฟใƒƒใ‚ฏใฎๅŸบๆœฌๆ–น้‡
4
+ TypeScriptใ‚’ใƒ™ใƒผใ‚นใจใ—ใŸใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณๅฎŸ่ฃ…ใ€‚ใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใƒ‘ใ‚ฟใƒผใƒณใฏใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฎ่ฆไปถใจ่ฆๆจกใซๅฟœใ˜ใฆ้ธๆŠžใ™ใ‚‹ใ“ใจใ€‚
5
+
6
+ ## ็’ฐๅขƒๅค‰ๆ•ฐ็ฎก็†ใจใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ
7
+
8
+ ### ็’ฐๅขƒๅค‰ๆ•ฐ็ฎก็†
9
+ - ็’ฐๅขƒๅค‰ๆ•ฐใฏไธ€ๅ…ƒ็ฎก็†ใ—ใ€ๅž‹ๅฎ‰ๅ…จๆ€งใ‚’็ขบไฟใ™ใ‚‹ไป•็ต„ใฟใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใ“ใจ
10
+ - `process.env` ใฎ็›ดๆŽฅๅ‚็…งใฏ้ฟใ‘ใ€่จญๅฎš็ฎก็†ๅฑคใ‚’้€šใ˜ใฆๅ–ๅพ—ใ™ใ‚‹ใ“ใจ
11
+ - ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆๅ€คใฎ่จญๅฎšใ‚„ๅฟ…้ ˆใƒใ‚งใƒƒใ‚ฏใ‚’้ฉๅˆ‡ใซๅฎŸ่ฃ…ใ™ใ‚‹ใ“ใจ
12
+
13
+ ### ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ
14
+ - `.env`ใƒ•ใ‚กใ‚คใƒซใฏGitใซๅซใ‚ใชใ„
15
+ - APIใ‚ญใƒผใ‚„ใ‚ทใƒผใ‚ฏใƒฌใƒƒใƒˆใฏๅฟ…ใš็’ฐๅขƒๅค‰ๆ•ฐใจใ—ใฆ็ฎก็†
16
+ - ๆฉŸๅฏ†ๆƒ…ๅ ฑใฎใƒญใ‚ฐๅ‡บๅŠ›ใฏ็ฆๆญข
17
+ - ใ‚จใƒฉใƒผใƒกใƒƒใ‚ปใƒผใ‚ธใซๆฉŸๅฏ†ๆƒ…ๅ ฑใ‚’ๅซใ‚ใชใ„
18
+
19
+ ## ใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃ่จญ่จˆ
20
+
21
+ ### ใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃ่จญ่จˆใฎๅŽŸๅ‰‡
22
+ ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ”ใจใซ้ฉๅˆ‡ใชใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใ‚’้ธๆŠžใ—ใ€ๆ˜Ž็ขบใซๅฎš็พฉใ™ใ‚‹ใ“ใจ๏ผš
23
+
24
+ - **ๆ˜Ž็ขบใชๅฎš็พฉ**: ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฎใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใฏ`docs/rules/architecture/`้…ไธ‹ใซๅฐ‚็”จใƒ•ใ‚กใ‚คใƒซใงๅฎš็พฉ
25
+ - **่ฒฌๅ‹™ใฎๅˆ†้›ข**: ๅ„ๅฑคใ‚„ใƒขใ‚ธใƒฅใƒผใƒซใฎ่ฒฌๅ‹™ใ‚’ๆ˜Ž็ขบใซๅฎš็พฉใ—ใ€ๅขƒ็•Œใ‚’ๅฎˆใ‚‹ใ“ใจ
26
+
27
+ ## ใƒ‘ใ‚ฟใƒผใƒณ้ฉ็”จใฎไธ€่ฒซๆ€ง
28
+
29
+ ้ธๆŠžใ—ใŸใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใƒ‘ใ‚ฟใƒผใƒณใซๅŽณๅฏ†ใซๅพ“ใ†ใ€‚ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅ›บๆœ‰่ฉณ็ดฐใฏ`docs/rules/architecture/`ๅ‚็…งใ€‚
30
+
31
+ ## ใƒ‡ใƒผใ‚ฟใƒ•ใƒญใƒผ็ตฑไธ€ๅŽŸๅ‰‡
32
+
33
+ #### ๅŸบๆœฌๅŽŸๅ‰‡
34
+ 1. **ๅ˜ไธ€ใƒ‡ใƒผใ‚ฟใ‚ฝใƒผใ‚น**: ๅŒใ˜ๆƒ…ๅ ฑใฏ1็ฎ‡ๆ‰€ใซใฎใฟไฟๅญ˜ใ™ใ‚‹
35
+ 2. **ๆง‹้€ ๅŒ–ใƒ‡ใƒผใ‚ฟๅ„ชๅ…ˆ**: JSONๆ–‡ๅญ—ๅˆ—ใงใฏใชใใƒ‘ใƒผใ‚นๆธˆใฟใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ไฝฟ็”จ
36
+ 3. **ๆ˜Ž็ขบใช่ฒฌๅ‹™ๅˆ†้›ข**: ๅ„ๅฑคใฎ่ฒฌๅ‹™ใ‚’ๆ˜Ž็ขบใซๅฎš็พฉ
37
+
38
+ #### ใƒ‡ใƒผใ‚ฟใƒ•ใƒญใƒผใฎใƒ™ใ‚นใƒˆใƒ—ใƒฉใ‚ฏใƒ†ใ‚ฃใ‚น
39
+ - **ๅ…ฅๅŠ›ๆ™‚็‚นใงใฎๆคœ่จผ**: ใƒ‡ใƒผใ‚ฟใฏๅ…ฅๅŠ›ๅฑคใงๆคœ่จผใ—ใ€ๅž‹ๅฎ‰ๅ…จใชๅฝขใงๅ†…้ƒจใซๆธกใ™
40
+ - **ๅค‰ๆ›ใฎไธ€ๅ…ƒๅŒ–**: ใƒ‡ใƒผใ‚ฟๅค‰ๆ›ใƒญใ‚ธใƒƒใ‚ฏใฏๅฐ‚็”จใฎใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃใซ้›†็ด„
41
+ - **ใƒญใ‚ฐใฎๆง‹้€ ๅŒ–**: ใƒ‡ใƒผใ‚ฟใƒ•ใƒญใƒผใฎๅ„ๆฎต้šŽใงๆง‹้€ ๅŒ–ใƒญใ‚ฐใ‚’ๅ‡บๅŠ›
42
+
43
+ ## ใƒ“ใƒซใƒ‰ใจใƒ†ใ‚นใƒˆ
44
+ package.jsonใฎ`packageManager`ใƒ•ใ‚ฃใƒผใƒซใƒ‰ใซๅฟœใ˜ใŸๅฎŸ่กŒใ‚ณใƒžใƒณใƒ‰ใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใ€‚
45
+
46
+ ### ใƒ“ใƒซใƒ‰ใ‚ณใƒžใƒณใƒ‰
47
+ - `build` - TypeScriptใƒ“ใƒซใƒ‰
48
+ - `type-check` - ๅž‹ใƒใ‚งใƒƒใ‚ฏ๏ผˆemit ใชใ—๏ผ‰
49
+
50
+ ### ใƒ†ใ‚นใƒˆใ‚ณใƒžใƒณใƒ‰
51
+ - `test` - ใƒ†ใ‚นใƒˆๅฎŸ่กŒ
52
+ - `test:coverage` - ใ‚ซใƒใƒฌใƒƒใ‚ธๆธฌๅฎš
53
+ - `test:coverage:fresh` - ใ‚ซใƒใƒฌใƒƒใ‚ธๆธฌๅฎš๏ผˆใ‚ญใƒฃใƒƒใ‚ทใƒฅใ‚ฏใƒชใ‚ข๏ผ‰
54
+ - `test:safe` - ๅฎ‰ๅ…จใชใƒ†ใ‚นใƒˆๅฎŸ่กŒ๏ผˆ่‡ชๅ‹•ใ‚ฏใƒชใƒผใƒณใ‚ขใƒƒใƒ—ไป˜ใ๏ผ‰
55
+ - `cleanup:processes` - Vitestใƒ—ใƒญใ‚ปใ‚นใฎใ‚ฏใƒชใƒผใƒณใ‚ขใƒƒใƒ—
56
+
57
+ ### ๅ“่ณชใƒใ‚งใƒƒใ‚ฏ่ฆไปถ
58
+
59
+ ๅ“่ณชใƒใ‚งใƒƒใ‚ฏใฏๅฎŸ่ฃ…ๅฎŒไบ†ๆ™‚ใซๅฟ…้ ˆ๏ผš
60
+
61
+ **Phase 1-3: ใ‚ณใƒผใƒ‰ๅ“่ณชใƒใ‚งใƒƒใ‚ฏ**
62
+ - `check` - Biome๏ผˆlint + format๏ผ‰
63
+ - `check:unused` - ๆœชไฝฟ็”จใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใฎๆคœๅ‡บ
64
+ - `check:deps` - ๅพช็’ฐไพๅญ˜ใฎๆคœๅ‡บ
65
+ - `build` - TypeScriptใƒ“ใƒซใƒ‰
66
+
67
+ **Phase 4: ใƒ†ใ‚นใƒˆ**
68
+ - `test` - ใƒ†ใ‚นใƒˆๅฎŸ่กŒ
69
+
70
+ **Phase 5: ใ‚ณใƒผใƒ‰ๅ“่ณชๅ†ๆคœ่จผ**
71
+ - `check:code` - ใ‚ณใƒผใƒ‰ๅ“่ณชใฎๅ†ๆคœ่จผ๏ผˆPhase 4ใงใฎใƒ†ใ‚นใƒˆไฟฎๆญฃใซใ‚ˆใ‚‹ๅ‰ฏไฝœ็”จใ‚’ๆธ…ๆŽƒ๏ผ‰
72
+
73
+ ### ่ฃœๅŠฉใ‚ณใƒžใƒณใƒ‰
74
+ - `check:all` - ๅ…จไฝ“็ตฑๅˆใƒใ‚งใƒƒใ‚ฏ๏ผˆcheck:code + test๏ผ‰โ€ปๆ‰‹ๅ‹•ไธ€ๆ‹ฌ็ขบ่ช็”จ
75
+ - `open coverage/index.html` - ใ‚ซใƒใƒฌใƒƒใ‚ธใƒฌใƒใƒผใƒˆ็ขบ่ช
76
+ - `format` - ใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆไฟฎๆญฃ
77
+ - `lint:fix` - Lintไฟฎๆญฃ
78
+
79
+ ### ใƒˆใƒฉใƒ–ใƒซใ‚ทใƒฅใƒผใƒ†ใ‚ฃใƒณใ‚ฐ
80
+ - **ใƒใƒผใƒˆไฝฟ็”จไธญใ‚จใƒฉใƒผ**: `cleanup:processes` ใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’ๅฎŸ่กŒ
81
+ - **ใ‚ญใƒฃใƒƒใ‚ทใƒฅๅ•้กŒ**: `test:coverage:fresh` ใ‚นใ‚ฏใƒชใƒ—ใƒˆใ‚’ๅฎŸ่กŒ
82
+ - **ไพๅญ˜้–ขไฟ‚ใ‚จใƒฉใƒผ**: ไพๅญ˜้–ขไฟ‚ใฎใ‚ฏใƒชใƒผใƒณใ‚คใƒณใ‚นใƒˆใƒผใƒซใ‚’ๅฎŸ่กŒ
83
+
84
+ ### ใ‚ซใƒใƒฌใƒƒใ‚ธ่ฆไปถ
85
+ - **ๅฟ…้ ˆ**: ใƒฆใƒ‹ใƒƒใƒˆใƒ†ใ‚นใƒˆใ‚ซใƒใƒฌใƒƒใ‚ธใฏ70%ไปฅไธŠ
86
+ - **ใƒกใƒˆใƒชใ‚ฏใ‚น**: Statementsใ€Branchesใ€Functionsใ€Lines
@@ -0,0 +1,149 @@
1
+ # TypeScript ใƒ†ใ‚นใƒˆใƒซใƒผใƒซ
2
+
3
+ ## ใƒ†ใ‚นใƒˆใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏ
4
+ - **Vitest**: ใ“ใฎใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใงใฏVitestใ‚’ไฝฟ็”จ
5
+ - ใƒ†ใ‚นใƒˆใฎใ‚คใƒณใƒใƒผใƒˆ: `import { describe, it, expect, beforeEach, vi } from 'vitest'`
6
+ - ใƒขใƒƒใ‚ฏใฎไฝœๆˆ: `vi.mock()` ใ‚’ไฝฟ็”จ
7
+
8
+ ## ใƒ†ใ‚นใƒˆใฎๅŸบๆœฌๆ–น้‡
9
+
10
+ ### ๅ“่ณช่ฆไปถ
11
+ - **ใ‚ซใƒใƒฌใƒƒใ‚ธ**: ๅ˜ไฝ“ใƒ†ใ‚นใƒˆใฎใ‚ซใƒใƒฌใƒƒใ‚ธใฏ70%ไปฅไธŠใ‚’ๅฟ…้ ˆ
12
+ - **็‹ฌ็ซ‹ๆ€ง**: ๅ„ใƒ†ใ‚นใƒˆใฏไป–ใฎใƒ†ใ‚นใƒˆใซไพๅญ˜ใ›ใšๅฎŸ่กŒๅฏ่ƒฝ
13
+ - **ๅ†็พๆ€ง**: ใƒ†ใ‚นใƒˆใฏ็’ฐๅขƒใซไพๅญ˜ใ›ใšใ€ๅธธใซๅŒใ˜็ตๆžœใ‚’่ฟ”ใ™
14
+ - **ๅฏ่ชญๆ€ง**: ใƒ†ใ‚นใƒˆใ‚ณใƒผใƒ‰ใ‚‚่ฃฝๅ“ใ‚ณใƒผใƒ‰ใจๅŒๆง˜ใฎๅ“่ณชใ‚’็ถญๆŒ
15
+
16
+ ### ใ‚ซใƒใƒฌใƒƒใ‚ธ่ฆไปถ
17
+ **ๅฟ…้ ˆ**: ๅ˜ไฝ“ใƒ†ใ‚นใƒˆใฎใ‚ซใƒใƒฌใƒƒใ‚ธใฏ70%ไปฅไธŠ
18
+ **ๆŒ‡ๆจ™**: Statements๏ผˆๆ–‡๏ผ‰ใ€Branches๏ผˆๅˆ†ๅฒ๏ผ‰ใ€Functions๏ผˆ้–ขๆ•ฐ๏ผ‰ใ€Lines๏ผˆ่กŒ๏ผ‰
19
+
20
+ ### ใƒ†ใ‚นใƒˆใฎ็จฎ้กžใจ็ฏ„ๅ›ฒ
21
+ 1. **ๅ˜ไฝ“ใƒ†ใ‚นใƒˆ๏ผˆUnit Tests๏ผ‰**
22
+ - ๅ€‹ใ€…ใฎ้–ขๆ•ฐใ‚„ใ‚ฏใƒฉใ‚นใฎๅ‹•ไฝœใ‚’ๆคœ่จผ
23
+ - ๅค–้ƒจไพๅญ˜ใฏใ™ในใฆใƒขใƒƒใ‚ฏๅŒ–
24
+ - ๆœ€ใ‚‚ๆ•ฐใŒๅคšใใ€็ดฐใ‹ใ„็ฒ’ๅบฆใงๅฎŸๆ–ฝ
25
+
26
+ 2. **็ตฑๅˆใƒ†ใ‚นใƒˆ๏ผˆIntegration Tests๏ผ‰**
27
+ - ่ค‡ๆ•ฐใฎใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฎ้€ฃๆบใ‚’ๆคœ่จผ
28
+ - ๅฎŸ้š›ใฎไพๅญ˜้–ขไฟ‚ใ‚’ไฝฟ็”จ๏ผˆDBใ‚„API็ญ‰๏ผ‰
29
+ - ไธป่ฆใชๆฉŸ่ƒฝใƒ•ใƒญใƒผใฎๆคœ่จผ
30
+
31
+ 3. **E2Eใƒ†ใ‚นใƒˆใงใฎๆฉŸ่ƒฝๆจชๆ–ญๆคœ่จผ**
32
+ - ๆ–ฐๆฉŸ่ƒฝ่ฟฝๅŠ ๆ™‚ใ€ๆ—ขๅญ˜ๆฉŸ่ƒฝใธใฎๅฝฑ้Ÿฟใ‚’ๅฟ…ใšๆคœ่จผ
33
+ - Design Docใฎใ€Œ็ตฑๅˆใƒใ‚คใƒณใƒˆใƒžใƒƒใƒ—ใ€ใงๅฝฑ้Ÿฟๅบฆใ€Œ้ซ˜ใ€ใ€Œไธญใ€ใฎ็ฎ‡ๆ‰€ใ‚’ใ‚ซใƒใƒผ
34
+ - ๆคœ่จผใƒ‘ใ‚ฟใƒผใƒณ: ๆ—ขๅญ˜ๆฉŸ่ƒฝๅ‹•ไฝœ โ†’ ๆ–ฐๆฉŸ่ƒฝๆœ‰ๅŠนๅŒ– โ†’ ๆ—ขๅญ˜ๆฉŸ่ƒฝใฎ็ถ™็ถšๆ€ง็ขบ่ช
35
+ - ๅˆคๅฎšๅŸบๆบ–: ใƒฌใ‚นใƒใƒณใ‚นๅ†…ๅฎนใฎๅค‰ๅŒ–ใชใ—ใ€ๅ‡ฆ็†ๆ™‚้–“5็ง’ไปฅๅ†…
36
+ - CI/CDใงใฎ่‡ชๅ‹•ๅฎŸ่กŒใ‚’ๅ‰ๆใจใ—ใŸ่จญ่จˆ
37
+
38
+ ## ใƒ†ใ‚นใƒˆใฎๅฎŸ่ฃ…่ฆ็ด„
39
+
40
+ ### ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชๆง‹้€ 
41
+ ```
42
+ src/
43
+ โ””โ”€โ”€ application/
44
+ โ””โ”€โ”€ services/
45
+ โ”œโ”€โ”€ __tests__/
46
+ โ”‚ โ”œโ”€โ”€ service.test.ts # ๅ˜ไฝ“ใƒ†ใ‚นใƒˆ
47
+ โ”‚ โ””โ”€โ”€ service.int.test.ts # ็ตฑๅˆใƒ†ใ‚นใƒˆ
48
+ โ””โ”€โ”€ service.ts
49
+ ```
50
+
51
+ ### ๅ‘ฝๅ่ฆๅ‰‡
52
+ - ใƒ†ใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซ: `{ๅฏพ่ฑกใƒ•ใ‚กใ‚คใƒซๅ}.test.ts`
53
+ - ็ตฑๅˆใƒ†ใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซ: `{ๅฏพ่ฑกใƒ•ใ‚กใ‚คใƒซๅ}.int.test.ts`
54
+ - ใƒ†ใ‚นใƒˆใ‚นใ‚คใƒผใƒˆ: ๅฏพ่ฑกใฎๆฉŸ่ƒฝใ‚„็Šถๆณใ‚’่ชฌๆ˜Žใ™ใ‚‹ๅๅ‰
55
+ - ใƒ†ใ‚นใƒˆใ‚ฑใƒผใ‚น: ๆœŸๅพ…ใ•ใ‚Œใ‚‹ๅ‹•ไฝœใ‚’่ชฌๆ˜Žใ™ใ‚‹ๅๅ‰
56
+
57
+
58
+ ### ใƒ†ใ‚นใƒˆใ‚ณใƒผใƒ‰ใฎๅ“่ณชใƒซใƒผใƒซ
59
+
60
+ โœ… **ๆŽจๅฅจ: ใ™ในใฆใฎใƒ†ใ‚นใƒˆใ‚’ๅธธใซๆœ‰ๅŠนใซไฟใค**
61
+ - ใƒกใƒชใƒƒใƒˆ: ใƒ†ใ‚นใƒˆใ‚นใ‚คใƒผใƒˆใฎๅฎŒๅ…จๆ€งใ‚’ไฟ่จผ
62
+ - ๅฎŸ่ทต: ๅ•้กŒใŒใ‚ใ‚‹ใƒ†ใ‚นใƒˆใฏไฟฎๆญฃใ—ใฆๆœ‰ๅŠนๅŒ–
63
+
64
+ โŒ **้ฟใ‘ใ‚‹ในใ: test.skip()ใ‚„ใ‚ณใƒกใƒณใƒˆใ‚ขใ‚ฆใƒˆ**
65
+ - ็†็”ฑ: ใƒ†ใ‚นใƒˆใฎ็ฉดใŒ็”Ÿใพใ‚Œใ€ๅ“่ณชใƒใ‚งใƒƒใ‚ฏใŒไธๅฎŒๅ…จใซใชใ‚‹
66
+ - ๅฏพๅ‡ฆ: ไธ่ฆใชใƒ†ใ‚นใƒˆใฏๅฎŒๅ…จใซๅ‰Š้™คใ™ใ‚‹
67
+
68
+ ## ใƒ†ใ‚นใƒˆๅ“่ณชๅŸบๆบ–
69
+
70
+ ### ๅขƒ็•Œๅ€คใƒป็•ฐๅธธ็ณปใฎ็ถฒ็พ…
71
+ ๆญฃๅธธ็ณปใซๅŠ ใˆใ€ๅขƒ็•Œๅ€คใจ็•ฐๅธธ็ณปใ‚’ๅซใ‚ใ‚‹ใ€‚
72
+ ```typescript
73
+ it('returns 0 for empty array', () => expect(calc([])).toBe(0))
74
+ it('throws on negative price', () => expect(() => calc([{price: -1}])).toThrow())
75
+ ```
76
+
77
+ ### ๆœŸๅพ…ๅ€คใฎ็›ดๆŽฅ่จ˜่ฟฐ
78
+ ๆœŸๅพ…ๅ€คใฏใƒชใƒ†ใƒฉใƒซใง่จ˜่ฟฐใ€‚ๅฎŸ่ฃ…ใƒญใ‚ธใƒƒใ‚ฏใ‚’ๅ†็พใ—ใชใ„ใ€‚
79
+ ```typescript
80
+ expect(calcTax(100)).toBe(10) // not: 100 * TAX_RATE
81
+ ```
82
+
83
+ ### ็ตๆžœใƒ™ใƒผใ‚นใฎๆคœ่จผ
84
+ ๅ‘ผใณๅ‡บใ—้ †ๅบใƒปๅ›žๆ•ฐใงใฏใชใ็ตๆžœใ‚’ๆคœ่จผใ€‚
85
+ ```typescript
86
+ expect(mock).toHaveBeenCalledWith('a') // not: toHaveBeenNthCalledWith
87
+ ```
88
+
89
+ ### ๆ„ๅ‘ณใ‚ใ‚‹ใ‚ขใ‚ตใƒผใ‚ทใƒงใƒณ
90
+ ๅ„ใƒ†ใ‚นใƒˆใซๆœ€ไฝŽ1ใคใฎๆคœ่จผใ‚’ๅซใ‚ใ‚‹ใ€‚
91
+ ```typescript
92
+ it('creates user', async () => {
93
+ const user = await createUser({name: 'test'})
94
+ expect(user.id).toBeDefined()
95
+ })
96
+ ```
97
+
98
+ ### ้ฉๅˆ‡ใชใƒขใƒƒใ‚ฏ็ฏ„ๅ›ฒ
99
+ ็›ดๆŽฅไพๅญ˜ใฎๅค–้ƒจI/Oใฎใฟใƒขใƒƒใ‚ฏใ€‚้–“ๆŽฅไพๅญ˜ใฏๅฎŸ็‰ฉไฝฟ็”จใ€‚
100
+ ```typescript
101
+ vi.mock('./database') // ๅค–้ƒจI/Oใฎใฟ
102
+ ```
103
+
104
+ ### Property-based Testing๏ผˆfast-check๏ผ‰
105
+ ไธๅค‰ๆกไปถใ‚„ใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใ‚’ๆคœ่จผใ™ใ‚‹ๅ ดๅˆใฏfast-checkใ‚’ไฝฟ็”จใ€‚
106
+ ```typescript
107
+ import fc from 'fast-check'
108
+
109
+ it('reverses twice equals original', () => {
110
+ fc.assert(fc.property(fc.array(fc.integer()), (arr) => {
111
+ return JSON.stringify(arr.reverse().reverse()) === JSON.stringify(arr)
112
+ }))
113
+ })
114
+ ```
115
+
116
+ **ไฝฟ็”จๆกไปถ**: Design DocใฎACใซPropertyๆณจ้‡ˆใŒไป˜ไธŽใ•ใ‚Œใฆใ„ใ‚‹ๅ ดๅˆใซไฝฟ็”จใ€‚
117
+
118
+ ## ใƒขใƒƒใ‚ฏใฎๅž‹ๅฎ‰ๅ…จๆ€ง
119
+
120
+ ### ๅฟ…่ฆๆœ€ๅฐ้™ใฎๅž‹ๅฎš็พฉ
121
+ ```typescript
122
+ // โœ… ๅฟ…่ฆใช้ƒจๅˆ†ใฎใฟ
123
+ type TestRepo = Pick<Repository, 'find' | 'save'>
124
+ const mock: TestRepo = { find: vi.fn(), save: vi.fn() }
125
+
126
+ // ใ‚„ใ‚€ใ‚’ๅพ—ใชใ„ๅ ดๅˆใฎใฟใ€็†็”ฑๆ˜Ž่จ˜
127
+ const sdkMock = {
128
+ call: vi.fn()
129
+ } as unknown as ExternalSDK // ๅค–้ƒจSDKใฎ่ค‡้›‘ใชๅž‹ใฎใŸใ‚
130
+ ```
131
+
132
+ ## VitestใฎๅŸบๆœฌไพ‹
133
+
134
+ ```typescript
135
+ import { describe, it, expect, vi } from 'vitest'
136
+
137
+ vi.mock('./userService', () => ({
138
+ getUserById: vi.fn(),
139
+ updateUser: vi.fn()
140
+ }))
141
+
142
+ describe('ComponentName', () => {
143
+ it('should follow AAA pattern', () => {
144
+ const input = 'test'
145
+ const result = someFunction(input)
146
+ expect(result).toBe('expected')
147
+ })
148
+ })
149
+ ```
@@ -0,0 +1,116 @@
1
+ # TypeScript ้–‹็™บใƒซใƒผใƒซ
2
+
3
+ ## BackendๅฎŸ่ฃ…ใซใŠใ‘ใ‚‹ๅž‹ๅฎ‰ๅ…จๆ€ง
4
+
5
+ **ใƒ‡ใƒผใ‚ฟใƒ•ใƒญใƒผใงใฎๅž‹ๅฎ‰ๅ…จๆ€ง**
6
+ ๅ…ฅๅŠ›ๅฑค๏ผˆ`unknown`๏ผ‰ โ†’ ๅž‹ใ‚ฌใƒผใƒ‰ โ†’ ใƒ“ใ‚ธใƒใ‚นๅฑค๏ผˆๅž‹ไฟ่จผ๏ผ‰ โ†’ ๅ‡บๅŠ›ๅฑค๏ผˆใ‚ทใƒชใ‚ขใƒฉใ‚คใ‚บ๏ผ‰
7
+
8
+ **Backendๅ›บๆœ‰ใฎๅž‹ใ‚ทใƒŠใƒชใ‚ช**:
9
+ - **API้€šไฟก**: ใƒฌใ‚นใƒใƒณใ‚นใฏๅฟ…ใš`unknown`ใงๅ—ใ‘ใ€ๅž‹ใ‚ฌใƒผใƒ‰ใงๆคœ่จผ
10
+ - **ใƒ•ใ‚ฉใƒผใƒ ๅ…ฅๅŠ›**: ๅค–้ƒจๅ…ฅๅŠ›ใฏ`unknown`ใ€ใƒใƒชใƒ‡ใƒผใ‚ทใƒงใƒณๅพŒใซๅž‹็ขบๅฎš
11
+ - **ใƒฌใ‚ฌใ‚ทใƒผ็ตฑๅˆ**: `window as unknown as LegacyWindow`ใฎใ‚ˆใ†ใซๆฎต้šŽ็š„ใ‚ขใ‚ตใƒผใ‚ทใƒงใƒณ
12
+ - **ใƒ†ใ‚นใƒˆใ‚ณใƒผใƒ‰**: ใƒขใƒƒใ‚ฏใ‚‚ๅฟ…ใšๅž‹ๅฎš็พฉใ€`Partial<T>`ใ‚„`vi.fn<[Args], Return>()`ๆดป็”จ
13
+
14
+ ## ใ‚ณใƒผใƒ‡ใ‚ฃใƒณใ‚ฐ่ฆ็ด„
15
+
16
+ **ใ‚ฏใƒฉใ‚นไฝฟ็”จใฎๅˆคๆ–ญๅŸบๆบ–**
17
+ - **ๆŽจๅฅจ๏ผš้–ขๆ•ฐใจinterfaceใงใฎๅฎŸ่ฃ…**
18
+ - ่ƒŒๆ™ฏ: ใƒ†ใ‚นใ‚ฟใƒ“ใƒชใƒ†ใ‚ฃใจ้–ขๆ•ฐๅˆๆˆใฎๆŸ”่ปŸๆ€งใŒๅ‘ไธŠ
19
+ - **ใ‚ฏใƒฉใ‚นไฝฟ็”จใ‚’่จฑๅฏ**:
20
+ - ใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏ่ฆๆฑ‚ๆ™‚๏ผˆNestJSใฎController/Serviceใ€TypeORMใฎEntity็ญ‰๏ผ‰
21
+ - ใ‚ซใ‚นใ‚ฟใƒ ใ‚จใƒฉใƒผใ‚ฏใƒฉใ‚นๅฎš็พฉๆ™‚
22
+ - ็Šถๆ…‹ใจใƒ“ใ‚ธใƒใ‚นใƒญใ‚ธใƒƒใ‚ฏใŒๅฏ†็ตๅˆใ—ใฆใ„ใ‚‹ๅ ดๅˆ๏ผˆไพ‹: ShoppingCartใ€Sessionใ€StateMachine๏ผ‰
23
+ - **ๅˆคๆ–ญๅŸบๆบ–**: ใ€Œใ“ใฎใƒ‡ใƒผใ‚ฟใฏๆŒฏใ‚‹่ˆžใ„ใ‚’ๆŒใคใ‹๏ผŸใ€ใŒYesใชใ‚‰ใ‚ฏใƒฉใ‚นๆคœ่จŽ
24
+ ```typescript
25
+ // โœ… ้–ขๆ•ฐใจinterface
26
+ interface UserService { create(data: UserData): User }
27
+ const userService: UserService = { create: (data) => {...} }
28
+ ```
29
+
30
+ **้–ขๆ•ฐ่จญ่จˆ**
31
+ - **ๅผ•ๆ•ฐใฏ0-2ๅ€‹ใพใง**: 3ๅ€‹ไปฅไธŠใฏใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆๅŒ–
32
+ ```typescript
33
+ // โœ… ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆๅผ•ๆ•ฐ
34
+ function createUser({ name, email, role }: CreateUserParams) {}
35
+ ```
36
+
37
+ **ไพๅญ˜ๆ€งๆณจๅ…ฅ**
38
+ - **ๅค–้ƒจไพๅญ˜ใฏๅผ•ๆ•ฐใงๆณจๅ…ฅ**: ใƒ†ใ‚นใƒˆๅฏ่ƒฝๆ€งใจใƒขใ‚ธใƒฅใƒผใƒซๆ€ง็ขบไฟ
39
+ ```typescript
40
+ // โœ… ไพๅญ˜ๆ€งใ‚’ๅผ•ๆ•ฐใงๅ—ใ‘ๅ–ใ‚‹
41
+ function createService(repository: Repository) { return {...} }
42
+ ```
43
+
44
+ **้žๅŒๆœŸๅ‡ฆ็†**
45
+ - Promiseๅ‡ฆ็†: ๅฟ…ใš`async/await`ใ‚’ไฝฟ็”จ
46
+ - ใ‚จใƒฉใƒผใƒใƒณใƒ‰ใƒชใƒณใ‚ฐ: ๅฟ…ใš`try-catch`ใงใƒใƒณใƒ‰ใƒชใƒณใ‚ฐ
47
+ - ๅž‹ๅฎš็พฉ: ๆˆปใ‚Šๅ€คใฎๅž‹ใฏๆ˜Ž็คบ็š„ใซๅฎš็พฉ๏ผˆไพ‹: `Promise<Result>`๏ผ‰
48
+
49
+ **ใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆ่ฆๅ‰‡**
50
+ - ใ‚ปใƒŸใ‚ณใƒญใƒณ็œ็•ฅ๏ผˆBiomeใฎ่จญๅฎšใซๅพ“ใ†๏ผ‰
51
+ - ๅž‹ใฏ`PascalCase`ใ€ๅค‰ๆ•ฐใƒป้–ขๆ•ฐใฏ`camelCase`
52
+ - ใ‚คใƒณใƒใƒผใƒˆใฏ็ตถๅฏพใƒ‘ใ‚น๏ผˆ`src/`๏ผ‰
53
+
54
+ **ใ‚ฏใƒชใƒผใƒณใ‚ณใƒผใƒ‰ๅŽŸๅ‰‡**
55
+ - โœ… ไฝฟ็”จใ•ใ‚Œใฆใ„ใชใ„ใ‚ณใƒผใƒ‰ใฏๅณๅบงใซๅ‰Š้™ค
56
+ - โœ… ใƒ‡ใƒใƒƒใ‚ฐ็”จ`console.log()`ใฏๅ‰Š้™ค
57
+ - โŒ ใ‚ณใƒกใƒณใƒˆใ‚ขใ‚ฆใƒˆใ•ใ‚ŒใŸใ‚ณใƒผใƒ‰๏ผˆใƒใƒผใ‚ธใƒงใƒณ็ฎก็†ใงๅฑฅๆญด็ฎก็†๏ผ‰
58
+ - โœ… ใ‚ณใƒกใƒณใƒˆใฏใ€Œใชใœใ€ใ‚’่ชฌๆ˜Ž๏ผˆใ€Œไฝ•ใ€ใงใฏใชใ๏ผ‰
59
+
60
+ ## ใ‚จใƒฉใƒผใƒใƒณใƒ‰ใƒชใƒณใ‚ฐ
61
+
62
+ **็ตถๅฏพใƒซใƒผใƒซ**: ใ‚จใƒฉใƒผใฎๆกใ‚Šใคใถใ—็ฆๆญขใ€‚ใ™ในใฆใฎใ‚จใƒฉใƒผใฏๅฟ…ใšใƒญใ‚ฐๅ‡บๅŠ›ใจ้ฉๅˆ‡ใชๅ‡ฆ็†ใ‚’่กŒใ†ใ€‚
63
+
64
+ **Fail-FastๅŽŸๅ‰‡**: ใ‚จใƒฉใƒผๆ™‚ใฏ้€Ÿใ‚„ใ‹ใซๅคฑๆ•—ใ•ใ›ใ€ไธๆญฃใช็Šถๆ…‹ใงใฎๅ‡ฆ็†็ถ™็ถšใ‚’้˜ฒใ
65
+ ```typescript
66
+ // โŒ ็ฆๆญข: ็„กๆกไปถใƒ•ใ‚ฉใƒผใƒซใƒใƒƒใ‚ฏ
67
+ catch (error) {
68
+ return defaultValue // ใ‚จใƒฉใƒผใ‚’้š ่”ฝ
69
+ }
70
+
71
+ // โœ… ๅฟ…้ ˆ: ๆ˜Ž็คบ็š„ใชๅคฑๆ•—
72
+ catch (error) {
73
+ logger.error('ๅ‡ฆ็†ๅคฑๆ•—', error)
74
+ throw error // ไธŠไฝๅฑคใง้ฉๅˆ‡ใซๅ‡ฆ็†
75
+ }
76
+ ```
77
+
78
+ **Resultๅž‹ใƒ‘ใ‚ฟใƒผใƒณ**: ใ‚จใƒฉใƒผใ‚’ๅž‹ใง่กจ็พใ—ใ€ๆ˜Ž็คบ็š„ใซๅ‡ฆ็†
79
+ ```typescript
80
+ type Result<T, E> = { ok: true; value: T } | { ok: false; error: E }
81
+
82
+ // ไฝฟ็”จไพ‹๏ผšใ‚จใƒฉใƒผใฎๅฏ่ƒฝๆ€งใ‚’ๅž‹ใง่กจ็พ
83
+ function parseUser(data: unknown): Result<User, ValidationError> {
84
+ if (!isValid(data)) return { ok: false, error: new ValidationError() }
85
+ return { ok: true, value: data as User }
86
+ }
87
+ ```
88
+
89
+ **ใ‚ซใ‚นใ‚ฟใƒ ใ‚จใƒฉใƒผใ‚ฏใƒฉใ‚น**
90
+ ```typescript
91
+ export class AppError extends Error {
92
+ constructor(message: string, public readonly code: string, public readonly statusCode = 500) {
93
+ super(message)
94
+ this.name = this.constructor.name
95
+ }
96
+ }
97
+ // ็”จ้€”ๅˆฅ: ValidationError(400), BusinessRuleError(400), DatabaseError(500), ExternalServiceError(502)
98
+ ```
99
+
100
+ **ๅฑคๅˆฅใ‚จใƒฉใƒผๅ‡ฆ็†**
101
+ - APIๅฑค: HTTPใƒฌใ‚นใƒใƒณใ‚นใซๅค‰ๆ›ใ€ๆฉŸๅฏ†ๆƒ…ๅ ฑใ‚’้™คๅค–ใ—ใฆใƒญใ‚ฐๅ‡บๅŠ›
102
+ - ใ‚ตใƒผใƒ“ใ‚นๅฑค: ใƒ“ใ‚ธใƒใ‚นใƒซใƒผใƒซ้•ๅใ‚’ๆคœๅ‡บใ€AppErrorใฏใใฎใพใพไผๆ’ญ
103
+ - ใƒชใƒใ‚ธใƒˆใƒชๅฑค: ๆŠ€่ก“็š„ใ‚จใƒฉใƒผใ‚’ใƒ‰ใƒกใ‚คใƒณใ‚จใƒฉใƒผใซๅค‰ๆ›
104
+
105
+ **ๆง‹้€ ๅŒ–ใƒญใ‚ฐใจๆฉŸๅฏ†ๆƒ…ๅ ฑไฟ่ญท**
106
+ ๆฉŸๅฏ†ๆƒ…ๅ ฑ๏ผˆpassword, token, apiKey, secret, creditCard๏ผ‰ใฏ็ตถๅฏพใซใƒญใ‚ฐใซๅซใ‚ใชใ„
107
+
108
+ **้žๅŒๆœŸใ‚จใƒฉใƒผใƒใƒณใƒ‰ใƒชใƒณใ‚ฐ**
109
+ - ใ‚ฐใƒญใƒผใƒใƒซใƒใƒณใƒ‰ใƒฉใƒผ่จญๅฎšๅฟ…้ ˆ: `unhandledRejection`, `uncaughtException`
110
+ - ใ™ในใฆใฎasync/awaitใงtry-catchไฝฟ็”จ
111
+ - ใ‚จใƒฉใƒผใฏๅฟ…ใšใƒญใ‚ฐใจๅ†ใ‚นใƒญใƒผ
112
+
113
+ ## ใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นๆœ€้ฉๅŒ–
114
+
115
+ - ใ‚นใƒˆใƒชใƒผใƒŸใƒณใ‚ฐๅ‡ฆ็†: ๅคงใใชใƒ‡ใƒผใ‚ฟใ‚ปใƒƒใƒˆใฏใ‚นใƒˆใƒชใƒผใƒ ใงๅ‡ฆ็†
116
+ - ใƒกใƒขใƒชใƒชใƒผใ‚ฏ้˜ฒๆญข: ไธ่ฆใชใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฏๆ˜Ž็คบ็š„ใซ่งฃๆ”พ
package/package.json ADDED
@@ -0,0 +1,98 @@
1
+ {
2
+ "name": "create-ai-project",
3
+ "version": "1.11.2",
4
+ "packageManager": "npm@10.8.2",
5
+ "description": "TypeScript project boilerplate optimized for Claude Code development with comprehensive development rules, architecture patterns, and quality assurance tools",
6
+ "keywords": [
7
+ "typescript",
8
+ "boilerplate",
9
+ "template",
10
+ "starter",
11
+ "scaffolding",
12
+ "cli",
13
+ "claude-code",
14
+ "anthropic",
15
+ "ai-development",
16
+ "llm-development"
17
+ ],
18
+ "author": "Shinsuke Kagawa",
19
+ "license": "MIT",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/shinpr/ai-coding-project-boilerplate.git"
23
+ },
24
+ "bin": {
25
+ "create-ai-project": "./bin/create-project.js"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc && tsc-alias",
29
+ "build:backend": "tsc && tsc-alias",
30
+ "build:frontend": "vite build",
31
+ "dev": "tsx src/index.ts",
32
+ "dev:frontend": "vite",
33
+ "watch": "tsx watch src/index.ts",
34
+ "preview": "vite preview",
35
+ "type-check": "tsc --noEmit",
36
+ "test": "vitest run",
37
+ "test:ui": "vitest --ui",
38
+ "test:coverage": "vitest run --coverage",
39
+ "test:coverage:summary": "node scripts/show-coverage.js",
40
+ "test:coverage:clean": "rm -rf coverage .vitest-cache",
41
+ "test:coverage:fresh": "npm run test:coverage:clean && npm run test:coverage",
42
+ "test:watch": "vitest",
43
+ "format": "biome format --write src",
44
+ "format:check": "biome format src",
45
+ "lint": "biome lint src",
46
+ "lint:fix": "biome lint --write src",
47
+ "check": "biome check src",
48
+ "check:fix": "biome check --write src",
49
+ "check:unused": "node scripts/check-unused-exports.js",
50
+ "check:unused:all": "ts-prune --project tsconfig.json --ignore 'src/index.ts|__tests__|test|vitest'",
51
+ "check:deps": "madge --circular --extensions ts src",
52
+ "check:deps:graph": "madge --extensions ts --image graph.svg src",
53
+ "check:code": "npm run check && npm run check:unused && npm run check:deps && npm run build",
54
+ "check:all": "npm run check:code && npm run test",
55
+ "cleanup:processes": "bash ./scripts/cleanup-test-processes.sh",
56
+ "test:safe": "npm test && npm run cleanup:processes",
57
+ "lang:ja": "node scripts/set-language.js ja",
58
+ "lang:en": "node scripts/set-language.js en",
59
+ "lang:status": "node scripts/set-language.js --status",
60
+ "postinstall": "node scripts/set-language.js ja",
61
+ "prepare": "husky"
62
+ },
63
+ "devDependencies": {
64
+ "@biomejs/biome": "^1.9.4",
65
+ "@testing-library/jest-dom": "^6.6.3",
66
+ "@testing-library/react": "^16.0.0",
67
+ "@types/node": "^20.0.0",
68
+ "@types/react": "^18.0.0",
69
+ "@types/react-dom": "^18.0.0",
70
+ "@vitejs/plugin-react": "^4.0.0",
71
+ "@vitest/coverage-v8": "^3.2.4",
72
+ "@vitest/ui": "^3.2.4",
73
+ "c8": "^10.1.3",
74
+ "fast-check": "^4.3.0",
75
+ "husky": "^9.1.7",
76
+ "jsdom": "^25.0.0",
77
+ "lint-staged": "^16.1.0",
78
+ "madge": "^8.0.0",
79
+ "react": "^18.0.0",
80
+ "react-dom": "^18.0.0",
81
+ "ts-node": "^10.9.1",
82
+ "ts-prune": "^0.10.3",
83
+ "tsc-alias": "^1.8.7",
84
+ "tsx": "^4.19.4",
85
+ "typescript": "^5.0.0",
86
+ "vite": "^5.0.0",
87
+ "vitest": "^3.2.4"
88
+ },
89
+ "engines": {
90
+ "node": ">=20"
91
+ },
92
+ "lint-staged": {
93
+ "src/**/*.{ts,tsx}": [
94
+ "biome check --write --no-errors-on-unmatched",
95
+ "biome format --write --no-errors-on-unmatched"
96
+ ]
97
+ }
98
+ }
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Unused exports checker script
5
+ * Filters out "used in module" from ts-prune output to show only truly unused exports
6
+ */
7
+
8
+ const { execSync } = require('child_process')
9
+
10
+ try {
11
+ // Run ts-prune
12
+ const output = execSync(
13
+ 'npx ts-prune --project tsconfig.json --ignore "src/index.ts|__tests__|test|vitest"',
14
+ { encoding: 'utf8' }
15
+ )
16
+
17
+ // Process each line
18
+ const lines = output.split('\n').filter(line => line.trim())
19
+ const results = {
20
+ usedInModule: [],
21
+ trulyUnused: [],
22
+ total: 0
23
+ }
24
+
25
+ for (const line of lines) {
26
+ if (line.includes(' - ')) {
27
+ results.total++
28
+ if (line.includes('(used in module)')) {
29
+ results.usedInModule.push(line)
30
+ } else {
31
+ results.trulyUnused.push(line)
32
+ }
33
+ }
34
+ }
35
+
36
+ // Display results
37
+ console.log('=== Unused Exports Analysis ===\n')
38
+
39
+ if (results.trulyUnused.length > 0) {
40
+ console.log(`๐Ÿ”ด Truly unused exports: ${results.trulyUnused.length}`)
41
+ console.log('โ”€'.repeat(50))
42
+ results.trulyUnused.forEach(line => console.log(line))
43
+ console.log('')
44
+ } else {
45
+ console.log('โœ… No truly unused exports found\n')
46
+ }
47
+
48
+ if (results.usedInModule.length > 0) {
49
+ console.log(`โš ๏ธ Used only in module (unnecessary exports): ${results.usedInModule.length}`)
50
+ console.log('โ”€'.repeat(50))
51
+ results.usedInModule.forEach(line => console.log(line))
52
+ console.log('')
53
+ } else {
54
+ console.log('โœ… No unnecessary internal exports found\n')
55
+ }
56
+
57
+ // Summary
58
+ console.log('=== Summary ===')
59
+ console.log(`Total unnecessary exports: ${results.total}`)
60
+ console.log(`โ”œโ”€โ”€ Truly unused: ${results.trulyUnused.length} (delete immediately)`)
61
+ console.log(`โ””โ”€โ”€ Used in module only: ${results.usedInModule.length} (remove export keyword)`)
62
+
63
+ // Exit code
64
+ process.exit(results.trulyUnused.length > 0 ? 1 : 0)
65
+
66
+ } catch (error) {
67
+ console.error('Error occurred:', error.message)
68
+ process.exit(1)
69
+ }
@@ -0,0 +1,32 @@
1
+ #!/bin/bash
2
+
3
+ # Vitest process cleanup script
4
+ # Check and remove zombie processes after test execution
5
+
6
+ echo "๐Ÿ” Checking for remaining test processes..."
7
+
8
+ # Vitest process check
9
+ VITEST_PROCESSES=$(ps aux | grep vitest | grep -v grep || true)
10
+ if [ -n "$VITEST_PROCESSES" ]; then
11
+ echo "โš ๏ธ Found vitest processes:"
12
+ echo "$VITEST_PROCESSES"
13
+ echo "๐Ÿ”ฅ Killing vitest processes..."
14
+ pkill -f vitest
15
+ echo "โœ… Vitest processes cleaned up"
16
+ else
17
+ echo "โœ… No vitest processes found"
18
+ fi
19
+
20
+ # Node test process check
21
+ NODE_TEST_PROCESSES=$(ps aux | grep "node.*test" | grep -v grep || true)
22
+ if [ -n "$NODE_TEST_PROCESSES" ]; then
23
+ echo "โš ๏ธ Found node test processes:"
24
+ echo "$NODE_TEST_PROCESSES"
25
+ echo "๐Ÿ”ฅ Killing node test processes..."
26
+ pkill -f "node.*test"
27
+ echo "โœ… Node test processes cleaned up"
28
+ else
29
+ echo "โœ… No node test processes found"
30
+ fi
31
+
32
+ echo "๐Ÿงน Process cleanup completed!"
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { execSync } = require('child_process');
6
+
7
+ /**
8
+ * Initialize git repository
9
+ */
10
+ function initGit() {
11
+ try {
12
+ console.log('๐Ÿ”ง Initializing git repository...');
13
+ execSync('git init', { stdio: 'inherit' });
14
+
15
+ console.log('๐Ÿ“ Creating initial commit...');
16
+ execSync('git add -A', { stdio: 'inherit' });
17
+ execSync('git commit -m "Initial commit from AI Coding Project Boilerplate"', { stdio: 'inherit' });
18
+
19
+ return true;
20
+ } catch (error) {
21
+ console.warn('โš ๏ธ Git initialization skipped (git might not be installed)');
22
+ return false;
23
+ }
24
+ }
25
+
26
+ /**
27
+ * Clean up files that shouldn't be in the user's project
28
+ */
29
+ function cleanupFiles() {
30
+ console.log('๐Ÿงน Cleaning up setup files...');
31
+
32
+ const filesToRemove = [
33
+ 'bin/create-project.js',
34
+ 'templates/.gitignore.template',
35
+ 'scripts/setup-project.js',
36
+ 'scripts/post-setup.js'
37
+ ];
38
+
39
+ const dirsToRemove = [
40
+ 'bin',
41
+ 'templates'
42
+ ];
43
+
44
+ // Remove files
45
+ for (const file of filesToRemove) {
46
+ const filePath = path.join(process.cwd(), file);
47
+ if (fs.existsSync(filePath)) {
48
+ fs.unlinkSync(filePath);
49
+ }
50
+ }
51
+
52
+ // Remove empty directories
53
+ for (const dir of dirsToRemove) {
54
+ const dirPath = path.join(process.cwd(), dir);
55
+ if (fs.existsSync(dirPath)) {
56
+ try {
57
+ fs.rmdirSync(dirPath);
58
+ } catch (e) {
59
+ // Directory might not be empty, ignore
60
+ }
61
+ }
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Show next steps to the user
67
+ */
68
+ function showNextSteps() {
69
+ const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'));
70
+ const projectName = packageJson.name;
71
+
72
+ console.log('\n๐ŸŽ‰ Project setup completed successfully!\n');
73
+ console.log('๐Ÿ“‹ Next steps:\n');
74
+ console.log(` cd ${projectName}`);
75
+ console.log(' npm install');
76
+ console.log(' npm run dev\n');
77
+ console.log('๐ŸŒ Language switching:\n');
78
+ console.log(' npm run lang:ja # Switch to Japanese');
79
+ console.log(' npm run lang:en # Switch to English\n');
80
+ console.log('๐Ÿ“– Available commands:\n');
81
+ console.log(' npm run dev # Start development');
82
+ console.log(' npm run build # Build for production');
83
+ console.log(' npm run test # Run tests');
84
+ console.log(' npm run check:all # Run all quality checks\n');
85
+ console.log('Happy coding! ๐Ÿš€\n');
86
+ }
87
+
88
+ /**
89
+ * Main post-setup process
90
+ */
91
+ function main() {
92
+ try {
93
+ // Initialize git repository
94
+ initGit();
95
+
96
+ // Clean up setup-specific files
97
+ cleanupFiles();
98
+
99
+ // Show next steps
100
+ showNextSteps();
101
+ } catch (error) {
102
+ console.error(`โŒ Post-setup failed: ${error.message}`);
103
+ process.exit(1);
104
+ }
105
+ }
106
+
107
+ // Run post-setup
108
+ if (require.main === module) {
109
+ main();
110
+ }