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.
- package/.claude/agents/acceptance-test-generator.md +316 -0
- package/.claude/agents/code-reviewer.md +193 -0
- package/.claude/agents/document-reviewer.md +182 -0
- package/.claude/agents/prd-creator.md +186 -0
- package/.claude/agents/quality-fixer.md +295 -0
- package/.claude/agents/requirement-analyzer.md +161 -0
- package/.claude/agents/rule-advisor.md +194 -0
- package/.claude/agents/task-decomposer.md +291 -0
- package/.claude/agents/task-executor.md +270 -0
- package/.claude/agents/technical-designer.md +343 -0
- package/.claude/agents/work-planner.md +181 -0
- package/.claude/agents-en/acceptance-test-generator.md +256 -0
- package/.claude/agents-en/code-reviewer.md +195 -0
- package/.claude/agents-en/design-sync.md +225 -0
- package/.claude/agents-en/document-reviewer.md +190 -0
- package/.claude/agents-en/integration-test-reviewer.md +195 -0
- package/.claude/agents-en/prd-creator.md +196 -0
- package/.claude/agents-en/quality-fixer-frontend.md +334 -0
- package/.claude/agents-en/quality-fixer.md +291 -0
- package/.claude/agents-en/requirement-analyzer.md +165 -0
- package/.claude/agents-en/rule-advisor.md +194 -0
- package/.claude/agents-en/task-decomposer.md +291 -0
- package/.claude/agents-en/task-executor-frontend.md +276 -0
- package/.claude/agents-en/task-executor.md +272 -0
- package/.claude/agents-en/technical-designer-frontend.md +441 -0
- package/.claude/agents-en/technical-designer.md +371 -0
- package/.claude/agents-en/work-planner.md +216 -0
- package/.claude/agents-ja/acceptance-test-generator.md +256 -0
- package/.claude/agents-ja/code-reviewer.md +195 -0
- package/.claude/agents-ja/design-sync.md +225 -0
- package/.claude/agents-ja/document-reviewer.md +192 -0
- package/.claude/agents-ja/integration-test-reviewer.md +195 -0
- package/.claude/agents-ja/prd-creator.md +194 -0
- package/.claude/agents-ja/quality-fixer-frontend.md +335 -0
- package/.claude/agents-ja/quality-fixer.md +292 -0
- package/.claude/agents-ja/requirement-analyzer.md +164 -0
- package/.claude/agents-ja/rule-advisor.md +194 -0
- package/.claude/agents-ja/task-decomposer.md +291 -0
- package/.claude/agents-ja/task-executor-frontend.md +276 -0
- package/.claude/agents-ja/task-executor.md +272 -0
- package/.claude/agents-ja/technical-designer-frontend.md +442 -0
- package/.claude/agents-ja/technical-designer.md +370 -0
- package/.claude/agents-ja/work-planner.md +213 -0
- package/.claude/commands/build.md +78 -0
- package/.claude/commands/design.md +27 -0
- package/.claude/commands/implement.md +79 -0
- package/.claude/commands/plan.md +43 -0
- package/.claude/commands/project-inject.md +76 -0
- package/.claude/commands/refine-rule.md +206 -0
- package/.claude/commands/review.md +78 -0
- package/.claude/commands/sync-rules.md +116 -0
- package/.claude/commands/task.md +13 -0
- package/.claude/commands-en/build.md +77 -0
- package/.claude/commands-en/design.md +39 -0
- package/.claude/commands-en/front-build.md +103 -0
- package/.claude/commands-en/front-design.md +42 -0
- package/.claude/commands-en/front-plan.md +40 -0
- package/.claude/commands-en/implement.md +75 -0
- package/.claude/commands-en/plan.md +45 -0
- package/.claude/commands-en/project-inject.md +76 -0
- package/.claude/commands-en/refine-rule.md +208 -0
- package/.claude/commands-en/review.md +78 -0
- package/.claude/commands-en/sync-rules.md +116 -0
- package/.claude/commands-en/task.md +13 -0
- package/.claude/commands-ja/build.md +75 -0
- package/.claude/commands-ja/design.md +37 -0
- package/.claude/commands-ja/front-build.md +103 -0
- package/.claude/commands-ja/front-design.md +42 -0
- package/.claude/commands-ja/front-plan.md +40 -0
- package/.claude/commands-ja/implement.md +73 -0
- package/.claude/commands-ja/plan.md +43 -0
- package/.claude/commands-ja/project-inject.md +76 -0
- package/.claude/commands-ja/refine-rule.md +206 -0
- package/.claude/commands-ja/review.md +78 -0
- package/.claude/commands-ja/sync-rules.md +116 -0
- package/.claude/commands-ja/task.md +13 -0
- package/.claude/settings.local.json +74 -0
- package/.husky/pre-commit +1 -0
- package/.husky/pre-push +3 -0
- package/.madgerc +14 -0
- package/.tsprunerc +11 -0
- package/CLAUDE.en.md +102 -0
- package/CLAUDE.ja.md +102 -0
- package/CLAUDE.md +111 -0
- package/LICENSE +21 -0
- package/README.ja.md +233 -0
- package/README.md +243 -0
- package/bin/create-project.js +87 -0
- package/biome.json +51 -0
- package/docs/adr/template-en.md +64 -0
- package/docs/adr/template-ja.md +64 -0
- package/docs/design/template-en.md +281 -0
- package/docs/design/template-ja.md +285 -0
- package/docs/guides/en/quickstart.md +111 -0
- package/docs/guides/en/rule-editing-guide.md +266 -0
- package/docs/guides/en/sub-agents.md +343 -0
- package/docs/guides/en/use-cases.md +308 -0
- package/docs/guides/ja/quickstart.md +112 -0
- package/docs/guides/ja/rule-editing-guide.md +266 -0
- package/docs/guides/ja/sub-agents.md +343 -0
- package/docs/guides/ja/use-cases.md +290 -0
- package/docs/guides/sub-agents.md +306 -0
- package/docs/plans/20250123-integration-test-improvement.md +993 -0
- package/docs/plans/template-en.md +130 -0
- package/docs/plans/template-ja.md +130 -0
- package/docs/prd/template-en.md +109 -0
- package/docs/prd/template-ja.md +109 -0
- package/docs/rules/ai-development-guide.md +260 -0
- package/docs/rules/architecture/implementation-approach.md +136 -0
- package/docs/rules/documentation-criteria.md +180 -0
- package/docs/rules/project-context.md +38 -0
- package/docs/rules/rules-index.yaml +137 -0
- package/docs/rules/technical-spec.md +47 -0
- package/docs/rules/typescript-testing.md +188 -0
- package/docs/rules/typescript.md +166 -0
- package/docs/rules-en/architecture/implementation-approach.md +136 -0
- package/docs/rules-en/coding-standards.md +333 -0
- package/docs/rules-en/documentation-criteria.md +184 -0
- package/docs/rules-en/frontend/technical-spec.md +143 -0
- package/docs/rules-en/frontend/typescript-testing.md +124 -0
- package/docs/rules-en/frontend/typescript.md +131 -0
- package/docs/rules-en/integration-e2e-testing.md +149 -0
- package/docs/rules-en/project-context.md +38 -0
- package/docs/rules-en/rules-index.yaml +211 -0
- package/docs/rules-en/technical-spec.md +86 -0
- package/docs/rules-en/typescript-testing.md +149 -0
- package/docs/rules-en/typescript.md +116 -0
- package/docs/rules-ja/architecture/implementation-approach.md +136 -0
- package/docs/rules-ja/coding-standards.md +333 -0
- package/docs/rules-ja/documentation-criteria.md +180 -0
- package/docs/rules-ja/frontend/technical-spec.md +143 -0
- package/docs/rules-ja/frontend/typescript-testing.md +124 -0
- package/docs/rules-ja/frontend/typescript.md +131 -0
- package/docs/rules-ja/integration-e2e-testing.md +149 -0
- package/docs/rules-ja/project-context.md +38 -0
- package/docs/rules-ja/rules-index.yaml +196 -0
- package/docs/rules-ja/technical-spec.md +86 -0
- package/docs/rules-ja/typescript-testing.md +149 -0
- package/docs/rules-ja/typescript.md +116 -0
- package/package.json +98 -0
- package/scripts/check-unused-exports.js +69 -0
- package/scripts/cleanup-test-processes.sh +32 -0
- package/scripts/post-setup.js +110 -0
- package/scripts/set-language.js +310 -0
- package/scripts/setup-project.js +199 -0
- package/scripts/show-coverage.js +74 -0
- package/src/index.ts +11 -0
- package/templates/.gitignore.template +52 -0
- package/tsconfig.json +50 -0
- 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
|
+
}
|