Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI

on:
push:
branches: ["main"]
branches: ["main", "v2-rebrand"]
pull_request:

jobs:
Expand Down Expand Up @@ -35,7 +35,7 @@ jobs:

# Core checks on all matrices (since it's cheap)
- name: Install CLI dependencies
run: npm ci
run: npm install

- name: Run Biome Lint
run: npm run lint
Expand All @@ -49,17 +49,30 @@ jobs:
- name: Build CLI
run: npm run build

- name: Test Project Generation (${{ matrix.pm }})
- name: Test Project Generation — stack next (${{ matrix.pm }})
run: |
mkdir -p /tmp/test-gen
cd /tmp/test-gen
node $GITHUB_WORKSPACE/dist/index.js test-app --pm ${{ matrix.pm }} --no-git --no-openspec
node $GITHUB_WORKSPACE/dist/index.js next test-app --pm ${{ matrix.pm }} --no-git --no-openspec
cd test-app

# Verificar que instaló dependencias (node_modules existe)
if [ ! -d "node_modules" ]; then
echo "❌ node_modules no fue creado por ${{ matrix.pm }}"
exit 1
fi

echo "✅ Generación e instalación exitosa con ${{ matrix.pm }}"
echo "✅ Generación e instalación exitosa con ${{ matrix.pm }} (stack next)"

- name: Test Project Generation — stack api (${{ matrix.pm }})
run: |
mkdir -p /tmp/test-gen-api
cd /tmp/test-gen-api
node $GITHUB_WORKSPACE/dist/index.js api test-api --pm ${{ matrix.pm }} --no-git --no-openspec
cd test-api

if [ ! -d "node_modules" ]; then
echo "❌ node_modules no fue creado por ${{ matrix.pm }}"
exit 1
fi

echo "✅ Generación e instalación exitosa con ${{ matrix.pm }} (stack api)"
26 changes: 26 additions & 0 deletions .knowledge/BRIEF.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# BRIEF: @gonzoblasco/create-stack

## Qué es

Scaffolder opinado multi-stack. Un solo comando y tenés un proyecto moderno, testeado, lintado y listo para que un AI agent lo habite.

## Por qué existe

Gonzo arranca proyectos constantemente y se cansó de repetir las mismas 40 decisiones. `create-stack-next` demostró el concepto pero quedó atado a Next.js. Esta es la evolución: un CLI que permite elegir el stack como argumento posicional, con arquitectura modular para agregar stacks sin tocar el core.

## Stack inicial

- **next:** Next.js 15 + React 19 + TypeScript estricto + Biome + Vitest + Playwright + Zod + OpenSpec + AI agent config
- **api:** Next.js 15 App Router (API-only) + Drizzle ORM + SQLite + middleware Bearer + tests

## Stack futuros (en consideración)

- tanstack, astro, cli

## Diferenciador

No es solo un scaffolder de código. Es un scaffolder de **entorno de desarrollo**: tests, lint, CI, AI agent config, OpenSpec, todo desde el día 1. El proyecto generado está listo para que un agente IA lo habite productivamente.

## Público

Gonzo (uso primario), y cualquier dev que quiera arrancar proyectos rápido con buena base técnica y AI-ready.
28 changes: 28 additions & 0 deletions .knowledge/STATUS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# STATUS: @gonzoblasco/create-stack

**Fecha:** 2026-07-20
**Fase:** Reidentificación (v2-rebrand)
**Última versión publicada:** 0.7.2 (como create-stack-next)

## Estado actual

En plena reidentificación de `create-stack-next` → `@gonzoblasco/create-stack`. Se está refactorizando la arquitectura a stacks modulares, renombrando el paquete, y documentando con ADRs + OpenSpec specs.

## Lo que está pasando ahora

- [x] ADRs de decisiones arquitectónicas (3/3)
- [x] OpenSpec specs del producto (7 specs)
- [x] BRIEF definido
- [ ] Refactor de `src/` a arquitectura modular
- [ ] Migración de templates a `src/stacks/`
- [ ] Renombre de package.json y bin
- [ ] Tests actualizados
- [ ] Documentación actualizada

## Próximos pasos inmediatos

1. Refactorizar `src/` (parse-args, cli, index)
2. Mover templates a `src/stacks/next/template/` y `src/stacks/api/template/`
3. Renombrar package.json
4. Actualizar tests
5. Verificar build + lint + typecheck + tests
10 changes: 10 additions & 0 deletions .knowledge/adr/0001-use-openspec-for-product-definition.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# ADR 0001: Usar OpenSpec para definición de producto

- **Fecha:** 2026-07-20
- **Contexto:** Reidentificación de `create-stack-next` → `@gonzoblasco/create-stack`. Necesitamos documentar decisiones de producto y especificaciones de manera estructurada y ejecutable por IA.
- **Decisión:** Usar OpenSpec como formato de especificación. Las specs viven en `.knowledge/specs/` y se sincronizan con el workspace git (no con el repo del proyecto). Los ADRs documentan decisiones arquitectónicas.
- **Consecuencias:**
- Las features se definen como OpenSpec specs antes de implementar
- Los ADRs capturan el "por qué" de cada decisión
- El workflow es: spec → implementación → spec actualizada
- **Estado:** Aceptado
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# ADR 0002: Renombrar a `@gonzoblasco/create-stack` con stacks posicionales

- **Fecha:** 2026-07-20
- **Contexto:** `create-stack-next` está atado semánticamente a Next.js, pero ya tiene `--template api` y se planean más stacks (TanStack, Astro). El nombre actual es engañoso y no escala.
- **Decisión:**
1. **Nombre npm:** `@gonzoblasco/create-stack` (scoped package público)
2. **Nombre repo:** `create-stack` (se renombrará en GitHub al estabilizar)
3. **CLI:** `npx @gonzoblasco/create-stack <stack> [nombre]` donde `<stack>` es el primer argumento posicional
4. **Stacks iniciales:** `next` (full app), `api` (Next.js API-only)
5. **Stacks futuros:** `tanstack`, `astro`, `cli`
- **Consecuencias:**
- Breaking change en la interfaz CLI (de `npx create-stack-next nombre` a `npx @gonzoblasco/create-stack next nombre`)
- El comando es más verboso pero más explícito y extensible
- El flag `--template` se depreca; el stack se pasa como argumento
- Se mantiene compatibilidad hacia atrás con `--template` por un tiempo
- **Estado:** Aceptado
14 changes: 14 additions & 0 deletions .knowledge/adr/0003-modular-stack-architecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# ADR 0003: Arquitectura modular de stacks

- **Fecha:** 2026-07-20
- **Contexto:** Necesitamos que agregar un nuevo stack sea trivial: crear una carpeta con template + config, sin tocar el core del CLI.
- **Decisión:** Cada stack es un módulo independiente en `src/stacks/<stack>/` con:
- `index.ts` — configuración del stack (nombre, descripción, template dir, package.json base, prompts)
- `template/` — archivos del template (copiados al proyecto destino)
- El core del CLI descubre stacks por convención de directorios
- **Consecuencias:**
- Agregar un stack = crear `src/stacks/<nombre>/` con su `index.ts` y `template/`
- El core no necesita saber qué stacks existen
- Los tests de cada stack pueden ser independientes
- Los templates actuales (`template/` y `template-api/`) se migran a `src/stacks/next/template/` y `src/stacks/api/template/`
- **Estado:** Aceptado
119 changes: 119 additions & 0 deletions .knowledge/specs/product.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# OpenSpec: @gonzoblasco/create-stack

## Summary

Scaffolder opinado multi-stack. Un solo comando y tenés un proyecto moderno, testeado, lintado y listo para que un AI agent lo habite. El stack se elige como primer argumento posicional.

## Specs

### spec-001: CLI entrypoint

- **ID:** spec-001
- **Title:** CLI entrypoint con argumento posicional de stack
- **Status:** proposed
- **Priority:** P0

**Description:**
El CLI se ejecuta con `npx @gonzoblasco/create-stack <stack> [nombre]`. El stack es obligatorio. El nombre del proyecto es opcional (si no se pasa, prompt interactivo).

**Acceptance Criteria:**
- [ ] `npx @gonzoblasco/create-stack next my-app` genera un proyecto Next.js full en `./my-app`
- [ ] `npx @gonzoblasco/create-stack api my-app` genera un proyecto Next.js API-only en `./my-app`
- [ ] `npx @gonzoblasco/create-stack` sin argumentos muestra help con stacks disponibles
- [ ] `npx @gonzoblasco/create-stack --help` muestra help
- [ ] `npx @gonzoblasco/create-stack inexistente` muestra error con stacks válidos
- [ ] El flag `--template` legacy sigue funcionando (compatibilidad)

### spec-002: Stacks modulares

- **ID:** spec-002
- **Title:** Stacks como módulos independientes
- **Status:** proposed
- **Priority:** P0

**Description:**
Cada stack vive en `src/stacks/<stack>/` con su propia configuración y template. El core descubre stacks automáticamente.

**Acceptance Criteria:**
- [ ] `src/stacks/next/index.ts` exporta config del stack Next.js full
- [ ] `src/stacks/api/index.ts` exporta config del stack Next.js API-only
- [ ] El core itera `src/stacks/` para listar stacks disponibles
- [ ] Agregar un stack nuevo no requiere modificar el core

### spec-003: Template copiado con personalización

- **ID:** spec-003
- **Title:** Template copiado con personalización por stack
- **Status:** proposed
- **Priority:** P0

**Description:**
Cada stack tiene su carpeta `template/` que se copia al directorio destino. Durante la copia se personaliza el `package.json` (name, version) y se ejecutan hooks post-copia.

**Acceptance Criteria:**
- [ ] `src/stacks/next/template/` contiene el template Next.js full
- [ ] `src/stacks/api/template/` contiene el template Next.js API-only
- [ ] El `package.json` del proyecto destino tiene el nombre correcto
- [ ] Los hooks post-copia se ejecutan (OpenSpec init, etc.)

### spec-004: OpenSpec integrado

- **ID:** spec-004
- **Title:** OpenSpec init post-scaffold
- **Status:** proposed
- **Priority:** P1

**Description:**
Después de copiar el template e instalar deps, se ejecuta `openspec init` con las herramientas IA seleccionadas por el usuario.

**Acceptance Criteria:**
- [ ] Select interactivo de herramientas IA (Claude Code, Cursor, etc.)
- [ ] `openspec init` se ejecuta con las herramientas seleccionadas
- [ ] Flag `--no-openspec` para saltear
- [ ] Fallback si `openspec init` falla (estructura base ya copiada del template)

### spec-005: Git init inteligente

- **ID:** spec-005
- **Title:** Git init con detección de workspace
- **Status:** proposed
- **Priority:** P1

**Description:**
Se inicializa git automáticamente a menos que se detecte un workspace (Turborepo, pnpm workspace) o se pase `--no-git`.

**Acceptance Criteria:**
- [ ] `git init -b main` + commit inicial
- [ ] Detección de workspace salta git init
- [ ] `--no-git` salta git init
- [ ] Si falta user.name/user.email, usa valores temporales y advierte

### spec-006: Package manager selection

- **ID:** spec-006
- **Title:** Selección de package manager
- **Status:** proposed
- **Priority:** P1

**Description:**
El usuario puede elegir el package manager con `--pm`. Default: npm.

**Acceptance Criteria:**
- [ ] `--pm npm|pnpm|yarn|bun` funciona
- [ ] Default: npm
- [ ] `npm install` se ejecuta post-copia

### spec-007: Help y discoverability

- **ID:** spec-007
- **Title:** Help con stacks disponibles
- **Status:** proposed
- **Priority:** P1

**Description:**
El comando `--help` muestra todos los stacks disponibles con su descripción, y ejemplos de uso.

**Acceptance Criteria:**
- [ ] `--help` lista stacks con nombre y descripción
- [ ] `--help` muestra ejemplos de uso
- [ ] Los stacks se listan dinámicamente (no hardcodeados)
5 changes: 3 additions & 2 deletions AGENT_TASKS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ Antes de escribir una sola línea de código, el agente DEBE:
2. Si la tarea implica una decisión arquitectónica nueva o cambio de diseño, documentarla como ADR en `docs/decisions.md`.
3. Planificar la implementación paso a paso.
4. Ejecutar cambios atómicos.
5. Correr linting (`npm run lint`), typecheck (`npm run typecheck`) y tests (`npm run test:run`).
6. Actualizar `CHANGELOG.md` en la sección `[Unreleased]` y, si corresponde, `ROADMAP.md`.
5. Correr `npm run lint:fix` (lint + format automático), `npm run typecheck` y `npm run test:run`.
6. **Solo si todo pasa**, hacer commit. Si algo falla, arreglarlo antes del commit — no hay commits de fixes.
7. Actualizar `CHANGELOG.md` en la sección `[Unreleased]` y, si corresponde, `ROADMAP.md`.

---

Expand Down
Loading
Loading