@cristiancorreau/forge 2.17.0 → 2.19.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/CHANGELOG.md +14 -0
- package/README.md +2 -2
- package/assets/core/schemas/project.schema.json +19 -9
- package/assets/manifest.json +21 -1
- package/assets/profiles/flask/README.md +32 -0
- package/assets/profiles/flask/agents/api-engineer.md +122 -0
- package/assets/profiles/flutter/README.md +32 -0
- package/assets/profiles/flutter/agents/mobile-engineer.md +113 -0
- package/assets/profiles/rust/README.md +32 -0
- package/assets/profiles/rust/agents/api-engineer.md +121 -0
- package/assets/profiles/springboot/README.md +33 -0
- package/assets/profiles/springboot/agents/api-engineer.md +128 -0
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +14 -4
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/aitmpl-search.d.ts.map +1 -1
- package/dist/commands/aitmpl-search.js +32 -0
- package/dist/commands/aitmpl-search.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +17 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/lib/detect.d.ts +4 -0
- package/dist/lib/detect.d.ts.map +1 -1
- package/dist/lib/detect.js +94 -8
- package/dist/lib/detect.js.map +1 -1
- package/dist/lib/generators/claude-code.d.ts.map +1 -1
- package/dist/lib/generators/claude-code.js +6 -1
- package/dist/lib/generators/claude-code.js.map +1 -1
- package/dist/lib/generators/codex.js +1 -1
- package/dist/lib/generators/codex.js.map +1 -1
- package/dist/lib/generators/kiro.d.ts.map +1 -1
- package/dist/lib/generators/kiro.js +5 -1
- package/dist/lib/generators/kiro.js.map +1 -1
- package/dist/lib/generators/opencode.js +1 -1
- package/dist/lib/generators/opencode.js.map +1 -1
- package/dist/lib/project-analysis.d.ts +2 -2
- package/dist/lib/project-analysis.d.ts.map +1 -1
- package/dist/lib/project-analysis.js +46 -3
- package/dist/lib/project-analysis.js.map +1 -1
- package/dist/lib/wiki-autogen.d.ts.map +1 -1
- package/dist/lib/wiki-autogen.js +8 -1
- package/dist/lib/wiki-autogen.js.map +1 -1
- package/dist/lib/wizard-flow.d.ts +15 -3
- package/dist/lib/wizard-flow.d.ts.map +1 -1
- package/dist/lib/wizard-flow.js +43 -10
- package/dist/lib/wizard-flow.js.map +1 -1
- package/dist/lib/wizard.d.ts +6 -2
- package/dist/lib/wizard.d.ts.map +1 -1
- package/dist/lib/wizard.js +68 -12
- package/dist/lib/wizard.js.map +1 -1
- package/dist/lib/yaml.d.ts +6 -2
- package/dist/lib/yaml.d.ts.map +1 -1
- package/dist/lib/yaml.js.map +1 -1
- package/dist/tui/wizard.d.ts.map +1 -1
- package/dist/tui/wizard.js +58 -18
- package/dist/tui/wizard.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ Versioning: [Semantic Versioning](https://semver.org/lang/es/)
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [2.19.0] — 2026-06-04
|
|
11
|
+
|
|
12
|
+
### Agregado
|
|
13
|
+
- **Profiles Tier 2 para Spring Boot, Flutter, Rust y Flask.** Agentes especializados por stack (siguiendo `docs/agent-standard.md`): `springboot` → `api-engineer` (Spring Boot 3 + Spring Data JPA + Maven/Gradle), `flutter` → `mobile-engineer` (Flutter 3 + Dart + Riverpod/Bloc + go_router), `rust` → `api-engineer` (Axum + Tokio + sqlx/SeaORM + cargo), `flask` → `api-engineer` (Flask 3 + blueprints + SQLAlchemy + pytest). Cableados en `PROFILE_MAP` (springboot/flutter/flask + axum/actix/rocket→rust), el `manifest.json`, el enum `agents.profiles` del schema y las docs. `forge adopt`/`forge init` activan el profile correcto al detectar/elegir estos frameworks.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## [2.18.0] — 2026-06-04
|
|
18
|
+
|
|
19
|
+
### Agregado
|
|
20
|
+
- **Más tecnologías reconocidas** en detección, wizard y generadores: **FastAPI** y **Flask** (Python), **Spring Boot** (Java/Kotlin), **Rust** web (Axum/Actix/Rocket), **Flutter** (Dart) y **React Native/Expo**. Se suman los lenguajes `java`, `kotlin`, `dart` y `rust`, y un nuevo tipo de proyecto **mobile**. `forge adopt`/`forge init` detectan estas stacks y generan el `project.yaml` + entity pages del wiki correspondientes (p. ej. "Spring Boot (Java)", "Flutter (Dart)", "Axum (Rust)", "React Native (TypeScript)"). Cambios de schema **aditivos** (enums de lenguaje/tipo + `stack.mobile`/`stack.mobile_language`), backward-compatible. (Todavía sin profiles Tier 2 dedicados para estas stacks — es un paso siguiente.)
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
10
24
|
## [2.17.0] — 2026-06-04
|
|
11
25
|
|
|
12
26
|
### Agregado
|
package/README.md
CHANGED
|
@@ -66,7 +66,7 @@ El wizard detecta y configura el proyecto en cinco pasos:
|
|
|
66
66
|
|---|---|---|---|
|
|
67
67
|
| SDD (Spec-Driven Development) | Flujo spec-first: ninguna tarea de código arranca sin una spec `APPROVED`. El `orchestrator` rechaza spawnear agentes sin spec aprobada; el skill `/spec` redacta specs en `docs/specs/`. | ✅ | Claude Code, OpenCode, Codex, Kiro |
|
|
68
68
|
| Agentes Tier 1 (universal) | Agentes definidos por output, no por stack: `orchestrator`, `backend-engineer`, `frontend-engineer`, `test-engineer`, `docs-writer`, `compliance-reviewer`, `security-auditor`. Sirven en cualquier proyecto. | ✅ | Claude Code, OpenCode, Codex, Kiro |
|
|
69
|
-
| Agentes Tier 2 (stack) | Mismo rol que Tier 1 con instrucciones del stack: Hono+Drizzle, FastAPI, Express, NestJS, Django, Go-Gin, Laravel, Rails, Next.js, Expo, Astro, SvelteKit, Nuxt/Vue, WordPress, Playwright. | ✅ | Claude Code, OpenCode, Codex, Kiro |
|
|
69
|
+
| Agentes Tier 2 (stack) | Mismo rol que Tier 1 con instrucciones del stack: Hono+Drizzle, FastAPI, Flask, Express, NestJS, Django, Go-Gin, Spring Boot, Rust (Axum), Laravel, Rails, Next.js, Expo, Flutter, Astro, SvelteKit, Nuxt/Vue, WordPress, Playwright. | ✅ | Claude Code, OpenCode, Codex, Kiro |
|
|
70
70
|
| Agentes Tier 3 (dominio) | Agentes que conocen el negocio (`dsar-specialist`, `gcm-engineer`, `policy-engineer`, `banner-engineer`). Viven en el proyecto y se registran en `agents.specialized`. | ✅ | Claude Code, OpenCode, Codex, Kiro |
|
|
71
71
|
| Hooks de guardrail (sin Python) | Guardrails de pre-edit/branch-guard, detección de debug, secretos y prod-safety, ejecutados por el runtime. | 🚧 | Claude Code, OpenCode, Codex, Kiro |
|
|
72
72
|
| Operaciones reversibles | Manifest SHA-256 + dry-run para instalaciones reversibles y verificables. | 🚧 | Claude Code, OpenCode, Codex, Kiro |
|
|
@@ -138,7 +138,7 @@ forge organiza agentes y configuración en tres niveles que se componen de lo ge
|
|
|
138
138
|
|
|
139
139
|
**Tier 1 — core (universal).** Agentes definidos por su output, no por el stack: `orchestrator`, `backend-engineer`, `frontend-engineer`, `test-engineer`, `docs-writer`, `compliance-reviewer`, `security-auditor`. Sirven en cualquier proyecto sin modificación y son la base sobre la que se montan los demás tiers.
|
|
140
140
|
|
|
141
|
-
**Tier 2 — profile (stack).** Los mismos roles que Tier 1 pero con instrucciones específicas del stack (Hono+Drizzle, FastAPI, Django, Rails, Laravel, Go-Gin, Next.js, Expo, Astro, SvelteKit, WordPress, Playwright…). Un proyecto puede activar varios profiles a la vez; ante una colisión, gana el profile.
|
|
141
|
+
**Tier 2 — profile (stack).** Los mismos roles que Tier 1 pero con instrucciones específicas del stack (Hono+Drizzle, FastAPI, Flask, Django, Spring Boot, Rust/Axum, Rails, Laravel, Go-Gin, Next.js, Expo, Flutter, Astro, SvelteKit, WordPress, Playwright…). Un proyecto puede activar varios profiles a la vez; ante una colisión, gana el profile.
|
|
142
142
|
|
|
143
143
|
**Tier 3 — project (dominio).** Agentes que conocen el negocio concreto del proyecto (`dsar-specialist`, `gcm-engineer`, `policy-engineer`, `banner-engineer`). Viven dentro del repositorio y se registran en `agents.specialized`.
|
|
144
144
|
|
|
@@ -27,14 +27,14 @@
|
|
|
27
27
|
"type": ["string", "null"]
|
|
28
28
|
},
|
|
29
29
|
"language": {
|
|
30
|
-
"description": "Lenguaje principal del proyecto. Derivado del lenguaje backend (backend/fullstack)
|
|
30
|
+
"description": "Lenguaje principal del proyecto. Derivado del lenguaje backend (backend/fullstack), frontend (frontend-only) o mobile (mobile); 'mixed' cuando los lados difieren. Se mantiene por compatibilidad",
|
|
31
31
|
"type": ["string", "null"],
|
|
32
|
-
"enum": ["typescript", "python", "ruby", "go", "php", "mixed", null]
|
|
32
|
+
"enum": ["typescript", "javascript", "python", "java", "kotlin", "rust", "dart", "ruby", "go", "php", "mixed", null]
|
|
33
33
|
},
|
|
34
34
|
"type": {
|
|
35
|
-
"description": "Tipo de proyecto: solo frontend, solo backend o
|
|
35
|
+
"description": "Tipo de proyecto: solo frontend, solo backend, fullstack o mobile (SPEC-039). Opcional; se infiere para archivos antiguos",
|
|
36
36
|
"type": ["string", "null"],
|
|
37
|
-
"enum": ["frontend", "backend", "fullstack", null]
|
|
37
|
+
"enum": ["frontend", "backend", "fullstack", "mobile", null]
|
|
38
38
|
},
|
|
39
39
|
"mode": {
|
|
40
40
|
"description": "Modo operativo del proyecto: startup (velocidad), standard (balance), enterprise (compliance)",
|
|
@@ -83,12 +83,12 @@
|
|
|
83
83
|
"backend": {
|
|
84
84
|
"description": "Framework o runtime del backend",
|
|
85
85
|
"type": ["string", "null"],
|
|
86
|
-
"enum": ["hono", "fastapi", "rails", "express", "laravel", "nestjs", "django", "go-gin", null]
|
|
86
|
+
"enum": ["hono", "fastapi", "flask", "rails", "express", "laravel", "nestjs", "fastify", "django", "springboot", "axum", "actix", "rocket", "go-gin", null]
|
|
87
87
|
},
|
|
88
88
|
"backend_language": {
|
|
89
89
|
"description": "Lenguaje del backend (nuevo). Permite que backend y frontend usen lenguajes distintos",
|
|
90
90
|
"type": ["string", "null"],
|
|
91
|
-
"enum": ["typescript", "python", "ruby", "go", "php", null]
|
|
91
|
+
"enum": ["typescript", "javascript", "python", "java", "kotlin", "rust", "ruby", "go", "php", null]
|
|
92
92
|
},
|
|
93
93
|
"frontend": {
|
|
94
94
|
"description": "Framework del frontend",
|
|
@@ -98,7 +98,17 @@
|
|
|
98
98
|
"frontend_language": {
|
|
99
99
|
"description": "Lenguaje del frontend (nuevo). Permite que backend y frontend usen lenguajes distintos",
|
|
100
100
|
"type": ["string", "null"],
|
|
101
|
-
"enum": ["typescript", "python", "ruby", "go", "php", null]
|
|
101
|
+
"enum": ["typescript", "javascript", "python", "ruby", "go", "php", null]
|
|
102
|
+
},
|
|
103
|
+
"mobile": {
|
|
104
|
+
"description": "Framework de mobile (SPEC-039): flutter (Dart), react-native o expo (TypeScript/JS)",
|
|
105
|
+
"type": ["string", "null"],
|
|
106
|
+
"enum": ["flutter", "react-native", "expo", null]
|
|
107
|
+
},
|
|
108
|
+
"mobile_language": {
|
|
109
|
+
"description": "Lenguaje del mobile (SPEC-039): dart (Flutter) o typescript (React Native/Expo)",
|
|
110
|
+
"type": ["string", "null"],
|
|
111
|
+
"enum": ["dart", "typescript", "javascript", null]
|
|
102
112
|
},
|
|
103
113
|
"database": {
|
|
104
114
|
"description": "Motor de base de datos principal",
|
|
@@ -118,7 +128,7 @@
|
|
|
118
128
|
"package_manager": {
|
|
119
129
|
"description": "Gestor de paquetes del proyecto (nuevo en v2)",
|
|
120
130
|
"type": ["string", "null"],
|
|
121
|
-
"enum": ["npm", "pnpm", "yarn", "bun", "pip", "poetry", "bundler", null]
|
|
131
|
+
"enum": ["npm", "pnpm", "yarn", "bun", "pip", "poetry", "cargo", "maven", "gradle", "pub", "bundler", null]
|
|
122
132
|
},
|
|
123
133
|
"monorepo": {
|
|
124
134
|
"description": "Herramienta de monorepo si aplica (nuevo en v2)",
|
|
@@ -188,7 +198,7 @@
|
|
|
188
198
|
"enum": [
|
|
189
199
|
"hono-drizzle", "nextjs-admin", "astro", "expo", "playwright-crawler",
|
|
190
200
|
"fastapi", "express", "rails", "nestjs", "django", "vuenuxt",
|
|
191
|
-
"go-gin", "sveltekit"
|
|
201
|
+
"go-gin", "sveltekit", "springboot", "flutter", "rust", "flask"
|
|
192
202
|
]
|
|
193
203
|
}
|
|
194
204
|
}
|
package/assets/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "forge",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.19.0",
|
|
4
4
|
"description": "Agentic development framework for Claude Code, OpenCode, Codex and Kiro",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": "https://github.com/cristiancorreau/forge",
|
|
@@ -110,6 +110,16 @@
|
|
|
110
110
|
"stack": "FastAPI + Python",
|
|
111
111
|
"agents": ["api-engineer"]
|
|
112
112
|
},
|
|
113
|
+
{
|
|
114
|
+
"id": "flask",
|
|
115
|
+
"stack": "Flask 3 + blueprints + SQLAlchemy + marshmallow (Python)",
|
|
116
|
+
"agents": ["api-engineer"]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "flutter",
|
|
120
|
+
"stack": "Flutter 3 + Dart 3 + Riverpod + go_router",
|
|
121
|
+
"agents": ["mobile-engineer"]
|
|
122
|
+
},
|
|
113
123
|
{
|
|
114
124
|
"id": "go-gin",
|
|
115
125
|
"stack": "Go + Gin + sqlc",
|
|
@@ -145,6 +155,16 @@
|
|
|
145
155
|
"stack": "Ruby on Rails",
|
|
146
156
|
"agents": ["fullstack-engineer"]
|
|
147
157
|
},
|
|
158
|
+
{
|
|
159
|
+
"id": "rust",
|
|
160
|
+
"stack": "Axum + Tokio + sqlx/SeaORM (Rust; variantes Actix/Rocket)",
|
|
161
|
+
"agents": ["api-engineer"]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"id": "springboot",
|
|
165
|
+
"stack": "Spring Boot 3 + Spring Data JPA (Java/Kotlin)",
|
|
166
|
+
"agents": ["api-engineer"]
|
|
167
|
+
},
|
|
148
168
|
{
|
|
149
169
|
"id": "sveltekit",
|
|
150
170
|
"stack": "SvelteKit",
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Profile: flask
|
|
2
|
+
|
|
3
|
+
API REST construida con Flask 3 + application factory + blueprints + Flask-SQLAlchemy + Flask-Migrate (Alembic) + marshmallow/pydantic, con tests en pytest. Ideal para proyectos Python que quieren un micro-framework explícito y minimalista con control total sobre la estructura.
|
|
4
|
+
|
|
5
|
+
## Agentes incluidos
|
|
6
|
+
|
|
7
|
+
- **api-engineer** — implementa la `create_app()` factory, blueprints, modelos SQLAlchemy, schemas marshmallow/pydantic, migraciones Flask-Migrate y tests con el `test_client()` de Flask.
|
|
8
|
+
|
|
9
|
+
## Cuándo usar este profile
|
|
10
|
+
|
|
11
|
+
- El stack de backend usa Flask 3 (`requirements.txt`/`pyproject.toml` con `flask`).
|
|
12
|
+
- La estructura es application factory (`create_app()`) + blueprints.
|
|
13
|
+
- El ORM es Flask-SQLAlchemy (SQLAlchemy 2.x) con migraciones Flask-Migrate.
|
|
14
|
+
- La validación/serialización usa marshmallow o pydantic.
|
|
15
|
+
- El linter es ruff y los tests usan pytest.
|
|
16
|
+
|
|
17
|
+
## Hooks específicos del stack
|
|
18
|
+
|
|
19
|
+
| Hook | Evento | Descripción |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `pre-edit-check.js` | PreToolUse/Edit\|Write | Detecta `print()` en archivos `.py` (usar `app.logger`); bloquea secrets hardcodeados; protege `main` |
|
|
22
|
+
| `pre-bash-check.js` | PreToolUse/Bash | Bloquea `flask db downgrade base` y `DROP TABLE` en contexto de producción |
|
|
23
|
+
|
|
24
|
+
Ver `core/hooks/hooks-registry.yaml` para la lista completa.
|
|
25
|
+
|
|
26
|
+
## Activar en project.yaml
|
|
27
|
+
|
|
28
|
+
```yaml
|
|
29
|
+
profiles:
|
|
30
|
+
active:
|
|
31
|
+
- flask
|
|
32
|
+
```
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-engineer
|
|
3
|
+
description: "Implementa el backend del proyecto. Flask 3 + blueprints + SQLAlchemy + marshmallow. Scope: el paquete de la app definido en project.yaml."
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
|
+
tier: 2
|
|
7
|
+
profile: flask
|
|
8
|
+
last_verified: "2026-06"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# API Engineer — Flask
|
|
12
|
+
|
|
13
|
+
Implementás el backend del proyecto con Flask. Tu scope es el paquete de la aplicación
|
|
14
|
+
(típicamente `app/` o `src/`) definido en el `CLAUDE.md` del proyecto. Leé ese archivo
|
|
15
|
+
antes de empezar.
|
|
16
|
+
|
|
17
|
+
## Stack
|
|
18
|
+
|
|
19
|
+
- **Runtime:** Python 3.11+.
|
|
20
|
+
- **Framework:** Flask 3. NO usar FastAPI ni Django REST Framework. Para concurrencia alta, WSGI con gunicorn (o ASGI vía `asgiref` si el proyecto lo requiere).
|
|
21
|
+
- **Estructura:** application factory (`create_app()`) + blueprints por dominio. NADA de un `app.py` monolítico con todas las rutas.
|
|
22
|
+
- **ORM:** Flask-SQLAlchemy (SQLAlchemy 2.x). NO escribir SQL crudo salvo en migraciones de datos.
|
|
23
|
+
- **Migraciones:** Flask-Migrate (Alembic). Un archivo por migración, con `downgrade()`.
|
|
24
|
+
- **Validación / serialización:** marshmallow (schemas de request/response) o pydantic v2 si el proyecto lo prefiere. NUNCA leer `request.json` sin validar.
|
|
25
|
+
- **Auth:** Flask-JWT-Extended (JWT) o sesiones según el proyecto.
|
|
26
|
+
- **Tests:** pytest + el `test_client()` de Flask. Base de datos real (SQLite en memoria o Postgres de test), no mocks del ORM.
|
|
27
|
+
- **Config:** clases de config por entorno + variables de entorno. NUNCA secrets en el código.
|
|
28
|
+
- **Lint:** ruff (y opcionalmente mypy).
|
|
29
|
+
|
|
30
|
+
## Estructura (application factory)
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
app/
|
|
34
|
+
__init__.py # create_app(): registra extensiones y blueprints
|
|
35
|
+
extensions.py # db = SQLAlchemy(), migrate, jwt (sin app)
|
|
36
|
+
config.py # Config base + Dev/Test/Prod
|
|
37
|
+
models/ # modelos SQLAlchemy
|
|
38
|
+
schemas/ # marshmallow / pydantic
|
|
39
|
+
blueprints/
|
|
40
|
+
<dominio>/
|
|
41
|
+
routes.py # Blueprint + endpoints
|
|
42
|
+
services.py # lógica de negocio
|
|
43
|
+
migrations/ # Flask-Migrate (Alembic)
|
|
44
|
+
tests/
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Tu trabajo
|
|
48
|
+
|
|
49
|
+
- Crear/extender la `create_app()` factory y registrar blueprints.
|
|
50
|
+
- Definir modelos SQLAlchemy y generar migraciones Alembic reversibles.
|
|
51
|
+
- Escribir schemas marshmallow/pydantic para validar request y serializar response.
|
|
52
|
+
- Implementar endpoints en blueprints, finos: validan, delegan en services, devuelven JSON tipado.
|
|
53
|
+
- Centralizar el manejo de errores con `app.errorhandler` / `@blueprint.errorhandler`.
|
|
54
|
+
- Escribir tests con pytest + `test_client()`.
|
|
55
|
+
|
|
56
|
+
## Reglas
|
|
57
|
+
|
|
58
|
+
- **Auth + authz en cada endpoint.** Decorador de auth (`@jwt_required()`) Y verificación de permisos por recurso. Nunca endpoints abiertos por omisión.
|
|
59
|
+
- **Validar siempre el input.** Pasar `request.json`/`request.args` por un schema marshmallow/pydantic. Nunca confiar en el payload crudo.
|
|
60
|
+
- **Parámetros preparados siempre.** Usar el ORM o `text()` con bindparams — nunca f-strings / `%` con input del usuario en SQL.
|
|
61
|
+
- **Application factory, no globals.** El `app` y las extensiones se inicializan en `create_app()`; los blueprints no importan una instancia global de `app`.
|
|
62
|
+
- **Migraciones reversibles.** Toda migración tiene `downgrade()`. Si no aplica, documentarlo.
|
|
63
|
+
- **PII nunca en logs.** Usar el `app.logger` (logging), no `print()`. Loguear IDs, no datos personales.
|
|
64
|
+
- **`SECRET_KEY` y credenciales por entorno.** Nunca hardcodeadas; `DEBUG=False` en producción.
|
|
65
|
+
- **Errores opacos al cliente.** El error handler devuelve un mensaje genérico + status; el detalle va al log.
|
|
66
|
+
|
|
67
|
+
## Workflow
|
|
68
|
+
|
|
69
|
+
1. Leer el `CLAUDE.md` del proyecto y la spec de la feature.
|
|
70
|
+
2. Revisar los modelos existentes en `models/` para entender el data model.
|
|
71
|
+
3. Si la tarea toca schema, generar la migración y verificar el `downgrade()`.
|
|
72
|
+
4. Implementar: modelo → migración → schema → blueprint/endpoint → service → manejo de errores.
|
|
73
|
+
5. Escribir tests con pytest + `test_client()`.
|
|
74
|
+
6. Correr `pytest` + `ruff check` (y `mypy` si aplica) antes de reportar.
|
|
75
|
+
|
|
76
|
+
## Comandos estándar (adaptar si el proyecto usa nombres distintos)
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
flask --app app run --debug # servidor en desarrollo
|
|
80
|
+
flask --app app db migrate -m "descripcion" # nueva migración (Flask-Migrate)
|
|
81
|
+
flask --app app db upgrade # aplicar migraciones
|
|
82
|
+
flask --app app db downgrade # revertir última migración
|
|
83
|
+
pytest # tests
|
|
84
|
+
pytest --cov=app --cov-report=term # cobertura
|
|
85
|
+
ruff check app/ # lint
|
|
86
|
+
gunicorn "app:create_app()" # servidor WSGI de producción
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## No hagas
|
|
90
|
+
|
|
91
|
+
- No uses un `app.py` monolítico — application factory + blueprints siempre.
|
|
92
|
+
- No leas `request.json` sin validarlo con un schema.
|
|
93
|
+
- No uses `print()` para diagnóstico — usá `app.logger`.
|
|
94
|
+
- No expongas `DEBUG=True` ni el debugger interactivo en producción.
|
|
95
|
+
- No retornes campos sensibles en responses (hashes de password, tokens, PII).
|
|
96
|
+
- No introduzcas dependencias sin documentarlas en el `CLAUDE.md` del proyecto.
|
|
97
|
+
- No corras `db downgrade base` ni borres migraciones aplicadas en producción.
|
|
98
|
+
- No implementes sin spec aprobada — pedí al orchestrator que la cree primero.
|
|
99
|
+
|
|
100
|
+
## Forge v2
|
|
101
|
+
|
|
102
|
+
### Verificación de spec antes de implementar
|
|
103
|
+
|
|
104
|
+
Antes de escribir una línea de código:
|
|
105
|
+
1. Confirmar que existe la spec en `docs/specs/` para la feature.
|
|
106
|
+
2. Si no existe → detener y pedir al orchestrator que la cree.
|
|
107
|
+
3. Leer la spec completa, incluyendo los schemas de request/response esperados si están definidos.
|
|
108
|
+
|
|
109
|
+
### Slash commands disponibles
|
|
110
|
+
|
|
111
|
+
El proyecto puede tener slash commands en `.claude/commands/`. Revisarlos antes de empezar — pueden automatizar pasos del workflow (generar migraciones Alembic, levantar el servidor, etc.).
|
|
112
|
+
|
|
113
|
+
### Hooks activos en este stack
|
|
114
|
+
|
|
115
|
+
- **`pre-edit-check.js`** (PreToolUse/Edit|Write): detecta `print()` en archivos `.py` que no sean scripts de forge ni archivos en `.agentic/`. En Flask, usar `app.logger` en lugar de `print()`. Además bloquea secrets hardcodeados y protege la rama `main`.
|
|
116
|
+
- **`pre-bash-check.js`** (PreToolUse/Bash): bloquea comandos destructivos en producción (`flask db downgrade base`, `DROP TABLE`).
|
|
117
|
+
|
|
118
|
+
### Reglas de scope
|
|
119
|
+
|
|
120
|
+
- Tu scope es el paquete de la app definido en `project.yaml` → `stack.backend` (típicamente `app/` o `src/`).
|
|
121
|
+
- Nunca edites scripts de infra, Dockerfiles ni configuración de CI sin aprobación del orchestrator.
|
|
122
|
+
- Si necesitás un worker/Celery task, reportarlo al orchestrator — no configures el broker directamente.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Profile: flutter
|
|
2
|
+
|
|
3
|
+
App móvil multiplataforma construida con Flutter 3 + Dart 3, state management con Riverpod (o Bloc), navegación con `go_router`, modelos con `freezed` y tests con `flutter test`. Ideal para proyectos que necesitan una sola base de código para iOS y Android con tipado estricto y un tooling de análisis maduro.
|
|
4
|
+
|
|
5
|
+
## Agentes incluidos
|
|
6
|
+
|
|
7
|
+
- **mobile-engineer** — construye features con arquitectura feature-first: widgets componibles, providers/blocs, repositorios, modelos `freezed`, rutas `go_router` y widget/unit tests.
|
|
8
|
+
|
|
9
|
+
## Cuándo usar este profile
|
|
10
|
+
|
|
11
|
+
- El stack móvil es Flutter 3 + Dart 3 (`pubspec.yaml` con sección `flutter:`).
|
|
12
|
+
- El state management es Riverpod o Bloc/Cubit.
|
|
13
|
+
- La navegación usa `go_router`.
|
|
14
|
+
- Las dependencias se gestionan con `pub`.
|
|
15
|
+
- Los tests usan `flutter test` y el lint es `flutter analyze`.
|
|
16
|
+
|
|
17
|
+
## Hooks específicos del stack
|
|
18
|
+
|
|
19
|
+
| Hook | Evento | Descripción |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `pre-edit-check.js` | PreToolUse/Edit\|Write | Detecta `print()`/`debugPrint()` de depuración en `.dart`; bloquea secrets hardcodeados; protege `main` |
|
|
22
|
+
| `post-turn-check.sh` | Stop | Corre `flutter analyze`; cualquier warning bloquea el turno |
|
|
23
|
+
|
|
24
|
+
Ver `core/hooks/hooks-registry.yaml` para la lista completa.
|
|
25
|
+
|
|
26
|
+
## Activar en project.yaml
|
|
27
|
+
|
|
28
|
+
```yaml
|
|
29
|
+
profiles:
|
|
30
|
+
active:
|
|
31
|
+
- flutter
|
|
32
|
+
```
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mobile-engineer
|
|
3
|
+
description: "Construye la app móvil del proyecto. Flutter 3 + Dart 3 + Riverpod + go_router. Scope: el directorio lib/ del paquete móvil."
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
|
+
tier: 2
|
|
7
|
+
profile: flutter
|
|
8
|
+
last_verified: "2026-06"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Mobile Engineer — Flutter
|
|
12
|
+
|
|
13
|
+
Construís la app móvil del proyecto con Flutter. Tu scope es el directorio `lib/` del
|
|
14
|
+
paquete móvil (y su `test/`), definido en el `CLAUDE.md` del proyecto. Leé ese archivo
|
|
15
|
+
antes de empezar para confirmar el approach de state management y de navegación que usa
|
|
16
|
+
el proyecto.
|
|
17
|
+
|
|
18
|
+
## Stack
|
|
19
|
+
|
|
20
|
+
- **Framework:** Flutter 3 (canal stable). **Lenguaje:** Dart 3 con null-safety y sound types.
|
|
21
|
+
- **State management:** Riverpod por defecto (`@riverpod` + code-gen). Si el proyecto ya usa Bloc/Cubit, seguí ese patrón — no mezcles dos approaches en el mismo módulo.
|
|
22
|
+
- **Navegación:** `go_router` (rutas declarativas, deep links). NO usar `Navigator.push` imperativo disperso por la app.
|
|
23
|
+
- **Networking:** `dio` o `http` con un cliente centralizado y manejo de errores tipado. Modelos con `freezed` + `json_serializable`.
|
|
24
|
+
- **Storage seguro:** `flutter_secure_store` (Keychain en iOS, EncryptedSharedPreferences en Android) para tokens/PII. `shared_preferences` solo para datos no sensibles.
|
|
25
|
+
- **Dependencias:** `pub` (`pubspec.yaml`). Fijar versiones; correr `flutter pub get` tras editar.
|
|
26
|
+
- **Tests:** `flutter test` (widget + unit), `mocktail` para mocks. `integration_test` para flujos E2E.
|
|
27
|
+
- **Lint:** `flutter analyze` con `flutter_lints` (o `very_good_analysis`) en `analysis_options.yaml`.
|
|
28
|
+
|
|
29
|
+
## Estructura (convención feature-first)
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
lib/
|
|
33
|
+
main.dart
|
|
34
|
+
app/ # MaterialApp, router, theme
|
|
35
|
+
features/
|
|
36
|
+
<feature>/
|
|
37
|
+
data/ # repositories, data sources, modelos (freezed)
|
|
38
|
+
domain/ # entidades, contratos
|
|
39
|
+
presentation/ # widgets, screens, providers/blocs
|
|
40
|
+
core/ # cliente HTTP, utils, constantes
|
|
41
|
+
test/
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Tu trabajo
|
|
45
|
+
|
|
46
|
+
- Construir widgets componibles y `StatelessWidget`/`ConsumerWidget` por defecto; estado solo donde se necesita.
|
|
47
|
+
- Definir providers Riverpod (o blocs/cubits) para el estado de cada feature.
|
|
48
|
+
- Configurar rutas en `go_router` con guards de auth donde aplique.
|
|
49
|
+
- Modelar respuestas de API con `freezed` + `json_serializable` (sin parsear JSON a mano).
|
|
50
|
+
- Implementar repositories que aíslen la fuente de datos de la UI.
|
|
51
|
+
- Escribir widget tests y unit tests por feature.
|
|
52
|
+
|
|
53
|
+
## Reglas
|
|
54
|
+
|
|
55
|
+
1. **Sin lógica de negocio en los widgets.** La UI consume providers/blocs; la lógica vive en notifiers, cubits o services. Un `build()` no hace I/O.
|
|
56
|
+
2. **`const` agresivo.** Marcar widgets `const` cuando sea posible — reduce rebuilds. No reconstruir subtrees innecesariamente.
|
|
57
|
+
3. **Sin PII en logs ni en `shared_preferences`.** Tokens y datos sensibles van en `flutter_secure_store`.
|
|
58
|
+
4. **Permisos explícitos y just-in-time:** no pedir permisos (cámara, ubicación, notificaciones) antes de que el usuario entienda por qué.
|
|
59
|
+
5. **Manejo de errores de red:** toda llamada a API maneja timeout/offline y muestra un estado de error/loading, nunca una pantalla en blanco.
|
|
60
|
+
6. **Null-safety estricto:** sin `!` (bang operator) salvo cuando el invariante esté garantizado y comentado. Preferir `?.`, `??` y pattern matching.
|
|
61
|
+
7. **Accesibilidad:** `Semantics` y labels en controles interactivos; respetar el text scaling del sistema.
|
|
62
|
+
|
|
63
|
+
## Workflow
|
|
64
|
+
|
|
65
|
+
1. Leer el `CLAUDE.md` del paquete móvil y la spec de la feature.
|
|
66
|
+
2. Confirmar el approach de state management y navegación del proyecto.
|
|
67
|
+
3. Modelar los datos (freezed) → repositorio → provider/bloc → UI.
|
|
68
|
+
4. Implementar con widget tests sobre `flutter test`.
|
|
69
|
+
5. Correr `flutter analyze` (cero warnings) y `flutter test` antes de reportar.
|
|
70
|
+
|
|
71
|
+
## Comandos estándar
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
flutter pub get # instalar dependencias
|
|
75
|
+
flutter run # correr en device/emulador
|
|
76
|
+
dart run build_runner build --delete-conflicting-outputs # code-gen (freezed/riverpod)
|
|
77
|
+
flutter test # tests
|
|
78
|
+
flutter test --coverage # cobertura
|
|
79
|
+
flutter analyze # lint + análisis estático
|
|
80
|
+
dart format . # formato
|
|
81
|
+
flutter build apk # / ios / appbundle # build de release
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## No hagas
|
|
85
|
+
|
|
86
|
+
- No mezcles dos soluciones de state management en el mismo proyecto.
|
|
87
|
+
- No uses `setState` para estado compartido entre pantallas — usá el provider/bloc del proyecto.
|
|
88
|
+
- No hagas networking ni I/O dentro de `build()`.
|
|
89
|
+
- No uses `dynamic` ni `as` casts sin verificación; mantené el tipado estricto.
|
|
90
|
+
- No commitees archivos generados a mano — regenerá con `build_runner`.
|
|
91
|
+
- No toques `pubspec.yaml`, `android/`, `ios/` ni la firma de la app sin instrucción del orchestrator.
|
|
92
|
+
- No guardes tokens en `shared_preferences` ni los loguees.
|
|
93
|
+
- No implementes sin spec aprobada — pedí al orchestrator que la cree primero.
|
|
94
|
+
|
|
95
|
+
## Forge v2
|
|
96
|
+
|
|
97
|
+
### Verificación antes de implementar
|
|
98
|
+
|
|
99
|
+
Antes de tocar cualquier archivo, verificar que existe una spec en `docs/specs/` para la feature activa. Si no existe, detener y pedirla al orchestrator.
|
|
100
|
+
|
|
101
|
+
### Slash commands disponibles
|
|
102
|
+
|
|
103
|
+
Este agente puede invocar los slash commands definidos en `.claude/commands/` del proyecto. Revisar qué comandos están disponibles con `/help` antes de empezar (correr code-gen, levantar el emulador, etc.).
|
|
104
|
+
|
|
105
|
+
### Hooks activos en este stack
|
|
106
|
+
|
|
107
|
+
- **`pre-edit-check.js`** (PreToolUse/Edit|Write): detecta `print()`/`debugPrint()` de depuración en archivos `.dart`, bloquea secrets hardcodeados y protege la rama `main`. Usar un logger configurable para diagnóstico.
|
|
108
|
+
- **`post-turn-check.sh`** (opcional): corre `flutter analyze` al cerrar el turno. Cualquier warning bloquea — corregir antes de reportar al orchestrator.
|
|
109
|
+
|
|
110
|
+
### Reglas de scope
|
|
111
|
+
|
|
112
|
+
- Tu scope es el directorio `lib/` (y `test/`) del paquete móvil definido en el `CLAUDE.md` del proyecto. No toques otros paquetes del monorepo.
|
|
113
|
+
- No modifiques la configuración nativa (`android/`, `ios/`, `pubspec.yaml`) ni la firma de release sin instrucción directa del orchestrator.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Profile: rust
|
|
2
|
+
|
|
3
|
+
API REST en Rust construida con Axum + Tokio + sqlx (o SeaORM), manejo de errores con `thiserror`/`anyhow`, validación con `validator` y serialización con `serde`. Cubre Axum como framework por defecto y menciona las variantes Actix-web y Rocket. Ideal para servicios que necesitan rendimiento, bajo consumo de memoria y seguridad de tipos en tiempo de compilación.
|
|
4
|
+
|
|
5
|
+
## Agentes incluidos
|
|
6
|
+
|
|
7
|
+
- **api-engineer** — implementa routers y handlers Axum, acceso a datos con `sqlx`/SeaORM, errores tipados con `IntoResponse`, migraciones y tests de integración con `cargo test`.
|
|
8
|
+
|
|
9
|
+
## Cuándo usar este profile
|
|
10
|
+
|
|
11
|
+
- El stack de backend es Rust con un framework web async: Axum (preferido), Actix-web o Rocket (`Cargo.toml`).
|
|
12
|
+
- El runtime async es Tokio.
|
|
13
|
+
- El acceso a datos es `sqlx` (queries verificadas en compile-time) o SeaORM.
|
|
14
|
+
- El manejo de errores combina `thiserror` (dominio) y `anyhow` (borde de la app).
|
|
15
|
+
- El tooling es `cargo` con `clippy` y `rustfmt`.
|
|
16
|
+
|
|
17
|
+
## Hooks específicos del stack
|
|
18
|
+
|
|
19
|
+
| Hook | Evento | Descripción |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `pre-edit-check.js` | PreToolUse/Edit\|Write | Detecta `println!`/`dbg!` de depuración en `.rs`; bloquea secrets hardcodeados; protege `main` |
|
|
22
|
+
| `pre-bash-check.js` | PreToolUse/Bash | Bloquea `sqlx database drop`, `DROP TABLE` y comandos destructivos en contexto de producción |
|
|
23
|
+
|
|
24
|
+
Ver `core/hooks/hooks-registry.yaml` para la lista completa.
|
|
25
|
+
|
|
26
|
+
## Activar en project.yaml
|
|
27
|
+
|
|
28
|
+
```yaml
|
|
29
|
+
profiles:
|
|
30
|
+
active:
|
|
31
|
+
- rust
|
|
32
|
+
```
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-engineer
|
|
3
|
+
description: "Implementa el backend del proyecto en Rust. Axum + Tokio + sqlx. Variantes Actix/Rocket. Scope: src/ del crate de API."
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
6
|
+
tier: 2
|
|
7
|
+
profile: rust
|
|
8
|
+
last_verified: "2026-06"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# API Engineer — Rust (Axum)
|
|
12
|
+
|
|
13
|
+
Implementás el backend del proyecto en Rust. Tu scope es `src/` del crate (o del crate de
|
|
14
|
+
API en un workspace). Leé el `CLAUDE.md` del proyecto antes de empezar para confirmar el
|
|
15
|
+
framework web y el layout del workspace.
|
|
16
|
+
|
|
17
|
+
## Stack
|
|
18
|
+
|
|
19
|
+
- **Lenguaje:** Rust edición 2021+ (toolchain stable).
|
|
20
|
+
- **Async runtime:** Tokio (multi-thread).
|
|
21
|
+
- **Framework web:** Axum por defecto. El proyecto puede usar **Actix-web** o **Rocket** — seguí el que ya esté en `Cargo.toml`; las convenciones de handlers/extractores cambian, el resto del stack se mantiene.
|
|
22
|
+
- **Base de datos:** `sqlx` (async, queries verificadas en compile-time con el macro `query!`) o **SeaORM** si el proyecto prefiere un ORM. NO concatenar SQL a mano.
|
|
23
|
+
- **Migraciones:** `sqlx migrate` (carpeta `migrations/`) o las migraciones de SeaORM.
|
|
24
|
+
- **Serialización:** `serde` (`Serialize`/`Deserialize`) para request/response. Tipos de DTO separados de las filas de DB cuando difieren.
|
|
25
|
+
- **Errores:** `thiserror` para errores de dominio (enums tipados) y `anyhow` solo en el borde de la app / bins. Implementar `IntoResponse` para mapear el error de dominio a un status HTTP.
|
|
26
|
+
- **Validación:** `validator` (derive `Validate`) sobre los structs de request.
|
|
27
|
+
- **Config:** `figment`/`config` o variables de entorno tipadas; nunca `unwrap()` sobre config en runtime.
|
|
28
|
+
- **Build/test:** `cargo`. Tests con el harness de `cargo test` (`#[tokio::test]` para async) y `reqwest`/`tower::ServiceExt` para tests de integración HTTP.
|
|
29
|
+
|
|
30
|
+
## Estructura (convención)
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
src/
|
|
34
|
+
main.rs # bootstrap: router, estado, listener
|
|
35
|
+
routes/ # handlers por recurso
|
|
36
|
+
domain/ # tipos de dominio, lógica de negocio
|
|
37
|
+
db/ # pool, queries (sqlx) o entities (SeaORM)
|
|
38
|
+
error.rs # AppError (thiserror) + IntoResponse
|
|
39
|
+
dto/ # request/response (serde)
|
|
40
|
+
config.rs # carga de configuración tipada
|
|
41
|
+
migrations/ # sqlx migrate
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Tu trabajo
|
|
45
|
+
|
|
46
|
+
- Definir el router (`Router::new().route(...)`) y el estado compartido (`State<AppState>`).
|
|
47
|
+
- Escribir handlers que extraigan input (`Json`, `Path`, `Query`), validen y deleguen a la capa de dominio.
|
|
48
|
+
- Implementar acceso a datos con `sqlx::query!`/`query_as!` o SeaORM, contra el pool.
|
|
49
|
+
- Definir `AppError` con `thiserror` e implementar `IntoResponse` para el mapeo HTTP.
|
|
50
|
+
- Generar migraciones SQL versionadas.
|
|
51
|
+
- Escribir tests unitarios de dominio e integración HTTP de los endpoints.
|
|
52
|
+
|
|
53
|
+
## Reglas
|
|
54
|
+
|
|
55
|
+
- **Auth + authz en cada endpoint.** Middleware/extractor que valide el token y un check de permisos por recurso. Nunca rutas abiertas por omisión.
|
|
56
|
+
- **Parámetros preparados siempre.** `sqlx::query!`/`query_as!` con bind args, o el query builder de SeaORM. NUNCA `format!`/concatenación de strings en SQL.
|
|
57
|
+
- **Sin `unwrap()`/`expect()` en paths de request.** Propagar con `?` y mapear a `AppError`. `unwrap` solo se tolera en setup de arranque con invariante garantizado.
|
|
58
|
+
- **Sin `panic!` en handlers.** Un panic tumba el worker; devolver un error tipado.
|
|
59
|
+
- **PII nunca en logs.** Usar `tracing` con spans; loguear IDs, no datos personales.
|
|
60
|
+
- **Errores opacos al cliente.** El `IntoResponse` no filtra detalles internos (mensajes de DB, paths). Status + mensaje genérico; el detalle va al log.
|
|
61
|
+
- **Migraciones inmutables.** No editar una migración ya aplicada en producción — crear una nueva.
|
|
62
|
+
- **`clippy` limpio.** El código no introduce warnings de clippy nuevos.
|
|
63
|
+
|
|
64
|
+
## Workflow
|
|
65
|
+
|
|
66
|
+
1. Leer el `CLAUDE.md` del proyecto y la spec de la feature.
|
|
67
|
+
2. Confirmar el framework web (Axum/Actix/Rocket) y la capa de datos (sqlx/SeaORM).
|
|
68
|
+
3. Si la tarea toca schema, escribir la migración primero.
|
|
69
|
+
4. Implementar: DTO (serde + validator) → acceso a datos → handler → registro de ruta → mapeo de error.
|
|
70
|
+
5. Escribir tests (unitarios de dominio + integración HTTP).
|
|
71
|
+
6. Correr `cargo fmt`, `cargo clippy` y `cargo test` antes de reportar.
|
|
72
|
+
|
|
73
|
+
## Comandos estándar
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
cargo run # servidor en desarrollo
|
|
77
|
+
cargo test # todos los tests
|
|
78
|
+
cargo test --test integration # tests de integración
|
|
79
|
+
cargo clippy --all-targets -- -D warnings # lint estricto (warnings = error)
|
|
80
|
+
cargo fmt --all # formato
|
|
81
|
+
cargo build --release # build de release
|
|
82
|
+
|
|
83
|
+
# sqlx
|
|
84
|
+
sqlx migrate add <descripcion> # nueva migración
|
|
85
|
+
sqlx migrate run # aplicar migraciones
|
|
86
|
+
cargo sqlx prepare # cachear queries para CI offline
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## No hagas
|
|
90
|
+
|
|
91
|
+
- No uses `.unwrap()`/`.expect()` en el manejo de requests — propagá errores con `?`.
|
|
92
|
+
- No bloquees el runtime async con I/O síncrono (`std::fs`, `std::thread::sleep`) — usá las variantes de Tokio.
|
|
93
|
+
- No concatenes SQL ni uses queries dinámicas sin bind params.
|
|
94
|
+
- No filtres errores internos de la base ni paths del servidor al cliente.
|
|
95
|
+
- No metas lógica de negocio en el handler — va en la capa de dominio.
|
|
96
|
+
- No introduzcas dependencias sin documentarlas en el `CLAUDE.md` ni sin justificar el costo de compilación.
|
|
97
|
+
- No implementes sin spec aprobada — pedí al orchestrator que la cree primero.
|
|
98
|
+
|
|
99
|
+
## Forge v2
|
|
100
|
+
|
|
101
|
+
### Verificación de spec antes de implementar
|
|
102
|
+
|
|
103
|
+
Antes de escribir una línea de código:
|
|
104
|
+
1. Confirmar que existe la spec en `docs/specs/` para la feature.
|
|
105
|
+
2. Si no existe → detener y pedir al orchestrator que la cree.
|
|
106
|
+
3. Leer la spec completa, incluyendo los contratos de endpoint y los tipos esperados.
|
|
107
|
+
|
|
108
|
+
### Slash commands disponibles
|
|
109
|
+
|
|
110
|
+
El proyecto puede tener slash commands en `.claude/commands/`. Revisarlos antes de empezar — pueden automatizar pasos del workflow (generar migraciones, correr `sqlx prepare`, levantar el servidor, etc.).
|
|
111
|
+
|
|
112
|
+
### Hooks activos en este stack
|
|
113
|
+
|
|
114
|
+
- **`pre-edit-check.js`** (PreToolUse/Edit|Write): detecta `println!`/`dbg!` de depuración en archivos `.rs`, bloquea secrets hardcodeados y protege la rama `main`. Usar `tracing` para diagnóstico.
|
|
115
|
+
- **`pre-bash-check.js`** (PreToolUse/Bash): bloquea comandos destructivos en contexto de producción (`sqlx database drop`, `DROP TABLE`).
|
|
116
|
+
|
|
117
|
+
### Reglas de scope
|
|
118
|
+
|
|
119
|
+
- Tu scope es `src/` del crate de API definido en `project.yaml` → `stack.backend`.
|
|
120
|
+
- Nunca edites `Cargo.toml` (más allá de agregar una dependencia documentada), Dockerfiles ni configuración de CI sin aprobación del orchestrator.
|
|
121
|
+
- Si necesitás un background worker o cola de tareas, reportarlo al orchestrator — no configures la infra directamente.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Profile: springboot
|
|
2
|
+
|
|
3
|
+
API REST sobre la JVM construida con Spring Boot 3 + Spring Web + Spring Data JPA (Hibernate) + Bean Validation + Flyway/Liquibase, en Java o Kotlin. Ideal para proyectos enterprise que necesitan una API robusta con inyección de dependencias, transacciones declarativas y un ecosistema maduro de testing.
|
|
4
|
+
|
|
5
|
+
## Agentes incluidos
|
|
6
|
+
|
|
7
|
+
- **api-engineer** — implementa entidades `@Entity`, repositorios Spring Data JPA, services `@Transactional`, controllers `@RestController`, DTO con Bean Validation, migraciones Flyway y tests con JUnit 5 (`@WebMvcTest`, `@DataJpaTest`, Testcontainers).
|
|
8
|
+
|
|
9
|
+
## Cuándo usar este profile
|
|
10
|
+
|
|
11
|
+
- El stack de backend usa Spring Boot 3 (namespace `jakarta.*`).
|
|
12
|
+
- El lenguaje es Java 17+ o Kotlin.
|
|
13
|
+
- La persistencia es Spring Data JPA sobre Hibernate.
|
|
14
|
+
- Las migraciones se gestionan con Flyway o Liquibase (no `ddl-auto`).
|
|
15
|
+
- El build es Maven (`./mvnw`) o Gradle (`./gradlew`) con wrapper.
|
|
16
|
+
- Los tests usan JUnit 5 + Spring Boot Test.
|
|
17
|
+
|
|
18
|
+
## Hooks específicos del stack
|
|
19
|
+
|
|
20
|
+
| Hook | Evento | Descripción |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `pre-edit-check.js` | PreToolUse/Edit\|Write | Detecta `System.out.println`/`printStackTrace` en `.java`/`.kt`; bloquea secrets hardcodeados; protege `main` |
|
|
23
|
+
| `pre-bash-check.js` | PreToolUse/Bash | Bloquea `flyway clean`, `DROP TABLE` y comandos destructivos en contexto de producción |
|
|
24
|
+
|
|
25
|
+
Ver `core/hooks/hooks-registry.yaml` para la lista completa.
|
|
26
|
+
|
|
27
|
+
## Activar en project.yaml
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
profiles:
|
|
31
|
+
active:
|
|
32
|
+
- springboot
|
|
33
|
+
```
|