create-ai-project 1.16.2 โ 1.17.0
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-en/acceptance-test-generator.md +4 -3
- package/.claude/agents-en/code-reviewer.md +2 -2
- package/.claude/agents-en/code-verifier.md +2 -2
- package/.claude/agents-en/design-sync.md +2 -2
- package/.claude/agents-en/document-reviewer.md +4 -4
- package/.claude/agents-en/integration-test-reviewer.md +2 -2
- package/.claude/agents-en/investigator.md +2 -2
- package/.claude/agents-en/prd-creator.md +4 -2
- package/.claude/agents-en/quality-fixer-frontend.md +7 -5
- package/.claude/agents-en/quality-fixer.md +3 -3
- package/.claude/agents-en/requirement-analyzer.md +2 -2
- package/.claude/agents-en/scope-discoverer.md +2 -2
- package/.claude/agents-en/skill-creator.md +2 -2
- package/.claude/agents-en/skill-reviewer.md +2 -2
- package/.claude/agents-en/solver.md +2 -2
- package/.claude/agents-en/task-decomposer.md +2 -2
- package/.claude/agents-en/task-executor-frontend.md +3 -3
- package/.claude/agents-en/task-executor.md +2 -2
- package/.claude/agents-en/technical-designer-frontend.md +17 -6
- package/.claude/agents-en/technical-designer.md +2 -2
- package/.claude/agents-en/ui-spec-designer.md +115 -0
- package/.claude/agents-en/verifier.md +2 -2
- package/.claude/agents-en/work-planner.md +2 -2
- package/.claude/agents-ja/acceptance-test-generator.md +4 -3
- package/.claude/agents-ja/code-reviewer.md +2 -2
- package/.claude/agents-ja/code-verifier.md +2 -2
- package/.claude/agents-ja/design-sync.md +2 -2
- package/.claude/agents-ja/document-reviewer.md +4 -4
- package/.claude/agents-ja/integration-test-reviewer.md +2 -2
- package/.claude/agents-ja/investigator.md +2 -2
- package/.claude/agents-ja/prd-creator.md +4 -2
- package/.claude/agents-ja/quality-fixer-frontend.md +7 -5
- package/.claude/agents-ja/quality-fixer.md +3 -3
- package/.claude/agents-ja/requirement-analyzer.md +2 -2
- package/.claude/agents-ja/scope-discoverer.md +2 -2
- package/.claude/agents-ja/skill-creator.md +2 -2
- package/.claude/agents-ja/skill-reviewer.md +2 -2
- package/.claude/agents-ja/solver.md +2 -2
- package/.claude/agents-ja/task-decomposer.md +2 -2
- package/.claude/agents-ja/task-executor-frontend.md +3 -3
- package/.claude/agents-ja/task-executor.md +2 -2
- package/.claude/agents-ja/technical-designer-frontend.md +17 -6
- package/.claude/agents-ja/technical-designer.md +2 -2
- package/.claude/agents-ja/ui-spec-designer.md +115 -0
- package/.claude/agents-ja/verifier.md +2 -2
- package/.claude/agents-ja/work-planner.md +2 -2
- package/.claude/commands-en/add-integration-tests.md +1 -1
- package/.claude/commands-en/build.md +55 -19
- package/.claude/commands-en/create-skill.md +1 -1
- package/.claude/commands-en/design.md +1 -1
- package/.claude/commands-en/diagnose.md +2 -2
- package/.claude/commands-en/front-build.md +40 -20
- package/.claude/commands-en/front-design.md +25 -8
- package/.claude/commands-en/front-plan.md +17 -9
- package/.claude/commands-en/front-review.md +2 -2
- package/.claude/commands-en/implement.md +15 -10
- package/.claude/commands-en/project-inject.md +1 -1
- package/.claude/commands-en/refine-skill.md +1 -1
- package/.claude/commands-en/reverse-engineer.md +3 -3
- package/.claude/commands-en/review.md +2 -2
- package/.claude/commands-en/sync-skills.md +1 -1
- package/.claude/commands-en/update-doc.md +2 -2
- package/.claude/commands-ja/add-integration-tests.md +1 -1
- package/.claude/commands-ja/build.md +56 -18
- package/.claude/commands-ja/create-skill.md +1 -1
- package/.claude/commands-ja/design.md +1 -1
- package/.claude/commands-ja/diagnose.md +2 -2
- package/.claude/commands-ja/front-build.md +41 -21
- package/.claude/commands-ja/front-design.md +26 -9
- package/.claude/commands-ja/front-plan.md +15 -7
- package/.claude/commands-ja/front-review.md +2 -2
- package/.claude/commands-ja/implement.md +15 -10
- package/.claude/commands-ja/project-inject.md +1 -1
- package/.claude/commands-ja/refine-skill.md +1 -1
- package/.claude/commands-ja/reverse-engineer.md +3 -3
- package/.claude/commands-ja/review.md +2 -2
- package/.claude/commands-ja/sync-skills.md +1 -1
- package/.claude/commands-ja/update-doc.md +2 -2
- package/.claude/skills-en/documentation-criteria/SKILL.md +37 -1
- package/.claude/skills-en/documentation-criteria/references/design-template.md +24 -0
- package/.claude/skills-en/documentation-criteria/references/prd-template.md +10 -0
- package/.claude/skills-en/documentation-criteria/references/ui-spec-template.md +145 -0
- package/.claude/skills-en/{frontend/technical-spec โ frontend-technical-spec}/SKILL.md +5 -5
- package/.claude/skills-en/{frontend/typescript-rules โ frontend-typescript-rules}/SKILL.md +1 -1
- package/.claude/skills-en/{frontend/typescript-testing โ frontend-typescript-testing}/SKILL.md +9 -2
- package/.claude/skills-en/frontend-typescript-testing/references/e2e.md +185 -0
- package/.claude/skills-en/integration-e2e-testing/SKILL.md +4 -0
- package/.claude/skills-en/integration-e2e-testing/references/e2e-design.md +86 -0
- package/.claude/skills-en/subagents-orchestration-guide/SKILL.md +44 -22
- package/.claude/skills-en/task-analyzer/references/skills-index.yaml +15 -11
- package/.claude/skills-en/technical-spec/SKILL.md +5 -4
- package/.claude/skills-ja/documentation-criteria/SKILL.md +37 -1
- package/.claude/skills-ja/documentation-criteria/references/design-template.md +24 -0
- package/.claude/skills-ja/documentation-criteria/references/prd-template.md +10 -0
- package/.claude/skills-ja/documentation-criteria/references/ui-spec-template.md +145 -0
- package/.claude/skills-ja/{frontend/technical-spec โ frontend-technical-spec}/SKILL.md +5 -5
- package/.claude/skills-ja/{frontend/typescript-rules โ frontend-typescript-rules}/SKILL.md +1 -1
- package/.claude/skills-ja/{frontend/typescript-testing โ frontend-typescript-testing}/SKILL.md +2 -2
- package/.claude/skills-ja/frontend-typescript-testing/references/e2e.md +185 -0
- package/.claude/skills-ja/integration-e2e-testing/SKILL.md +4 -0
- package/.claude/skills-ja/integration-e2e-testing/references/e2e-design.md +86 -0
- package/.claude/skills-ja/subagents-orchestration-guide/SKILL.md +44 -22
- package/.claude/skills-ja/task-analyzer/references/skills-index.yaml +15 -11
- package/.claude/skills-ja/technical-spec/SKILL.md +5 -4
- package/CHANGELOG.md +67 -0
- package/CLAUDE.en.md +2 -2
- package/CLAUDE.ja.md +2 -2
- package/CLAUDE.md +68 -86
- package/README.ja.md +10 -7
- package/README.md +10 -7
- package/bin/create-project.js +76 -75
- package/biome.json +5 -8
- package/package.json +11 -24
- package/scripts/post-setup.js +54 -57
- package/scripts/set-language.js +107 -112
- package/scripts/setup-project.js +97 -92
- package/scripts/show-coverage.js +36 -22
- package/scripts/update-project.js +205 -201
- package/scripts/utils.js +19 -21
- package/tsconfig.json +3 -3
- package/vitest.config.mjs +2 -2
- package/.tsprunerc +0 -11
- package/scripts/check-unused-exports.js +0 -69
package/README.md
CHANGED
|
@@ -139,10 +139,11 @@ This boilerplate provides the principles used in agentic implementation workflow
|
|
|
139
139
|
| `technical-spec` | Architecture, environment, build commands |
|
|
140
140
|
| `implementation-approach` | Strategy patterns, task decomposition |
|
|
141
141
|
| `integration-e2e-testing` | Integration/E2E test design, ROI-based selection |
|
|
142
|
+
| `frontend-typescript-rules` | React component design, Props-driven patterns |
|
|
143
|
+
| `frontend-typescript-testing` | React Testing Library, MSW, Playwright E2E |
|
|
144
|
+
| `frontend-technical-spec` | React architecture, environment, data flow |
|
|
142
145
|
| `project-context` | Project-specific prerequisites for AI accuracy (set via `/project-inject`) |
|
|
143
146
|
|
|
144
|
-
**Frontend-specific skills** are also available under `frontend/` (e.g., `frontend/typescript-rules`).
|
|
145
|
-
|
|
146
147
|
๐ [Learn how Skills work (Claude Code docs)](https://code.claude.com/docs/en/skills)
|
|
147
148
|
|
|
148
149
|
## ๐ฏ Built with This Boilerplate
|
|
@@ -185,7 +186,7 @@ Essential commands for Claude Code:
|
|
|
185
186
|
| `/diagnose` | Root cause analysis workflow | Debugging, troubleshooting |
|
|
186
187
|
| `/reverse-engineer` | Generate PRD/Design Docs from code | Legacy system documentation |
|
|
187
188
|
|
|
188
|
-
Frontend equivalents (`/front-design
|
|
189
|
+
Frontend equivalents (`/front-design` for UI Spec + Design Doc, `/front-build`, `/front-review`, `/front-plan`) and utility commands (`/add-integration-tests`, `/update-doc`) are also available.
|
|
189
190
|
|
|
190
191
|
[Full command reference โ](docs/guides/en/use-cases.md)
|
|
191
192
|
|
|
@@ -228,7 +229,7 @@ graph TB
|
|
|
228
229
|
### How It Works
|
|
229
230
|
|
|
230
231
|
1. **Requirement Analysis**: `/implement` command analyzes task scale
|
|
231
|
-
2. **Document Generation**: Creates necessary docs (PRD, Design Doc, Work Plan)
|
|
232
|
+
2. **Document Generation**: Creates necessary docs (PRD, UI Spec, Design Doc, Work Plan)
|
|
232
233
|
3. **Task Execution**: Specialized agents handle each phase
|
|
233
234
|
4. **Quality Assurance**: Automatic testing, type checking, and fixes
|
|
234
235
|
5. **Commit & Continue**: Clean commits for each completed task
|
|
@@ -247,7 +248,9 @@ ai-coding-project-boilerplate/
|
|
|
247
248
|
โ โโโ documentation-criteria/
|
|
248
249
|
โ โโโ technical-spec/
|
|
249
250
|
โ โโโ project-context/
|
|
250
|
-
โ
|
|
251
|
+
โ โโโ frontend-typescript-rules/
|
|
252
|
+
โ โโโ frontend-typescript-testing/
|
|
253
|
+
โ โโโ frontend-technical-spec/
|
|
251
254
|
โโโ docs/
|
|
252
255
|
โ โโโ guides/ # User documentation
|
|
253
256
|
โ โโโ adr/ # Architecture decisions
|
|
@@ -286,7 +289,7 @@ When you change these, Claude Code will recognize them and execute with the appr
|
|
|
286
289
|
|
|
287
290
|
The above are representative examples. The following scripts are referenced in skills and sub-agent definitions. Update them as needed:
|
|
288
291
|
|
|
289
|
-
`build`, `
|
|
292
|
+
`build`, `dev`, `type-check`, `test`, `test:coverage`, `test:coverage:fresh`, `test:safe`, `cleanup:processes`, `check`, `check:fix`, `check:code`, `check:unused`, `check:deps`, `check:all`, `format`, `format:check`, `lint`, `lint:fix`
|
|
290
293
|
|
|
291
294
|
## ๐ Multilingual Support
|
|
292
295
|
|
|
@@ -328,7 +331,7 @@ A: Through context engineering. Each sub-agent runs in its own context window fo
|
|
|
328
331
|
|
|
329
332
|
## ๐ค Sub Agents
|
|
330
333
|
|
|
331
|
-
20+ specialized sub-agents covering the full development lifecycle: requirement analysis, design, planning, implementation, quality assurance, code review, debugging, and reverse engineering. Each agent runs in its own context window for focused execution.
|
|
334
|
+
20+ specialized sub-agents covering the full development lifecycle: requirement analysis, UI specification, design, planning, implementation, quality assurance, code review, debugging, and reverse engineering. Each agent runs in its own context window for focused execution.
|
|
332
335
|
|
|
333
336
|
[Full agent list โ](.claude/agents-en/)
|
|
334
337
|
|
package/bin/create-project.js
CHANGED
|
@@ -1,34 +1,33 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { spawn } from 'node:child_process'
|
|
4
|
+
import fs from 'node:fs'
|
|
5
|
+
import path from 'node:path'
|
|
6
|
+
import { fileURLToPath } from 'node:url'
|
|
7
|
+
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
6
9
|
|
|
7
10
|
// Parse command line arguments
|
|
8
|
-
const args = process.argv.slice(2)
|
|
11
|
+
const args = process.argv.slice(2)
|
|
9
12
|
|
|
10
13
|
// Route to update subcommand
|
|
11
14
|
if (args[0] === 'update') {
|
|
12
|
-
const updateScript = path.join(__dirname, '..', 'scripts', 'update-project.js')
|
|
13
|
-
const updateArgs = args.slice(1)
|
|
15
|
+
const updateScript = path.join(__dirname, '..', 'scripts', 'update-project.js')
|
|
16
|
+
const updateArgs = args.slice(1)
|
|
14
17
|
const updateProcess = spawn('node', [updateScript, ...updateArgs], {
|
|
15
18
|
stdio: 'inherit',
|
|
16
|
-
cwd: process.cwd()
|
|
17
|
-
})
|
|
19
|
+
cwd: process.cwd(),
|
|
20
|
+
})
|
|
18
21
|
|
|
19
22
|
updateProcess.on('close', (code) => {
|
|
20
|
-
process.exit(code || 0)
|
|
21
|
-
})
|
|
23
|
+
process.exit(code || 0)
|
|
24
|
+
})
|
|
22
25
|
|
|
23
26
|
updateProcess.on('error', (err) => {
|
|
24
|
-
console.error(`\nโ Failed to execute update script: ${err.message}`)
|
|
25
|
-
process.exit(1)
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
|
|
27
|
+
console.error(`\nโ Failed to execute update script: ${err.message}`)
|
|
28
|
+
process.exit(1)
|
|
29
|
+
})
|
|
30
|
+
} else if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
|
|
32
31
|
console.log(`
|
|
33
32
|
๐ AI Coding Project Boilerplate
|
|
34
33
|
|
|
@@ -55,65 +54,67 @@ Examples:
|
|
|
55
54
|
npx create-ai-project update
|
|
56
55
|
npx create-ai-project update --dry-run
|
|
57
56
|
npx create-ai-project update --ignore skills project-context
|
|
58
|
-
`)
|
|
59
|
-
process.exit(0)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
57
|
+
`)
|
|
58
|
+
process.exit(0)
|
|
59
|
+
} else {
|
|
60
|
+
const projectName = args[0]
|
|
61
|
+
const options = args.slice(1)
|
|
62
|
+
|
|
63
|
+
// Parse language option
|
|
64
|
+
let language = 'en' // default
|
|
65
|
+
for (const opt of options) {
|
|
66
|
+
if (opt.startsWith('--lang=')) {
|
|
67
|
+
language = opt.split('=')[1]
|
|
68
|
+
if (!['ja', 'en'].includes(language)) {
|
|
69
|
+
console.error(`โ Invalid language: ${language}. Supported languages are: ja, en`)
|
|
70
|
+
process.exit(1)
|
|
71
|
+
}
|
|
73
72
|
}
|
|
74
73
|
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Validate project name
|
|
78
|
-
const validNamePattern = /^[a-z0-9-._]+$/;
|
|
79
|
-
if (!validNamePattern.test(projectName)) {
|
|
80
|
-
console.error(`โ Invalid project name: ${projectName}`);
|
|
81
|
-
console.error(' Project name must contain only lowercase letters, numbers, hyphens, dots, and underscores.');
|
|
82
|
-
process.exit(1);
|
|
83
|
-
}
|
|
84
74
|
|
|
85
|
-
//
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
75
|
+
// Validate project name
|
|
76
|
+
const validNamePattern = /^[a-z0-9-._]+$/
|
|
77
|
+
if (!validNamePattern.test(projectName)) {
|
|
78
|
+
console.error(`โ Invalid project name: ${projectName}`)
|
|
79
|
+
console.error(
|
|
80
|
+
' Project name must contain only lowercase letters, numbers, hyphens, dots, and underscores.'
|
|
81
|
+
)
|
|
82
|
+
process.exit(1)
|
|
83
|
+
}
|
|
91
84
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const setupScript = path.join(__dirname, '..', 'scripts', 'setup-project.js');
|
|
98
|
-
const setupProcess = spawn('node', [setupScript, projectName, language], {
|
|
99
|
-
stdio: 'inherit',
|
|
100
|
-
cwd: process.cwd() // ็พๅจใฎไฝๆฅญใใฃใฌใฏใใชใไฝฟ็จ
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
setupProcess.on('close', (code) => {
|
|
104
|
-
if (code !== 0) {
|
|
105
|
-
console.error(`\nโ Setup failed with exit code ${code}`);
|
|
106
|
-
process.exit(code);
|
|
85
|
+
// Check if directory already exists
|
|
86
|
+
const projectPath = path.resolve(process.cwd(), projectName)
|
|
87
|
+
if (fs.existsSync(projectPath)) {
|
|
88
|
+
console.error(`โ Directory already exists: ${projectPath}`)
|
|
89
|
+
process.exit(1)
|
|
107
90
|
}
|
|
108
|
-
|
|
109
|
-
console.log(`\n
|
|
110
|
-
console.log(
|
|
111
|
-
console.log(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
91
|
+
|
|
92
|
+
console.log(`\n๐ Creating new AI coding project: ${projectName}`)
|
|
93
|
+
console.log(`๐ Location: ${projectPath}`)
|
|
94
|
+
console.log(`๐ Language: ${language}\n`)
|
|
95
|
+
|
|
96
|
+
// Run setup script
|
|
97
|
+
const setupScript = path.join(__dirname, '..', 'scripts', 'setup-project.js')
|
|
98
|
+
const setupProcess = spawn('node', [setupScript, projectName, language], {
|
|
99
|
+
stdio: 'inherit',
|
|
100
|
+
cwd: process.cwd(),
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
setupProcess.on('close', (code) => {
|
|
104
|
+
if (code !== 0) {
|
|
105
|
+
console.error(`\nโ Setup failed with exit code ${code}`)
|
|
106
|
+
process.exit(code)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
console.log(`\nโ
Project created successfully!`)
|
|
110
|
+
console.log(`\n๐ Next steps:`)
|
|
111
|
+
console.log(` cd ${projectName}`)
|
|
112
|
+
console.log(` npm install`)
|
|
113
|
+
console.log(` npm run dev\n`)
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
setupProcess.on('error', (err) => {
|
|
117
|
+
console.error(`\nโ Failed to execute setup script: ${err.message}`)
|
|
118
|
+
process.exit(1)
|
|
119
|
+
})
|
|
120
|
+
}
|
package/biome.json
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/
|
|
3
|
-
"organizeImports":
|
|
4
|
-
"enabled": true
|
|
5
|
-
},
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.4.6/schema.json",
|
|
3
|
+
"assist": { "actions": { "source": { "organizeImports": "on" } } },
|
|
6
4
|
"formatter": {
|
|
7
5
|
"enabled": true,
|
|
8
6
|
"formatWithErrors": false,
|
|
@@ -27,7 +25,7 @@
|
|
|
27
25
|
},
|
|
28
26
|
"overrides": [
|
|
29
27
|
{
|
|
30
|
-
"
|
|
28
|
+
"includes": ["**/__tests__/**/*.ts", "**/*.test.ts", "**/*.spec.ts"],
|
|
31
29
|
"linter": {
|
|
32
30
|
"rules": {
|
|
33
31
|
"suspicious": {
|
|
@@ -45,7 +43,6 @@
|
|
|
45
43
|
}
|
|
46
44
|
},
|
|
47
45
|
"files": {
|
|
48
|
-
"
|
|
49
|
-
"ignore": ["node_modules/**", "dist/**"]
|
|
46
|
+
"includes": ["**/src/**/*.ts", "**/src/**/*.js", "!**/node_modules/**", "!**/dist/**"]
|
|
50
47
|
}
|
|
51
|
-
}
|
|
48
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-ai-project",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"packageManager": "npm@10.8.2",
|
|
5
5
|
"description": "TypeScript boilerplate with skills and sub-agents for Claude Code. Prevents context exhaustion through role-based task splitting.",
|
|
6
6
|
"keywords": [
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
],
|
|
23
23
|
"author": "Shinsuke Kagawa",
|
|
24
24
|
"license": "MIT",
|
|
25
|
+
"type": "module",
|
|
25
26
|
"repository": {
|
|
26
27
|
"type": "git",
|
|
27
28
|
"url": "https://github.com/shinpr/ai-coding-project-boilerplate.git"
|
|
@@ -32,11 +33,8 @@
|
|
|
32
33
|
"scripts": {
|
|
33
34
|
"build": "tsc && tsc-alias",
|
|
34
35
|
"build:backend": "tsc && tsc-alias",
|
|
35
|
-
"build:frontend": "vite build",
|
|
36
36
|
"dev": "tsx src/index.ts",
|
|
37
|
-
"dev:frontend": "vite",
|
|
38
37
|
"watch": "tsx watch src/index.ts",
|
|
39
|
-
"preview": "vite preview",
|
|
40
38
|
"type-check": "tsc --noEmit",
|
|
41
39
|
"test": "vitest run",
|
|
42
40
|
"test:ui": "vitest --ui",
|
|
@@ -51,8 +49,7 @@
|
|
|
51
49
|
"lint:fix": "biome lint --write src",
|
|
52
50
|
"check": "biome check src",
|
|
53
51
|
"check:fix": "biome check --write src",
|
|
54
|
-
"check:unused": "
|
|
55
|
-
"check:unused:all": "ts-prune --project tsconfig.json --ignore 'src/index.ts|__tests__|test|vitest'",
|
|
52
|
+
"check:unused": "knip --include exports",
|
|
56
53
|
"check:deps": "madge --circular --extensions ts src",
|
|
57
54
|
"check:deps:graph": "madge --extensions ts --image graph.svg src",
|
|
58
55
|
"check:code": "npm run check && npm run check:unused && npm run check:deps && npm run build",
|
|
@@ -66,30 +63,20 @@
|
|
|
66
63
|
"prepare": "husky"
|
|
67
64
|
},
|
|
68
65
|
"devDependencies": {
|
|
69
|
-
"@biomejs/biome": "^
|
|
70
|
-
"@
|
|
71
|
-
"@
|
|
72
|
-
"@
|
|
73
|
-
"
|
|
74
|
-
"@types/react-dom": "^18.0.0",
|
|
75
|
-
"@vitejs/plugin-react": "^4.0.0",
|
|
76
|
-
"@vitest/coverage-v8": "^3.2.4",
|
|
77
|
-
"@vitest/ui": "^3.2.4",
|
|
78
|
-
"c8": "^10.1.3",
|
|
79
|
-
"fast-check": "^4.3.0",
|
|
66
|
+
"@biomejs/biome": "^2.4.6",
|
|
67
|
+
"@types/node": "^22.0.0",
|
|
68
|
+
"@vitest/coverage-v8": "^4.0.0",
|
|
69
|
+
"@vitest/ui": "^4.0.0",
|
|
70
|
+
"fast-check": "^3.23.2",
|
|
80
71
|
"husky": "^9.1.7",
|
|
81
|
-
"
|
|
72
|
+
"knip": "^5.0.0",
|
|
82
73
|
"lint-staged": "^16.1.0",
|
|
83
74
|
"madge": "^8.0.0",
|
|
84
|
-
"react": "^18.0.0",
|
|
85
|
-
"react-dom": "^18.0.0",
|
|
86
|
-
"ts-node": "^10.9.1",
|
|
87
|
-
"ts-prune": "^0.10.3",
|
|
88
75
|
"tsc-alias": "^1.8.7",
|
|
89
76
|
"tsx": "^4.19.4",
|
|
90
77
|
"typescript": "^5.0.0",
|
|
91
|
-
"vite": "^
|
|
92
|
-
"vitest": "^
|
|
78
|
+
"vite": "^6.0.0",
|
|
79
|
+
"vitest": "^4.0.0"
|
|
93
80
|
},
|
|
94
81
|
"engines": {
|
|
95
82
|
"node": ">=20"
|
package/scripts/post-setup.js
CHANGED
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { execSync } from 'node:child_process'
|
|
4
|
+
import fs from 'node:fs'
|
|
5
|
+
import path from 'node:path'
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Initialize git repository
|
|
9
9
|
*/
|
|
10
10
|
function initGit() {
|
|
11
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"', {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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"', {
|
|
18
|
+
stdio: 'inherit',
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
return true
|
|
22
|
+
} catch (_error) {
|
|
23
|
+
console.warn('โ ๏ธ Git initialization skipped (git might not be installed)')
|
|
24
|
+
return false
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
27
|
|
|
@@ -27,35 +29,32 @@ function initGit() {
|
|
|
27
29
|
* Clean up files that shouldn't be in the user's project
|
|
28
30
|
*/
|
|
29
31
|
function cleanupFiles() {
|
|
30
|
-
console.log('๐งน Cleaning up setup files...')
|
|
31
|
-
|
|
32
|
+
console.log('๐งน Cleaning up setup files...')
|
|
33
|
+
|
|
32
34
|
const filesToRemove = [
|
|
33
35
|
'bin/create-project.js',
|
|
34
36
|
'templates/.gitignore.template',
|
|
35
37
|
'scripts/setup-project.js',
|
|
36
|
-
'scripts/post-setup.js'
|
|
37
|
-
]
|
|
38
|
-
|
|
39
|
-
const dirsToRemove = [
|
|
40
|
-
|
|
41
|
-
'templates'
|
|
42
|
-
];
|
|
43
|
-
|
|
38
|
+
'scripts/post-setup.js',
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
const dirsToRemove = ['bin', 'templates']
|
|
42
|
+
|
|
44
43
|
// Remove files
|
|
45
44
|
for (const file of filesToRemove) {
|
|
46
|
-
const filePath = path.join(process.cwd(), file)
|
|
45
|
+
const filePath = path.join(process.cwd(), file)
|
|
47
46
|
if (fs.existsSync(filePath)) {
|
|
48
|
-
fs.unlinkSync(filePath)
|
|
47
|
+
fs.unlinkSync(filePath)
|
|
49
48
|
}
|
|
50
49
|
}
|
|
51
|
-
|
|
50
|
+
|
|
52
51
|
// Remove empty directories
|
|
53
52
|
for (const dir of dirsToRemove) {
|
|
54
|
-
const dirPath = path.join(process.cwd(), dir)
|
|
53
|
+
const dirPath = path.join(process.cwd(), dir)
|
|
55
54
|
if (fs.existsSync(dirPath)) {
|
|
56
55
|
try {
|
|
57
|
-
fs.rmdirSync(dirPath)
|
|
58
|
-
} catch (
|
|
56
|
+
fs.rmdirSync(dirPath)
|
|
57
|
+
} catch (_e) {
|
|
59
58
|
// Directory might not be empty, ignore
|
|
60
59
|
}
|
|
61
60
|
}
|
|
@@ -66,23 +65,23 @@ function cleanupFiles() {
|
|
|
66
65
|
* Show next steps to the user
|
|
67
66
|
*/
|
|
68
67
|
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')
|
|
68
|
+
const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'))
|
|
69
|
+
const projectName = packageJson.name
|
|
70
|
+
|
|
71
|
+
console.log('\n๐ Project setup completed successfully!\n')
|
|
72
|
+
console.log('๐ Next steps:\n')
|
|
73
|
+
console.log(` cd ${projectName}`)
|
|
74
|
+
console.log(' npm install')
|
|
75
|
+
console.log(' npm run dev\n')
|
|
76
|
+
console.log('๐ Language switching:\n')
|
|
77
|
+
console.log(' npm run lang:ja # Switch to Japanese')
|
|
78
|
+
console.log(' npm run lang:en # Switch to English\n')
|
|
79
|
+
console.log('๐ Available commands:\n')
|
|
80
|
+
console.log(' npm run dev # Start development')
|
|
81
|
+
console.log(' npm run build # Build for production')
|
|
82
|
+
console.log(' npm run test # Run tests')
|
|
83
|
+
console.log(' npm run check:all # Run all quality checks\n')
|
|
84
|
+
console.log('Happy coding! ๐\n')
|
|
86
85
|
}
|
|
87
86
|
|
|
88
87
|
/**
|
|
@@ -91,20 +90,18 @@ function showNextSteps() {
|
|
|
91
90
|
function main() {
|
|
92
91
|
try {
|
|
93
92
|
// Initialize git repository
|
|
94
|
-
initGit()
|
|
95
|
-
|
|
93
|
+
initGit()
|
|
94
|
+
|
|
96
95
|
// Clean up setup-specific files
|
|
97
|
-
cleanupFiles()
|
|
98
|
-
|
|
96
|
+
cleanupFiles()
|
|
97
|
+
|
|
99
98
|
// Show next steps
|
|
100
|
-
showNextSteps()
|
|
99
|
+
showNextSteps()
|
|
101
100
|
} catch (error) {
|
|
102
|
-
console.error(`โ Post-setup failed: ${error.message}`)
|
|
103
|
-
process.exit(1)
|
|
101
|
+
console.error(`โ Post-setup failed: ${error.message}`)
|
|
102
|
+
process.exit(1)
|
|
104
103
|
}
|
|
105
104
|
}
|
|
106
105
|
|
|
107
106
|
// Run post-setup
|
|
108
|
-
|
|
109
|
-
main();
|
|
110
|
-
}
|
|
107
|
+
main()
|