{"id":44370976,"url":"https://github.com/salimomrani/forgekit","last_synced_at":"2026-05-03T20:02:44.270Z","repository":{"id":337810208,"uuid":"1155335284","full_name":"salimomrani/forgekit","owner":"salimomrani","description":"CLI de scaffolding full-stack (Spring Boot, FastAPI, Angular, React/Vite) — une commande, un projet prêt à l'emploi","archived":false,"fork":false,"pushed_at":"2026-03-28T23:16:20.000Z","size":614,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-29T01:43:59.633Z","etag":null,"topics":["angular","claude-code","cli","fastapi","fullstack","react","scaffold","scaffolding","spring-boot","tailwindcss","typescript","vite"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/salimomrani.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-11T11:53:41.000Z","updated_at":"2026-03-28T23:16:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/salimomrani/forgekit","commit_stats":null,"previous_names":["salimomrani/forgekit"],"tags_count":59,"template":false,"template_full_name":null,"purl":"pkg:github/salimomrani/forgekit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salimomrani%2Fforgekit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salimomrani%2Fforgekit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salimomrani%2Fforgekit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salimomrani%2Fforgekit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/salimomrani","download_url":"https://codeload.github.com/salimomrani/forgekit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salimomrani%2Fforgekit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292631,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","claude-code","cli","fastapi","fullstack","react","scaffold","scaffolding","spring-boot","tailwindcss","typescript","vite"],"created_at":"2026-02-11T20:10:51.334Z","updated_at":"2026-05-03T20:02:44.263Z","avatar_url":"https://github.com/salimomrani.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.svg\" alt=\"ForgeKit\" width=\"120\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eForgeKit\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  Full-stack scaffolding CLI — generates a production-ready project in seconds.\u003cbr/\u003e\n  Pick your backend (Spring Boot, FastAPI, or Laravel), your frontend, and go.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@iconsulting-dev/forgekit\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@iconsulting-dev/forgekit.svg\" alt=\"npm version\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@iconsulting-dev/forgekit\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/@iconsulting-dev/forgekit.svg\" alt=\"downloads\"/\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT license\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## What it generates\n\nOne command creates an entire project wired together:\n\n| Layer | Options |\n|---|---|\n| **Backend** | Spring Boot 3 (Java 21) · FastAPI (Python 3.12) · Laravel 12 (PHP 8.3) · NestJS (Node.js/TypeScript) · Next.js (Node.js fullstack) · none |\n| **Frontend** | Angular 19 (standalone, OnPush, lazy routes) · React 19 (Vite + Tailwind CSS v4) · Vue 3 (Vite + Tailwind CSS v4) · none |\n| **UI** | PrimeNG (Aura / Lara / Nora) · Tailwind CSS v4 · none |\n| **Database** | PostgreSQL 17 via Docker Compose |\n| **ORM** | Prisma (NestJS optional) |\n| **State** | NgRx SignalStore (optional, Angular only) |\n| **Auth** | Spring Security + JWT + Angular interceptors/guards (optional) · React `useAuth` hook + `ProtectedRoute` + axios interceptor (optional) · Vue composable + axios interceptor (optional) · NestJS JWT (optional) · Laravel Sanctum (optional) |\n| **CI/CD** | GitHub Actions |\n| **AI tooling** | Claude Code config (hooks, hookify guards, skills, CLAUDE.md) |\n| **Spec workflow** | Speckit integration (spec → plan → tasks → TDD) |\n\n---\n\n## Prerequisites\n\nInstall what you need for your stack before running ForgeKit.\n\n### Required for all stacks\n\n| Tool | Version | Install |\n|---|---|---|\n| **Node.js** | ≥ 20 | [nodejs.org](https://nodejs.org) |\n| **Git** | any | [git-scm.com](https://git-scm.com) |\n\n### Spring Boot backend\n\n| Tool | Version | Install |\n|---|---|---|\n| **Java (JDK)** | 21+ | [adoptium.net](https://adoptium.net) or `brew install temurin@21` |\n| **Maven** | 3.9+ | Bundled via Maven Wrapper (`./mvnw`) — no install needed |\n\n### FastAPI backend\n\n| Tool | Version | Install |\n|---|---|---|\n| **Python** | 3.12+ | [python.org](https://python.org) or `brew install python@3.12` |\n| **pip** | any | Bundled with Python |\n\n### Laravel backend\n\n| Tool | Version | Install |\n|---|---|---|\n| **PHP** | 8.3+ | [php.net](https://www.php.net) or `brew install php@8.3` |\n| **Composer** | 2.x | [getcomposer.org](https://getcomposer.org) |\n\n### Docker Compose (database + services)\n\n| Tool | Install |\n|---|---|\n| **Docker Desktop** | [docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop) |\n\n\u003e Docker Compose is auto-checked in the wizard only if Docker is detected in your `$PATH`.\n\n### Claude Code integration (optional)\n\n| Tool | Install |\n|---|---|\n| **Claude Code CLI** | `npm i -g @anthropic-ai/claude-code` |\n\n\u003e The Claude Code option is auto-checked in the wizard if `claude` is detected. If absent, the option is unchecked and the generated project will not include `.claude/` config.\n\n### Speckit integration (optional)\n\n| Tool | Install |\n|---|---|\n| **specify CLI** | `uv tool install specify-cli --from git+https://github.com/github/spec-kit.git` |\n| **uv** | `curl -LsSf https://astral.sh/uv/install.sh \\| sh` |\n\n\u003e The Speckit option is auto-checked if `specify` is detected. If absent, it is shown with a `(specify CLI not detected)` notice and remains unchecked.\n\n---\n\n## Installation\n\n```bash\nnpm i -g @iconsulting-dev/forgekit\n```\n\n### From source\n\n```bash\ngit clone https://github.com/salimomrani/forgekit.git\ncd forgekit\nnpm install\nnpm run build\nnpm link\n```\n\n---\n\n## Usage\n\n### Interactive wizard\n\n```bash\nforgekit new\n```\n\nThe wizard guides you through all options with sensible defaults:\n\n```\n? Project name: (my-app)\n? Description: (My application)\n? Backend: (Spring Boot (Java 21) | FastAPI (Python) | Laravel (PHP 8.3) | None)\n? Frontend: (Angular (standalone, OnPush) | React (Vite + Tailwind) | Aucun)\n? Group ID: (com.example)                          ← Spring Boot only\n? Backend features: (Flyway ✓  OpenAPI ✓  JWT ✗  MapStruct ✓)  ← Spring Boot\n? Laravel features: (Sanctum ✗  Scramble ✗)                   ← Laravel only\n? UI framework: (PrimeNG)                          ← Angular only\n? PrimeNG preset: (Aura)                           ← Angular + PrimeNG only\n? Include NgRx SignalStore? (No)                   ← Angular only\n? Include auth scaffold? (No)                      ← Angular or React\n? Infrastructure: (Docker ✓  CI/CD ✓  Claude Code ✓  Speckit ✓  Git ✓)\n```\n\n\u003e Options requiring external CLIs are auto-checked/unchecked based on what's installed.\n\n### Add a layer to an existing project\n\n```bash\nforgekit add react              # Add React frontend to an existing backend project\nforgekit add vue                # Add Vue.js frontend\nforgekit add spring-boot        # Add Spring Boot backend\nforgekit add nestjs --prisma    # Add NestJS backend with Prisma\nforgekit add docker             # Add Docker Compose\nforgekit add laravel            # Add Laravel backend\nforgekit add angular --ui tailwind --auth   # Add Angular with options\n```\n\nAvailable layers: `spring-boot`, `fastapi`, `laravel`, `nestjs`, `nextjs`, `angular`, `react`, `vue`, `docker`, `ci`, `claude-code`, `speckit`, `prettier`.\n\nForgeKit detects the existing project via `forgekit.json` (or filesystem fallback for pre-v1.16 projects), asks layer-specific sub-questions, generates in a temp directory, and moves files on success. Dependent layers (Docker, CI, Claude Code) are auto-regenerated when adding a backend or frontend.\n\n### Direct flags\n\n```bash\n# Spring Boot + Angular\nforgekit new my-app --spring-boot --group com.example --angular --docker --claude-code\n\n# Spring Boot + React (Vite + Tailwind)\nforgekit new my-app --spring-boot --group com.example --react --docker --claude-code\n\n# FastAPI + React with auth\nforgekit new my-app --fastapi --react --auth --docker --claude-code\n\n# NestJS + Vue with auth and Prisma\nforgekit new my-app --nestjs --vue --auth --prisma --docker --claude-code\n\n# Next.js fullstack with auth\nforgekit new my-app --nextjs --auth --docker --claude-code\n\n# Laravel + React with auth\nforgekit new my-app --laravel --react --auth --docker\n\n# FastAPI backend only (no frontend, no Docker)\nforgekit new my-api --fastapi --no-docker\n\n# Spring Boot + Angular with auth\nforgekit new my-app --spring-boot --auth --angular --docker\n```\n\n### All available flags\n\n| Flag | Description |\n|---|---|\n| `--spring-boot` | Spring Boot backend (Java 21) |\n| `--fastapi` | FastAPI backend (Python 3.12) |\n| `--laravel` | Laravel backend (PHP 8.3, API-only) |\n| `--nestjs` | NestJS backend (Node.js/TypeScript) |\n| `--nextjs` | Next.js fullstack (Node.js, API routes + frontend) |\n| `--angular` | Angular frontend (standalone, OnPush) |\n| `--react` | React frontend (Vite + Tailwind CSS v4) |\n| `--vue` | Vue.js frontend (Vite + Tailwind CSS v4) |\n| `--group \u003cid\u003e` | Java Group ID (e.g. `com.example`) — Spring Boot only |\n| `--description \u003cdesc\u003e` | Project description |\n| `--auth` | Auth scaffold — Angular interceptors/guards or React `useAuth` + axios |\n| `--flyway` / `--no-flyway` | SQL migrations with Flyway |\n| `--openapi` / `--no-openapi` | OpenAPI / Swagger UI |\n| `--mapstruct` / `--no-mapstruct` | MapStruct bean mappers |\n| `--ngrx` / `--no-ngrx` | NgRx SignalStore (Angular only) |\n| `--prisma` / `--no-prisma` | Prisma ORM (NestJS only) |\n| `--ui \u003cframework\u003e` | UI framework: `primeng` \\| `tailwind` \\| `none` (Angular only) |\n| `--preset \u003cpreset\u003e` | PrimeNG preset: `Aura` \\| `Lara` \\| `Nora` (Angular only) |\n| `--docker` / `--no-docker` | Docker Compose (PostgreSQL + pgAdmin) |\n| `--ci` / `--no-ci` | GitHub Actions CI workflow |\n| `--claude-code` / `--no-claude-code` | Claude Code config |\n| `--no-git` | Skip Git initialization |\n| `--prettier` / `--no-prettier` | Prettier + Husky + lint-staged (requires frontend) |\n\n---\n\n## Generated project structure\n\n```\nmy-project/\n├── backend/                 # Spring Boot / Java 21  — or —  FastAPI / Python 3.12  — or —  Laravel / PHP 8.3\n├── frontend/                # Angular / PrimeNG (or Tailwind)  — or —  React / Vite / Tailwind\n├── docker-compose.yml       # PostgreSQL 17 + pgAdmin (+ api service for FastAPI)\n├── .github/workflows/       # GitHub Actions CI\n├── CLAUDE.md                # AI workflow conventions, TDD rules, constitution ref\n├── .claude/                 # Hooks, hookify guards, skills, settings.json\n├── .specify/memory/         # Architectural constitution\n├── forgekit.json               # Project manifest (tracks generated layers)\n├── .gitignore\n└── README.md\n```\n\n---\n\n## Backend — Spring Boot\n\n**Included by default:** Spring Web, Spring Data JPA, PostgreSQL driver, Spring Validation, Lombok, Spring Actuator.\n\n**Optional (enabled by default):** Flyway (`--flyway`), SpringDoc OpenAPI (`--openapi`), MapStruct (`--mapstruct`).\n\n**With `--auth`:** Spring Security configured as stateless + JWT-ready, Angular interceptors and route guard.\n\n```\nbackend/src/main/java/com/{group}/{name}/\n├── Application.java\n├── config/\n│   ├── SecurityConfig.java           # (--auth) CORS, stateless, JWT-ready\n│   └── OpenApiConfig.java\n├── shared/\n│   ├── exception/\n│   │   ├── GlobalExceptionHandler.java\n│   │   └── ApiError.java             # Record\n│   └── dto/\n│       └── PageResponse.java         # Pagination record\n└── feature/                          # Feature-based structure\n```\n\n**Config files:**\n- `application.yml` — main config with environment variables\n- `application-dev.yml` — dev profile pointing to Docker Compose\n- `db/migration/V1__init.sql` — first Flyway migration ready to fill in\n\n**Start the backend:**\n```bash\ncd backend\n./mvnw spring-boot:run   # requires Docker Compose running for DB\n```\n\n---\n\n## Backend — FastAPI\n\n**Stack:** FastAPI, uvicorn, pydantic-settings, pytest, httpx.\n\n```\nbackend/\n├── app/\n│   ├── __init__.py\n│   ├── main.py              # FastAPI entry point\n│   ├── config.py            # pydantic-settings\n│   └── routers/\n│       └── health.py        # GET /health\n├── tests/\n│   └── test_health.py       # pytest + TestClient\n├── requirements.txt\n├── Dockerfile               # python:3.12-slim + uvicorn\n└── .python-version          # 3.12\n```\n\n**Start the backend:**\n```bash\ncd backend\npip install -r requirements.txt\nuvicorn app.main:app --reload   # port 8000\npytest                          # run tests\n```\n\n---\n\n## Backend — Laravel\n\n**Stack:** Laravel 12, PHP 8.3, API-only (no web routes, Blade, or sessions).\n\n**Always included:** Migrations, Seeders, Factories, API Resources, CORS, Pint (linter).\n\n**Optional:** Sanctum (`--auth`) for API token authentication, Scramble (`--openapi`) for auto-generated OpenAPI docs.\n\n```\nbackend/\n├── app/\n│   ├── Http/\n│   │   ├── Controllers/\n│   │   │   └── HealthController.php   # GET /api/health\n│   │   ├── Middleware/\n│   │   └── Resources/\n│   ├── Models/\n│   └── Providers/\n│       └── AppServiceProvider.php\n├── bootstrap/\n│   └── app.php                        # API-only routing, Sanctum middleware\n├── config/\n│   ├── app.php\n│   ├── database.php                   # PostgreSQL default\n│   ├── cors.php\n│   ├── sanctum.php                    # (--auth)\n│   └── scramble.php                   # (--openapi)\n├── database/\n│   ├── factories/\n│   ├── migrations/\n│   └── seeders/\n├── routes/\n│   └── api.php                        # Health + auth routes\n├── tests/\n│   ├── TestCase.php\n│   └── Feature/\n│       └── HealthTest.php\n├── composer.json\n├── artisan\n├── phpunit.xml\n├── Dockerfile                         # Multi-stage: composer + php:8.3-cli\n└── .env.example                       # PostgreSQL env vars\n```\n\n**Start the backend:**\n```bash\ncd backend\ncomposer install\nphp artisan serve   # port 8000\nphp artisan test    # run tests\n./vendor/bin/pint   # lint\n```\n\n---\n\n## Backend — NestJS\n\n**Stack:** NestJS, TypeScript, Express.js, class-validator, Prisma (optional).\n\n**Always included:** Class-based controllers, dependency injection, OpenAPI ready.\n\n**Optional:** Prisma ORM (`--prisma`) for type-safe database access, JWT (`--auth`) for stateless authentication.\n\n```\nbackend/\n├── src/\n│   ├── main.ts                  # NestJS entry point\n│   ├── app.module.ts            # Root module\n│   ├── health/\n│   │   ├── health.controller.ts # GET /health\n│   │   └── health.service.ts\n│   ├── prisma/                  # (--prisma)\n│   │   ├── prisma.service.ts\n│   │   └── schema.prisma\n│   └── common/\n│       ├── decorators/\n│       ├── filters/\n│       └── guards/              # (--auth) JWT guard\n├── test/\n├── package.json\n├── tsconfig.json\n├── docker-compose.yml           # PostgreSQL + pgAdmin\n└── Dockerfile                   # Node.js + pnpm\n```\n\n**Start the backend:**\n```bash\ncd backend\nnpm install\nnpm run start:dev   # port 3000\nnpm test            # run tests\n```\n\n---\n\n## Backend — Next.js\n\n**Stack:** Next.js 15, React 19, TypeScript, API routes.\n\n**Features:** Built as a fullstack framework (frontend + API routes in same project), supports both static and dynamic API endpoints.\n\n**Optional:** Auth scaffold with middleware and route protection.\n\n```\nbackend/\n├── app/\n│   ├── layout.tsx               # Root layout\n│   ├── page.tsx                 # Home page\n│   ├── api/\n│   │   ├── health/\n│   │   │   └── route.ts         # GET /api/health\n│   │   └── auth/                # (--auth) Auth routes\n│   └── (routes)/                # Feature pages\n├── middleware.ts                # (--auth) Auth middleware\n├── lib/\n│   └── auth.ts                  # (--auth) Auth utilities\n├── public/\n├── package.json\n├── next.config.js\n└── Dockerfile\n```\n\n**Start the application:**\n```bash\ncd backend\nnpm install\nnpm run dev         # port 3000\nnpm run build       # production build\nnpm test            # run tests\n```\n\n---\n\n## Frontend — Angular\n\n**UI framework (mutually exclusive):**\n- `primeng` *(default)* — PrimeNG with `Aura` / `Lara` / `Nora` preset\n- `tailwind` — Tailwind CSS v4 (`@import \"tailwindcss\"`, no JS config)\n- `none` — minimal, no UI dependency\n\n**Optional:** NgRx SignalStore (`--ngrx`) — generates `AppStore` in `core/store/`.\n\n```\nfrontend/src/app/\n├── app.component.ts            # Standalone, OnPush\n├── app.routes.ts               # Lazy-loaded routes\n├── app.config.ts               # Providers (PrimeNG, HttpClient, Router)\n├── layout/\n│   ├── layout.component.ts     # Shell (sidebar + topbar + router-outlet)\n│   ├── sidebar/\n│   └── topbar/\n├── core/                       # (--auth)\n│   ├── interceptors/           # Auth + Error interceptors\n│   ├── guards/                 # Auth guard\n│   └── services/               # Auth service (signals)\n├── shared/                     # Shared components and pipes\n└── features/\n    └── home/                   # Default home page\n```\n\n**Start the frontend:**\n```bash\ncd frontend\nnpm install\nnpm start   # port 4200\n```\n\n---\n\n## Frontend — React (Vite + Tailwind)\n\n**Stack:** React 19, Vite 7, Tailwind CSS v4, React Router v7 (declarative).\n\n```\nfrontend/src/\n├── main.tsx               # Entry point\n├── App.tsx                # Root component\n├── index.css              # Tailwind @import\n├── router/\n│   └── index.tsx          # Routes (BrowserRouter + lazy-ready)\n├── hooks/                 # (--auth) useAuth hook\n├── components/            # (--auth) ProtectedRoute component\n└── lib/                   # (--auth) axios instance with JWT interceptor\n```\n\n**With `--auth`:** generates `useAuth.ts`, `ProtectedRoute.tsx`, and `lib/http.ts` (axios instance that reads the token from `localStorage` and attaches it as `Authorization: Bearer …` on every request).\n\n**Start the frontend:**\n```bash\ncd frontend\nnpm install\nnpm run dev     # port 5173\nnpm run build   # production build\nnpm run lint    # TypeScript check (tsc --noEmit)\n```\n\n---\n\n## Frontend — Vue.js (Vite + Tailwind)\n\n**Stack:** Vue 3, Vite 7, Tailwind CSS v4, Vue Router 4.\n\n```\nfrontend/src/\n├── main.ts                # Entry point\n├── App.vue                # Root component\n├── index.css              # Tailwind @import\n├── router/\n│   └── index.ts           # Routes (createRouter + lazy-ready)\n├── stores/                # (--auth) Pinia store for auth state\n├── components/\n│   └── ProtectedRoute.vue # (--auth) Route protection component\n└── lib/                   # (--auth) axios instance with JWT interceptor\n```\n\n**With `--auth`:** generates Pinia store for auth state, `ProtectedRoute.vue` component, and `lib/http.ts` (axios instance that reads the token from `localStorage` and attaches it as `Authorization: Bearer …`).\n\n**Start the frontend:**\n```bash\ncd frontend\nnpm install\nnpm run dev     # port 5173\nnpm run build   # production build\nnpm run lint    # TypeScript check (tsc --noEmit)\n```\n\n---\n\n## Docker Compose\n\n```bash\ndocker compose up -d\n```\n\n| Service | Port | Description |\n|---|---|---|\n| PostgreSQL 17 | 5432 | Database with persistent volume |\n| pgAdmin | 5050 | Web UI — `admin@admin.com` / `admin` |\n| api *(FastAPI / Laravel)* | 8000 | Backend API service |\n\n---\n\n## Claude Code integration\n\nForgeKit generates a complete, ready-to-use Claude Code configuration:\n\n```\nmy-project/\n├── CLAUDE.md                                     # Workflow routing, stack conventions\n└── .claude/\n    ├── settings.json                             # Permissions (deny rules + allow) + hooks\n    ├── hooks/\n    │   ├── pre-bash.sh                          # Bash guard\n    │   └── session-start.sh                     # Auto-loads constitution\n    ├── hookify.block-dangerous-rm.local.md      # Blocks rm -rf\n    ├── hookify.block-force-push.local.md        # Blocks git push --force\n    ├── hookify.block-no-verify.local.md         # Blocks --no-verify\n    ├── hookify.stop-verify-tests.local.md       # TDD reminder\n    ├── hookify.warn-console-log.local.md        # Warns on console.log\n    ├── hookify.warn-env-edit.local.md           # Warns on .env edits\n    ├── hookify.warn-no-test-before-commit.local.md\n    ├── hookify.warn-todo-fixme.local.md\n    └── skills/\n        ├── applying-angular-conventions/SKILL.md    # if Angular frontend\n        ├── applying-react-conventions/SKILL.md      # if React frontend\n        ├── applying-python-conventions/SKILL.md     # if FastAPI backend\n        └── applying-java-conventions/SKILL.md       # if Spring Boot backend\n```\n\n\u003e Skills are copied from `~/.claude/skills/` based on the selected stack. Every developer who clones the project gets the same AI conventions automatically.\n\n---\n\n## Speckit — Spec-Driven Development\n\nForgeKit integrates [Speckit](https://github.com/github/spec-kit), a specification-driven development workflow for Claude Code.\n\n**What ForgeKit generates:**\n\n```\nmy-project/\n└── .specify/\n    ├── memory/\n    │   └── constitution.md        # Project architectural constitution\n    └── templates/\n        ├── spec-template.md\n        ├── plan-template.md\n        └── tasks-template.md\n```\n\n**Setup (once per project):**\n```\n/speckit.constitution   # Fill in the architectural constitution\n```\n\nThe `session-start.sh` hook detects if the constitution is empty and prompts Claude to configure it at the start of each session.\n\n**Fast track** *(simple feature, 1–3 tasks)*:\n```\n/speckit.workflow \"feature description\"\n  → /speckit.specify   # spec.md\n  → /speckit.tasks     # tasks.md (plan skipped)\n  → TDD implementation\n```\n\n**Full workflow** *(complex feature)*:\n```\n/speckit.workflow \"feature description\"\n  Phase 1 — SPEC\n    → /speckit.specify    # spec.md\n    → /speckit.clarify    # resolve ambiguities\n    → /speckit.plan       # plan.md, data-model.md, contracts/\n    → /speckit.tasks      # ordered tasks.md\n    → /speckit.analyze    # consistency gate (blocks on CRITICAL)\n\n  Phase 2 — IMPLEMENTATION\n    → isolated worktree + TDD (RED → GREEN → REFACTOR) per task\n\n  Phase 3 — COMPLETION\n    → code review → PR\n```\n\n**Resume a workflow:**\n```\n/speckit.workflow   # no args = resumes last spec where it left off\n```\n\n---\n\n## Dynamic version resolution\n\nForgeKit resolves the latest stable versions from npm and Maven Central at generation time:\n\n- **npm (Angular):** Angular, PrimeNG, @primeuix/themes, NgRx Signals, Tailwind CSS, RxJS, TypeScript, zone.js\n- **npm (React):** React, React Router, Vite (capped at v7 — `@vitejs/plugin-react@4.x` peer dep), axios, Tailwind CSS\n- **Maven:** Spring Boot, SpringDoc OpenAPI, MapStruct\n- **Packagist (Laravel):** Laravel framework, Sanctum, Scramble\n\nFallback versions are used if resolution fails.\n\n---\n\n## Persistent config\n\nForgeKit saves your preferences in `~/.forgekit/config.json` (Group ID, etc.) and reuses them automatically on the next run.\n\nEach generated project also contains a `forgekit.json` manifest that tracks which layers and options were used. This enables `forgekit add` to detect the existing config without filesystem guessing.\n\n---\n\n## Architecture\n\n```\nsrc/\n├── commands/new.ts              # `forgekit new` command\n├── commands/add.ts              # `forgekit add` command\n├── prompts/project.ts           # Interactive wizard (new)\n├── prompts/add.ts               # Layer-specific prompts (add)\n├── generators/\n│   ├── base-generator.ts        # Abstract base class\n│   ├── backend/index.ts         # Spring Boot generator\n│   ├── fastapi/index.ts         # FastAPI generator\n│   ├── laravel/index.ts         # Laravel generator\n│   ├── nestjs/index.ts          # NestJS generator\n│   ├── nextjs/index.ts          # Next.js generator\n│   ├── frontend/index.ts        # Frontend router (Angular, React, or Vue)\n│   ├── frontend/react-vite.ts   # React / Vite generator\n│   ├── frontend/vue.ts          # Vue.js generator\n│   ├── docker/index.ts          # Docker Compose generator\n│   ├── claude-code/index.ts     # Claude Code config generator\n│   ├── ci/index.ts              # GitHub Actions CI generator\n│   ├── root/index.ts            # README + .gitignore\n│   ├── speckit.ts               # Calls specify init\n│   └── git.ts                   # Git init + first commit\n├── templates/                   # Handlebars (.hbs) templates\n│   ├── backend/                 # Spring Boot templates\n│   ├── fastapi/                 # FastAPI templates\n│   ├── laravel/                 # Laravel templates\n│   ├── nestjs/                  # NestJS templates\n│   ├── nextjs/                  # Next.js templates\n│   ├── frontend/angular/        # Angular templates\n│   ├── frontend/react-vite/     # React/Vite templates\n│   ├── frontend/vue/            # Vue.js templates\n│   ├── docker/                  # Docker Compose templates\n│   ├── claude-code/             # CLAUDE.md, settings.json, hooks, hookify\n│   ├── ci/                      # GitHub Actions templates\n│   ├── root/                    # Root templates\n│   └── shared/                  # Shared templates (prettier, git, etc)\n├── utils/\n│   ├── template-engine.ts       # Handlebars compile + render\n│   ├── validation.ts            # Input validators\n│   ├── system.ts                # CLI detection (claude, specify, docker)\n│   ├── detect-project.ts        # Project detection (manifest + filesystem fallback)\n│   └── forgekit-json.ts         # Read/write forgekit.json manifest\n├── types.ts                     # BackendType, FrontendType, ProjectConfig\n├── versions.ts                  # Dynamic version resolution\n└── config.ts                    # Persistent config (~/.forgekit)\n```\n\n**Tech stack:** Node.js / TypeScript ESM · Handlebars · Commander.js · Inquirer.js · fs-extra · chalk\n\n---\n\n## Contributing\n\n```bash\ngit clone https://github.com/salimomrani/forgekit.git\ncd forgekit\nnpm install\nnpm test          # vitest run --coverage\nnpm run typecheck # tsc --noEmit\nnpm run lint      # eslint src/\nnpm run build     # compile to dist/\n```\n\n---\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsalimomrani%2Fforgekit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsalimomrani%2Fforgekit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsalimomrani%2Fforgekit/lists"}