project-scaffold
Project Scaffolder
Scaffold production-ready projects with modern tooling and configurable features.
Interactive Workflow
Follow these steps in order. Use the AskUserQuestion tool for each step.
Step 1: Project Name
Ask for the project name. Validate that it:
- Uses lowercase letters, numbers, and hyphens only (kebab-case)
- Starts with a letter
- Is between 2-50 characters
- Does not start with a number
Example prompt:
What would you like to name your project?
(Use lowercase with hyphens, e.g., my-awesome-app)
Step 2: Project Type
Ask which type of project to create:
| Type | Description |
|---|---|
| Frontend | Static site or single-page application |
| CLI | Command-line tool |
| API | REST API server |
| Monorepo | Multi-package workspace |
Step 3: Language/Framework
Based on project type, present these options:
Frontend:
- React with TypeScript (Recommended)
- React with JavaScript
- Vue with TypeScript
- Vue with JavaScript
- Vanilla (no framework)
CLI:
- TypeScript/Node.js with Commander (Recommended)
- JavaScript/Node.js with Commander
- Python with Click
API:
- TypeScript/Express (Recommended)
- JavaScript/Express
- Python/FastAPI
Monorepo:
- Node.js with pnpm + Turborepo (Recommended)
- Python with uv workspaces
Step 4: Features
Ask which features to include (allow multiple selections):
| Feature | Node.js | Python |
|---|---|---|
| Testing | Vitest / Jest | Pytest |
| Linting | ESLint + Prettier | Ruff |
| CI/CD | GitHub Actions | GitHub Actions |
| Docker | Dockerfile + compose | Dockerfile + compose |
| Documentation | README, CONTRIBUTING, LICENSE | README, CONTRIBUTING, LICENSE |
Step 5: Confirmation
Summarize all selections and ask for confirmation:
I'll create a [LANGUAGE] [TYPE] project named '[NAME]' with:
- [Feature 1]
- [Feature 2]
- ...
Proceed? (yes to confirm, or specify changes)
Generation Process
After confirmation, generate the project:
-
Create project directory at the specified path (default: current directory)
-
Copy base templates from the appropriate
templates/[type]/[language]/directory -
Process template variables - Replace these placeholders in all
.tmplfiles:{{PROJECT_NAME}}- kebab-case name (e.g.,my-app){{PROJECT_NAME_PASCAL}}- PascalCase (e.g.,MyApp){{PROJECT_NAME_SNAKE}}- snake_case (e.g.,my_app){{AUTHOR}}- Fromgit config user.nameor "Your Name"{{YEAR}}- Current year
-
Add feature files from
templates/features/[feature]/for each selected feature -
Create .gitignore appropriate for the language
-
Initialize git with
git init -
Display next steps:
Project created successfully! Next steps: cd [project-name] [install command] # npm install / pip install -e . [dev command] # npm run dev / python -m [name]
Template Locations
Base project templates:
templates/frontend/react-ts/- React + TypeScript + Vitetemplates/frontend/react-js/- React + JavaScript + Vitetemplates/frontend/vue-ts/- Vue + TypeScript + Vitetemplates/frontend/vue-js/- Vue + JavaScript + Vitetemplates/frontend/vanilla/- Vanilla JS + Vitetemplates/cli/node-ts/- Node.js + TypeScript + Commandertemplates/cli/node-js/- Node.js + JavaScript + Commandertemplates/cli/python/- Python + Clicktemplates/api/node-ts/- Express + TypeScripttemplates/api/node-js/- Express + JavaScripttemplates/api/python/- FastAPI + Uvicorntemplates/monorepo/node/- pnpm + Turborepotemplates/monorepo/python/- uv workspaces
Feature templates:
templates/features/testing/- Test configs (vitest, jest, pytest)templates/features/linting/- Lint configs (eslint, prettier, ruff)templates/features/ci-cd/- GitHub Actions workflowstemplates/features/docker/- Dockerfile and docker-composetemplates/features/docs/- README, CONTRIBUTING, LICENSE
File Naming
Template files use .tmpl extension. When copying:
- Remove
.tmplextension (e.g.,package.json.tmpl→package.json) - Process variable substitutions
- Preserve directory structure
Best Practices Applied
All generated projects include:
- Modern tooling: Vite for frontend, tsx for Node, uv for Python
- Type safety: TypeScript by default, type hints for Python
- Sensible defaults: Works out of the box with minimal config
- Clean structure: Organized src/ directory, clear separation of concerns
- Git-ready: Appropriate .gitignore, ready for version control